From 0002726295068380ae88b6d6d2ca9d6a8b8872b4 Mon Sep 17 00:00:00 2001
From: Elian Kraja <e.kraja@nextworks.it>
Date: Wed, 16 Jan 2019 15:57:47 +0100
Subject: [PATCH] Extension for jsonlibrary in case of python3. Small fixies.
 SOL005 completed

---
 .../jsons/operateVnfRequest.json              |   2 +-
 .../jsons/ThresholdCrossedNotification.json   |   2 +-
 .../jsons/operateVnfRequest.json              |   2 +-
 .../VNFPackageArtifacts.robot                 |  20 +-
 .../{subscriptios.json => subscriptions.json} |   0
 .../IndividualPmJob.robot                     |  10 +-
 .../jsons/ThresholdCrossedNotification.json   |   2 +-
 .../IndividualNSDescriptor.robot              |  74 +++-
 .../IndividualPnfDescriptor.robot             |  18 +-
 .../IndividualSubscription.robot              |  91 ++++
 SOL005/NSDManagement-API/NSDContent.robot     | 219 +++++++++
 .../NSDManagementNotification.robot           | 170 +++++++
 SOL005/NSDManagement-API/NSDescriptors.robot  |  60 +++
 SOL005/NSDManagement-API/PNFDContent.robot    | 112 +++++
 SOL005/NSDManagement-API/PNFDescriptors.robot |  87 +++-
 SOL005/NSDManagement-API/Subscriptions.robot  | 143 ++++++
 .../environment/individualSubscription.txt    |   3 +
 .../environment/nsDescriptors.txt             |  14 +-
 .../environment/pnfDescriptors.txt            |  10 +-
 .../environment/subscriptions.txt             |   4 +
 .../environment/variables.txt                 |   7 +
 .../notifications/NsdChangeNotification.json  |   1 +
 .../NsdDeletionNotification.json              |   1 +
 .../NsdOnBoardingFailureNotification.json     |   1 +
 .../NsdOnBoardingNotification.json            |   8 +
 .../PnfdDeletionNotification.json             |   1 +
 .../PnfdOnBoardingFailureNotification.json    |   1 +
 .../PnfdOnBoardingNotification.json           |   1 +
 .../jsons/subscriptions.json                  |   3 +
 .../IndividualSubscription.robot              |  91 ++++
 .../IndividualVNFPackage.robot                | 113 +++++
 .../Notifications.robot                       | 116 +++++
 .../Subscriptions.robot                       | 139 ++++++
 .../VNFDInIndividualVNFPackage.robot          | 114 +++++
 .../VNFPackageArtifacts.robot                 | 109 +++++
 .../VNFPackageContent.robot                   | 144 ++++++
 .../VNFPackageContentViaURI.robot             |  70 +++
 .../VNFPackages.robot                         | 248 +++++++++++
 .../environment/generic.txt                   |  19 +
 .../environment/individualSubscription.txt    |   3 +
 .../environment/individualVnfPackage.txt      |   4 +
 .../environment/subscriptions.txt             |   4 +
 .../environment/variables.txt                 |   7 +
 .../environment/vnfPackageArtifacts.txt       |  11 +
 .../environment/vnfPackageContent.txt         |  10 +
 .../environment/vnfPackages.txt               |   5 +
 .../vnfdInIndividualVnfPackage.txt            |  11 +
 .../jsons/CreateVnfPkgInfoRequest.json        |   3 +
 .../jsons/PkgmSubscription.json               | 414 ++++++++++++++++++
 .../jsons/UploadVnfPkgFromUriRequest.json     |   3 +
 .../jsons/VnfPkgInfoModifications.json        |   4 +
 .../VnfPkgInfoModificationsDisabled.json      |   4 +
 .../jsons/subscriptions.json                  |   6 +
 .../jsons/vnfPkgInfos.json                    | 313 +++++++++++++
 .../PackageChangeNotification.schema.json     |  97 ++++
 .../PackageOnboardingNotification.schema.json |  80 ++++
 .../IndividualPmJob.robot                     |  76 ++++
 .../IndividualReport.robot                    |  61 +++
 .../IndividualSubscription.robot              |  82 ++++
 .../IndividualThreshold.robot                 |  70 +++
 .../Notifications.robot                       | 117 +++++
 .../VNFPerformanceManagement-API/PMJobs.robot | 202 +++++++++
 .../Subscriptions.robot                       | 184 ++++++++
 .../Thresholds.robot                          |  91 ++++
 .../environment/IndividualPmJob.txt           |   3 +
 .../environment/generic.txt                   |  20 +
 .../environment/individualSubscription.txt    |   3 +
 .../environment/individualThresholds.txt      |   3 +
 .../environment/notifications.txt             |   6 +
 .../environment/pmJobs.txt                    |   4 +
 .../environment/reports.txt                   |   4 +
 .../environment/subscriptions.txt             |   3 +
 .../environment/thresholds.txt                |   3 +
 .../jsons/CreatePmJobRequest.json             |  10 +
 .../jsons/CreateThresholdRequest.json         |  12 +
 ...manceInformationAvailableNotification.json |  13 +
 .../jsons/ThresholdCrossedNotification.json   |  16 +
 .../jsons/subscriptions.json                  |   6 +
 ...formationAvailableNotification.schema.json | 105 +++++
 .../schemas/PerformanceReport.schema.json     |   1 +
 .../schemas/PmJob.schema.json                 |   1 +
 .../schemas/PmJobs.schema.json                | 134 ++++++
 .../schemas/PmSubscription.schema.json        | 142 ++++++
 .../schemas/PmSubscriptions.schema.json       |   1 +
 .../schemas/ProblemDetails.schema.json        |   1 +
 .../schemas/Subscriptions.schema.json         |   1 +
 .../schemas/Threshold.schema.json             |  85 ++++
 .../ThresholdCrossedNotification.schema.json  | 113 +++++
 .../schemas/Thresholds.schema.json            |  88 ++++
 .../schemas/criteria.schema.json              |  34 ++
 .../schemas/links.schema.json                 |  35 ++
 .../schemas/reports.schema.json               |  26 ++
 extensions/jsonlibrary.patch                  |  59 +++
 93 files changed, 4978 insertions(+), 46 deletions(-)
 rename SOL003/VNFPackageManagement-API/jsons/{subscriptios.json => subscriptions.json} (100%)
 create mode 100644 SOL005/NSDManagement-API/IndividualSubscription.robot
 create mode 100644 SOL005/NSDManagement-API/NSDContent.robot
 create mode 100644 SOL005/NSDManagement-API/NSDManagementNotification.robot
 create mode 100644 SOL005/NSDManagement-API/PNFDContent.robot
 create mode 100644 SOL005/NSDManagement-API/Subscriptions.robot
 create mode 100644 SOL005/NSDManagement-API/environment/individualSubscription.txt
 create mode 100644 SOL005/NSDManagement-API/environment/subscriptions.txt
 create mode 100644 SOL005/NSDManagement-API/environment/variables.txt
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/NsdChangeNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/NsdDeletionNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingFailureNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/PnfdDeletionNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingFailureNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingNotification.json
 create mode 100644 SOL005/NSDManagement-API/jsons/subscriptions.json
 create mode 100644 SOL005/VNFPackageManagement-API/IndividualSubscription.robot
 create mode 100644 SOL005/VNFPackageManagement-API/IndividualVNFPackage.robot
 create mode 100644 SOL005/VNFPackageManagement-API/Notifications.robot
 create mode 100644 SOL005/VNFPackageManagement-API/Subscriptions.robot
 create mode 100644 SOL005/VNFPackageManagement-API/VNFDInIndividualVNFPackage.robot
 create mode 100644 SOL005/VNFPackageManagement-API/VNFPackageArtifacts.robot
 create mode 100644 SOL005/VNFPackageManagement-API/VNFPackageContent.robot
 create mode 100644 SOL005/VNFPackageManagement-API/VNFPackageContentViaURI.robot
 create mode 100644 SOL005/VNFPackageManagement-API/VNFPackages.robot
 create mode 100644 SOL005/VNFPackageManagement-API/environment/generic.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/individualSubscription.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/individualVnfPackage.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/subscriptions.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/variables.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/vnfPackageArtifacts.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/vnfPackageContent.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/vnfPackages.txt
 create mode 100644 SOL005/VNFPackageManagement-API/environment/vnfdInIndividualVnfPackage.txt
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/CreateVnfPkgInfoRequest.json
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/PkgmSubscription.json
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/UploadVnfPkgFromUriRequest.json
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModifications.json
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModificationsDisabled.json
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/subscriptions.json
 create mode 100644 SOL005/VNFPackageManagement-API/jsons/vnfPkgInfos.json
 create mode 100644 SOL005/VNFPackageManagement-API/schemas/PackageChangeNotification.schema.json
 create mode 100644 SOL005/VNFPackageManagement-API/schemas/PackageOnboardingNotification.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/IndividualPmJob.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/IndividualReport.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/IndividualSubscription.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/IndividualThreshold.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/Notifications.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/PMJobs.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/Subscriptions.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/Thresholds.robot
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/IndividualPmJob.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/generic.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/individualSubscription.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/individualThresholds.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/notifications.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/pmJobs.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/reports.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/subscriptions.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/environment/thresholds.txt
 create mode 100644 SOL005/VNFPerformanceManagement-API/jsons/CreatePmJobRequest.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/jsons/CreateThresholdRequest.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/jsons/PerformanceInformationAvailableNotification.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/jsons/ThresholdCrossedNotification.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/jsons/subscriptions.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/PerformanceInformationAvailableNotification.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/PerformanceReport.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/PmJob.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/PmJobs.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/PmSubscription.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/PmSubscriptions.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/ProblemDetails.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/Subscriptions.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/Threshold.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/ThresholdCrossedNotification.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/Thresholds.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/criteria.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/links.schema.json
 create mode 100644 SOL005/VNFPerformanceManagement-API/schemas/reports.schema.json
 create mode 100644 extensions/jsonlibrary.patch

diff --git a/SOL002/VNFLifecycleManagement-API/jsons/operateVnfRequest.json b/SOL002/VNFLifecycleManagement-API/jsons/operateVnfRequest.json
index 92dc07fa..2ead53e1 100644
--- a/SOL002/VNFLifecycleManagement-API/jsons/operateVnfRequest.json
+++ b/SOL002/VNFLifecycleManagement-API/jsons/operateVnfRequest.json
@@ -1,5 +1,5 @@
 {
   "changeStateTo": "STOPPED",
-  "stopType": "FORCEFUL"
+  "stopType": "FORCEFUL",
   "additionalParams": {}
 }
\ No newline at end of file
diff --git a/SOL002/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json b/SOL002/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json
index 23ee9e24..fc476acf 100644
--- a/SOL002/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json
+++ b/SOL002/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json
@@ -7,7 +7,7 @@
 	"crossingDirection": "UP",
 	"objectInstanceId": "vnfID",
 	"performanceMetric": "performanceMetric",
-	"performanceValue": 7
+	"performanceValue": 7,
 	"_links": {
 			"subscription": "link to subscription",
 			"threshold": "link to threshold"
diff --git a/SOL003/VNFLifecycleManagement-API/jsons/operateVnfRequest.json b/SOL003/VNFLifecycleManagement-API/jsons/operateVnfRequest.json
index 92dc07fa..2ead53e1 100644
--- a/SOL003/VNFLifecycleManagement-API/jsons/operateVnfRequest.json
+++ b/SOL003/VNFLifecycleManagement-API/jsons/operateVnfRequest.json
@@ -1,5 +1,5 @@
 {
   "changeStateTo": "STOPPED",
-  "stopType": "FORCEFUL"
+  "stopType": "FORCEFUL",
   "additionalParams": {}
 }
\ No newline at end of file
diff --git a/SOL003/VNFPackageManagement-API/VNFPackageArtifacts.robot b/SOL003/VNFPackageManagement-API/VNFPackageArtifacts.robot
index d761a466..e30759f7 100644
--- a/SOL003/VNFPackageManagement-API/VNFPackageArtifacts.robot
+++ b/SOL003/VNFPackageManagement-API/VNFPackageArtifacts.robot
@@ -9,7 +9,7 @@ Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
 GET VNF Package Artifact
     Log    Trying to get a VNF Package Artifact
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    200
     Log    Received a 200 OK as expected
     ${contentType}=    Output    response headers Content-Type
@@ -20,7 +20,7 @@ GET VNF Package Artifact - Range
     Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
     Set Headers    {"Range": "${range}"}
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    206
     Log    Received 206 Partial Content as expected.
     ${headers}=    Output    response headers
@@ -32,7 +32,7 @@ GET VNF Package Artifact - NFVO No RANGE
     Pass Execution If    ${NFVO_RANGE_OK} == 1    Skipping this test as NFVO is able to handle partial Requests.
     Set Headers    {"Range": "${range}"}
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    200
     Log    Received 200 OK as expected. The content is all available on this request. RANGE request has been ignored.
 
@@ -41,7 +41,7 @@ GET VNF Package Artifact - Negative Range
     Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
     Set Headers    {"Range": "${range}"}
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    416
     Log    Received 416 Range not satisfiable as expected.
     ${contentType}=    Output    response headers Content-Type
@@ -55,7 +55,7 @@ GET VNF Package Artifact - Negative Range
 GET VNF Package Artifact- Negative (Not Found)
     Log    Trying to perform a negative get, using an erroneous package ID
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/artifacts/{artifactPath}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/artifacts/${artifactPath}
     Integer    response status    404
     Log    Received 404 Not Found as expected
     ${contentType}=    Output    response headers Content-Type
@@ -69,7 +69,7 @@ GET VNF Package Artifact- Negative (Not Found)
 GET VNF Package Artifact - Negative (onboardingState issue)
     Log    Trying to get a VNF Package artifact present in the NFVO Catalogue, but not in ONBOARDED operationalStatus
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/artifacts/{artifactPath}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/artifacts/${artifactPath}
     Integer    response status    409
     Log    Received 409 Conflict as expected
     ${contentType}=    Output    response headers Content-Type
@@ -83,27 +83,27 @@ GET VNF Package Artifact - Negative (onboardingState issue)
 POST VNF Package Artifact - (Method not implemented)
     Log    Trying to perform a POST (method should not be implemented)
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    405
     Log    Received 405 Method not implemented as expected
 
 PUT VNF Package Artifact - (Method not implemented)
     Log    Trying to perform a PUT. This method should not be implemented
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    405
     Log    Received 405 Method not implemented as expected
 
 PATCH VNF Package Artifact - (Method not implemented)
     Log    Trying to perform a PATCH. This method should not be implemented
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    405
     Log    Received 405 Method not implemented as expected
 
 DELETE VNF Package Artifact - (Method not implemented)
     Log    Trying to perform a DELETE. This method should not be implemented
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
-    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/{artifactPath}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
     Integer    response status    405
     Log    Received 405 Method not implemented as expected
diff --git a/SOL003/VNFPackageManagement-API/jsons/subscriptios.json b/SOL003/VNFPackageManagement-API/jsons/subscriptions.json
similarity index 100%
rename from SOL003/VNFPackageManagement-API/jsons/subscriptios.json
rename to SOL003/VNFPackageManagement-API/jsons/subscriptions.json
diff --git a/SOL003/VNFPerformanceManagement-API/IndividualPmJob.robot b/SOL003/VNFPerformanceManagement-API/IndividualPmJob.robot
index c876be05..a8bc6d83 100644
--- a/SOL003/VNFPerformanceManagement-API/IndividualPmJob.robot
+++ b/SOL003/VNFPerformanceManagement-API/IndividualPmJob.robot
@@ -49,8 +49,14 @@ DELETE Individual PM Job - Negative (Not Found)
     Run Keyword If    ${VNFM_AUTH_USAGE} == 1    Set Headers    {"Authorization": "${VNFM_AUTHENTICATION}"}
     DELETE    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${erroneousPmJobId}
     Integer    response status    404
-    Log    Received 204 No Content as expected
-
+    Log    Received 404 Not Found as expected
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+	
+	
 POST Individual PM Job - (Method not implemented)
     Log    Trying to perform a POST (method should not be implemented)
     Set Headers    {"Accept": "${ACCEPT_JSON}"}
diff --git a/SOL003/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json b/SOL003/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json
index 23ee9e24..fc476acf 100644
--- a/SOL003/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json
+++ b/SOL003/VNFPerformanceManagementNotification-API/jsons/ThresholdCrossedNotification.json
@@ -7,7 +7,7 @@
 	"crossingDirection": "UP",
 	"objectInstanceId": "vnfID",
 	"performanceMetric": "performanceMetric",
-	"performanceValue": 7
+	"performanceValue": 7,
 	"_links": {
 			"subscription": "link to subscription",
 			"threshold": "link to threshold"
diff --git a/SOL005/NSDManagement-API/IndividualNSDescriptor.robot b/SOL005/NSDManagement-API/IndividualNSDescriptor.robot
index f0d3399e..3216a694 100644
--- a/SOL005/NSDManagement-API/IndividualNSDescriptor.robot
+++ b/SOL005/NSDManagement-API/IndividualNSDescriptor.robot
@@ -3,10 +3,12 @@ Documentation     This clause defines all the resources and methods provided by
 Library           JSONSchemaLibrary    schemas/
 Resource          environment/generic.txt    # Generic Parameters
 Resource          environment/nsDescriptors.txt    # Specific nsDescriptors Parameters
+Library           OperatingSystem
 Library           JSONLibrary
 Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
-Library           OperatingSystem
 
+Library    JSONSchemaLibrary    schemas/
+*** Variable ***
 *** Test Cases ***
 GET Single Network Service Descriptor
     [Documentation]   The GET method reads information about an individual NS descriptor.
@@ -44,6 +46,19 @@ GET Single Network Service Descriptor (Negative: Not found)
 
 
 PATCH Single Network Service Descriptor - (Disabling a nsdInfo)
+    [Documentation]    The PATCH method modifies the operational state and/or user defined data of an individual NS descriptor resource.
+    ...    This method can be used to:
+    ...    
+    ...    1) Enable a previously disabled individual NS descriptor resource, allowing again its use for instantiation of new 
+    ...    network service with this descriptor. The usage state (i.e. "IN_USE/NOT_IN_USE") shall not change as a
+    ...    result.
+    ...    
+    ...    2) Disable a previously enabled individual NS descriptor resource, preventing any further use for instantiation of
+    ...    new network service(s) with this descriptor. The usage state (i.e. "IN_USE/NOT_IN_USE") shall not change
+    ...    as a result.
+    ...    
+    ...    3) Modify the user defined data of an individual NS descriptor resource.
+    ...    
     Log    Trying to perform a PATCH. As prerequisite the nsdInfo shall be in enabled operational state
     Set Headers    {"Accept": "${ACCEPT_JSON}"}
     Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
@@ -66,12 +81,57 @@ PATCH Single Network Service Descriptor - (Enabling an previously disabled nsdIn
     PATCH    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}    ${body}
     Integer    response status    200
     Log    Received 200 OK as expected
-#    ${result}=    Output    response body
-#    ${json}=    evaluate    json.loads('''${result}''')    json
-#    Validate Json    NsdInfoModification.schema.json    ${json}
-#    Log    Validation of NsdInfoModifications OK
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdInfoModification.schema.json    ${json}
+    Log    Validation of NsdInfoModifications OK
+    
+
+PATCH Single Network Service Descriptor - NEGATIVE (Trying to enable an previously enabled nsdInfo)
+    Log    Trying to perform a PATCH. As prerequisite the nsdInfo shall be in enabled operational state
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/NsdInfoModificationEnable.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${enabledNsdInfoId}    ${body}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+    
+    
+ PATCH Single Network Service Descriptor - NEGATIVE (Trying to get an ETag mismatch)
+    Log    Trying to perform a PATCH. As prerequisite the nsdInfo shall be modified by another entity
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Set Headers    {"If-Match": "${Etag}"}
+    ${body}=    Get File    json/NsdInfoModificationEnable.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${modifiedNsdInfoId}    ${body}
+    Integer    response status    412
+    Log    Received 412 Precondition failed as expected
+    ${returned_etag}=    Output    response headers Etag
+    Log    Verify different etags
+    Should Not Be Equal    ${Etag}    ${returned_etag}    
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK  
+    
 
 DELETE Single Network Service Descriptor
+    [Documentation]    The DELETE method deletes an individual NS descriptor resource.
+    ...    An individual NS descriptor resource can only be deleted when there is no NS instance using it (i.e. usageState =
+    ...    NOT_IN_USE) and has been disabled already (i.e. operationalState = DISABLED). Otherwise, the DELETE method
+    ...    shall fail.
     Log    Trying to perform a DELETE nsdInfo. The nsdInfo should be in "NOT_USED" usageState and in "DISABLED" operationalState.
     Set Headers    {"Accept": "${ACCEPT_JSON}"}
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
@@ -81,6 +141,10 @@ DELETE Single Network Service Descriptor
 
 
 DELETE Single Network Service Descriptor (Negative: Trying to delete an enabled nsdInfo)
+    [Documentation]    The DELETE method deletes an individual NS descriptor resource.
+    ...    An individual NS descriptor resource can only be deleted when there is no NS instance using it (i.e. usageState =
+    ...    NOT_IN_USE) and has been disabled already (i.e. operationalState = DISABLED). Otherwise, the DELETE method
+    ...    shall fail.
     Log    Trying to perform a DELETE nsdInfo in ENABLED operational state
     Set Headers    {"Accept": "${ACCEPT_JSON}"}
     Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
diff --git a/SOL005/NSDManagement-API/IndividualPnfDescriptor.robot b/SOL005/NSDManagement-API/IndividualPnfDescriptor.robot
index e558d9c2..78f914c8 100644
--- a/SOL005/NSDManagement-API/IndividualPnfDescriptor.robot
+++ b/SOL005/NSDManagement-API/IndividualPnfDescriptor.robot
@@ -20,11 +20,11 @@ GET Single PNF Descriptor
     ${contentType}=    Output    response headers Content-Type
     Should Contain    ${contentType}    application/json
     Log  Validation of Content-Type : OK
-#    Log    Trying to validate response
-#    ${result}=    Output    response body
-#    ${json}=    evaluate    json.loads('''${result}''')    json
-#    Validate Json    NsdInfo.schema.json    ${json}
-#    Log    Validation OK
+   Log    Trying to validate response
+   ${result}=    Output    response body
+   ${json}=    evaluate    json.loads('''${result}''')    json
+   Validate Json    NsdInfo.schema.json    ${json}
+   Log    Validation OK
 
 
 GET Single PNF Descriptor (Negative: Not found)
@@ -55,10 +55,10 @@ PATCH Single PNF Descriptor - (Disabling a nsdInfo)
     PATCH    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${pnfdInfoId}    ${body}
     Integer    response status    200
     Log    Received 200 OK as expected
-#    ${result}=    Output    response body
-#    ${json}=    evaluate    json.loads('''${result}''')    json
-#    Validate Json    PnfdInfoModification.schema.json    ${json}
-#    Log    Validation of PnfdInfoModification OK
+   ${result}=    Output    response body
+   ${json}=    evaluate    json.loads('''${result}''')    json
+   Validate Json    PnfdInfoModification.schema.json    ${json}
+   Log    Validation of PnfdInfoModification OK
 
 
 DELETE Single PNF Descriptor
diff --git a/SOL005/NSDManagement-API/IndividualSubscription.robot b/SOL005/NSDManagement-API/IndividualSubscription.robot
new file mode 100644
index 00000000..392a3716
--- /dev/null
+++ b/SOL005/NSDManagement-API/IndividualSubscription.robot
@@ -0,0 +1,91 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/individualSubscription.txt
+Library           OperatingSystem
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Individual Subscription
+    Log    Trying to get a single subscription identified by subscriptionId
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdmSubscription.schema.json    ${json}
+    Log    Validated NsdmSubscription schema
+
+GET Subscription - Negative (Not Found)
+    Log    Trying to perform a request on a subscriptionID which doesn't exist
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${erroneousSubscriptionId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+DELETE Subscription
+    Log    Trying to perform a DELETE on a subscriptionId
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    204
+    Log    Received 204 No Content as expected
+    Comment    Log    Trying to get the deleted element
+    Comment    Create HTTP Context    ${NFVO_HOST}:${NFVO_PORT}    ${NFVO_SCHEMA}
+    Comment    Set Request Header    Accept    ${ACCEPT_JSON}
+    Comment    Run Keyword If    ${AUTH_USAGE} == 1    Set Request Header    Authorization    ${AUTHORIZATION}
+    Comment    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Comment    Response Status Code Should Equal    404
+    Comment    Log    The subscriptionId is not present in database
+
+DELETE Subscription - Negative (Not Found)
+    Log    Trying to perform a DELETE on a subscriptionId which doesn't exist
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${erroneousSubscriptionId}
+    Integer    response status    404
+    Log    The subscriptionId is not present in database
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+PUT Subscription - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Subscription - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+POST Subscription - (Method not implemented)
+    Log    Trying to perform a POST. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/NSDManagement-API/NSDContent.robot b/SOL005/NSDManagement-API/NSDContent.robot
new file mode 100644
index 00000000..b3ff9a68
--- /dev/null
+++ b/SOL005/NSDManagement-API/NSDContent.robot
@@ -0,0 +1,219 @@
+*** Settings ***
+Documentation     This clause defines the content of the individual NS descriptor, i.e. NSD content
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/nsDescriptors.txt    # Specific nsDescriptors Parameters
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Library           OperatingSystem
+
+*** Test Cases ***
+GET NSD Content
+    [Documentation]   The GET method fetches the content of the NSD.
+    ...    The NSD can be implemented as a single file or as a collection of multiple files. If the NSD is implemented in the form
+    ...    of multiple files, a ZIP file embedding these files shall be returned. If the NSD is implemented as a single file, either
+    ...    that file or a ZIP file embedding that file shall be returned.
+    ...    
+    ...    The selection of the format is controlled by the "Accept" HTTP header passed in the GET request:
+    ...    
+    ...    - If the "Accept" header contains only "text/plain" and the NSD is implemented as a single file, the file shall be
+    ...    returned; otherwise, an error message shall be returned.
+    ...    
+    ...    - If the "Accept" header contains only "application/zip", the single file or the multiple files that make up the
+    ...    NSD shall be returned embedded in a ZIP file.
+    ...    
+    ...    - If the "Accept" header contains both "text/plain" and "application/zip", it is up to the NFVO to choose the
+    ...    format to return for a single-file NSD; for a multi-file NSD, a ZIP file shall be returned.
+    ...    
+    ...    NOTE: The structure of the NSD zip file is outside the scope of the present document.
+    ...    
+    ...    This method shall follow the provisions specified in the Tables 5.4.4.3.2-1 and 5.4.4.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    The GET method queries multiple NS descriptors
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_ZIP}
+
+
+GET NSD Content - Range
+    Log    Trying to get a NSD Content using RANGE using an NFVO that can handle it
+    Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    206
+    Log    Received 206 Partial Content as expected.
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Content-Range
+    Log    Header Content-Range is present
+    Should Contain    ${headers}    Content-Length
+    Log    Header Content-Length is present
+    
+    
+GET NSD Content - Range NFVO No RANGE
+    Log    Trying to get a NSD Content using RANGE using an NFVO that can handle it
+    Pass Execution If    ${NFVO_RANGE_OK} == 1    Skipping this test as NFVO is able to handle partial Requests.
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    200
+    Log    Received 200 OK as expected. The content is all available on this request. RANGE request has been ignored.
+        
+        
+GET NSD Content - Negative Range
+    Log    Trying to get a range of bytes of the limit of the NSD Content
+    Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Set Headers    {"Range": "${erroneousRange}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    416
+    Log    Received 416 Range not satisfiable as expected.
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK        
+        
+        
+
+
+GET NSD Content- Negative (Not Found)
+    Log    Trying to perform a negative get, using an erroneous package ID
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${erroneous_nsdInfoId}/nsd_content
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+  
+GET NSD Content - Negative (onboardingState issue)
+    Log    Trying to get a NSD content present in the NFVO Catalogue, but not in ONBOARDED operationalStatus
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${onboardingStateNsdInfoId}/nsd_content
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+      
+        
+PUT a NSD Content - Asynchronous mode
+    [Documentation]    The NSD to be uploaded can be implemented as a single file or as a collection of multiple files, as defined in
+    ...    clause 5.4.4.3.2. If the NSD is implemented in the form of multiple files, a ZIP file embedding these files shall be
+    ...    uploaded. If the NSD is implemented as a single file, either that file or a ZIP file embedding that file shall be uploaded.
+    ...    The "Content-Type" HTTP header in the PUT request shall be set accordingly based on the format selection of the
+    ...    NSD.
+    ...    
+    ...    - If the NSD to be uploaded is a text file, the "Content-Type" header is set to "text/plain".
+    ...    
+    ...    - If the NSD to be uploaded is a zip file, the "Content-Type" header is set to "application/zip".
+    ...    
+    ...    This method shall follow the provisions specified in the Tables 5.4.4.3.3-1 and 5.4.4.3.3-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a PUT. This method upload the content of a NSD
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=  Get Binary File  ${contentFile}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content    ${body}
+    Integer    response status    202
+    Log    Received 202 Accepted as expected
+    ${response}=    Output    response body
+    Should Be Empty    ${response}    
+    
+    
+PUT a NSD Content - Synchronous mode
+    [Documentation]    The NSD to be uploaded can be implemented as a single file or as a collection of multiple files, as defined in
+    ...    clause 5.4.4.3.2. If the NSD is implemented in the form of multiple files, a ZIP file embedding these files shall be
+    ...    uploaded. If the NSD is implemented as a single file, either that file or a ZIP file embedding that file shall be uploaded.
+    ...    The "Content-Type" HTTP header in the PUT request shall be set accordingly based on the format selection of the
+    ...    NSD.
+    ...    
+    ...    - If the NSD to be uploaded is a text file, the "Content-Type" header is set to "text/plain".
+    ...    
+    ...    - If the NSD to be uploaded is a zip file, the "Content-Type" header is set to "application/zip".
+    ...    
+    ...    This method shall follow the provisions specified in the Tables 5.4.4.3.3-1 and 5.4.4.3.3-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a PUT. This method upload the content of a NSD
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=  Get Binary File  ${contentFile}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content    ${body}
+    Integer    response status    200
+    Log    Received 200 OK as expected
+    ${response}=    Output    response body
+    Should Be Empty    ${response}   
+    
+    
+PUT a NSD Content - Negative. Nsd in CREATING state
+    [Documentation]    The NSD to be uploaded can be implemented as a single file or as a collection of multiple files, as defined in
+    ...    clause 5.4.4.3.2. If the NSD is implemented in the form of multiple files, a ZIP file embedding these files shall be
+    ...    uploaded. If the NSD is implemented as a single file, either that file or a ZIP file embedding that file shall be uploaded.
+    ...    The "Content-Type" HTTP header in the PUT request shall be set accordingly based on the format selection of the
+    ...    NSD.
+    ...    
+    ...    - If the NSD to be uploaded is a text file, the "Content-Type" header is set to "text/plain".
+    ...    
+    ...    - If the NSD to be uploaded is a zip file, the "Content-Type" header is set to "application/zip".
+    ...    
+    ...    This method shall follow the provisions specified in the Tables 5.4.4.3.3-1 and 5.4.4.3.3-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a PUT. This method upload the content of a NSD
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=  Get Binary File  ${contentFile}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${creatingNsdInfoId}/nsd_content    ${body}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+ 
+        
+
+POST a NSD Content (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+
+
+PATCH a NSD Content (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE a NSD Content (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors/${nsdInfoId}/nsd_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/NSDManagement-API/NSDManagementNotification.robot b/SOL005/NSDManagement-API/NSDManagementNotification.robot
new file mode 100644
index 00000000..3ce71af2
--- /dev/null
+++ b/SOL005/NSDManagement-API/NSDManagementNotification.robot
@@ -0,0 +1,170 @@
+*** Setting ***
+Resource	environment/variables.txt
+Suite Setup    Create Sessions
+Suite Teardown    Terminate All Processes    kill=true
+Library    MockServerLibrary
+Library    Process
+Library    OperatingSystem
+Library    BuiltIn
+Library    Collections
+Library    String
+
+
+*** Test Cases ***
+Check Notification Endpoint
+    &{req}=  Create Mock Request Matcher	GET  ${callback_endpoint}    
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Verify Mock Expectation  ${req}
+    Clear Requests  ${callback_endpoint}
+    
+Post NSD Change Notification
+    ${json}=	Get File	schemas/NsdChangeNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  NSD Change Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+Post NSD Deletion Notification
+    ${json}=	Get File	schemas/NsdDeletionNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  NSD Deletion Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+Post NSD Onboard Failure Notification
+    ${json}=	Get File	schemas/NsdOnboardingFailureNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  NSD Onboard Failure Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+Post NSD Onboard Notification
+    ${json}=	Get File	schemas/NsdOnboardingNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  NSD Onboard Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+Post PNFD Deletion Notification
+    ${json}=	Get File	schemas/PnfdDeletionNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  PNFD Deletion Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+Post PNFD Onboard Failure Notification
+    ${json}=	Get File	schemas/PNFDOnboardingFailureNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  PNFD Onboard Failure Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+Post PNFD Onboard Notification
+    ${json}=	Get File	schemas/OPNFDOnboardingNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  NSD Onboard Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}    
+    
+
+Post Notification Negative 404 
+    ${json}=	Get File	schemas/ProblemDetails.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle Notification to handle 404 error
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint_error}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=404
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+PUT VNF Package Management Notification 
+    Log  PUT Method not implemented
+    &{req}=  Create Mock Request Matcher	PUT  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+PATCH VNF Package Management Notification 
+    Log  PATCH Method not implemented
+    &{req}=  Create Mock Request Matcher	PATCH  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+DELETE VNF Package Management Notification 
+    Log  PATCH Method not implemented
+    &{req}=  Create Mock Request Matcher	DELETE  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+
+*** Keywords ***
+Create Sessions
+    Start Process  java  -jar  ../../bin/mockserver-netty-5.3.0-jar-with-dependencies.jar  -serverPort  ${callback_port}  alias=mockInstance
+    Wait For Process  handle=mockInstance  timeout=5s  on_timeout=continue
+    Create Mock Session  ${callback_uri}:${callback_port}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/NSDescriptors.robot b/SOL005/NSDManagement-API/NSDescriptors.robot
index 159fcc6c..b427aa85 100644
--- a/SOL005/NSDManagement-API/NSDescriptors.robot
+++ b/SOL005/NSDManagement-API/NSDescriptors.robot
@@ -104,6 +104,66 @@ GET all Network Service Descriptors (Negative: Not found)
     ${json}=    evaluate    json.loads('''${problemDetails}''')    json
     Validate Json    ProblemDetails.schema.json    ${json}
     Log    Validation OK
+    
+    
+GET all Network Service Descriptors - all_fields
+        [Documentation]   The GET method queries information about multiple NS descriptor resources.
+    ...    This method shall follow the provisions specified in the Tables 5.4.2.3.2-1 and 5.4.2.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    The GET method queries multiple NS descriptors using Attribute-based filtering parameters "all_fields"
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors?all_fields
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdInfos.schema.json    ${json}
+    Log    NsdInfo schema validated
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Validate Json    links.schema.json    ${links[0]}
+    Log    Validation for _links schema OK
+
+GET all Network Service Descriptors - exclude_default
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using exclude_default filter.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/ns_descriptors?exclude_default
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdInfos.schema.json    ${json}
+    Log    NsdInfo schema validated
+    Log    Checking missing information for _links element
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Should Be Empty    ${links}
+    Log    _links element is missing as excepted
+
+
+GET all Network Service Descriptors - exclude_fields
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using filter params
+    Pass Execution If    ${NFVO_FIELDS} == 0    The NFVO is not able to use exclude_fields option
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?exlude_fields=${fields}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdInfos.schema.json    ${json}
+    Log    NsdInfo schema validated
+    Log    Checking missing information for _links element
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Should Be Empty    ${links}
+    Log    _links element is missing as excepted
+        
 
 POST a new Network Service Descriptors
     Log    Creating a new network service descriptor
diff --git a/SOL005/NSDManagement-API/PNFDContent.robot b/SOL005/NSDManagement-API/PNFDContent.robot
new file mode 100644
index 00000000..ef178867
--- /dev/null
+++ b/SOL005/NSDManagement-API/PNFDContent.robot
@@ -0,0 +1,112 @@
+*** Settings ***
+Documentation     This clause defines the content of the individual NS descriptor, i.e. NSD content
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/pnfDescriptors.txt    # Specific nsDescriptors Parameters
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Library           OperatingSystem
+
+*** Test Cases ***
+GET PNFD Content
+    [Documentation]   The GET method fetches the content of the PNFD..
+    ...    This method shall follow the provisions specified in the Tables 5.4.7.3.2-1 and 5.4.7.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    The GET method queries PNFD Content
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${pnfdInfoId}/pnfd_content
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_PLAIN}
+
+
+GET PNFD Content- Negative (Not Found)
+    Log    Trying to perform a negative get, using an erroneous package ID
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${erroneous_pnfdId}/pnfd_content
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+  
+GET PNFD Content - Negative (onboardingState issue)
+    Log    Trying to get a PNFD content present in the NFVO Catalogue, but not in ONBOARDED operationalStatus
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${onboardingStatePnfdId}/pnfd_content
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+      
+        
+PUT a PNFD Content 
+    Log    Trying to perform a PUT. This method upload the content of a PNFD
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=  Get Binary File  ${contentFile}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}//pnf_descriptors/${pnfdInfoId}/pnfd_content    ${body}
+    Integer    response status    204
+    Log    Received 204 No Content as expected
+    ${response}=    Output    response body
+    Should Be Empty    ${response}
+    ${contentType}=    Output    response headers Content-Type
+    Should Be Equal    text/plain    ${contentType}    
+    
+    
+    
+PUT a PNFD Content - Negative. Nsd in CREATING state
+    Log    Trying to perform a PUT.
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=  Get Binary File  ${contentFile}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${creatingPnfdId}/pnfd_content    ${body}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+ 
+        
+
+POST a PNFD Content (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${pnfdInfoId}/pnfd_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+
+
+PATCH a NSDContent (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${pnfdInfoId}/pnfd_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE a NSDContent (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors/${pnfdInfoId}/pnfd_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/NSDManagement-API/PNFDescriptors.robot b/SOL005/NSDManagement-API/PNFDescriptors.robot
index e36cd9de..e9d1b93f 100644
--- a/SOL005/NSDManagement-API/PNFDescriptors.robot
+++ b/SOL005/NSDManagement-API/PNFDescriptors.robot
@@ -20,11 +20,11 @@ GET all PNF Descriptors
     ${contentType}=    Output    response headers Content-Type
     Should Contain    ${contentType}    application/json
     Log  Validation of Content-Type : OK
-#    Log    Trying to validate response
-#    ${result}=    Output    response body
-#    ${json}=    evaluate    json.loads('''${result}''')    json
-#    Validate Json    PnfdInfos.schema.json    ${json}
-#    Log    Validation OK
+   Log    Trying to validate response
+   ${result}=    Output    response body
+   ${json}=    evaluate    json.loads('''${result}''')    json
+   Validate Json    PnfdInfos.schema.json    ${json}
+   Log    Validation OK
 
 GET all PNF Descriptors - Filter
     [Documentation]   The GET method queries information about multiple PNF descriptor resources.
@@ -37,11 +37,11 @@ GET all PNF Descriptors - Filter
     Integer    response status    200
     ${contentType}=    Output    response headers Content-Type
     Should Contain    ${contentType}    application/json
-#    Log    Trying to validate response
-#    ${result}=    Output    response body
-#    ${json}=    evaluate    json.loads('''${result}''')    json
-#    Validate Json    PnfdInfos.schema.json    ${json}
-#    Log    Validation OK
+   Log    Trying to validate response
+   ${result}=    Output    response body
+   ${json}=    evaluate    json.loads('''${result}''')    json
+   Validate Json    PnfdInfos.schema.json    ${json}
+   Log    Validation OK
 
 GET all PNF Descriptors - Negative (wronge filter name)
     Log    The GET method queries multiple PNF descriptors using Attribute-based filtering parameters. Negative case, with erroneous attribute name
@@ -104,6 +104,65 @@ GET all PNF Descriptors (Negative: Not found)
     ${json}=    evaluate    json.loads('''${problemDetails}''')    json
     Validate Json    ProblemDetails.schema.json    ${json}
     Log    Validation OK
+    
+    
+GET all PNF Descriptors - all_fields
+        [Documentation]   The GET method queries information about multiple PNF descriptor resources
+    ...    This method shall follow the provisions specified in the Tables 5.4.5.3.2-1 and 5.4.5.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    The GET method queries multiple PNF descriptors using Attribute-based filtering parameters "all_fields"
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors?all_fields
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PnfdInfos.schema.json    ${json}
+    Log    PnfdInfos schema validated
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Validate Json    links.schema.json    ${links[0]}
+    Log    Validation for _links schema OK
+
+GET all PNF Descriptors - exclude_default
+    Log    Trying to get all PNF Descriptors present in the NFVO Catalogue, using exclude_default filter.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors?exclude_default
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PnfdInfos.schema.json    ${json}
+    Log    PnfdInfo schema validated
+    Log    Checking missing information for _links element
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Should Be Empty    ${links}
+    Log    _links element is missing as excepted
+
+
+GET all PNF Descriptors - exclude_fields
+    Log    Trying to get all PNF descriptors present in the NFVO Catalogue, using filter params
+    Pass Execution If    ${NFVO_FIELDS} == 0    The NFVO is not able to use exclude_fields option
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pnf_descriptors?exlude_fields=${fields}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PnfdInfos.schema.json    ${json}
+    Log    PnfdInfo schema validated
+    Log    Checking missing information for _links element
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Should Be Empty    ${links}
+    Log    _links element is missing as excepted
 
 POST a new PNF Descriptor
     Log    Creating a new PNF descriptor
@@ -117,10 +176,10 @@ POST a new PNF Descriptor
     ${headers}=    Output    response headers
     Should Contain    ${headers}    Location
     Log    Response has header Location
-#    ${result}=    Output    response body
-#    ${json}=    evaluate    json.loads('''${result}''')    json
-#    Validate Json    PnfdInfo.schema.json    ${json}
-#    Log    Validation of PnfdInfo OK
+   ${result}=    Output    response body
+   ${json}=    evaluate    json.loads('''${result}''')    json
+   Validate Json    PnfdInfo.schema.json    ${json}
+   Log    Validation of PnfdInfo OK
 
 PUT all PNF Descriptors (Method not implemented)
     Log    Trying to perform a PUT. This method should not be implemented
diff --git a/SOL005/NSDManagement-API/Subscriptions.robot b/SOL005/NSDManagement-API/Subscriptions.robot
new file mode 100644
index 00000000..04cfa069
--- /dev/null
+++ b/SOL005/NSDManagement-API/Subscriptions.robot
@@ -0,0 +1,143 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/subscriptions.txt
+Library           OperatingSystem
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Subscription
+    [Documentation]    This method shall support the URI query parameters, request and response data structures, and response codes, as
+    ...    specified in the Tables 5.4.8.3.2-1 and 5.4.8.3.2-2.
+    Log    Trying to get the list of subscriptions
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdmSubscriptions.schema.json    ${json}
+    Log    Validated NsdmSubscription schema
+
+GET Subscription - Filter
+    Log    Trying to get the list of subscriptions using filters
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions?${filter_ok}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdmSubscriptions.schema.json    ${json}
+    Log    Validated NsdmSubscription schema
+
+GET Subscription - Negative Filter
+    Log    Trying to get the list of subscriptions using filters with wrong attribute name
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions?${filter_ok}
+    Integer    response status    400
+    Log    Received a 400 Bad Request as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET Subscription - Negative (Not Found)
+    Log    Trying to perform a request on a Uri which doesn't exist
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscription
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST Subscription
+    [Documentation]    This method shall support the URI query parameters, request and response data structures, and response codes, as
+    ...    specified in the Tables 5.4.8.3.1-1 and 5.4.8.3.1-2.
+    Log    Trying to create a new subscription
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/subscriptions.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+    Log    Response has header Location
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdmSubscription.schema.json    ${json}
+    Log    Validation of NsdmSubscription OK
+
+POST Subscription - DUPLICATION
+    Log    Trying to create a subscription with an already created content
+    Pass Execution If    ${NFVO_DUPLICATION} == 0    NFVO is not permitting duplication. Skipping the test
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/subscriptions.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+    Log    Response has header Location
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    NsdmSubscription.schema.json    ${json}
+    Log    Validation of NsdmSubscription OK
+
+POST Subscription - NO DUPLICATION
+    Log    Trying to create a subscription with an already created content
+    Pass Execution If    ${NFVO_DUPLICATION} == 1    NFVO is permitting duplication. Skipping the test
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/subscriptions.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body}
+    Integer    response status    303
+    Log    Received 303 See Other as expected
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+    Log    Response header contains Location
+
+PUT Subscription - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Subscription - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE Subscription - (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/NSDManagement-API/environment/individualSubscription.txt b/SOL005/NSDManagement-API/environment/individualSubscription.txt
new file mode 100644
index 00000000..23ed0f47
--- /dev/null
+++ b/SOL005/NSDManagement-API/environment/individualSubscription.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${subscriptionId}    f3ae6df7-07e1-47c9-8924-9ebe10343586
+${erroneousSubscriptionId}    442e3ee5-0499-4849-9b31-eb91ce1638f1    # Not existing ID on the subscriptions
diff --git a/SOL005/NSDManagement-API/environment/nsDescriptors.txt b/SOL005/NSDManagement-API/environment/nsDescriptors.txt
index 1a96929e..d76d2eda 100644
--- a/SOL005/NSDManagement-API/environment/nsDescriptors.txt
+++ b/SOL005/NSDManagement-API/environment/nsDescriptors.txt
@@ -3,4 +3,16 @@ ${POS_FIELDS}     name=nsdOnboardingState
 ${NEG_FIELDS}     wrongName=any_value
 ${nsdInfoId}    5a569e1d-4ffe-4e9a-8cf6-c24226651e56
 ${erroneous_nsdInfoId}  erroneous_nsdInfoId
-${enabledNsdInfoId}  5a569e1d-4ffe-4e9a-8cf6-c24226651e56
\ No newline at end of file
+${enabledNsdInfoId}  5a569e1d-4ffe-4e9a-8cf6-c24226651e56
+${fields}    _links
+${NFVO_FIELDS}    1
+${Etag}=    an etag
+${modifiedNsdInfoId}    f27200b1-1d8b-48c2-9d98-a993b8ab117f
+${ACCEPT_ZIP}    application/zip
+${CONTENT_TYPE_ZIP}    application/zip
+${NFVO_RANGE_OK}    1
+${range}          bytes=0-1023
+${erroneousRange}    bytes=100000-1000000    # Requesting a out of range number of bytes
+${onboardingStateNsdInfoId}    b992a851-08b1-45a8-9282-a5f7a7df04a6
+${contentFile}    files/nsdContent.zip
+${creatingNsdInfoId}    71241932-994a-46e2-ad6c-1740674dda44
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/environment/pnfDescriptors.txt b/SOL005/NSDManagement-API/environment/pnfDescriptors.txt
index bdd98634..9a01c9f4 100644
--- a/SOL005/NSDManagement-API/environment/pnfDescriptors.txt
+++ b/SOL005/NSDManagement-API/environment/pnfDescriptors.txt
@@ -3,4 +3,12 @@ ${POS_FIELDS}     name=pnfdOnboardingState
 ${NEG_FIELDS}     wrongName=any_value
 ${pnfdInfoId}    40853bda-8a8f-4f63-9130-cef439f65348
 ${erroneous_pnfdInfoId}  erroneous_pnfdInfoId
-${enabledPnfdInfoId}  40853bda-8a8f-4f63-9130-cef439f65348
\ No newline at end of file
+${enabledPnfdInfoId}  40853bda-8a8f-4f63-9130-cef439f65348
+${NFVO_FIELDS}    1
+${fields}    _links
+${ACCEPT_PLAIN}    text/plain
+${CONTENT_TYPE_PLAIN}    text/plain
+${erroneous_pnfdId}    erroneousPnfdId
+${onboardingStatePnfdId}    8ed2bf1f-f6ae-4d18-b478-bfab02fd4cd2
+${contentFile}    files/pnfdContent.zip
+${creatingPnfdId}    2e4ce0ef-3ea8-49f9-92dd-8771866015bb
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/environment/subscriptions.txt b/SOL005/NSDManagement-API/environment/subscriptions.txt
new file mode 100644
index 00000000..63a33d5e
--- /dev/null
+++ b/SOL005/NSDManagement-API/environment/subscriptions.txt
@@ -0,0 +1,4 @@
+*** Variables ***
+${filter_ok}      callbackUri=http://127.0.0.1/subscription
+${filter_ko}      nfvId=f9f130e4-05eb-4082-a676-4c97d13a883d    # Not existant filter attribute-based
+${NFVO_DUPLICATION}    0
diff --git a/SOL005/NSDManagement-API/environment/variables.txt b/SOL005/NSDManagement-API/environment/variables.txt
new file mode 100644
index 00000000..c758145e
--- /dev/null
+++ b/SOL005/NSDManagement-API/environment/variables.txt
@@ -0,0 +1,7 @@
+
+*** Variables ***
+${callback_uri}    http://localhost
+${callback_port}    9091
+${callback_endpoint}    /endpoint
+${callback_endpoint_error}    /endpoint_404
+${sleep_interval}    20s
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/notifications/NsdChangeNotification.json b/SOL005/NSDManagement-API/jsons/notifications/NsdChangeNotification.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/NsdChangeNotification.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/notifications/NsdDeletionNotification.json b/SOL005/NSDManagement-API/jsons/notifications/NsdDeletionNotification.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/NsdDeletionNotification.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingFailureNotification.json b/SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingFailureNotification.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingFailureNotification.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingNotification.json b/SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingNotification.json
new file mode 100644
index 00000000..7266cf06
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/NsdOnBoardingNotification.json
@@ -0,0 +1,8 @@
+{
+"_links": "",
+"id": "",
+"notificationType": "",
+"nsdId": "",
+"nsdInfoId": "",
+"timeStamp": ""
+}
diff --git a/SOL005/NSDManagement-API/jsons/notifications/PnfdDeletionNotification.json b/SOL005/NSDManagement-API/jsons/notifications/PnfdDeletionNotification.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/PnfdDeletionNotification.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingFailureNotification.json b/SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingFailureNotification.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingFailureNotification.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingNotification.json b/SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingNotification.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/notifications/PnfdOnBoardingNotification.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/SOL005/NSDManagement-API/jsons/subscriptions.json b/SOL005/NSDManagement-API/jsons/subscriptions.json
new file mode 100644
index 00000000..ccf9f514
--- /dev/null
+++ b/SOL005/NSDManagement-API/jsons/subscriptions.json
@@ -0,0 +1,3 @@
+{
+	"callbackUri": "http://127.0.0.1/subscribe"
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/IndividualSubscription.robot b/SOL005/VNFPackageManagement-API/IndividualSubscription.robot
new file mode 100644
index 00000000..1a14bd04
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/IndividualSubscription.robot
@@ -0,0 +1,91 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/individualSubscription.txt
+Library           OperatingSystem
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Individual Subscription
+    Log    Trying to get a single subscription identified by subscriptionId
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PkgmSubscription.schema.json    ${json}
+    Log    Validated PkgmSubscription schema
+
+GET Subscription - Negative (Not Found)
+    Log    Trying to perform a request on a subscriptionID which doesn't exist
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${erroneousSubscriptionId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+DELETE Subscription
+    Log    Trying to perform a DELETE on a subscriptionId
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    204
+    Log    Received 204 No Content as expected
+    Comment    Log    Trying to get the deleted element
+    Comment    Create HTTP Context    ${NFVO_HOST}:${NFVO_PORT}    ${NFVO_SCHEMA}
+    Comment    Set Request Header    Accept    ${ACCEPT_JSON}
+    Comment    Run Keyword If    ${AUTH_USAGE} == 1    Set Request Header    Authorization    ${AUTHORIZATION}
+    Comment    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Comment    Response Status Code Should Equal    404
+    Comment    Log    The subscriptionId is not present in database
+
+DELETE Subscription - Negative (Not Found)
+    Log    Trying to perform a DELETE on a subscriptionId which doesn't exist
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${erroneousSubscriptionId}
+    Integer    response status    404
+    Log    The subscriptionId is not present in database
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+PUT Subscription - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Subscription - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+POST Subscription - (Method not implemented)
+    Log    Trying to perform a POST. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/IndividualVNFPackage.robot b/SOL005/VNFPackageManagement-API/IndividualVNFPackage.robot
new file mode 100644
index 00000000..853cf653
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/IndividualVNFPackage.robot
@@ -0,0 +1,113 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/individualVnfPackage.txt
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Individual VNF Package
+    Log    Trying to get a VNF Package present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${vnfPkgInfo}=    Output    response body
+    ${json}=    evaluate    json.loads('''${vnfPkgInfo}''')    json
+    Validate Json    vnfPkgInfo.schema.json    ${json}
+    Log    Validation OK
+
+GET Individual VNF Package - Negative (Not Found)
+    Log    Trying to perform a negative get, using wrong authorization bearer
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPackageId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+    
+    
+PATCH Individual VNF Package
+    Log    Trying to perform a PATCH. This method updates the information of a VNF package.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=    Load JSON From File    jsons/VnfPkgInfoModifications.json
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}    ${body}
+    Integer    response status    200
+    Log    Received 200 OK as expected
+    Log    Trying to validate VnfPkgInfoModification
+    ${response}=    Output    response body
+    ${json}=    evaluate    json.loads('''${response}''')    json
+    Validate Json    VnfPkgInfoModification.schema.json    ${json}
+    Log    Validation OK
+    
+    
+PATCH Individual VNF Package - Negative (Conflict on the state of the resource)
+    Log    Trying to perform a PATCH, disabling a package already disabled
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=    Load JSON From File    jsons/VnfPkgInfoModificationsDisabled.json
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${disabledVnfPackageId}    ${body}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    Log    Trying to validate ProblemDetails
+    ${response}=    Output    response body
+    ${json}=    evaluate    json.loads('''${response}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK    
+    
+
+DELETE Individual VNF Package
+    [Documentation]    This method shall follow the provisions specified in the Tables 9.4.3.3.5-1 and 9.4.3.3.5-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a DELETE. This method deletes an individual VNF package resource.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${disabledVnfPackageId}
+    Integer    response status    204
+    Log    Received 204 No Content as expected
+    
+    
+    
+DELETE Individual VNF Package - Negative (Conflict on the state of the resource)
+    [Documentation]    This method shall follow the provisions specified in the Tables 9.4.3.3.5-1 and 9.4.3.3.5-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a DELETE trying to delete a resource which operational status is ENABLED.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    Log    Trying to validate ProblemDetails
+    ${response}=    Output    response body
+    ${json}=    evaluate    json.loads('''${response}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK    
+    
+    
+POST Individual VNF Package - (Method not implemented)
+    Log    Trying to perform a POST (method should not be implemented)
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT Individual VNF Package - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+
diff --git a/SOL005/VNFPackageManagement-API/Notifications.robot b/SOL005/VNFPackageManagement-API/Notifications.robot
new file mode 100644
index 00000000..420c3c61
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/Notifications.robot
@@ -0,0 +1,116 @@
+*** Setting ***
+Resource	environment/variables.txt
+Suite Setup    Create Sessions
+Suite Teardown    Terminate All Processes    kill=true
+Library    MockServerLibrary
+Library    Process
+Library    OperatingSystem
+Library    BuiltIn
+Library    Collections
+Library    String
+
+
+*** Test Cases ***
+Check Notification Endpoint
+    &{req}=  Create Mock Request Matcher	GET  ${callback_endpoint}    
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Verify Mock Expectation  ${req}
+    Clear Requests  ${callback_endpoint}
+    
+Post VNF Package Onboarding Notification
+    ${json}=	Get File	schemas/PackageOnboardingNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle  VNF Package Onboarding Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+
+Post VNF Package Onboarding Notification Negative 404 
+    ${json}=	Get File	schemas/ProblemDetails.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle VNF Package Onboarding Notification to handle 404 error
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint_error}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=404
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+
+Post VNF Package Change Notification
+    ${json}=	Get File	schema/PackageChangeNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle Package Change Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+
+Post Package Change Notification Negative 404 
+    ${json}=	Get File	schemas/ProblemDetails.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle Package Change Notification to handle 404 error
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint_error}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=404
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+PUT VNF Package Management Notification 
+    Log  PUT Method not implemented
+    &{req}=  Create Mock Request Matcher	PUT  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+PATCH VNF Package Management Notification 
+    Log  PATCH Method not implemented
+    &{req}=  Create Mock Request Matcher	PATCH  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+DELETE VNF Package Management Notification 
+    Log  PATCH Method not implemented
+    &{req}=  Create Mock Request Matcher	DELETE  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+
+*** Keywords ***
+Create Sessions
+    Start Process  java  -jar  ../../bin/mockserver-netty-5.3.0-jar-with-dependencies.jar  -serverPort  ${callback_port}  alias=mockInstance
+    Wait For Process  handle=mockInstance  timeout=5s  on_timeout=continue
+    Create Mock Session  ${callback_uri}:${callback_port}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/Subscriptions.robot b/SOL005/VNFPackageManagement-API/Subscriptions.robot
new file mode 100644
index 00000000..d74b799c
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/Subscriptions.robot
@@ -0,0 +1,139 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/subscriptions.txt
+Library           OperatingSystem
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Subscription
+    Log    Trying to get the list of subscriptions
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PkgmSubscriptions.schema.json    ${json}
+    Log    Validated PkgmSubscription schema
+
+GET Subscription - Filter
+    Log    Trying to get the list of subscriptions using filters
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions?${filter_ok}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PkgmSubscriptions.schema.json    ${json}
+    Log    Validated PkgmSubscription schema
+
+GET Subscription - Negative Filter
+    Log    Trying to get the list of subscriptions using filters with wrong attribute name
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions?${filter_ok}
+    Integer    response status    400
+    Log    Received a 400 Bad Request as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET Subscription - Negative (Not Found)
+    Log    Trying to perform a request on a Uri which doesn't exist
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscription
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST Subscription
+    Log    Trying to create a new subscription
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/subscriptions.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+    Log    Response has header Location
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PkgmSubscription.schema.json    ${json}
+    Log    Validation of PkgmSubscription OK
+
+POST Subscription - DUPLICATION
+    Log    Trying to create a subscription with an already created content
+    Pass Execution If    ${NFVO_DUPLICATION} == 0    NFVO is not permitting duplication. Skipping the test
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/subscriptions.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+    Log    Response has header Location
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PkgmSubscription.schema.json    ${json}
+    Log    Validation of PkgmSubscription OK
+
+POST Subscription - NO DUPLICATION
+    Log    Trying to create a subscription with an already created content
+    Pass Execution If    ${NFVO_DUPLICATION} == 1    NFVO is permitting duplication. Skipping the test
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    ${body}=    Get File    json/subscriptions.json
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body}
+    Integer    response status    303
+    Log    Received 303 See Other as expected
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+    Log    Response header contains Location
+
+PUT Subscription - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Subscription - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE Subscription - (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/VNFDInIndividualVNFPackage.robot b/SOL005/VNFPackageManagement-API/VNFDInIndividualVNFPackage.robot
new file mode 100644
index 00000000..fe149c08
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/VNFDInIndividualVNFPackage.robot
@@ -0,0 +1,114 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/vnfdInIndividualVnfPackage.txt
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET VNFD in Individual VNF Package (PLAIN)
+    Log    Trying to get a VNFD from a given VNF Package present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgPlainVNFD}/vnfd
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_PLAIN}
+
+GET VNFD in Individual VNF Package (ZIP)
+    Log    Trying to get a VNFD from a given VNF Package present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgZipVNFD}/vnfd
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_ZIP}
+
+GET VNFD in Individual VNF Package (PLAIN-ZIP)
+    Log    Trying to get a VNFD from a given VNF Package present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgZipVNFD}/vnfd
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Run Keyword If    ${NFVO_PLAIN} == 0    Should Contain    ${contentType}    ${CONTENT_TYPE_ZIP}
+    Run Keyword If    ${NFVO_PLAIN} == 1    Should Contain    ${contentType}    ${CONTENT_TYPE_PLAIN}
+
+GET VNFD in Individual VNF Package - Negative (PLAIN/ZIP)
+    Log    Trying to get a negative case performing a get on a VNFD from a given VNF Package present in the NFVO Catalogue. Accept will be text/plain but VNFD is composed my multiple files.
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgZipVNFD}/vnfd
+    Integer    response status    406
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET VNFD in Individual VNF Package - Negative (Not Found)
+    Log    Trying to perform a negative get, using an erroneous package ID
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/vnfd
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET VNFD in Individual VNF Package - Negative (onboardingState issue)
+    Log    Trying to get a VNFD from a given VNF Package present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_PLAIN}"}
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${onboardingStateVnfPkgId}/vnfd
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST VNFD in Individual VNF Package (Method not implemented)
+    Log    Trying to perform a POST (method should not be implemented)
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/vnfd
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT VNFD in Individual VNF Package (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/vnfd
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH VNFD in Individual VNF Package (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/vnfd
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE VNFD in Individual VNF Package (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization: "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/VNFPackageArtifacts.robot b/SOL005/VNFPackageManagement-API/VNFPackageArtifacts.robot
new file mode 100644
index 00000000..e30759f7
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/VNFPackageArtifacts.robot
@@ -0,0 +1,109 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/vnfPackageArtifacts.txt
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET VNF Package Artifact
+    Log    Trying to get a VNF Package Artifact
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_OCTET}
+
+GET VNF Package Artifact - Range
+    Log    Trying to get an Artifact using RANGE Header and using an NFVO that can handle it
+    Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    206
+    Log    Received 206 Partial Content as expected.
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Content-Range
+    Should Contain    ${headers}    Content-Length
+
+GET VNF Package Artifact - NFVO No RANGE
+    Log    Trying to get an Artifact using RANGE Header and using an NFVO that cannot handle it
+    Pass Execution If    ${NFVO_RANGE_OK} == 1    Skipping this test as NFVO is able to handle partial Requests.
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    200
+    Log    Received 200 OK as expected. The content is all available on this request. RANGE request has been ignored.
+
+GET VNF Package Artifact - Negative Range
+    Log    Trying to get a range of bytes of the limit of the VNF Package
+    Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    416
+    Log    Received 416 Range not satisfiable as expected.
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET VNF Package Artifact- Negative (Not Found)
+    Log    Trying to perform a negative get, using an erroneous package ID
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET VNF Package Artifact - Negative (onboardingState issue)
+    Log    Trying to get a VNF Package artifact present in the NFVO Catalogue, but not in ONBOARDED operationalStatus
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST VNF Package Artifact - (Method not implemented)
+    Log    Trying to perform a POST (method should not be implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT VNF Package Artifact - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH VNF Package Artifact - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE VNF Package Artifact - (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/artifacts/${artifactPath}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/VNFPackageContent.robot b/SOL005/VNFPackageManagement-API/VNFPackageContent.robot
new file mode 100644
index 00000000..7a523f1b
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/VNFPackageContent.robot
@@ -0,0 +1,144 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/vnfPackageContent.txt
+Library           JSONLibrary
+Library           OperatingSystem    
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET VNF Package Content
+    Log    Trying to get a VNF Package Content
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/package_content
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_ZIP}
+
+GET VNF Package Content - Range
+    Log    Trying to get a VNF Package Content using RANGE using an NFVO that can handle it
+    Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/package_content
+    Integer    response status    206
+    Log    Received 206 Partial Content as expected.
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Content-Range
+    Log    Header Content-Range is present
+    Should Contain    ${headers}    Content-Length
+    Log    Header Content-Length is present
+
+GET VNF Package Content - Range NFVO No RANGE
+    Log    Trying to get a VNF Package Content using RANGE using an NFVO that can handle it
+    Pass Execution If    ${NFVO_RANGE_OK} == 1    Skipping this test as NFVO is able to handle partial Requests.
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Set Headers    {"Range": "${range}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/package_content
+    Integer    response status    200
+    Log    Received 200 OK as expected. The content is all available on this request. RANGE request has been ignored.
+
+GET VNF Package Content - Negative Range
+    Log    Trying to get a range of bytes of the limit of the VNF Package
+    Pass Execution If    ${NFVO_RANGE_OK} == 0    Skipping this test as NFVO is not able to handle partial Requests.
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Set Headers    {"Range": "${erroneousRange}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/package_content
+    Integer    response status    416
+    Log    Received 416 Range not satisfiable as expected.
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET VNF Package Content - Negative (Not Found)
+    Log    Trying to perform a negative get, using an erroneous package ID
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${erroneousVnfPkgId}/package_content
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET VNF Package Content - Negative (onboardingState issue)
+    Log    Trying to get a VNF Package content present in the NFVO Catalogue, but not in ONBOARDED operationalStatus
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${onboardingStateVnfPkgId}/package_content
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+
+PUT VNF Package Content 
+    Log    Trying to perform a PUT. This method uploads the content of a VNF package.
+    Set Headers    {"Contet-Type": "${CONTENT_TYPE_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${content}=    Get Binary File     files/vnfPackage.zip
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content    ${content}
+    Integer    response status    202
+    Log    Received 202 Accepted as expected
+    Log    Verification of body. Should be empty
+    ${body}=    Output    response body
+    Should Be Empty    ${body}
+    Log    Verified empty body OK    
+
+
+PUT VNF Package Content - Negative (Conflict on onboarding status not in CREATED)
+    Log    Trying to perform a PUT. This method uploads the content of a VNF package.
+    Set Headers    {"Contet-Type": "${CONTENT_TYPE_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${content}=    Get Binary File     files/vnfPackage.zip
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${creatingVnfPackageId}/package_content    ${content}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+    
+
+POST VNF Package Content - (Method not implemented)
+    Log    Trying to perform a POST (method should not be implemented)
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+
+PATCH VNF Package Content - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE VNF Package Content - (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/VNFPackageContentViaURI.robot b/SOL005/VNFPackageManagement-API/VNFPackageContentViaURI.robot
new file mode 100644
index 00000000..77898996
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/VNFPackageContentViaURI.robot
@@ -0,0 +1,70 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/vnfPackageContent.txt
+Library           JSONLibrary
+Library           OperatingSystem    
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+POST VNF Package Content 
+    [Documentation]    This method shall follow the provisions specified in the Tables 9.4.6.3.1-1 and 9.4.6.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a POST. The POST method provides the information for the NFVO to get the content of a VNF package.
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=    Get Binary File    jsons/UploadVnfPkgFromUriRequest.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content/upload_from_uri    ${body}
+    Integer    response status    202
+    Log    Received 202 Accepted as expected
+    ${response}=    Output    response body
+    Should Be Empty    ${response} 
+
+
+POST VNF Package Content - Negative (VNF Package not in CREATED operational state)
+    [Documentation]    This method shall follow the provisions specified in the Tables 9.4.6.3.1-1 and 9.4.6.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a POST. The POST method provides the information for the NFVO to get the content of a VNF package.
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=    Get Binary File    jsons/UploadVnfPkgFromUriRequest.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${creatingVnfPackageId}/package_content/upload_from_uri    ${body}
+    Integer    response status    409
+    Log    Received 409 Conflict as expected
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK     
+    
+    
+GET VNF Package Content - (Method not implemented)
+    Log    Trying to perform a GET. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPkgId}/package_content/upload_from_uri
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+    
+    
+PUT VNF Package Content - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content/upload_from_uri
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH VNF Package Content - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content/upload_from_uri
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE VNF Package Content - (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_ZIP}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages/${vnfPackageId}/package_content/upload_from_uri
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/VNFPackages.robot b/SOL005/VNFPackageManagement-API/VNFPackages.robot
new file mode 100644
index 00000000..f058f86a
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/VNFPackages.robot
@@ -0,0 +1,248 @@
+*** Settings ***
+Resource          environment/vnfPackages.txt    # VNF Packages specific parameters
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET all Packages
+    [Documentation]    This method shall follow the provisions specified in the Tables 9.4.2.3.1-1 and 9.4.2.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    vnfPkgsInfo.schema.json    ${json}
+    Log    Validation OK
+    Log    Checking missing information for softwareImages element
+    ${softwareImages}=    Get Value From Json    ${json}    $..softwareImages
+    Should Be Empty    ${softwareImages}
+    Log    softwareImages element is missing as excepted
+    Log    Checking missing information for additionalArtifact element
+    ${additional_artifacts}=    Get Value From Json    ${json}    $..additionalArtifacts
+    Should Be Empty    ${additional_artifacts}
+    Log    additionalArtifact element is missing as excepted
+    Log    Checking missing information for _links element
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Should Be Empty    ${links}
+    Log    _links element is missing as excepted
+
+GET all Packages - Filter
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using filter params
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?${POS_FIELDS}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    vnfPkgsInfo.schema.json    ${json}
+    Log    Validation OK
+
+GET all Packages - Negative (wronge filter name)
+    Log    Trying to perform a negative get, filtering by the inexistent field 'nfvId'
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?${NEG_FIELDS}
+    Integer    response status    400
+    Log    Received 400 Bad Request as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET all Packages - Negative (Unauthorized: Wrong Token)
+    Log    Trying to perform a negative get, using wrong authorization bearer
+    Pass Execution If    ${AUTH_USAGE} == 0    Skipping test as NFVO is not supporting authentication
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Authorization": "${NEG_AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages
+    Integer    response status    401
+    Log    Received 401 Unauthorized as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET all Packages - Negative (Unauthorized: No Token)
+    Log    Trying to perform a negative get, using wrong authorization bearer
+    Pass Execution If    ${AUTH_USAGE} == 0    Skipping test as NFVO is not supporting authentication
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages
+    Integer    response status    401
+    Log    Received 401 Unauthorized as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET all Packages - all_fields
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using filter params
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?all_fields
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${vnfPkgInfos}=    Output    response body
+    ${json}=    evaluate    json.loads('''${vnfPkgInfos}''')    json
+    Log    Trying to validate response
+    Validate Json    vnfPkgsInfo.schema.json    ${json}
+    Log    Validation OK
+    Log    Trying to validate softwareImages schema
+    ${softwareImages}=    Get Value From Json    ${json}    $..softwareImages
+    Validate Json    softwareImage.schema.json    ${softwareImages[0]}
+    Log    Validation for softwareImage schema OK
+    Log    Trying to validate additionalArtifacts schema
+    ${additional_artifacts}=    Get Value From Json    ${json}    $..additionalArtifacts
+    Validate Json    additionalArtifacts.schema.json    ${additional_artifacts[0]}
+    Log    Validation for additionalArtifacts schema OK
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Validate Json    links.schema.json    ${links[0]}
+    Log    Validation for _links schema OK
+
+GET all Packages - exclude_default
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using exclude_default filter.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?exclude_default
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${vnfPkgInfos}=    Output    response body
+    ${json}=    evaluate    json.loads('''${vnfPkgInfos}''')    json
+    Log    Trying to validate response
+    Validate Json    vnfPkgsInfo.schema.json    ${json}
+    Log    Validation OK
+    Log    Checking missing information for softwareImages element
+    ${softwareImages}=    Get Value From Json    ${json}    $..softwareImages
+    Should Be Empty    ${softwareImages}
+    Log    softwareImages element is missing as excepted
+    Log    Checking missing information for additionalArtifact element
+    ${additional_artifacts}=    Get Value From Json    ${json}    $..additionalArtifacts
+    Should Be Empty    ${additional_artifacts}
+    Log    additionalArtifact element is missing as excepted
+    Log    Checking missing information for _links element
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Should Be Empty    ${links}
+    Log    _links element is missing as excepted
+
+GET all Packages - fields
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using filter params
+    Pass Execution If    ${NFVO_FIELDS} == 0    The NFVO is not able to use fields parameter
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?fields=${fields}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${vnfPkgInfos}=    Output    response body
+    ${json}=    evaluate    json.loads('''${vnfPkgInfos}''')    json
+    Log    Trying to validate response, checking vnfPkgInfo and other complex attributes included in the vnfPkgInfo
+    Validate Json    vnfPkgsInfo.schema.json    ${json}
+    Log    Validation for vnfPkgInfo OK
+    Log    Trying to validate softwareImages schema
+    ${softwareImages}=    Get Value From Json    ${json}    $..softwareImages
+    Validate Json    softwareImage.schema.json    ${softwareImages[0]}
+    Log    Validation for softwareImage schema OK
+    Log    Trying to validate additionalArtifacts schema
+    ${additional_artifacts}=    Get Value From Json    ${json}    $..additionalArtifacts
+    Validate Json    additionalArtifacts.schema.json    ${additional_artifacts[0]}
+    Log    Validation for additionalArtifacts schema OK
+
+GET all Packages - exclude_fields
+    Log    Trying to get all VNF Packages present in the NFVO Catalogue, using filter params
+    Pass Execution If    ${NFVO_FIELDS} == 0    The NFVO is not able to use exclude_fields option
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages?exlude_fields=${fields}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    ${vnfPkgInfos}=    Output    response body
+    ${json}=    evaluate    json.loads('''${vnfPkgInfos}''')    json
+    Log    Checking missing information for softwareImages element
+    ${softwareImages}=    Get Value From Json    ${json}    $..softwareImages
+    Should Be Empty    ${softwareImages}
+    Log    softwareImages element is missing as excepted
+    Log    Checking missing information for additionalArtifact element
+    ${additional_artifacts}=    Get Value From Json    ${json}    $..additionalArtifacts
+    Should Be Empty    ${additional_artifacts}
+    Log    additionalArtifact element is missing as excepted
+
+GET all PACKAGE (Negative: Not found)
+    Log    Trying to perform a GET on a erroneous URI
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/vnf_package
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST all VNF PACKAGE
+    [Documentation]    This method shall follow the provisions specified in the Tables 9.4.2.3.1-1 and 9.4.2.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Log    Trying to perform a POST to create a new individual VNF package resource
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=    Load JSON From File    jsons/CreateVnfPkgInfoRequest.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages    ${body}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    Log    Trying to get Location from the header
+    ${location}=    Output    response headers Location
+    Should Not Be Empty    ${location}
+    Log    Validation of Location headers OK
+    Log    Validation of the vnfPkgInfo schema
+    ${vnfPkgInfo}=    Output    response body
+    Log    Trying to validate response
+    ${json}=    evaluate    json.loads('''${vnfPkgInfo}''')    json
+    Validate Json    vnfPkgInfo.schema.json    ${json}
+
+PUT all PACKAGE (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH all PACKAGE (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE all PACKAGE (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/vnf_packages
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPackageManagement-API/environment/generic.txt b/SOL005/VNFPackageManagement-API/environment/generic.txt
new file mode 100644
index 00000000..aee1052a
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/generic.txt
@@ -0,0 +1,19 @@
+*** Variables ***
+${VNFM_HOST}      localhost    # Hostname of the VNFM
+${VNFM_PORT}      8080    # Listening port of the VNFM
+${NFVO_HOST}      localhost    # Hostname of the NFVO
+${NFVO_PORT}      8081    # Listening port of the NFVO
+${VNFM_SCHEMA}    https
+${NFVO_SCHEMA}    https
+${AUTHORIZATION}    Bearer 0b79bab50daca910b000d4f1a2b675d604257e42
+${CONTENT_TYPE_JSON}    application/json
+${ACCEPT_JSON}    application/json
+${apiRoot}        /
+${AUTH_USAGE}     1
+${NEG_AUTHORIZATION}    Bearer negativetoken
+${apiVersion}     v1
+${apiName}        vnfpkgm
+${FIELD_USAGE}    1
+${NFVO_PLAIN}     1
+${NFVO_FIELDS}    1
+${vnfPackageId}  788106a2-d692-44f3-a86d-384f0ce35e42
diff --git a/SOL005/VNFPackageManagement-API/environment/individualSubscription.txt b/SOL005/VNFPackageManagement-API/environment/individualSubscription.txt
new file mode 100644
index 00000000..23ed0f47
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/individualSubscription.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${subscriptionId}    f3ae6df7-07e1-47c9-8924-9ebe10343586
+${erroneousSubscriptionId}    442e3ee5-0499-4849-9b31-eb91ce1638f1    # Not existing ID on the subscriptions
diff --git a/SOL005/VNFPackageManagement-API/environment/individualVnfPackage.txt b/SOL005/VNFPackageManagement-API/environment/individualVnfPackage.txt
new file mode 100644
index 00000000..a2655eac
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/individualVnfPackage.txt
@@ -0,0 +1,4 @@
+*** Variables ***
+${vnfPackageId}    4bbca710-c00e-11e8-b568-0800200c9a66
+${erroneousVnfPackageId}    erroneousVnfPackageId    # Given ID for vnfPkg not present in database
+${disabledVnfPackageId}    87a2c9d3-00ea-4032-8c67-a5106d001868
diff --git a/SOL005/VNFPackageManagement-API/environment/subscriptions.txt b/SOL005/VNFPackageManagement-API/environment/subscriptions.txt
new file mode 100644
index 00000000..63a33d5e
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/subscriptions.txt
@@ -0,0 +1,4 @@
+*** Variables ***
+${filter_ok}      callbackUri=http://127.0.0.1/subscription
+${filter_ko}      nfvId=f9f130e4-05eb-4082-a676-4c97d13a883d    # Not existant filter attribute-based
+${NFVO_DUPLICATION}    0
diff --git a/SOL005/VNFPackageManagement-API/environment/variables.txt b/SOL005/VNFPackageManagement-API/environment/variables.txt
new file mode 100644
index 00000000..c758145e
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/variables.txt
@@ -0,0 +1,7 @@
+
+*** Variables ***
+${callback_uri}    http://localhost
+${callback_port}    9091
+${callback_endpoint}    /endpoint
+${callback_endpoint_error}    /endpoint_404
+${sleep_interval}    20s
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/environment/vnfPackageArtifacts.txt b/SOL005/VNFPackageManagement-API/environment/vnfPackageArtifacts.txt
new file mode 100644
index 00000000..57893512
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/vnfPackageArtifacts.txt
@@ -0,0 +1,11 @@
+*** Variables ***
+${ACCEPT_ZIP}     application/zip
+${CONTENT_TYPE_ZIP}    application/zip
+${NFVO_RANGE_OK}    1    # If 1 means that Range is supported by the NFVO
+${erroneousVnfPkgId}    erroneousPkgId
+${vnfPkgId}       788106a2-d692-44f3-a86d-384f0ce35e42
+${erroneousRange}    bytes=100000-1000000    # Requesting a out of range number of bytes
+${onboardingStateVnfPkgId}    788106a2-d692-44f3-a86d-384f0ce35e42    # The VNF Package is in CREATED onboardingState
+${range}          bytes=0-1023
+${artifactPath}    artifactPath
+${CONTENT_TYPE_OCTET}    application/octet-stream
diff --git a/SOL005/VNFPackageManagement-API/environment/vnfPackageContent.txt b/SOL005/VNFPackageManagement-API/environment/vnfPackageContent.txt
new file mode 100644
index 00000000..fb6bb20d
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/vnfPackageContent.txt
@@ -0,0 +1,10 @@
+*** Variables ***
+${ACCEPT_ZIP}     application/zip
+${CONTENT_TYPE_ZIP}    application/zip
+${NFVO_RANGE_OK}    1    # If 1 means that Range is supported by the NFVO
+${erroneousVnfPkgId}    erroneousPkgId
+${vnfPkgId}       788106a2-d692-44f3-a86d-384f0ce35e42
+${erroneousRange}    bytes=100000-1000000    # Requesting a out of range number of bytes
+${onboardingStateVnfPkgId}    f9f130e4-05eb-4082-a676-4c97d13a883d    # The VNF Package is in CREATED onboardingState
+${range}          bytes=0-1023
+${creatingVnfPackageId}    d246ccdd-71aa-402f-b256-6a80ee54be3d
diff --git a/SOL005/VNFPackageManagement-API/environment/vnfPackages.txt b/SOL005/VNFPackageManagement-API/environment/vnfPackages.txt
new file mode 100644
index 00000000..ec8ef4fc
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/vnfPackages.txt
@@ -0,0 +1,5 @@
+*** Variables ***
+${POS_FIELDS}     vnfdId=41fdd38a-3d4c-465c-83e0-f80e014425f8 ,vnfProvider=NXW    # Positive case, suing compiant fields name for filtering get request
+${NEG_FIELDS}     nfvId=41fdd38a-3d4c-465c-83e0-f80e014425f8    # Negative case, using wrong name of field
+${CAN_FILTER}     1    # NFVO in able to use filters when retrieving VNF Packages
+${fields}         softwareImages,additionalArtifacts
diff --git a/SOL005/VNFPackageManagement-API/environment/vnfdInIndividualVnfPackage.txt b/SOL005/VNFPackageManagement-API/environment/vnfdInIndividualVnfPackage.txt
new file mode 100644
index 00000000..519a2794
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/environment/vnfdInIndividualVnfPackage.txt
@@ -0,0 +1,11 @@
+*** Variables ***
+${ACCEPT_PLAIN}    text/plain
+${ACCEPT_ZIP}     application/zip
+${CONTENT_TYPE_PLAIN}    text/plain
+${CONTENT_TYPE_ZIP}    application/zip
+${NFVO_VNFD_PLAIN}    1
+${NFVO_VNFD_ZIP}    0
+${vnfPkgPlainVNFD}    c26ad7fb-072b-48c4-a663-7d71646d9e98    # The VNF Pakcage contains a VNFD which is a Single Plain File
+${vnfPkgZipVNFD}    f5b220d4-6177-4ebb-a554-a43311e16075    # The VNF Package contains a VNFD composed by multiple files
+${erroneousVnfPkgId}    erroneousPkgId
+${onboardingStateVnfPkgId}    788106a2-d692-44f3-a86d-384f0ce35e42    # The VNF Package is in CREATED onboardingState
diff --git a/SOL005/VNFPackageManagement-API/jsons/CreateVnfPkgInfoRequest.json b/SOL005/VNFPackageManagement-API/jsons/CreateVnfPkgInfoRequest.json
new file mode 100644
index 00000000..87845130
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/CreateVnfPkgInfoRequest.json
@@ -0,0 +1,3 @@
+{
+	"userDefinedData": {}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/jsons/PkgmSubscription.json b/SOL005/VNFPackageManagement-API/jsons/PkgmSubscription.json
new file mode 100644
index 00000000..c01e92b4
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/PkgmSubscription.json
@@ -0,0 +1,414 @@
+[
+  {
+    "id": "ABCDEFGHIJKL",
+    "callbackUri": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+    "_links": {
+      "self": {
+        "href": "ABCDEFGHIJKLMNOPQR"
+      }
+    },
+    "filter": {
+      "notificationTypes": [
+        "VnfPackageChangeNotification"
+      ],
+      "vnfProductsFromProviders": [
+        {
+          "vnfProvider": "ABCDEFGHIJKLMNOPQRSTUVW",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGHIJKLMNOPQRSTUVWX",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQ",
+                    "ABCDE"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+                  ]
+                }
+              ]
+            },
+            {
+              "vnfProductName": "ABCDEFGHIJKLM",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMN",
+                  "vnfdVersions": [
+                    "ABCDEF",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNO",
+                    "ABCDEFGH",
+                    "ABCDEF"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCD",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXY",
+                    "ABCDEFGHIJ",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRST",
+                  "vnfdVersions": [
+                    "ABCDEFG",
+                    "ABCDEFGHIJKLMNOPQRSTU"
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "vnfProvider": "ABCDEF",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGH",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRST",
+                  "vnfdVersions": [
+                    "ABCDE",
+                    "ABCDE",
+                    "ABCDEFGHIJKLMNOPQR"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWX",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOP"
+                  ]
+                }
+              ]
+            },
+            {
+              "vnfProductName": "ABCDE",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNO",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJ",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRS"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJK",
+                  "vnfdVersions": [
+                    "ABCD"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCD",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKL",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+                  ]
+                }
+              ]
+            },
+            {
+              "vnfProductName": "ABCD",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRST",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQ",
+                    "ABCDEFGHIJKL"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXY",
+                  "vnfdVersions": [
+                    "ABCDEF",
+                    "ABCDEFGHIJKLMNOPQRST"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEF",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                    "ABCDEFGHIJKLMNOPQR",
+                    "ABCDEFGHIJKLMNOP"
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "vnfdId": [
+        "ABCDEFGHIJKLMNOPQRS",
+        "ABCDEFGHIJKLMNO",
+        "ABCDEFGHIJKLM",
+        "ABCDEFGHIJK"
+      ],
+      "vnfPkgId": [
+        "ABCDEFGH",
+        "ABCDEFGHIJKLMNOPQ",
+        "ABCDE",
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+      ],
+      "operationalState": "DISABLED",
+      "usageState": {}
+    }
+  },
+  {
+    "id": "ABCDE",
+    "callbackUri": "ABCDEFGHIJKLM",
+    "_links": {
+      "self": {
+        "href": "ABCDEFGHIJKLMNOPQRSTU"
+      }
+    },
+    "filter": {
+      "notificationTypes": [
+        "VnfPackageOnboardingNotification",
+        "VnfPackageOnboardingNotification",
+        "VnfPackageOnboardingNotification"
+      ],
+      "vnfProductsFromProviders": [
+        {
+          "vnfProvider": "ABCDEFGH",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGHIJKLMNOPQRSTUV",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCD",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMN",
+                    "ABCDEFGHIJKLMNOPQRSTUVW",
+                    "ABCDE",
+                    "ABCDEFGHIJKLMNOPQRS"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRS"
+                  ]
+                }
+              ]
+            },
+            {
+              "vnfProductName": "ABCDEFGHIJKLMN",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOP",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJ",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                    "ABCDEFGHIJKLMNOPQRSTUVWX",
+                    "ABCDEFGHIJKLMNOPQR"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMN",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNO",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+                    "ABCDEFGHIJKLMNOPQRSTUVW"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEF",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLM",
+                    "ABCDE",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZA"
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "vnfProvider": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGHIJKLMNOPQ",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXY",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQ",
+                    "ABCDE"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMN",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWX",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+                  ]
+                }
+              ]
+            },
+            {
+              "vnfProductName": "ABCDEFGHIJKLMNOP",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCD",
+                  "vnfdVersions": [
+                    "ABCDEFGH",
+                    "ABCDEFGHIJKLMN",
+                    "ABCDEFGHIJKLMNOP"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLM",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLM",
+                    "ABCDEFGH"
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "vnfdId": [
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+        "ABCDEFGHIJKLM",
+        "ABCDEFGHIJKLMNOPQRS",
+        "ABCDEFGHIJKL"
+      ],
+      "vnfPkgId": [
+        "ABCDEFGHIJKLMNOPQRSTUVWXY"
+      ],
+      "operationalState": "DISABLED",
+      "usageState": {}
+    }
+  },
+  {
+    "id": "ABCDEF",
+    "callbackUri": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+    "_links": {
+      "self": {
+        "href": "ABCDEFGHIJKLMNOPQ"
+      }
+    },
+    "filter": {
+      "notificationTypes": [
+        "VnfPackageChangeNotification",
+        "VnfPackageOnboardingNotification",
+        "VnfPackageChangeNotification",
+        "VnfPackageOnboardingNotification"
+      ],
+      "vnfProductsFromProviders": [
+        {
+          "vnfProvider": "ABCDEFGHIJKL",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGHIJK",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDE",
+                  "vnfdVersions": [
+                    "ABCDEFGHI",
+                    "ABCDEFGHIJKLMNOPQRS",
+                    "ABCDEFGHIJKLMNOPQR"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWX",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWX",
+                    "ABCDEFG",
+                    "ABCDEFGHIJKLMNOPQRSTUVW",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXY"
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "vnfProvider": "ABCDEFGHI",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGHIJ",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKL",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                    "ABCDEFGHIJKL",
+                    "ABCDEFGHIJKLMNOPQR"
+                  ]
+                },
+                {
+                  "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQ",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                    "ABCDEFGHIJKLMNOPQRSTU",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                    "ABCDEFGHIJKLMN"
+                  ]
+                }
+              ]
+            }
+          ]
+        },
+        {
+          "vnfProvider": "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+          "vnfProducts": [
+            {
+              "vnfProductName": "ABCDEFGH",
+              "versions": [
+                {
+                  "vnfSoftwareVersion": "ABCDE",
+                  "vnfdVersions": [
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+                    "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+                    "ABCDEFGHIJKLMNOPQRS",
+                    "ABCDEFGHIJKLMNOPQRST"
+                  ]
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "vnfdId": [
+        "ABCDEFGHIJKLMNOP",
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZA"
+      ],
+      "vnfPkgId": [
+        "ABCDEFGHIJKLMNOPQRSTUVW",
+        "ABCDEFGHIJKLMNOPQ",
+        "ABCDEFGHIJKLMN"
+      ],
+      "operationalState": "ENABLED",
+      "usageState": [
+        773,
+        [
+          {},
+          [
+            false,
+            true
+          ],
+          null,
+          null
+        ]
+      ]
+    }
+  }
+]
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/jsons/UploadVnfPkgFromUriRequest.json b/SOL005/VNFPackageManagement-API/jsons/UploadVnfPkgFromUriRequest.json
new file mode 100644
index 00000000..f76054e5
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/UploadVnfPkgFromUriRequest.json
@@ -0,0 +1,3 @@
+{
+"addressInformation": "http://localhost/content.zip"
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModifications.json b/SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModifications.json
new file mode 100644
index 00000000..68757b0d
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModifications.json
@@ -0,0 +1,4 @@
+{
+	"userDefinedData":{},
+	"operationalState": "ENABLED"
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModificationsDisabled.json b/SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModificationsDisabled.json
new file mode 100644
index 00000000..74e8feff
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/VnfPkgInfoModificationsDisabled.json
@@ -0,0 +1,4 @@
+{
+	"userDefinedData":{},
+	"operationalState": "DISABLED"
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/jsons/subscriptions.json b/SOL005/VNFPackageManagement-API/jsons/subscriptions.json
new file mode 100644
index 00000000..d0dd3eef
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/subscriptions.json
@@ -0,0 +1,6 @@
+{
+	"callbackUri": "http://127.0.0.1/subscribe",
+	"filter": {
+		"vnfPkgId": "788106a2-d692-44f3-a86d-384f0ce35e42"
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/jsons/vnfPkgInfos.json b/SOL005/VNFPackageManagement-API/jsons/vnfPkgInfos.json
new file mode 100644
index 00000000..6edb7985
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/jsons/vnfPkgInfos.json
@@ -0,0 +1,313 @@
+[
+  {
+    "id": "ABCDEFGHIJKL",
+    "operationalState": "ENABLED",
+    "usageState": {},
+    "_links": {
+      "self": {
+        "href": "ABCDEFGHIJKLMNOPQR"
+      },
+      "packageContent": {
+        "href": "ABCDEFGHI"
+      },
+      "vnfd": {
+        "href": "ABCDEFGHIJKLMNOPQRSTUVWXYZA"
+      }
+    },
+    "vnfdId": "ABCD",
+    "vnfProvider": "ABCDEFGHIJKLMNOPQRS",
+    "vnfProductName": "ABCDEFGHIJKLMNOPQRS",
+    "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWX",
+    "vnfdVersion": "ABCDEFGHIJK",
+    "checksum": {
+      "algorithm": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+      "hash": "ABCDEFGHIJKLMN"
+    },
+    "softwareImages": [
+      {
+        "id": "ABCDEFGHIJKLMNO",
+        "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+        "provider": "ABCDE",
+        "version": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLM",
+          "hash": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+        },
+        "containerFormat": "AMI",
+        "diskFormat": "QCOW2",
+        "createdAt": "ABCDEFGHIJKLMNOP",
+        "minDisk": -14,
+        "minRam": 836,
+        "size": 698,
+        "imagePath": "ABCDEFGHIJKLMNOPQRSTUVWX",
+        "userMetadata": {}
+      },
+      {
+        "id": "ABCDEFGHIJKLMNOPQRSTUV",
+        "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+        "provider": "ABCDEFGHIJK",
+        "version": "ABCD",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOP",
+          "hash": "ABCDEFGHIJKLMNOP"
+        },
+        "containerFormat": "AMI",
+        "diskFormat": "VHDX",
+        "createdAt": "ABCDEFGHIJKLMNOPQRSTUVW",
+        "minDisk": 82,
+        "minRam": 460,
+        "size": 51,
+        "imagePath": "ABCDEFGHI",
+        "userMetadata": {}
+      },
+      {
+        "id": "ABCDEFGHIJK",
+        "name": "ABCDEFGHIJKLMNOPQRST",
+        "provider": "ABCDEFGHIJKLMN",
+        "version": "ABCDEFGHI",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRST",
+          "hash": "ABCDEFGHIJKLMNOPQRSTUVWX"
+        },
+        "containerFormat": "AKI",
+        "diskFormat": "VMDK",
+        "createdAt": "ABCDEFGHIJKLMNOPQRS",
+        "minDisk": 821,
+        "minRam": 358,
+        "size": 589,
+        "imagePath": "ABCDEFGHIJ",
+        "userMetadata": {}
+      }
+    ],
+    "additionalArtifacts": [
+      {
+        "artifactPath": "ABCDEFG",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQ",
+          "hash": "ABCDEFGHIJKLMNO"
+        },
+        "metadata": {}
+      },
+      {
+        "artifactPath": "ABCDEFGHIJ",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTU",
+          "hash": "ABCDEFGHIJKLMNO"
+        },
+        "metadata": {}
+      },
+      {
+        "artifactPath": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+        "checksum": {
+          "algorithm": "ABCD",
+          "hash": "ABCDEFGHIJKLMNOPQ"
+        },
+        "metadata": {}
+      }
+    ],
+    "onboardingState": "CREATED",
+    "userDefinedData": {}
+  },
+  {
+    "id": "ABCDEFGHIJKLMNOPQRS",
+    "operationalState": "DISABLED",
+    "usageState": 215,
+    "_links": {
+      "self": {
+        "href": "ABCDEFGHIJKLMNOPQRSTU"
+      },
+      "packageContent": {
+        "href": "ABCDEFGHIJKLMNO"
+      },
+      "vnfd": {
+        "href": "ABCDEF"
+      }
+    },
+    "vnfdId": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+    "vnfProvider": "ABCDEFGHIJKLMNOPQRST",
+    "vnfProductName": "ABCDEFGHIJKLMNOPQRST",
+    "vnfSoftwareVersion": "ABCDEFGHIJKLMNOPQRSTUVWXYZAB",
+    "vnfdVersion": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+    "checksum": {
+      "algorithm": "ABCDEFGHIJKLM",
+      "hash": "ABCDEFGHIJKLMNOPQRSTUVWXYZAB"
+    },
+    "softwareImages": [
+      {
+        "id": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+        "name": "ABCDEFGHIJKLMNOPQRSTU",
+        "provider": "ABCD",
+        "version": "ABCDEFGHIJKLMNOP",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNO",
+          "hash": "ABCDEFGHIJKLM"
+        },
+        "containerFormat": "DOCKER",
+        "diskFormat": "QCOW2",
+        "createdAt": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+        "minDisk": -98,
+        "minRam": 204,
+        "size": 587,
+        "imagePath": "ABCDEF",
+        "userMetadata": {}
+      },
+      {
+        "id": "ABCDE",
+        "name": "ABCDEFG",
+        "provider": "ABCDEFGH",
+        "version": "ABCDEFGHIJKLMNOPQRSTU",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUV",
+          "hash": "ABCDEFGHIJKLMNOPQRSTUVW"
+        },
+        "containerFormat": "DOCKER",
+        "diskFormat": "AKI",
+        "createdAt": "ABCDEFGHIJKLMNOP",
+        "minDisk": 87,
+        "minRam": 216,
+        "size": 262,
+        "imagePath": "ABCDEFGHIJK",
+        "userMetadata": {}
+      },
+      {
+        "id": "ABCD",
+        "name": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+        "provider": "ABCDEFGHIJKLMN",
+        "version": "ABCDEFGHIJKLMNOPQRSTUVW",
+        "checksum": {
+          "algorithm": "ABCDEFG",
+          "hash": "ABCDEFGHIJKLMNOPQRST"
+        },
+        "containerFormat": "AKI",
+        "diskFormat": "QCOW2",
+        "createdAt": "ABCDEFGHIJK",
+        "minDisk": 821,
+        "minRam": 335,
+        "size": 698,
+        "imagePath": "ABCDEFGHIJKLMNOPQRST",
+        "userMetadata": {}
+      },
+      {
+        "id": "ABCDEFG",
+        "name": "ABCDEFGHIJKLMNOPQRSTUVW",
+        "provider": "ABCDEFGHIJKLMNOPQR",
+        "version": "ABCDEFGHIJKLMNOPQRS",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUVW",
+          "hash": "ABCDEFGHIJ"
+        },
+        "containerFormat": "DOCKER",
+        "diskFormat": "QCOW2",
+        "createdAt": "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+        "minDisk": 709,
+        "minRam": 243,
+        "size": 351,
+        "imagePath": "ABCDEFG",
+        "userMetadata": {}
+      }
+    ],
+    "additionalArtifacts": [
+      {
+        "artifactPath": "ABCDEFGHIJKLMNOPQRSTUVWXYZA",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC",
+          "hash": "ABCDEFGHIJKLMN"
+        },
+        "metadata": {}
+      },
+      {
+        "artifactPath": "ABCDEFGHIJKLMNOPQRSTU",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUV",
+          "hash": "ABCDEFGHIJKLM"
+        },
+        "metadata": {}
+      }
+    ],
+    "onboardingState": "PROCESSING",
+    "userDefinedData": {}
+  },
+  {
+    "id": "ABCDE",
+    "operationalState": "ENABLED",
+    "usageState": 712,
+    "_links": {
+      "self": {
+        "href": "ABCDEFGHIJKLMNOPQRSTUVWX"
+      },
+      "packageContent": {
+        "href": "ABCDEFGHIJKLMNOPQRSTUVWXYZA"
+      },
+      "vnfd": {
+        "href": "ABCDEFGHIJKLMNOPQRS"
+      }
+    },
+    "vnfdId": "ABCDE",
+    "vnfProvider": "ABCD",
+    "vnfProductName": "ABCDEFGHIJKLMNOPQRSTUV",
+    "vnfSoftwareVersion": "ABCDEFGH",
+    "vnfdVersion": "ABCDEFGHIJKLMN",
+    "checksum": {
+      "algorithm": "ABCDEFGHIJKLMNOPQR",
+      "hash": "ABCDEFGHIJKLM"
+    },
+    "softwareImages": [
+      {
+        "id": "ABCDEFGHIJKLM",
+        "name": "ABCDEFGHIJKLM",
+        "provider": "ABCDEFGHIJKLMNOPQRSTUVWXYZAB",
+        "version": "ABCDEFGHIJKLM",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNO",
+          "hash": "ABCDEFGHIJKLMNOPQRSTUVWXYZAB"
+        },
+        "containerFormat": "OVA",
+        "diskFormat": "AKI",
+        "createdAt": "ABCDEFGHIJKLMNOPQRSTUVWXY",
+        "minDisk": 803,
+        "minRam": 888,
+        "size": 479,
+        "imagePath": "ABCDEFGH",
+        "userMetadata": {}
+      },
+      {
+        "id": "ABCD",
+        "name": "ABCDEFGH",
+        "provider": "ABCDEFGHIJKL",
+        "version": "ABCDEFGHIJKL",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUV",
+          "hash": "ABCDEFGH"
+        },
+        "containerFormat": "OVA",
+        "diskFormat": "AKI",
+        "createdAt": "ABCDEF",
+        "minDisk": 816,
+        "minRam": 366,
+        "size": 806,
+        "imagePath": "ABCDEFGHI",
+        "userMetadata": {}
+      }
+    ],
+    "additionalArtifacts": [
+      {
+        "artifactPath": "ABCDEFGHIJKLMNOPQR",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUVWX",
+          "hash": "ABCDEFGHIJKLMNOPQRSTUVWXYZABC"
+        },
+        "metadata": {}
+      },
+      {
+        "artifactPath": "ABCDEFGHIJKLMNOPQRSTUVW",
+        "checksum": {
+          "algorithm": "ABCDEFGHIJKLMNOPQRSTUVW",
+          "hash": "ABCDEFGHIJKLMNOPQRSTUVWXY"
+        },
+        "metadata": {}
+      }
+    ],
+    "onboardingState": "CREATED",
+    "userDefinedData": {}
+  }
+]
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/schemas/PackageChangeNotification.schema.json b/SOL005/VNFPackageManagement-API/schemas/PackageChangeNotification.schema.json
new file mode 100644
index 00000000..5cf4045f
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/schemas/PackageChangeNotification.schema.json
@@ -0,0 +1,97 @@
+{
+	"description": "This type represents a VNF package management notification, which informs the receiver of a change of the status in an on-boarded VNF package. Only changes in the \"operationalState\" attribute of an on-boarded VNF package and the deletion NF package will be reported. Changes in the \"usageState\" and \"onboardingState\" attributes are not reported. The notification shall be triggered by the NFVO when there is a change in the status of an onboarded VNF package, as follows: * The \"operationalState\" attribute of a VNF package has changed, and the\n  \"onboardingState\" attribute of the package has the value \"ONBOARDED\"\n  (i.e. the package has been onboarded previously).\n* The on-boarded VNF package has been deleted.\n",
+	"type": "object",
+	"required": [
+		"id",
+		"notificationType",
+		"timeStamp",
+		"vnfPkgId",
+		"vnfdId",
+		"changeType",
+		"_links"
+	],
+	"properties": {
+		"id": {
+			"description": "An identifier with the intention of being globally unique.\n",
+			"type": "string"
+		},
+		"notificationType": {
+			"description": "Discriminator for the different notification types.  Shall be set to \"VnfPackageChangeNotification\" for this notification type.\n",
+			"type": "string",
+			"enum": [
+				"VnfPackageChangeNotification"
+			]
+		},
+		"subscriptionId": {
+			"description": "An identifier with the intention of being globally unique.\n",
+			"type": "string"
+		},
+		"timeStamp": {
+			"description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+			"type": "string",
+			"format": "date-time"
+		},
+		"vnfPkgId": {
+			"description": "An identifier with the intention of being globally unique.\n",
+			"type": "string"
+		},
+		"vnfdId": {
+			"description": "An identifier with the intention of being globally unique.\n",
+			"type": "string"
+		},
+		"changeType": {
+			"description": "- OP_STATE_CHANGE: The \"operationalState\" attribute has been changed. - PKG_DELETE: The VNF package has been deleted.\n",
+			"type": "string",
+			"enum": [
+				"OP_STATE_CHANGE",
+				"PKG_DELETE"
+			]
+		},
+		"operationalState": {
+			"description": "- ENABLED: The VNF package is enabled, i.e. it can be used for\n  instantiation of new VNF instances.\n- DISABLED: The VNF package is disabled, i.e. it cannot be used for\n  further VNF instantiation requests (unless and until the VNF package\n  is re-enabled).\n",
+			"type": "string",
+			"enum": [
+				"ENABLED",
+				"DISABLED"
+			]
+		},
+		"_links": {
+			"description": "This type represents the links to resources that a VNF package management notification can contain.\n",
+			"type": "object",
+			"required": [
+				"vnfPackage",
+				"subscription"
+			],
+			"properties": {
+				"vnfPackage": {
+					"description": "This type represents a link to a resource.\n",
+					"type": "object",
+					"required": [
+						"href"
+					],
+					"properties": {
+						"href": {
+							"description": "URI of the referenced resource.\n",
+							"type": "string",
+							"format": "url"
+						}
+					}
+				},
+				"subscription": {
+					"description": "This type represents a link to a resource.\n",
+					"type": "object",
+					"required": [
+						"href"
+					],
+					"properties": {
+						"href": {
+							"description": "URI of the referenced resource.\n",
+							"type": "string",
+							"format": "url"
+						}
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPackageManagement-API/schemas/PackageOnboardingNotification.schema.json b/SOL005/VNFPackageManagement-API/schemas/PackageOnboardingNotification.schema.json
new file mode 100644
index 00000000..903f0bf4
--- /dev/null
+++ b/SOL005/VNFPackageManagement-API/schemas/PackageOnboardingNotification.schema.json
@@ -0,0 +1,80 @@
+{
+  "description": "This type represents a VNF package management notification, which informs the receiver that the onboarding process of a VNF package is complete and the package is ready for use. The notification shall be triggered by the NFVO when the \"onboardingState\" attribute of a new VNF package has changed to \"ONBOARDED\".",
+  "type": "object",
+  "required": [
+    "id",
+    "notificationType",
+    "timeStamp",
+    "vnfPkgId",
+    "vnfdId",
+    "_links"
+  ],
+  "properties": {
+    "id": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "notificationType": {
+      "description": "Discriminator for the different notification types. Shall be set to \"VnfPackageOnboardingNotification\" for this notification type.\n",
+      "type": "string",
+      "enum": [
+        "VnfPackageOnboardingNotification"
+      ]
+    },
+    "subscriptionId": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "timeStamp": {
+      "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+      "type": "string",
+      "format": "date-time"
+    },
+    "vnfPkgId": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "vnfdId": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "_links": {
+      "description": "This type represents the links to resources that a VNF package management notification can contain.\n",
+      "type": "object",
+      "required": [
+        "vnfPackage",
+        "subscription"
+      ],
+      "properties": {
+        "vnfPackage": {
+          "description": "This type represents a link to a resource.\n",
+          "type": "object",
+          "required": [
+            "href"
+          ],
+          "properties": {
+            "href": {
+              "description": "URI of the referenced resource.\n",
+              "type": "string",
+              "format": "url"
+            }
+          }
+        },
+        "subscription": {
+          "description": "This type represents a link to a resource.\n",
+          "type": "object",
+          "required": [
+            "href"
+          ],
+          "properties": {
+            "href": {
+              "description": "URI of the referenced resource.\n",
+              "type": "string",
+              "format": "url"
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/IndividualPmJob.robot b/SOL005/VNFPerformanceManagement-API/IndividualPmJob.robot
new file mode 100644
index 00000000..00c0445d
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/IndividualPmJob.robot
@@ -0,0 +1,76 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           JSONLibrary
+Resource          environment/IndividualPmJob.txt
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Individual PM Job
+    Log    Trying to get a Pm Job present in the NFVO Catalogue
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJob.schema.json    ${json}
+    Log    Validation OK
+
+GET Individual PM Job - Negative (Not Found)
+    Log    Trying to perform a negative get, using erroneous PM Job identifier
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${erroneousPmJobId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+DELETE Individual PM Job
+    Log    Trying to delete an existing PM Job
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}
+    Integer    response status    204
+    Log    Received 204 No Content as expected
+
+DELETE Individual PM Job - Negative (Not Found)
+    Log    Trying to delete an existing PM Job
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${erroneousPmJobId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST Individual PM Job - (Method not implemented)
+    Log    Trying to perform a POST (method should not be implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT Individual PM Job - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Individual PM Job - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPerformanceManagement-API/IndividualReport.robot b/SOL005/VNFPerformanceManagement-API/IndividualReport.robot
new file mode 100644
index 00000000..38e9da21
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/IndividualReport.robot
@@ -0,0 +1,61 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Resource          environment/reports.txt
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+
+*** Test Cases ***
+GET Report on Single PM Job
+    [Documentation]    The client can use this resource to read the performance report.
+    ...    The URI of this report can be obtained from a PerformanceInformationAvailableNotification
+    ...    (see clause 7.5.2.5) or from the representation of the "Individual PM job" resource
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}/reports/${reportId}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate result with PerformanceReport schema
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PerformanceReport.schema.json    ${json}
+
+GET Report on Single PM Job - Negative (Not Found)
+    [Documentation]    The client can use this resource to read the performance report.
+    ...    The URI of this report can be obtained from a PerformanceInformationAvailableNotification
+    ...    (see clause 7.5.2.5) or from the representation of the "Individual PM job" resource
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}/reports/${erroneousReportId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}/reports/${reportId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}/reports/${reportId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}/reports/${reportId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs/${pmJobId}/reports/${reportId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPerformanceManagement-API/IndividualSubscription.robot b/SOL005/VNFPerformanceManagement-API/IndividualSubscription.robot
new file mode 100644
index 00000000..2c6d9fae
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/IndividualSubscription.robot
@@ -0,0 +1,82 @@
+*** Settings ***
+Documentation     This resource represents an individual subscription for notifications about performance management related events.
+...               The client can use this resource to read and to terminate a subscription to notifications related to NS performance
+...               management.
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Library           OperatingSystem
+Library           JSONLibrary
+Resource          environment/individualSubscription.txt
+
+*** Test Cases ***
+GET Individual Subscription
+    [Documentation]    The client can use this method for reading an individual subscription about Performance management notifications
+    ...    subscribed by the client.
+    ...    This method shall follow the provisions specified in the tables 6.4.8.3.2-1 and 6.4.8.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmSubscription.schema.json    ${json}
+    Log    Validated PmSubscription schema
+
+GET Individual Subscription - Negative (Not Found)
+    [Documentation]    The client can use this method for reading an individual subscription about Performance management notifications
+    ...    subscribed by the client.
+    ...    This method shall follow the provisions specified in the tables 6.4.8.3.2-1 and 6.4.8.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${erroneousSubscriptionId}
+    Integer    response status    404
+    Log    Received a 404 Not found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validated ProblemDetails schema
+
+POST Individual Subscription - (Method not implemented)
+    [Documentation]    This method is not supported. When this method is requested on this resource, the NFVO shall return a "405 Method
+    ...    Not Allowed" response as defined in clause 4.3.5.4.
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT Individual Subscription - (Method not implemented)
+    [Documentation]    This method is not supported. When this method is requested on this resource, the NFVO shall return a "405 Method
+    ...    Not Allowed" response as defined in clause 4.3.5.4.
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Individual Subscription - (Method not implemented)
+    [Documentation]    This method is not supported. When this method is requested on this resource, the NFVO shall return a "405 Method
+    ...    Not Allowed" response as defined in clause 4.3.5.4.
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE Individual Subscription
+    [Documentation]    This method terminates an individual subscription.
+    ...    This method shall follow the provisions specified in the tables 6.4.8.3.5-1 and 6.4.8.3.5-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions/${subscriptionId}
+    Integer    response status    204
+    Log    Received a 204 No Content as expected
+    ${body}=    Output    response body
+    Should Be Empty    ${body}
+    Log    Body of the response is empty
diff --git a/SOL005/VNFPerformanceManagement-API/IndividualThreshold.robot b/SOL005/VNFPerformanceManagement-API/IndividualThreshold.robot
new file mode 100644
index 00000000..717d143d
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/IndividualThreshold.robot
@@ -0,0 +1,70 @@
+*** Settings ***
+Documentation     This resource represents an individual threshold.
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Library           OperatingSystem
+Resource          environment/individualThresholds.txt
+
+*** Test Cases ***
+GET Individual Threshold
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/thresholds/${thresholdId}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Log    Trying to validate result with thresholds schema
+    Validate Json    Threshold.schema.json    ${json}
+
+GET Individual Threshold - Negative (Not Found)
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/thresholds/${erroneousThresholdId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+DELETE Individual Threshold
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/thresholds/${thresholdId}
+    Integer    response status    204
+    Log    Received 204 No Content as expected
+    ${body}=    Output    response body
+    Should Be Empty    ${body}
+    Log    Body of the response is empty
+
+DELETE Individual Threshold - Negative (Not Found)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/thresholds/${erroneousThresholdId}
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Log    Trying to validate result with ProblemDetails schema
+    Validate Json    ProblemDetails.schema.json    ${json}
+
+POST Individual Threshold - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    POST    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PUT Individual Threshold - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Individual Threshold - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPerformanceManagement-API/Notifications.robot b/SOL005/VNFPerformanceManagement-API/Notifications.robot
new file mode 100644
index 00000000..711bca03
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/Notifications.robot
@@ -0,0 +1,117 @@
+*** Setting ***
+Resource	environment/notifications.txt
+Suite Setup    Create Sessions
+Suite Teardown    Terminate All Processes    kill=true
+Library    MockServerLibrary
+Library    Process
+Library    OperatingSystem
+Library    BuiltIn
+Library    Collections
+Library    String
+
+
+*** Test Cases ***
+Check Notification Endpoint
+    &{req}=  Create Mock Request Matcher    GET    ${callback_endpoint}    
+    &{rsp}=  Create Mock Response    headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Verify Mock Expectation  ${req}
+    Clear Requests  ${callback_endpoint}
+    
+Post Performance Information Available Notification
+    ${json}=	Get File	schemas/PerformanceInformationAvailableNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle Performance Information Available Notification
+    &{req}=  Create Mock Request Matcher    POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+
+Post Performance Information Available Notification Negative 404 
+    ${json}=	Get File	schemas/ProblemDetails.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle Performance Information Available Notification to handle 404 error
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint_error}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=404
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+
+Post Threshold Crossed Notification
+    ${json}=	Get File	schema/ThresholdCrossedNotification.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handle Threshold Crossed Notification
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response 	headers="Content-Type: application/json"  status_code=204
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+
+Post Threshold Crossed Notification Negative 404 
+    ${json}=	Get File	schemas/ProblemDetails.schema.json
+    ${BODY}=	evaluate	json.loads('''${json}''')	json
+    Log  Creating mock request and response to handleThreshold Crossed Notification to handle 404 error
+    &{req}=  Create Mock Request Matcher	POST  ${callback_endpoint_error}  body_type="JSON_SCHEMA"    body=${BODY}
+    &{rsp}=  Create Mock Response	headers="Content-Type: application/json"  status_code=404
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+PUT Performance Notification 
+    Log  PUT Method not implemented
+    &{req}=  Create Mock Request Matcher	PUT  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+PATCH Performance Notification 
+    Log  PATCH Method not implemented
+    &{req}=  Create Mock Request Matcher	PATCH  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+    
+    
+DELETE Performance Notification 
+    Log  PATCH Method not implemented
+    &{req}=  Create Mock Request Matcher	DELETE  ${callback_endpoint}
+    &{rsp}=  Create Mock Response  status_code=405
+    Create Mock Expectation  ${req}  ${rsp}
+    Sleep  ${sleep_interval}
+    Log  Verifying results
+    Verify Mock Expectation  ${req}
+    Log  Cleaning the endpoint
+    Clear Requests  ${callback_endpoint}
+	
+
+*** Keywords ***
+Create Sessions
+    Start Process  java  -jar  ../../bin/mockserver-netty-5.3.0-jar-with-dependencies.jar  -serverPort  ${callback_port}  alias=mockInstance
+    Wait For Process  handle=mockInstance  timeout=5s  on_timeout=continue
+    Create Mock Session  ${callback_uri}:${callback_port}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/PMJobs.robot b/SOL005/VNFPerformanceManagement-API/PMJobs.robot
new file mode 100644
index 00000000..9269c1d7
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/PMJobs.robot
@@ -0,0 +1,202 @@
+*** Settings ***
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           JSONLibrary
+Library           OperatingSystem
+Resource          environment/pmJobs.txt
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Library           MockServerLibrary
+
+*** Test Cases ***
+GET all Pm Jobs
+    Log    Trying to get all PM Jobs present in the VNFM
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJobs.schema.json    ${json}
+    Log    Validation OK
+    Log    Checking that reports element is missing
+    ${reports}=    Get Value From Json    ${json}    $..reports
+    Should Be Empty    ${reports}
+    Log    Reports element is empty as expected
+
+GET all Pm Jobs - Filter
+    Log    Trying to get all PM Jobs present in the VNFM, using filter params
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs?${POS_FILTER}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJobs.schema.json    ${json}
+    Log    Validation OK
+
+GET all Pm Jobs - all_fields
+    Log    Trying to get all PM Jobs present in the VNFM, using 'all_fields' filter
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs?all_fields
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJobs.schema.json    ${json}
+    Log    Validation OK
+    Log    Trying to validate criteria schema
+    ${criteria}=    Get Value From Json    ${json}    $..criteria
+    Validate Json    criteria.schema.json    ${criteria[0]}
+    Log    Validation for criteria schema OK
+    Log    Trying to validate criteria schema
+    ${reports}=    Get Value From Json    ${json}    $..reports
+    Validate Json    reports.schema.json    ${reports[0]}
+    Log    Validation for reports schema OK
+    Log    Validating _links schema
+    ${links}=    Get Value From Json    ${json}    $.._links
+    Validate Json    links.schema.json    ${links[0]}
+    Log    Validation for _links schema OK
+
+GET all Pm Jobs - exclude_default
+    Log    Trying to get all VNF Packages present in the VNFM, using filter params
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs?exclude_default
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJobs.schema.json    ${json}
+    Log    Validation OK
+    Log    Checking that reports element is missing
+    ${reports}=    Get Value From Json    ${json}    $..reports
+    Should Be Empty    ${reports}
+    Log    Reports element is empty as expected
+
+GET all Pm Jobs - fields
+    Log    Trying to get all VNF Packages present in the VNFM, using filter params
+    Pass Execution If    ${FIELD_USAGE} == 0    Skipping test as VNFM is not supporting 'fields'
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs?fields=${fields}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJobs.schema.json    ${json}
+    Log    Validation OK
+    Log    Trying to validate criteria schema
+    ${criteria}=    Get Value From Json    ${json}    $..criteria
+    Validate Json    criteria.schema.json    ${criteria[0]}
+    Log    Validation for criteria schema OK
+    Log    Trying to validate criteria schema
+    ${reports}=    Get Value From Json    ${json}    $..reports
+    Validate Json    reports.schema.json    ${reports[0]}
+    Log    Validation for reports schema OK
+
+GET all Pm Jobs - exclude_fields
+    Log    Trying to get all VNF Packages present in the VNFM, using filter params
+    Pass Execution If    ${FIELD_USAGE} == 0    Skipping test as VNFM is not supporting 'fields'
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs?fields=${fields}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJobs.schema.json    ${json}
+    Log    Validation OK
+    Log    Checking that reports element is missing
+    ${reports}=    Get Value From Json    ${json}    $..reports
+    Should Be Empty    ${reports}
+    Log    Reports element is empty as expected
+    Log    Checking that criteria element is missing
+    ${criteria}=    Get Value From Json    ${json}    $..criteria
+    Should Be Empty    ${criteria}
+    Log    Criteria element is empty as expected
+
+GET all Pm Jobs - Negative (wronge filter name)
+    Log    Trying to get all PM Jobs present in the VNFM, using an erroneous filter param
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs?${NEG_FILTER}
+    Integer    response status    400
+    Log    Received 400 Bad Request as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response headers Content-Type
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+GET all Pm Jobs (Negative: Not found)
+    Log    Trying to perform a GET on a erroneous URI
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/pm_job    # wrong URI /pm_job instead of /pm_jobs
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate ProblemDetails
+    ${problemDetails}=    Output    response headers Content-Type
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST all PM Jobs - Create new PM Job
+    Log    Creating a new PM Job
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body}=    Get File    jsons/CreatePmJobRequest.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs    ${body}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    ${CONTENT_TYPE_JSON}
+    Log    Trying to validate response
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmJob.schema.json    ${json}
+    Log    Validation OK
+
+PUT all PM Jobs - (Method not implemented)
+    Log    Trying to perform a PUT. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH all Pm Jobs - (Method not implemented)
+    Log    Trying to perform a PATCH. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE all Pm Jobs - (Method not implemented)
+    Log    Trying to perform a DELETE. This method should not be implemented
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/pm_jobs
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPerformanceManagement-API/Subscriptions.robot b/SOL005/VNFPerformanceManagement-API/Subscriptions.robot
new file mode 100644
index 00000000..52622658
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/Subscriptions.robot
@@ -0,0 +1,184 @@
+*** Settings ***
+Documentation     This resource represents subscriptions. The client can use this resource to subscribe to notifications related to VNF
+...               performance management and to query its subscriptions.
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Library           OperatingSystem
+Library           JSONLibrary
+Resource          environment/subscriptions.txt
+
+*** Test Cases ***
+GET Subscription
+    [Documentation]    The client can use this method to query the list of active subscriptions to Performance management notifications
+    ...    subscribed by the client.
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.2-1 and 7.4.7.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmSubscriptions.schema.json    ${json}
+    Log    Validated PmSubscription schema
+
+GET Subscription - Filter
+    [Documentation]    The client can use this method to query the list of active subscriptions to Performance management notifications
+    ...    subscribed by the client.
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.2-1 and 7.4.7.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions?${filter_ok}
+    Integer    response status    200
+    Log    Received a 200 OK as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmSubscriptions.schema.json    ${json}
+    Log    Validated PmSubscription schema
+
+GET Subscription - Negative Filter (Erroneous filter)
+    [Documentation]    The client can use this method to query the list of active subscriptions to Performance management notifications
+    ...    subscribed by the client.
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.2-1 and 7.4.7.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscriptions?${filter_ko}
+    Integer    response status    400
+    Log    Received a 400 Bad Request as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validated ProblemDetails schema
+
+GET Subscription - Negative (Not Found)
+    [Documentation]    The client can use this method to query the list of active subscriptions to Performance management notifications
+    ...    subscribed by the client.
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.2-1 and 7.4.7.3.2-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/subscription
+    Integer    response status    404
+    Log    Received a 404 Not found as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validated ProblemDetails schema
+
+POST Subscription
+    [Documentation]    The POST method creates a new subscription
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.1-1 and 7.4.7.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    ...    Creation of two subscription resources with the same callbackURI and the same filter can result in performance
+    ...    degradation and will provide duplicates of notifications to the OSS, and might make sense only in very rare use cases.
+    ...    Consequently, the NFVO may either allow creating a subscription resource if another subscription resource with the
+    ...    same filter and callbackUri already exists (in which case it shall return the "201 Created" response code), or may decide
+    ...    to not create a duplicate subscription resource (in which case it shall return a "303 See Other" response code referencing
+    ...    the existing subscription resource with the same filter and callbackUri).
+    Set headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body_request}=    Get File    jsons/subscriptions.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body_request}
+    Integer    response status    201
+    Log    Received a 201 Created as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmSubscription.schema.json    ${json}
+    Log    Validated PmSubscription schema
+    Log    Trying to validate the Location header
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+
+POST Subscription - DUPLICATION
+    [Documentation]    The POST method creates a new subscription
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.1-1 and 7.4.7.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    ...    Creation of two subscription resources with the same callbackURI and the same filter can result in performance
+    ...    degradation and will provide duplicates of notifications to the OSS, and might make sense only in very rare use cases.
+    ...    Consequently, the NFVO may either allow creating a subscription resource if another subscription resource with the
+    ...    same filter and callbackUri already exists (in which case it shall return the "201 Created" response code), or may decide
+    ...    to not create a duplicate subscription resource (in which case it shall return a "303 See Other" response code referencing
+    ...    the existing subscription resource with the same filter and callbackUri).
+    Pass Execution If    ${NFVO_DUPLICATION} == 1    NFVO is permitting duplication. Skipping the test
+    Set headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body_request}=    Get File    jsons/subscriptions.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body_request}
+    Integer    response status    303
+    Log    Received a 303 See other as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    Should Be Empty    ${result}
+    Log    Body is empty
+    Log    Trying to validate the Location header
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+
+POST Subscription - NO DUPLICATION
+    [Documentation]    The POST method creates a new subscription
+    ...    This method shall follow the provisions specified in the Tables 7.4.7.3.1-1 and 7.4.7.3.1-2 for URI query parameters,
+    ...    request and response data structures, and response codes.
+    ...    Creation of two subscription resources with the same callbackURI and the same filter can result in performance
+    ...    degradation and will provide duplicates of notifications to the OSS, and might make sense only in very rare use cases.
+    ...    Consequently, the NFVO may either allow creating a subscription resource if another subscription resource with the
+    ...    same filter and callbackUri already exists (in which case it shall return the "201 Created" response code), or may decide
+    ...    to not create a duplicate subscription resource (in which case it shall return a "303 See Other" response code referencing
+    ...    the existing subscription resource with the same filter and callbackUri).
+    Pass Execution If    ${NFVO_DUPLICATION} == 0    NFVO is not permitting duplication. Skipping the test
+    Set headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Set headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${body_request}=    Get File    jsons/subscriptions.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/subscriptions    ${body_request}
+    Integer    response status    201
+    Log    Received a 201 Created as expected
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Validate Json    PmSubscription.schema.json    ${json}
+    Log    Validated PmSubscription schema
+    Log    Trying to validate the Location header
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+
+PUT Subscription - (Method not implemented)
+    [Documentation]    This method is not supported. When this method is requested on this resource, the NFVO shall return a "405 Method
+    ...    Not Allowed" response as defined in clause 4.3.5.4.
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Subscription - (Method not implemented)
+    [Documentation]    This method is not supported. When this method is requested on this resource, the VNFM shall return a "405 Method
+    ...    Not Allowed" response as defined in clause 4.3.5.4.
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE Subscription - (Method not implemented)
+    [Documentation]    This method is not supported. When this method is requested on this resource, the VNFM shall return a "405 Method
+    ...    Not Allowed" response as defined in clause 4.3.5.4.
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/subscriptions
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPerformanceManagement-API/Thresholds.robot b/SOL005/VNFPerformanceManagement-API/Thresholds.robot
new file mode 100644
index 00000000..71a80669
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/Thresholds.robot
@@ -0,0 +1,91 @@
+*** Settings ***
+Documentation     This resource represents thresholds. The client can use this resource to create and query thresholds.
+Library           JSONSchemaLibrary    schemas/
+Resource          environment/generic.txt    # Generic Parameters
+Library           JSONLibrary
+Library           REST    ${NFVO_SCHEMA}://${NFVO_HOST}:${NFVO_PORT}
+Resource          environment/thresholds.txt
+Library           OperatingSystem
+
+*** Test Cases ***
+GET Thresholds
+    [Documentation]    T=This resource represents thresholds. 
+    ...    The client can use this resource to create and query thresholds.
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Log    Trying to validate result with thresholds schema
+    Validate Json    Thresholds.schema.json    ${json}
+
+GET Thresholds - Filter
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/thresholds?${FILTER_OK}
+    Integer    response status    200
+    ${contentType}=    Output    response headers Content-Type
+    Should Contain    ${contentType}    application/json
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Log    Trying to validate result with Threshold schema
+    Validate Json    Thresholds.schema.json    ${json}
+
+GET Thresholds - NEGATIVE Filter
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/thresholds?${FILTER_KO}
+    Integer    response status    400
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Log    Trying to validate result with ProblemDetails schema
+    Validate Json    ProblemDetails.schema.json    ${json}
+
+GET Thresholds - Negative (Not Found)
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    GET    ${apiRoot}/${apiName}/${apiVersion}/threshold
+    Integer    response status    404
+    Log    Received 404 Not Found as expected
+    ${problemDetails}=    Output    response body
+    ${json}=    evaluate    json.loads('''${problemDetails}''')    json
+    Log    Trying to validate ProblemDetails
+    Validate Json    ProblemDetails.schema.json    ${json}
+    Log    Validation OK
+
+POST Reports
+    Set Headers    {"Accept": "${ACCEPT_JSON}"}
+    Set Headers    {"Content-Type": "${CONTENT_TYPE_JSON}"}
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    ${request}=    Get File    jsons/CreateThresholdRequest.json
+    POST    ${apiRoot}/${apiName}/${apiVersion}/thresholds    ${request}
+    Integer    response status    201
+    Log    Received 201 Created as expected
+    ${result}=    Output    response body
+    ${json}=    evaluate    json.loads('''${result}''')    json
+    Log    Trying to validate result with thresholds schema
+    Validate Json    Threshold.schema.json    ${json}
+    Log    Trying to validate the Location header
+    ${headers}=    Output    response headers
+    Should Contain    ${headers}    Location
+
+PUT Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PUT    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+PATCH Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    PATCH    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
+
+DELETE Reports - (Method not implemented)
+    Run Keyword If    ${AUTH_USAGE} == 1    Set Headers    {"Authorization": "${AUTHORIZATION}"}
+    DELETE    ${apiRoot}/${apiName}/${apiVersion}/thresholds
+    Integer    response status    405
+    Log    Received 405 Method not implemented as expected
diff --git a/SOL005/VNFPerformanceManagement-API/environment/IndividualPmJob.txt b/SOL005/VNFPerformanceManagement-API/environment/IndividualPmJob.txt
new file mode 100644
index 00000000..a7823e6b
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/IndividualPmJob.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${pmJobId}        29f4ff6a-be91-4ec8-856e-fcf1e2479e4e
+${erroneousPmJobId}    erroneousPmJobId
diff --git a/SOL005/VNFPerformanceManagement-API/environment/generic.txt b/SOL005/VNFPerformanceManagement-API/environment/generic.txt
new file mode 100644
index 00000000..4bc951ca
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/generic.txt
@@ -0,0 +1,20 @@
+*** Variables ***
+${VNFM_HOST}      localhost    # Hostname of the VNFM
+${VNFM_PORT}      8080    # Listening port of the VNFM
+${NFVO_HOST}      localhost    # Hostname of the NFVO
+${NFVO_PORT}      8081    # Listening port of the NFVO
+${VNFM_SCHEMA}    https
+${NFVO_SCHEMA}    https
+${AUTHORIZATION}    Bearer 0b79bab50daca910b000d4f1a2b675d604257e42
+${CONTENT_TYPE_JSON}    application/json
+${ACCEPT_JSON}    application/json
+${apiRoot}        /
+${AUTH_USAGE}     1
+${NEG_AUTHORIZATION}    Bearer negativetoken
+${apiVersion}     v1
+${apiName}        vnfpm
+${FIELD_USAGE}    1
+${VNFM_AUTHENTICATION}    Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
+${VNFM_AUTH_USAGE}    1
+${VNFM_DUPLICATION}    1
+${NFVO_DUPLICATION}    1
diff --git a/SOL005/VNFPerformanceManagement-API/environment/individualSubscription.txt b/SOL005/VNFPerformanceManagement-API/environment/individualSubscription.txt
new file mode 100644
index 00000000..f5aa4ba9
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/individualSubscription.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${subscriptionId}    17563e75-0e14-4bd7-94b4-6bbb869c79aa
+${erroneousSubscriptionId}    erroneousSubscriptionId
diff --git a/SOL005/VNFPerformanceManagement-API/environment/individualThresholds.txt b/SOL005/VNFPerformanceManagement-API/environment/individualThresholds.txt
new file mode 100644
index 00000000..59056904
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/individualThresholds.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${thresholdId}    1f50d68b-82e8-4deb-bd40-c934d4d1ac0a
+${erroneousThresholdId}    erroneousThresholdId
diff --git a/SOL005/VNFPerformanceManagement-API/environment/notifications.txt b/SOL005/VNFPerformanceManagement-API/environment/notifications.txt
new file mode 100644
index 00000000..12a19817
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/notifications.txt
@@ -0,0 +1,6 @@
+*** Variables ***
+${callback_uri}    http://localhost
+${callback_port}    9091
+${callback_endpoint}    /endpoint
+${callback_endpoint_error}    /endpoint_404
+${sleep_interval}    20s
diff --git a/SOL005/VNFPerformanceManagement-API/environment/pmJobs.txt b/SOL005/VNFPerformanceManagement-API/environment/pmJobs.txt
new file mode 100644
index 00000000..ee57a309
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/pmJobs.txt
@@ -0,0 +1,4 @@
+*** Variables ***
+${POS_FILTER}     objectInstanceIds=1f50d68b-82e8-4deb-bd40-c934d4d1ac0a
+${NEG_FILTER}     criteriaPmJob=erroneousAttributeName
+${fields}         criteria,objectInstanceIds
diff --git a/SOL005/VNFPerformanceManagement-API/environment/reports.txt b/SOL005/VNFPerformanceManagement-API/environment/reports.txt
new file mode 100644
index 00000000..7edfcc5c
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/reports.txt
@@ -0,0 +1,4 @@
+*** Variables ***
+${pmJobId}        1f50d68b-82e8-4deb-bd40-c934d4d1ac0a
+${reportId}       0fb4c875-e07f-46ca-a9dd-13907667a568
+${erroneousReportId}    erroneousReportId
diff --git a/SOL005/VNFPerformanceManagement-API/environment/subscriptions.txt b/SOL005/VNFPerformanceManagement-API/environment/subscriptions.txt
new file mode 100644
index 00000000..fec8c84b
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/subscriptions.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${filter_ok}      callbackUri=http://localhost/subscriptions
+${filter_ko}      erroneousFilter=erroneous
diff --git a/SOL005/VNFPerformanceManagement-API/environment/thresholds.txt b/SOL005/VNFPerformanceManagement-API/environment/thresholds.txt
new file mode 100644
index 00000000..49461a09
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/environment/thresholds.txt
@@ -0,0 +1,3 @@
+*** Variables ***
+${FILTER_OK}      objectInstanceId=1f50d68b-82e8-4deb-bd40-c934d4d1ac0a
+${FILTER_KO}      criterias=erroneousFilter
diff --git a/SOL005/VNFPerformanceManagement-API/jsons/CreatePmJobRequest.json b/SOL005/VNFPerformanceManagement-API/jsons/CreatePmJobRequest.json
new file mode 100644
index 00000000..1872a3bc
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/jsons/CreatePmJobRequest.json
@@ -0,0 +1,10 @@
+{
+	"objectInstanceIds" : ["1f50d68b-82e8-4deb-bd40-c934d4d1ac0a"],
+	"criteria" : {
+		"performanceMetric": [],
+		"performanceMetricGroup": [],
+		"collectionPeriod": 10,
+		"reportingPeriod": 30,
+		
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/jsons/CreateThresholdRequest.json b/SOL005/VNFPerformanceManagement-API/jsons/CreateThresholdRequest.json
new file mode 100644
index 00000000..1e58c2ba
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/jsons/CreateThresholdRequest.json
@@ -0,0 +1,12 @@
+{
+	"objectInstanceIds" : "1f50d68b-82e8-4deb-bd40-c934d4d1ac0a",
+	"criteria" : {
+		"performanceMetric": "cpu_util",
+		"thresholdType": "SIMPLE",
+		"simpleThresholdDetails": {
+			"thresholdValue": 10,
+			"hysteresis": 50
+		}
+		
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/jsons/PerformanceInformationAvailableNotification.json b/SOL005/VNFPerformanceManagement-API/jsons/PerformanceInformationAvailableNotification.json
new file mode 100644
index 00000000..cbe45fa7
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/jsons/PerformanceInformationAvailableNotification.json
@@ -0,0 +1,13 @@
+{
+	"id": "id",
+	"notificationType" : "PerformanceInformationAvailableNotification",
+	"subscriptionId ": "subscriptionId",
+	"timeStamp": "2012-04-21T18:25:43-05:00",
+	"objectInstanceId": "vnfID",
+	"_links": {
+			"subscription": "link to subscription",
+			"pmJob" : "link to PMJob",
+			"performanceReport": "link to PerformanceReport"
+	}
+	
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/jsons/ThresholdCrossedNotification.json b/SOL005/VNFPerformanceManagement-API/jsons/ThresholdCrossedNotification.json
new file mode 100644
index 00000000..23ee9e24
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/jsons/ThresholdCrossedNotification.json
@@ -0,0 +1,16 @@
+{
+	"id": "id",
+	"notificationType" : "ThresholdCrossedNotification",
+	"subscriptionId ": "subscriptionId",
+	"timeStamp": "2012-04-21T18:25:43-05:00",
+	"thresholdId": "thresholdId",
+	"crossingDirection": "UP",
+	"objectInstanceId": "vnfID",
+	"performanceMetric": "performanceMetric",
+	"performanceValue": 7
+	"_links": {
+			"subscription": "link to subscription",
+			"threshold": "link to threshold"
+	}
+	
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/jsons/subscriptions.json b/SOL005/VNFPerformanceManagement-API/jsons/subscriptions.json
new file mode 100644
index 00000000..3fcc4e59
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/jsons/subscriptions.json
@@ -0,0 +1,6 @@
+{
+	"callbackUri": "http://127.0.0.1/subscribe",
+	"filter": {
+		"notificationTypes": ["ThresholdCrossedNotification"]
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/PerformanceInformationAvailableNotification.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/PerformanceInformationAvailableNotification.schema.json
new file mode 100644
index 00000000..04ae7ead
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/PerformanceInformationAvailableNotification.schema.json
@@ -0,0 +1,105 @@
+{
+    "description": "This notification informs the receiver that performance information is available. The timing of sending this notification is determined by the capability of the producing entity to evaluate the threshold crossing condition. The notification shall be triggered by the VNFM when new performance information collected by a PM job is available.\n",
+    "type": "object",
+    "required": [
+      "id",
+      "notificationType",
+      "subscriptionId",
+      "timeStamp",
+      "objectInstanceId",
+      "_links"
+    ],
+    "properties": {
+      "id": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "notificationType": {
+        "description": "Discriminator for the different notification types. Shall be set to \"PerformanceInformationAvailableNotification\" for this notification type.\n",
+        "type": "string",
+        "enum": [
+          "PerformanceInformationAvailableNotification"
+        ]
+      },
+      "subscriptionId": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "timeStamp": {
+        "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+        "type": "string",
+        "format": "date-time"
+      },
+      "objectInstanceId": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "_links": {
+        "description": "Links to resources related to this notification.\n",
+        "type": "object",
+        "required": [
+          "subscription",
+          "pmJob",
+          "performanceReport"
+        ],
+        "properties": {
+          "subscription": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          },
+          "objectInstance": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          },
+          "pmJob": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          },
+          "performanceReport": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          }
+        }
+      }
+    }
+  }
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/PerformanceReport.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/PerformanceReport.schema.json
new file mode 100644
index 00000000..c0a9c444
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/PerformanceReport.schema.json
@@ -0,0 +1 @@
+{  "description": "This type defines the format of a performance report provided by the VNFM to the NFVO as a result of collecting performance information as part of a PM job.\n",  "type": "object",  "properties": {    "entries": {      "description": "List of performance information entries. Each performance report entry is for a given metric of a given object (i.e. VNF instance), but can include multiple collected values.\n",      "type": "array",      "items": {        "type": "object",        "required": [          "objectType",          "objectInstanceId",          "performanceMetric",          "performanceValue"        ],        "properties": {          "objectType": {            "description": "Defines the object type for which performance information is reported (i.e. VNF type). The string value shall be set to the vnfdId of the VNF instance to which the performance information relates.\n",            "type": "string"          },          "objectInstanceId": {            "description": "An identifier with the intention of being globally unique.\n",            "type": "string"          },          "performanceMetric": {            "description": "Name of the metric collected.\n",            "type": "string"          },          "performanceValues": {            "description": "List of performance values with associated timestamp.\n",            "type": "array",            "items": {              "type": "object",              "required": [                "timeStamp",                "performanceValue"              ],              "properties": {                "timeStamp": {                  "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",                  "type": "string",                  "format": "date-time"                },                "value": {                  "description": "Value of the metric collected. The type of the \"value\" attribute (i.e. scalar, structure (Object in JSON), or array (of scalars, arrays or structures / Objects)) is assumed to be defined in the external measurement specification (see ETSI GS NFV-IFA 027).\n",                  "type": "object"                }              }            }          }        }      }    }  }}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/PmJob.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/PmJob.schema.json
new file mode 100644
index 00000000..65121412
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/PmJob.schema.json
@@ -0,0 +1 @@
+{  "description": "This type represents a PM job.\n",  "type": "object",  "required": [    "id",    "objectInstanceIds",    "criteria"  ],  "properties": {    "id": {      "description": "An identifier with the intention of being globally unique.\n",      "type": "string"    },    "objectInstanceIds": {      "description": "Identifiers of the VNF instances for which performance information is collected.\n",      "type": "array",      "items": {        "description": "An identifier with the intention of being globally unique.\n",        "type": "string"      }    },    "criteria": {      "description": "Criteria of the collection of performance information.\n",      "type": "object",      "required": [        "collectionPeriod",        "reportingPeriod"      ],      "properties": {        "performanceMetric": {          "description": "This defines the types of performance metrics for the specified object instances, as specified in ETSI GS NFV-IFA 027). At least one of the two attributes (performance metric or group) shall be present.\n",          "type": "array",          "items": {            "type": "string"          }        },        "performanceMetricGroup": {          "description": "Group of performance metrics. A metric group is a pre-defined list of metrics, known to the producer that it can decompose to individual metrics. At least one of the two attributes (performance metric or group) shall be present.\n",          "type": "array",          "items": {            "type": "string"          }        },        "collectionPeriod": {          "description": "Specifies the periodicity at which the producer will collect performance information. The unit shall be seconds. At the end of each reportingPeriod, the producer will inform the consumer about availability of the performance data collected for each completed collection period during this reportingPeriod. The reportingPeriod should be equal to or a multiple of the collectionPeriod. In the latter case, the performance data for the collection periods within one reporting period are reported together.\n",          "type": "integer"        },        "reportingPeriod": {          "description": "Specifies the periodicity at which the producer will report to the consumer. about performance information. The unit shall be seconds. At the end of each reportingPeriod, the producer will inform the consumer about availability of the performance data collected for each completed collection period during this reportingPeriod. The reportingPeriod should be equal to or a multiple of the collectionPeriod. In the latter case, the performance data for the collection periods within one reporting period are reported together.\n",          "type": "integer"        },        "reportingBoundary": {          "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",          "type": "string",          "format": "date-time"        }      }    },    "reports": {      "description": "Information about available reports collected by this PM job.\n",      "type": "object",      "required": [        "href",        "readyTime",        "_links"      ],      "properties": {        "href": {          "description": "The Uri where the report can be obtained.\n",          "type": "string",          "format": "url"        },        "readyTime": {          "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",          "type": "string",          "format": "date-time"        },        "expiryTime": {          "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",          "type": "string",          "format": "date-time"        },        "fileSize": {          "description": "The size of the report file in bytes, if known.\n",          "type": "integer"        },        "_links": {          "description": "Links for this resource.\n",          "type": "object",          "required": [            "self"          ],          "properties": {            "self": {              "description": "This type represents a link to a resource.\n",              "type": "object",              "required": [                "href"              ],              "properties": {                "href": {                  "description": "URI of the referenced resource.\n",                  "type": "string",                  "format": "url"                }              }            },            "objects": {              "description": "Links to resources representing the VNF instances for which performance information is collected. Shall be present if the VNF instance information is accessible as a resource.\n",              "type": "array",              "items": {                "description": "This type represents a link to a resource.\n",                "type": "object",                "required": [                  "href"                ],                "properties": {                  "href": {                    "description": "URI of the referenced resource.\n",                    "type": "string",                    "format": "url"                  }                }              }            }          }        }      }    }  }}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/PmJobs.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/PmJobs.schema.json
new file mode 100644
index 00000000..654acdcf
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/PmJobs.schema.json
@@ -0,0 +1,134 @@
+{
+  "type": "array",
+  "items": {
+    "description": "This type represents a PM job.\n",
+    "type": "object",
+    "required": [
+      "id",
+      "objectInstanceIds",
+      "criteria"
+    ],
+    "properties": {
+      "id": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "objectInstanceIds": {
+        "description": "Identifiers of the VNF instances for which performance information is collected.\n",
+        "type": "array",
+        "items": {
+          "description": "An identifier with the intention of being globally unique.\n",
+          "type": "string"
+        }
+      },
+      "criteria": {
+        "description": "Criteria of the collection of performance information.\n",
+        "type": "object",
+        "required": [
+          "collectionPeriod",
+          "reportingPeriod"
+        ],
+        "properties": {
+          "performanceMetric": {
+            "description": "This defines the types of performance metrics for the specified object instances, as specified in ETSI GS NFV-IFA 027). At least one of the two attributes (performance metric or group) shall be present.\n",
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "performanceMetricGroup": {
+            "description": "Group of performance metrics. A metric group is a pre-defined list of metrics, known to the producer that it can decompose to individual metrics. At least one of the two attributes (performance metric or group) shall be present.\n",
+            "type": "array",
+            "items": {
+              "type": "string"
+            }
+          },
+          "collectionPeriod": {
+            "description": "Specifies the periodicity at which the producer will collect performance information. The unit shall be seconds. At the end of each reportingPeriod, the producer will inform the consumer about availability of the performance data collected for each completed collection period during this reportingPeriod. The reportingPeriod should be equal to or a multiple of the collectionPeriod. In the latter case, the performance data for the collection periods within one reporting period are reported together.\n",
+            "type": "integer"
+          },
+          "reportingPeriod": {
+            "description": "Specifies the periodicity at which the producer will report to the consumer. about performance information. The unit shall be seconds. At the end of each reportingPeriod, the producer will inform the consumer about availability of the performance data collected for each completed collection period during this reportingPeriod. The reportingPeriod should be equal to or a multiple of the collectionPeriod. In the latter case, the performance data for the collection periods within one reporting period are reported together.\n",
+            "type": "integer"
+          },
+          "reportingBoundary": {
+            "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+            "type": "string",
+            "format": "date-time"
+          }
+        }
+      },
+      "reports": {
+        "description": "Information about available reports collected by this PM job.\n",
+        "type": "object",
+        "required": [
+          "href",
+          "readyTime",
+          "_links"
+        ],
+        "properties": {
+          "href": {
+            "description": "The Uri where the report can be obtained.\n",
+            "type": "string",
+            "format": "url"
+          },
+          "readyTime": {
+            "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+            "type": "string",
+            "format": "date-time"
+          },
+          "expiryTime": {
+            "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+            "type": "string",
+            "format": "date-time"
+          },
+          "fileSize": {
+            "description": "The size of the report file in bytes, if known.\n",
+            "type": "integer"
+          },
+          "_links": {
+            "description": "Links for this resource.\n",
+            "type": "object",
+            "required": [
+              "self"
+            ],
+            "properties": {
+              "self": {
+                "description": "This type represents a link to a resource.\n",
+                "type": "object",
+                "required": [
+                  "href"
+                ],
+                "properties": {
+                  "href": {
+                    "description": "URI of the referenced resource.\n",
+                    "type": "string",
+                    "format": "url"
+                  }
+                }
+              },
+              "objects": {
+                "description": "Links to resources representing the VNF instances for which performance information is collected. Shall be present if the VNF instance information is accessible as a resource.\n",
+                "type": "array",
+                "items": {
+                  "description": "This type represents a link to a resource.\n",
+                  "type": "object",
+                  "required": [
+                    "href"
+                  ],
+                  "properties": {
+                    "href": {
+                      "description": "URI of the referenced resource.\n",
+                      "type": "string",
+                      "format": "url"
+                    }
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/PmSubscription.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/PmSubscription.schema.json
new file mode 100644
index 00000000..c9ad0513
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/PmSubscription.schema.json
@@ -0,0 +1,142 @@
+{
+  "description": "This type represents a subscription.\n",
+  "type": "object",
+  "required": [
+    "id",
+    "callbackUri",
+    "_links"
+  ],
+  "properties": {
+    "id": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "filter": {
+      "description": "This type represents a filter that can be used to subscribe for notifications related to performance management events.\n",
+      "type": "object",
+      "properties": {
+        "vnfInstanceSubscriptionFilter": {
+          "description": "This type represents subscription filter criteria to match VNF instances.\n",
+          "type": "object",
+          "properties": {
+            "vnfdIds": {
+              "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. The attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances that are based on certain VNFDs in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",
+              "type": "array",
+              "items": {
+                "description": "An identifier with the intention of being globally unique.\n",
+                "type": "string"
+              }
+            },
+            "vnfProductsFromProviders": {
+              "description": "If present, match VNF instances that belong to VNF products from certain providers. The attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances that are based on certain VNFDs in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",
+              "type": "array",
+              "items": {
+                "type": "object",
+                "required": [
+                  "vnfProvider"
+                ],
+                "properties": {
+                  "vnfProvider": {
+                    "description": "Name of the VNF provider to match.\n",
+                    "type": "string"
+                  },
+                  "vnfProducts": {
+                    "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n",
+                    "type": "array",
+                    "items": {
+                      "type": "object",
+                      "required": [
+                        "vnfProductName"
+                      ],
+                      "properties": {
+                        "vnfProductName": {
+                          "description": "Name of the VNF product to match.\n",
+                          "type": "string"
+                        },
+                        "versions": {
+                          "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n",
+                          "type": "array",
+                          "items": {
+                            "type": "object",
+                            "required": [
+                              "vnfSoftwareVersion"
+                            ],
+                            "properties": {
+                              "vnfSoftwareVersion": {
+                                "description": "A version.\n",
+                                "type": "string"
+                              },
+                              "vnfdVersions": {
+                                "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n",
+                                "type": "array",
+                                "items": {
+                                  "description": "A version.\n",
+                                  "type": "string"
+                                }
+                              }
+                            }
+                          }
+                        }
+                      }
+                    }
+                  }
+                }
+              }
+            },
+            "vnfInstanceIds": {
+              "description": "If present, match VNF instances with an instance identifier listed in this attribute. The attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",
+              "type": "array",
+              "items": {
+                "description": "An identifier with the intention of being globally unique.\n",
+                "type": "string"
+              }
+            },
+            "vnfInstanceNames": {
+              "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. The attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",
+              "type": "array",
+              "items": {
+                "type": "string"
+              }
+            }
+          }
+        },
+        "notificationTypes": {
+          "description": "Match particular notification types. Permitted values: * ThresholdCrossedNotification * PerformanceInformationAvailableNotification The permitted values of the \"notificationTypes\" attribute are spelled exactly as the names of the notification types to facilitate automated code generation systems.\n",
+          "type": "string",
+          "enum": [
+            "ThresholdCrossedNotification",
+            "PerformanceInformationAvailableNotification"
+          ]
+        }
+      }
+    },
+    "callbackUri": {
+      "description": "The URI of the endpoint to send the notification to.\n",
+      "type": "string",
+      "format": "url"
+    },
+    "_links": {
+      "description": "Links to resources related to this resource.\n",
+      "type": "object",
+      "required": [
+        "self"
+      ],
+      "properties": {
+        "self": {
+          "description": "This type represents a link to a resource.\n",
+          "type": "object",
+          "required": [
+            "href"
+          ],
+          "properties": {
+            "href": {
+              "description": "URI of the referenced resource.\n",
+              "type": "string",
+              "format": "url"
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/PmSubscriptions.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/PmSubscriptions.schema.json
new file mode 100644
index 00000000..fefb142d
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/PmSubscriptions.schema.json
@@ -0,0 +1 @@
+{  "type": "array",  "items": {    "description": "This type represents a subscription.\n",    "type": "object",    "required": [      "id",      "callbackUri",      "_links"    ],    "properties": {      "id": {        "description": "An identifier with the intention of being globally unique.\n",        "type": "string"      },      "filter": {        "description": "This type represents a filter that can be used to subscribe for notifications related to performance management events.\n",        "type": "object",        "properties": {          "vnfInstanceSubscriptionFilter": {            "description": "This type represents subscription filter criteria to match VNF instances.\n",            "type": "object",            "properties": {              "vnfdIds": {                "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. The attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances that are based on certain VNFDs in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "description": "An identifier with the intention of being globally unique.\n",                  "type": "string"                }              },              "vnfProductsFromProviders": {                "description": "If present, match VNF instances that belong to VNF products from certain providers. The attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances that are based on certain VNFDs in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "type": "object",                  "required": [                    "vnfProvider"                  ],                  "properties": {                    "vnfProvider": {                      "description": "Name of the VNF provider to match.\n",                      "type": "string"                    },                    "vnfProducts": {                      "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n",                      "type": "array",                      "items": {                        "type": "object",                        "required": [                          "vnfProductName"                        ],                        "properties": {                          "vnfProductName": {                            "description": "Name of the VNF product to match.\n",                            "type": "string"                          },                          "versions": {                            "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n",                            "type": "array",                            "items": {                              "type": "object",                              "required": [                                "vnfSoftwareVersion"                              ],                              "properties": {                                "vnfSoftwareVersion": {                                  "description": "A version.\n",                                  "type": "string"                                },                                "vnfdVersions": {                                  "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n",                                  "type": "array",                                  "items": {                                    "description": "A version.\n",                                    "type": "string"                                  }                                }                              }                            }                          }                        }                      }                    }                  }                }              },              "vnfInstanceIds": {                "description": "If present, match VNF instances with an instance identifier listed in this attribute. The attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "description": "An identifier with the intention of being globally unique.\n",                  "type": "string"                }              },              "vnfInstanceNames": {                "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. The attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "type": "string"                }              }            }          },          "notificationTypes": {            "description": "Match particular notification types. Permitted values: * ThresholdCrossedNotification * PerformanceInformationAvailableNotification The permitted values of the \"notificationTypes\" attribute are spelled exactly as the names of the notification types to facilitate automated code generation systems.\n",            "type": "string",            "enum": [              "ThresholdCrossedNotification",              "PerformanceInformationAvailableNotification"            ]          }        }      },      "callbackUri": {        "description": "The URI of the endpoint to send the notification to.\n",        "type": "string",        "format": "url"      },      "_links": {        "description": "Links to resources related to this resource.\n",        "type": "object",        "required": [          "self"        ],        "properties": {          "self": {            "description": "This type represents a link to a resource.\n",            "type": "object",            "required": [              "href"            ],            "properties": {              "href": {                "description": "URI of the referenced resource.\n",                "type": "string",                "format": "url"              }            }          }        }      }    }  }}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/ProblemDetails.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/ProblemDetails.schema.json
new file mode 100644
index 00000000..2af3ef9b
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/ProblemDetails.schema.json
@@ -0,0 +1 @@
+{  "description": "The definition of the general \"ProblemDetails\" data structure from IETF RFC 7807 [19] is reproduced inthis structure. Compared to the general framework defined in IETF RFC 7807 [19], the \"status\" and \"detail\" attributes are mandated to be included by the present document, to ensure that the response contains additional textual information about an error. IETF RFC 7807 [19] foresees extensibility of the \"ProblemDetails\" type. It is possible that particular APIs in the present document, or particular implementations, define extensions to define additional attributes that provide more information about the error. The description column only provides some explanation of the meaning to Facilitate understanding of the design. For a full description, see IETF RFC 7807 [19].\n",  "type": "object",  "required": [    "status",    "detail"  ],  "properties": {    "type": {      "description": "A URI reference according to IETF RFC 3986 [5] that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".\n",      "type": "string",      "format": "URI"    },    "title": {      "description": "A short, human-readable summary of the problem type. It should not change from occurrence to occurrence of the problem, except for purposes of localization. If type is given and other than \"about:blank\", this attribute shall also be provided. A short, human-readable summary of the problem type.  It SHOULD NOT change from occurrence to occurrence of the problem, except for purposes of localization (e.g., using proactive content negotiation; see [RFC7231], Section 3.4).\n",      "type": "string"    },    "status": {      "description": "The HTTP status code for this occurrence of the problem. The HTTP status code ([RFC7231], Section 6) generated by the origin server for this occurrence of the problem.\n",      "type": "integer"    },    "detail": {      "description": "A human-readable explanation specific to this occurrence of the problem.\n",      "type": "string"    },    "instance": {      "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.\n",      "type": "string",      "format": "URI"    }  }}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/Subscriptions.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/Subscriptions.schema.json
new file mode 100644
index 00000000..fefb142d
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/Subscriptions.schema.json
@@ -0,0 +1 @@
+{  "type": "array",  "items": {    "description": "This type represents a subscription.\n",    "type": "object",    "required": [      "id",      "callbackUri",      "_links"    ],    "properties": {      "id": {        "description": "An identifier with the intention of being globally unique.\n",        "type": "string"      },      "filter": {        "description": "This type represents a filter that can be used to subscribe for notifications related to performance management events.\n",        "type": "object",        "properties": {          "vnfInstanceSubscriptionFilter": {            "description": "This type represents subscription filter criteria to match VNF instances.\n",            "type": "object",            "properties": {              "vnfdIds": {                "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. The attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances that are based on certain VNFDs in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "description": "An identifier with the intention of being globally unique.\n",                  "type": "string"                }              },              "vnfProductsFromProviders": {                "description": "If present, match VNF instances that belong to VNF products from certain providers. The attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances that are based on certain VNFDs in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "type": "object",                  "required": [                    "vnfProvider"                  ],                  "properties": {                    "vnfProvider": {                      "description": "Name of the VNF provider to match.\n",                      "type": "string"                    },                    "vnfProducts": {                      "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n",                      "type": "array",                      "items": {                        "type": "object",                        "required": [                          "vnfProductName"                        ],                        "properties": {                          "vnfProductName": {                            "description": "Name of the VNF product to match.\n",                            "type": "string"                          },                          "versions": {                            "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n",                            "type": "array",                            "items": {                              "type": "object",                              "required": [                                "vnfSoftwareVersion"                              ],                              "properties": {                                "vnfSoftwareVersion": {                                  "description": "A version.\n",                                  "type": "string"                                },                                "vnfdVersions": {                                  "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n",                                  "type": "array",                                  "items": {                                    "description": "A version.\n",                                    "type": "string"                                  }                                }                              }                            }                          }                        }                      }                    }                  }                }              },              "vnfInstanceIds": {                "description": "If present, match VNF instances with an instance identifier listed in this attribute. The attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "description": "An identifier with the intention of being globally unique.\n",                  "type": "string"                }              },              "vnfInstanceNames": {                "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. The attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n",                "type": "array",                "items": {                  "type": "string"                }              }            }          },          "notificationTypes": {            "description": "Match particular notification types. Permitted values: * ThresholdCrossedNotification * PerformanceInformationAvailableNotification The permitted values of the \"notificationTypes\" attribute are spelled exactly as the names of the notification types to facilitate automated code generation systems.\n",            "type": "string",            "enum": [              "ThresholdCrossedNotification",              "PerformanceInformationAvailableNotification"            ]          }        }      },      "callbackUri": {        "description": "The URI of the endpoint to send the notification to.\n",        "type": "string",        "format": "url"      },      "_links": {        "description": "Links to resources related to this resource.\n",        "type": "object",        "required": [          "self"        ],        "properties": {          "self": {            "description": "This type represents a link to a resource.\n",            "type": "object",            "required": [              "href"            ],            "properties": {              "href": {                "description": "URI of the referenced resource.\n",                "type": "string",                "format": "url"              }            }          }        }      }    }  }}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/Threshold.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/Threshold.schema.json
new file mode 100644
index 00000000..d3138727
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/Threshold.schema.json
@@ -0,0 +1,85 @@
+{
+  "description": "This type represents a threshold.\n",
+  "type": "object",
+  "required": [
+    "id",
+    "objectInstanceId",
+    "criteria",
+    "_links"
+  ],
+  "properties": {
+    "id": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "objectInstanceId": {
+      "description": "An identifier with the intention of being globally unique.\n",
+      "type": "string"
+    },
+    "criteria": {
+      "description": "This type represents criteria that define a threshold.\n",
+      "type": "object",
+      "required": [
+        "performanceMetric",
+        "thresholdType"
+      ],
+      "properties": {
+        "performanceMetric": {
+          "description": "Defines the performance metric associated with the threshold, as specified in ETSI GS NFV-IFA 027).\n",
+          "type": "string"
+        },
+        "thresholdType": {
+          "description": "Type of threshold. This attribute determines which other attributes are present in the data structure. Permitted values: * SIMPLE: Single-valued static threshold In the present document, simple thresholds are defined. The definition of additional threshold types is left for future specification.\n",
+          "type": "string",
+          "enum": [
+            "SIMPLE"
+          ]
+        },
+        "simpleThresholdDetails": {
+          "description": "Details of a simple threshold. Shall be present if thresholdType=\"SIMPLE\".\n",
+          "type": "object",
+          "required": [
+            "thresholdValue",
+            "hysteresis"
+          ],
+          "properties": {
+            "thresholdValue": {
+              "description": "The threshold value. Shall be represented as a floating point number.\n",
+              "type": "integer"
+            },
+            "hysteresis": {
+              "description": "The hysteresis of the threshold. Shall be represented as a non-negative floating point number. A notification with crossing direction \"UP\" will be generated if the measured value reaches or exceeds \"thresholdValue\" + \"hysteresis\". A notification with crossing direction \"DOWN\" will be generated if the measured value reaches or undercuts \"thresholdValue\" - \"hysteresis\". The hysteresis is defined to prevent storms of threshold crossing notifications. When processing a request to create a threshold, implementations should enforce a suitable minimum value for this attribute (e.g. override the value or reject the request).\n",
+              "type": "integer"
+            }
+          }
+        }
+      }
+    },
+    "_links": {
+      "description": "Links for this resource.\n",
+      "type": "object",
+      "required": [
+        "self"
+      ],
+      "properties": {
+        "self": {
+          "description": "This type represents a link to a resource.\n",
+          "type": "object",
+          "required": [
+            "href"
+          ],
+          "properties": {
+            "href": {
+              "description": "URI of the referenced resource.\n",
+              "type": "string",
+              "format": "url"
+            }
+          }
+        },
+        "object": {
+          "description": "Link to a resource representing the VNF instance for which performance information is collected. Shall be present if the VNF instance information is accessible as a resource.\n"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/ThresholdCrossedNotification.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/ThresholdCrossedNotification.schema.json
new file mode 100644
index 00000000..e5cec230
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/ThresholdCrossedNotification.schema.json
@@ -0,0 +1,113 @@
+{
+    "description": "This type represents a notification that is sent when a threshold has been crossed. The notification shall be triggered by the VNFM when a threshold has been crossed.\n",
+    "type": "object",
+    "required": [
+      "id",
+      "notificationType",
+      "subscriptionId",
+      "timeStamp",
+      "thresholdId",
+      "crossingDirection",
+      "objectInstanceId",
+      "performanceMetric",
+      "performanceValue",
+      "_links"
+    ],
+    "properties": {
+      "id": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "notificationType": {
+        "description": "Discriminator for the different notification types. Shall be set to \"ThresholdCrossedNotification\" for this notification type.\n",
+        "type": "string",
+        "enum": [
+          "ThresholdCrossedNotification"
+        ]
+      },
+      "subscriptionId": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "timeStamp": {
+        "description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+        "type": "string",
+        "format": "date-time"
+      },
+      "thresholdId": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "crossingDirection": {
+        "type": "string",
+        "enum": [
+          "UP",
+          "DOWN"
+        ]
+      },
+      "objectInstanceId": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "performanceMetric": {
+        "description": "Performance metric associated with the threshold.\n",
+        "type": "string"
+      },
+      "performanceValue": {
+        "description": "Value of the metric that resulted in threshold crossing. The type of the \"performanceValue\" attribute (i.e. scalar, structure (Object in JSON), or array (of scalars, arrays or structures / Objects)) is assumed to be defined in the external measurement specification (see ETSI GS NFV-IFA 027).\n",
+        "type": "object"
+      },
+      "_links": {
+        "description": "Links to resources related to this notification.\n",
+        "type": "object",
+        "required": [
+          "subscription",
+          "threshold"
+        ],
+        "properties": {
+          "subscription": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          },
+          "objectInstance": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          },
+          "threshold": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          }
+        }
+      }
+    }
+  }
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/Thresholds.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/Thresholds.schema.json
new file mode 100644
index 00000000..42ba2c0b
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/Thresholds.schema.json
@@ -0,0 +1,88 @@
+{
+  "type": "array",
+  "items": {
+    "description": "This type represents a threshold.\n",
+    "type": "object",
+    "required": [
+      "id",
+      "objectInstanceId",
+      "criteria",
+      "_links"
+    ],
+    "properties": {
+      "id": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "objectInstanceId": {
+        "description": "An identifier with the intention of being globally unique.\n",
+        "type": "string"
+      },
+      "criteria": {
+        "description": "This type represents criteria that define a threshold.\n",
+        "type": "object",
+        "required": [
+          "performanceMetric",
+          "thresholdType"
+        ],
+        "properties": {
+          "performanceMetric": {
+            "description": "Defines the performance metric associated with the threshold, as specified in ETSI GS NFV-IFA 027).\n",
+            "type": "string"
+          },
+          "thresholdType": {
+            "description": "Type of threshold. This attribute determines which other attributes are present in the data structure. Permitted values: * SIMPLE: Single-valued static threshold In the present document, simple thresholds are defined. The definition of additional threshold types is left for future specification.\n",
+            "type": "string",
+            "enum": [
+              "SIMPLE"
+            ]
+          },
+          "simpleThresholdDetails": {
+            "description": "Details of a simple threshold. Shall be present if thresholdType=\"SIMPLE\".\n",
+            "type": "object",
+            "required": [
+              "thresholdValue",
+              "hysteresis"
+            ],
+            "properties": {
+              "thresholdValue": {
+                "description": "The threshold value. Shall be represented as a floating point number.\n",
+                "type": "integer"
+              },
+              "hysteresis": {
+                "description": "The hysteresis of the threshold. Shall be represented as a non-negative floating point number. A notification with crossing direction \"UP\" will be generated if the measured value reaches or exceeds \"thresholdValue\" + \"hysteresis\". A notification with crossing direction \"DOWN\" will be generated if the measured value reaches or undercuts \"thresholdValue\" - \"hysteresis\". The hysteresis is defined to prevent storms of threshold crossing notifications. When processing a request to create a threshold, implementations should enforce a suitable minimum value for this attribute (e.g. override the value or reject the request).\n",
+                "type": "integer"
+              }
+            }
+          }
+        }
+      },
+      "_links": {
+        "description": "Links for this resource.\n",
+        "type": "object",
+        "required": [
+          "self"
+        ],
+        "properties": {
+          "self": {
+            "description": "This type represents a link to a resource.\n",
+            "type": "object",
+            "required": [
+              "href"
+            ],
+            "properties": {
+              "href": {
+                "description": "URI of the referenced resource.\n",
+                "type": "string",
+                "format": "url"
+              }
+            }
+          },
+          "object": {
+            "description": "Link to a resource representing the VNF instance for which performance information is collected. Shall be present if the VNF instance information is accessible as a resource.\n"
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/criteria.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/criteria.schema.json
new file mode 100644
index 00000000..319d15f5
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/criteria.schema.json
@@ -0,0 +1,34 @@
+{
+	"description": "Criteria of the collection of performance information.\n",
+	"type": "object",
+	"required": ["collectionPeriod", "reportingPeriod"],
+	"properties": {
+		"performanceMetric": {
+			"description": "This defines the types of performance metrics for the specified object instances, as specified in ETSI GS NFV-IFA 027). At least one of the two attributes (performance metric or group) shall be present.\n",
+			"type": "array",
+			"items": {
+				"type": "string"
+			}
+		},
+		"performanceMetricGroup": {
+			"description": "Group of performance metrics. A metric group is a pre-defined list of metrics, known to the producer that it can decompose to individual metrics. At least one of the two attributes (performance metric or group) shall be present.\n",
+			"type": "array",
+			"items": {
+				"type": "string"
+			}
+		},
+		"collectionPeriod": {
+			"description": "Specifies the periodicity at which the producer will collect performance information. The unit shall be seconds. At the end of each reportingPeriod, the producer will inform the consumer about availability of the performance data collected for each completed collection period during this reportingPeriod. The reportingPeriod should be equal to or a multiple of the collectionPeriod. In the latter case, the performance data for the collection periods within one reporting period are reported together.\n",
+			"type": "integer"
+		},
+		"reportingPeriod": {
+			"description": "Specifies the periodicity at which the producer will report to the consumer. about performance information. The unit shall be seconds. At the end of each reportingPeriod, the producer will inform the consumer about availability of the performance data collected for each completed collection period during this reportingPeriod. The reportingPeriod should be equal to or a multiple of the collectionPeriod. In the latter case, the performance data for the collection periods within one reporting period are reported together.\n",
+			"type": "integer"
+		},
+		"reportingBoundary": {
+			"description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+			"type": "string",
+			"format": "date-time"
+		}
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/links.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/links.schema.json
new file mode 100644
index 00000000..ef262a8c
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/links.schema.json
@@ -0,0 +1,35 @@
+{
+	"description": "Links for this resource.\n",
+	"type": "object",
+	"required": ["self"],
+	"properties": {
+		"self": {
+			"description": "This type represents a link to a resource.\n",
+			"type": "object",
+			"required": ["href"],
+			"properties": {
+				"href": {
+					"description": "URI of the referenced resource.\n",
+					"type": "string",
+					"format": "url"
+				}
+			}
+		},
+		"objects": {
+			"description": "Links to resources representing the VNF instances for which performance information is collected. Shall be present if the VNF instance information is accessible as a resource.\n",
+			"type": "array",
+			"items": {
+				"description": "This type represents a link to a resource.\n",
+				"type": "object",
+				"required": ["href"],
+				"properties": {
+					"href": {
+						"description": "URI of the referenced resource.\n",
+						"type": "string",
+						"format": "url"
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/SOL005/VNFPerformanceManagement-API/schemas/reports.schema.json b/SOL005/VNFPerformanceManagement-API/schemas/reports.schema.json
new file mode 100644
index 00000000..834ded68
--- /dev/null
+++ b/SOL005/VNFPerformanceManagement-API/schemas/reports.schema.json
@@ -0,0 +1,26 @@
+{
+	"description": "Information about available reports collected by this PM job.\n",
+	"type": "object",
+	"required": ["href", "readyTime"],
+	"properties": {
+		"href": {
+			"description": "The Uri where the report can be obtained.\n",
+			"type": "string",
+			"format": "url"
+		},
+		"readyTime": {
+			"description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+			"type": "string",
+			"format": "date-time"
+		},
+		"expiryTime": {
+			"description": "Date-time stamp.  Representation: String formatted according to IETF RFC 3339.\n",
+			"type": "string",
+			"format": "date-time"
+		},
+		"fileSize": {
+			"description": "The size of the report file in bytes, if known.\n",
+			"type": "integer"
+		}
+	}
+}
\ No newline at end of file
diff --git a/extensions/jsonlibrary.patch b/extensions/jsonlibrary.patch
new file mode 100644
index 00000000..39d454a3
--- /dev/null
+++ b/extensions/jsonlibrary.patch
@@ -0,0 +1,59 @@
+diff --git a/JSONLibrary/JSONLibraryKeywords.py b/JSONLibrary/JSONLibraryKeywords.py
+index 6ceb6e1..20bfd45 100644
+--- a/JSONLibrary/JSONLibraryKeywords.py
++++ b/JSONLibrary/JSONLibraryKeywords.py
+@@ -1,7 +1,13 @@
+ # -*- coding: utf-8 -*-
+ from robot.api import logger
+ from robot.api.deco import keyword
+-from version import VERSION
++#from version import VERSION
++try:
++    from version import VERSION
++except:
++    from JSONLibrary.version import VERSION
++
++
+ import os.path
+ import json
+ from jsonpath_rw import Index, Fields
+diff --git a/JSONLibrary/__init__.py b/JSONLibrary/__init__.py
+index efc756e..79ad728 100644
+--- a/JSONLibrary/__init__.py
++++ b/JSONLibrary/__init__.py
+@@ -1,6 +1,12 @@
+ # -*- coding: utf-8 -*-
+-from JSONLibraryKeywords import JSONLibraryKeywords
+-from version import VERSION
++# from JSONLibraryKeywords import JSONLibraryKeywords
++# from version import VERSION
++try:
++    from JSONLibraryKeywords import JSONLibraryKeywords
++    from version import VERSION
++except:
++    from JSONLibrary.JSONLibraryKeywords import JSONLibraryKeywords
++    from JSONLibrary.version import VERSION
+ 
+ __author__ = 'Traitanit Huangsri'
+ __email__ = 'traitanit.hua@gmail.com'
+diff --git a/setup.py b/setup.py
+index 744e6f5..5082364 100644
+--- a/setup.py
++++ b/setup.py
+@@ -2,7 +2,15 @@
+ # -*- coding: utf-8 -*-
+ 
+ from setuptools import setup
+-from JSONLibrary.version import VERSION
++# from JSONLibrary.version import VERSION
++
++
++# importing this has the unwanted side-effect of importing
++# other required packages that may not be installed yet
++# resulting in an error
++#from JSONLibrary.version import VERSION
++
++VERSION = '0.2'
+ 
+ requirements = [
+     'tox',
-- 
GitLab