diff --git a/robot-systest/lib/connectivity_lib.robot b/robot-systest/lib/connectivity_lib.resource
similarity index 60%
rename from robot-systest/lib/connectivity_lib.robot
rename to robot-systest/lib/connectivity_lib.resource
index 79381e4..e91aedd 100644
--- a/robot-systest/lib/connectivity_lib.robot
+++ b/robot-systest/lib/connectivity_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
@@ -10,10 +11,17 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
+*** Settings ***
+Documentation   Library providing keywords for testing connectivity to hosts via ping.
+Library   OperatingSystem
+
+
 *** Variables ***
-${success_return_code}   0
-${connectivity_pol_time}   5sec
-${connectivity_max_wait_time}   30sec
+${SUCCESS_RETURN_CODE}   0
+${CONNECTIVITY_POL_TIME}   5sec
+${CONNECTIVITY_MAX_WAIT_TIME}   30sec
+
 
 *** Keywords ***
 Test Ping Host
@@ -22,14 +30,12 @@
     ...                  host: IP or name of the host
     ...               Execution example:
     ...                  Ping Test   \${host}
-
     [Arguments]   ${host}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   ping -c 2 -W 1 ${host}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ping -c 2 -W 1 ${host}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Test Connectivity
+    [Documentation]   Ping a host several times during ${CONNECTIVITY_MAX_WAIT_TIME} until it succeeds or raises a timeout.
     [Arguments]   ${host}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${connectivity_max_wait_time}   ${connectivity_pol_time}   Test Ping Host   ${host}
+    Wait Until Keyword Succeeds   ${CONNECTIVITY_MAX_WAIT_TIME}   ${CONNECTIVITY_POL_TIME}   Test Ping Host   ${host}
diff --git a/robot-systest/lib/juju_lib.robot b/robot-systest/lib/juju_lib.resource
similarity index 77%
rename from robot-systest/lib/juju_lib.robot
rename to robot-systest/lib/juju_lib.resource
index 45208a8..3d02901 100644
--- a/robot-systest/lib/juju_lib.robot
+++ b/robot-systest/lib/juju_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
@@ -10,59 +11,66 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
+*** Settings ***
+Documentation   Library providing keywords to read objects from Juju using juju client.
+Library   String
+Resource   ssh_lib.resource
+
+
 *** Variables ***
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Keywords ***
 Get Scale Number
+    [Documentation]   Get from Juju the number of units (scale) of a juju application and return it.
     [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${application_name}   ${model_name}
-
     Should Not Be Empty   ${application_name}   ${model_name}
     ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
     ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju show-status ${application_name} --format yaml -m ${model_name} | grep scale | awk -F ': ' '{print $2}'
     Log   ${stdout}
-    [Return]   ${stdout}
+    RETURN   ${stdout}
 
 Get Model Name
+    [Documentation]   Get from Juju the model from a KDU name and a NS id.
     [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${ns_id}   ${kdu_name}
-
     Should Not Be Empty   ${ns_id}   ${kdu_name}
     ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
     ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju models | grep -i ${kdu_name} | grep -i ${ns_id} | cut -f1 -d " "
     Log   ${stdout}
     ${model_name}=   Set Variable   ${kdu_name}-${ns_id}
     Should Be Equal As Strings   ${model_name}   ${stdout}
-    [Return]   ${stdout}
+    RETURN   ${stdout}
 
 Get Application Name VDU Level Charm
+    [Documentation]   Get from Juju the application name matching a model and a VDU profile id passed as arguments. The application name must contain the EE passed as argument.
     [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vdu_profile_id}   ${ee_name}
-
     Should Not Be Empty   ${model_name}
     ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
     ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-vdu" | grep -v "*" | grep -i ${vdu_profile_id} | cut -f1 -d " "
     Log   ${stdout}
     Should Not Be Empty   ${stdout}
     Should Contain   ${stdout}   ${ee_name}
-    [Return]   ${stdout}
+    RETURN   ${stdout}
 
 Get Application Name NS Level Charm
+    [Documentation]   Get from Juju the application name matching a model and a NS charm passed as arguments.
     [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${charm_name}
-
     Should Not Be Empty   ${model_name}
     ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
     ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-ns" | grep -v "*" | grep -i ${charm_name} | cut -f1 -d " "
     Log   ${stdout}
     Should Not Be Empty   ${stdout}
-    [Return]   ${stdout}
+    RETURN   ${stdout}
 
 Get Application Name VNF Level Charm
+    [Documentation]   Get from Juju the application name matching a model and a VNF profile id passed as arguments. The application name must contain the EE passed as argument.
     [Arguments]   ${endpoint}   ${username}   ${password}   ${privatekey}   ${model_name}   ${vnf_profile_id}   ${ee_name}
-
     Should Not Be Empty   ${model_name}
     ${host}=   Remove String Using Regexp   ${endpoint}   :([0-9]+)$
     ${stdout}=   Execute Remote Command Check Rc Return Output   ${host}   ${username}   ${password}   ${privatekey}   juju status -m ${model_name} | grep "\\-vnf" | grep -v "*" | grep -i ${vnf_profile_id} | cut -f1 -d " "
     Log   ${stdout}
     Should Not Be Empty   ${stdout}
     Should Contain   ${stdout}   ${ee_name}
-    [Return]   ${stdout}
\ No newline at end of file
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/k8scluster_lib.resource b/robot-systest/lib/k8scluster_lib.resource
new file mode 100644
index 0000000..0895da7
--- /dev/null
+++ b/robot-systest/lib/k8scluster_lib.resource
@@ -0,0 +1,90 @@
+*** Comments ***
+# Copyright 2020 Canonical Ltd.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Kubernetes clusters with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${K8SCLUSTER_LAUNCH_MAX_WAIT_TIME}   6min
+${K8SCLUSTER_LAUNCH_POL_TIME}   30sec
+${K8SCLUSTER_DELETE_MAX_WAIT_TIME}   2min
+${K8SCLUSTER_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Create K8s Cluster
+    [Documentation]   Register a Kubernetes cluster in OSM using the name, version and credentials passed as arguments.
+    [Arguments]   ${k8scluster_creds}   ${k8scluster_version}   ${k8scluster_vim}   ${k8scluster_net}   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-add --creds ${k8scluster_creds} --version ${k8scluster_version} --vim ${k8scluster_vim} --k8s-nets '{"net1": "${k8scluster_net}"}' ${k8scluster_name} --description "Robot cluster"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${K8SCLUSTER_LAUNCH_MAX_WAIT_TIME}   ${K8SCLUSTER_LAUNCH_POL_TIME}   Check For K8s Cluster To Be Ready   ${k8scluster_name}
+    Check For K8s Cluster To Be Enabled   ${k8scluster_name}
+    RETURN   ${stdout}
+
+Delete K8s Cluster
+    [Documentation]   Unregister/delete a Kubernetes cluster from OSM.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-delete ${k8scluster_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${K8SCLUSTER_DELETE_MAX_WAIT_TIME}   ${K8SCLUSTER_DELETE_POL_TIME}   Check For K8s Cluster To Be Deleted   ${k8scluster_name}
+
+Get K8s Cluster
+    [Documentation]   Get the list of Kubernetes clusters in OSM, and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    RETURN   ${stdout}
+
+Check For K8s Cluster
+    [Documentation]   Check if a Kubernetes cluster identified by name exists in OSM, and return it.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}"
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Check For K8s Cluster To Be Deleted
+    [Documentation]   Check if a Kubernetes cluster identified by name is not present in OSM.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}" | awk '{print $2}' | grep ${k8scluster_name}
+    Log   ${rc},${stdout}
+    Should Be Empty   ${stdout}
+
+Check For K8s Cluster To Be Ready
+    [Documentation]   Check if a Kubernetes cluster registered in OSM is ready (the state must be ENABLED or DEGRADED).
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED,DEGRADED"
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
+
+Check For K8s Cluster To Be Enabled
+    [Documentation]   Check if the state of Kubernetes cluster registered in OSM is ENABLED.
+    [Arguments]   ${k8scluster_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-show ${k8scluster_name}
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED"
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
diff --git a/robot-systest/lib/k8scluster_lib.robot b/robot-systest/lib/k8scluster_lib.robot
deleted file mode 100644
index 8f642a3..0000000
--- a/robot-systest/lib/k8scluster_lib.robot
+++ /dev/null
@@ -1,71 +0,0 @@
-# Copyright 2020 Canonical Ltd.
-#
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Variables ***
-${success_return_code}   0
-${k8scluster_launch_max_wait_time}   6min
-${k8scluster_launch_pol_time}   30sec
-${k8scluster_delete_max_wait_time}   2min
-${k8scluster_delete_pol_time}   15sec
-
-*** Keywords ***
-Create K8s Cluster
-    [Arguments]   ${k8scluster_creds}   ${k8scluster_version}   ${k8scluster_vim}   ${k8scluster_net}   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-add --creds ${k8scluster_creds} --version ${k8scluster_version} --vim ${k8scluster_vim} --k8s-nets '{"net1": "${k8scluster_net}"}' ${k8scluster_name} --description "Robot cluster"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${k8scluster_launch_max_wait_time}   ${k8scluster_launch_pol_time}   Check For K8s Cluster To Be Ready   ${k8scluster_name}
-    Check For K8s Cluster To Be Enabled   ${k8scluster_name}
-    [Return]   ${stdout}
-
-Delete K8s Cluster
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-delete ${k8scluster_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${k8scluster_delete_max_wait_time}   ${k8scluster_delete_pol_time}   Check For K8s Cluster To Be Deleted   ${k8scluster_name}
-
-Get K8s Cluster
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Log   ${stdout}
-    [Return]   ${stdout}
-
-Check for K8s Cluster
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}"
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-Check For K8s Cluster To Be Deleted
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}" | awk '{print $2}' | grep ${k8scluster_name}
-    Should Be Empty   ${stdout}
-
-Check For K8s Cluster To Be Ready
-    [Arguments]   ${k8scluster_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED,DEGRADED"
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
-
-Check For K8s Cluster To Be Enabled
-    [Arguments]   ${k8scluster_name}
-    ${rc2}   ${stdout2}=   Run and Return RC and Output   osm k8scluster-show ${k8scluster_name}
-    Log   ${stdout2}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm k8scluster-list --filter name="${k8scluster_name}" --filter _admin.operationalState="ENABLED"
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   echo "${stdout}" | awk '{print $2}' | grep ${k8scluster_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Be Equal As Strings   ${stdout}   ${k8scluster_name}
diff --git a/robot-systest/lib/ns_lib.resource b/robot-systest/lib/ns_lib.resource
new file mode 100644
index 0000000..f76478e
--- /dev/null
+++ b/robot-systest/lib/ns_lib.resource
@@ -0,0 +1,221 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library to deploy and delete NS, and run operations on them.
+
+Library   Collections
+Library   DateTime
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NS_LAUNCH_POL_TIME}   30sec
+${NS_DELETE_POL_TIME}   15sec
+${VIM_TIMEOUT_MULTIPLIER}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
+
+
+*** Keywords ***
+Create Network Service
+    [Documentation]   Launch the instantation of a NS and verify in a loop that the NS instance is successfully created in a given time, and return the NS instance id.
+    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_launch_max_wait_time}=5min   ${config_file}=${EMPTY}
+    ${ns_launch_max_wait_time}=   Convert Time   ${ns_launch_max_wait_time}   result_format=number
+    ${ns_launch_max_wait_time}=   Evaluate   ${ns_launch_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Log   ${ns_launch_max_wait_time}
+    ${config_attr}=   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   ${EMPTY}
+    ${sshkeys_attr}=   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   ${EMPTY}
+    ${config_file_attr}=   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   ${EMPTY}
+    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_attr} ${config_file_attr}
+    Log   ${ns_id}
+    Wait Until Keyword Succeeds   ${ns_launch_max_wait_time}   ${NS_LAUNCH_POL_TIME}   Check For NS Instance To Configured   ${ns_name}
+    Check For NS Instance For Failure   ${ns_name}
+    RETURN   ${ns_id}
+
+Instantiate Network Service
+    [Documentation]   Launch the instantation of a NS, and return the NS instance id.
+    [Arguments]   ${ns_name}   ${nsd}   ${vim_name}   ${ns_extra_args}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} ${ns_extra_args}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Vnf Management Ip Address
+    [Documentation]   Get the mgmt IP address of a member VNF in a NS instance, and return it.
+    [Arguments]   ${ns_id}   ${vnf_member_index}
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $14}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Vnf Id
+    [Documentation]   Get the VNF instance ID of a member VNF in a NS instance, and return it.
+    [Arguments]   ${ns_id}   ${vnf_member_index}
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $2}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Ns Id
+    [Documentation]   Get the NS instance ID from a NS instance name passed as argument, and return it.
+    [Arguments]   ${ns_name}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list | grep ${ns_name} | awk '{print $4}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Empty   ${stdout}
+    RETURN   ${stdout}
+
+Get Ns List
+    [Documentation]   Get the list of NS instances and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Ns Vnf List
+    [Documentation]   Get the list of VNF instances of a given NS instance id, and return it.
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    @{vnf_list_string}=   Run And Return Rc And Output   osm vnf-list --ns ${ns_id} | grep ${ns_id} | awk '{print $2}' 2>&1
+    # Returns a String of vnf_id and needs to be converted into a list
+    @{vnf_list}=   Split String   ${vnf_list_string}[1]
+    Log List   ${vnf_list}
+    RETURN   @{vnf_list}
+
+Get Ns Ip List
+    [Documentation]   Obtain the list of IP addresses of all VM in a NS, and return it.
+    [Arguments]   @{vnf_list}
+    Should Not Be Empty   @{vnf_list}
+    @{temp_list}=   Create List
+    FOR   ${vnf_id}   IN   @{vnf_list}
+        Log   ${vnf_id}
+        @{vnf_ip_list}=   Get Vnf Ip List   ${vnf_id}
+        @{temp_list}=   Combine Lists   ${temp_list}   ${vnf_ip_list}
+    END
+    Should Not Be Empty   ${temp_list}
+    RETURN   @{temp_list}
+
+Get Vnf Ip List
+    [Documentation]   Obtain the list of IP addresses of all VM in a VNF, and return it.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    @{vnf_ip_list_string}=   Run And Return Rc And Output   osm vnf-list --filter id=${vnf_id} | grep -o '[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}' | sort -t: -u -k1,1 2>&1
+    # returns a string of ip addresses and needs to be converted into a list
+    Should Not Be Empty   ${vnf_ip_list_string}[1]
+    @{vnf_ip_list}=   Split String   ${vnf_ip_list_string}[1]
+    Log Many   ${vnf_ip_list}
+    Should Not Be Empty   ${vnf_ip_list}
+    RETURN   @{vnf_ip_list}
+
+Check For Ns Instance To Configured
+    [Documentation]   Check if a given NS instance has completed the instantiation, no matter if it succeeded (the status should be READY or BROKEN).
+    [Arguments]   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list --filter name="${ns_name}"
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain Any   ${stdout}   READY   BROKEN
+
+Check For NS Instance For Failure
+    [Documentation]   Check if a given NS instance has not failed in the instantiation (the status should not be BROKEN).
+    [Arguments]   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list --filter name="${ns_name}"
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Contain   ${stdout}   BROKEN
+
+Check For NS Instance To Be Deleted
+    [Documentation]   Check if a given NS instance is not present in OSM.
+    [Arguments]   ${ns}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list | awk '{print $2}' | grep ${ns}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${ns}
+
+Delete NS
+    [Documentation]   Delete a NS instance.
+    [Arguments]   ${ns}   ${ns_delete_max_wait_time}=4min
+    ${ns_delete_max_wait_time}=   Convert Time   ${ns_delete_max_wait_time}   result_format=number
+    ${ns_delete_max_wait_time}=   Evaluate   ${ns_delete_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Log   ${ns_delete_max_wait_time}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-delete ${ns}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${ns_delete_max_wait_time}   ${NS_DELETE_POL_TIME}   Check For NS Instance To Be Deleted   ${ns}
+
+Get Ns Vnfr Ids
+    [Documentation]   Return a list with the IDs of the VNF records of a NS instance.
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list --ns ${ns_id} | grep ${ns_id} | awk '{print $2}' 2>&1
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{vdur}=   Split String   ${stdout}
+    RETURN   @{vdur}
+
+Get Vnf Vdur Names
+    [Documentation]   Return a list with the names of the VDU records of a VNF instance.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq -r .vdur[].name
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{vdur}=   Split String   ${stdout}
+    RETURN   @{vdur}
+
+Get Vnf Kdu Replica Count
+    [Documentation]   Return the number of KDU replicas (empty if none) of a VNF instance.
+    [Arguments]   ${vnf_id}   ${kdu_name}
+    Should Not Be Empty   ${vnf_id}
+    Should Not Be Empty   ${kdu_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --kdu ${kdu_name} | yq -r .config.replicaCount
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    ${return}=   Set Variable If   '${stdout}' == 'null'   ${EMPTY}   ${stdout}
+    RETURN   ${return}
+
+Get Application Names
+    [Documentation]   Return the list of the application of a VNF instance.
+    [Arguments]   ${ns_name}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-show ${ns_name} --literal | yq -r ._admin.deployed.VCA[].application
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{app_names}=   Split String   ${stdout}
+    RETURN   ${app_names}
+
+Get VDU Affinity Group Name
+    [Documentation]   Return the affinity group name for a NF
+    [Arguments]   ${ns_name}   ${vnf_id}   ${vdur_id}
+    ${rc}   ${affinity_group_id}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq -r '."affinity-or-anti-affinity-group-id"[0]' 2>&1
+    Log   ${affinity_group_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${affinity_group_id}   values=False
+    ${rc}   ${affinity_group_name}=   Run And Return Rc And Output   osm ns-show ${ns_name} --literal | yq '."affinity-or-anti-affinity-group"[] | select(.id == "'${affinity_group_id}'")' | yq -r '.name' 2>&1
+    Log   ${affinity_group_name}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${affinity_group_name}   values=False
+    RETURN   ${affinity_group_name}
+
+GET Dual Ip
+    [Documentation]   Get dual ip from the ns list
+    [Arguments]   ${ns_id}
+    Should Not Be Empty   ${ns_id}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm ns-show ${ns_id} --literal | grep -A2 ip-address | awk '{print $2}' | paste -sd ',' | sed 's/^,//; s/,/, /g' | sed 's/^/[/; s/$/]/'
+    Log   ${rc},${stdout}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/ns_lib.robot b/robot-systest/lib/ns_lib.robot
deleted file mode 100644
index c8da271..0000000
--- a/robot-systest/lib/ns_lib.robot
+++ /dev/null
@@ -1,427 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Settings ***
-Documentation   Library to deploy and delete NS, and run operations on them.
-
-Library   DateTime
-
-
-*** Variables ***
-${success_return_code}   0
-${ns_launch_pol_time}   30sec
-${ns_delete_pol_time}   15sec
-${ns_action_max_wait_time}   1min
-${ns_action_pol_time}   15sec
-${vnf_scale_pol_time}   15sec
-${healing_pol_time}   15sec
-${vim_timeout_multiplier}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
-
-
-*** Keywords ***
-Create Network Service
-    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}   ${ns_launch_max_wait_time}=5min   ${config_file}=${EMPTY}
-
-    ${ns_launch_max_wait_time}=   Convert Time   ${ns_launch_max_wait_time}   result_format=number
-    ${ns_launch_max_wait_time}=   Evaluate   ${ns_launch_max_wait_time} * ${vim_timeout_multiplier}
-    Log   ${ns_launch_max_wait_time}
-    ${config_attr}   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   \
-    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
-    ${config_file_attr}   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   \
-
-    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_attr} ${config_file_attr}
-    Log   ${ns_id}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For NS Instance To Configured   ${ns_name}
-    Check For NS Instance For Failure   ${ns_name}
-    [Return]   ${ns_id}
-
-
-Instantiate Network Service
-    [Arguments]   ${ns_name}   ${nsd}   ${vim_name}   ${ns_extra_args}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} ${ns_extra_args}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Update Network Service
-    [Arguments]   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-update ${ns_id} --updatetype ${update_type} --config ${ns_update_config} --timeout ${ns_update_timeout} --wait
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Vnf Management Ip Address
-    [Arguments]   ${ns_id}   ${vnf_member_index}
-
-    Should Not Be Empty   ${ns_id}
-    Should Not Be Empty   ${vnf_member_index}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $14}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Vnf Id
-    [Arguments]   ${ns_id}   ${vnf_member_index}
-
-    Should Not Be Empty   ${ns_id}
-    Should Not Be Empty   ${vnf_member_index}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --filter member-vnf-index-ref=${vnf_member_index} | grep ${ns_id} | awk '{print $2}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Ns Id
-    [Arguments]   ${ns_name}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | grep ${ns_name} | awk '{print $4}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Empty   ${stdout}
-    [Return]   ${stdout}
-
-
-Get Ns List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Ns Vnf List
-    [Arguments]   ${ns_id}
-
-    Should Not Be Empty   ${ns_id}
-    @{vnf_list_string}=   Run and Return RC and Output   osm vnf-list --ns ${ns_id} | grep ${ns_id} | awk '{print $2}' 2>&1
-    # Returns a String of vnf_id and needs to be converted into a list
-    @{vnf_list} =   Split String   ${vnf_list_string}[1]
-    Log List   ${vnf_list}
-    [Return]   @{vnf_list}
-
-
-Get Ns Ip List
-    [Arguments]   @{vnf_list}
-
-    should not be empty   @{vnf_list}
-    @{temp_list}=   Create List
-    FOR   ${vnf_id}   IN   @{vnf_list}
-        Log   ${vnf_id}
-        @{vnf_ip_list}   Get Vnf Ip List   ${vnf_id}
-        @{temp_list}=   Combine Lists   ${temp_list}   ${vnf_ip_list}
-    END
-    should not be empty   ${temp_list}
-    [return]   @{temp_list}
-
-
-Get Vnf Ip List
-    [arguments]   ${vnf_id}
-
-    should not be empty   ${vnf_id}
-    @{vnf_ip_list_string}=   run and return rc and output   osm vnf-list --filter id=${vnf_id} | grep -o '[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}' | sort -t: -u -k1,1 2>&1
-    # returns a string of ip addresses and needs to be converted into a list
-    should not be empty   ${vnf_ip_list_string}[1]
-    @{vnf_ip_list} =   split string   ${vnf_ip_list_string}[1]
-    Log Many   ${vnf_ip_list}
-    should not be empty   ${vnf_ip_list}
-    [return]   @{vnf_ip_list}
-
-
-Check For Ns Instance To Configured
-    [arguments]   ${ns_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list
-    Log   ${stdout}
-    ${rc}   ${stdout}=   run and return rc and output   osm ns-list --filter name="${ns_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain Any   ${stdout}   READY   BROKEN
-
-Check For NS Instance For Failure
-    [Arguments]   ${ns_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list --filter name="${ns_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Contain   ${stdout}   BROKEN
-
-Check For NS Instance To Be Deleted
-    [Arguments]   ${ns}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list
-    Log   ${stdout}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | awk '{print $2}' | grep ${ns}
-    Should Not Be Equal As Strings   ${stdout}   ${ns}
-
-Delete NS
-    [Documentation]   Delete ns
-    [Arguments]   ${ns}   ${ns_delete_max_wait_time}=4min
-
-    ${ns_delete_max_wait_time}=   Convert Time   ${ns_delete_max_wait_time}   result_format=number
-    ${ns_delete_max_wait_time}=   Evaluate   ${ns_delete_max_wait_time} * ${vim_timeout_multiplier}
-    Log   ${ns_delete_max_wait_time}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-delete ${ns}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${ns_delete_max_wait_time}   ${ns_delete_pol_time}   Check For NS Instance To Be Deleted   ${ns}
-
-Execute NS Action
-    [Documentation]   Execute an action over the desired NS.
-    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
-    ...               Return the ID of the operation associated to the executed action.
-    ...               Examples of execution:
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
-
-    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   @{action_params}
-
-    ${params}=   Set Variable   ${EMPTY}
-    FOR   ${param}   IN   @{action_params}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
-        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
-    END
-    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index}
-    ${osm_ns_action_command}=   Run Keyword If   '${params}'!='${EMPTY}'   Catenate   ${osm_ns_action_command}   --params '{${params}}'
-    ...   ELSE   Set Variable   ${osm_ns_action_command}
-    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_ns_action_command}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${ns_action_max_wait_time}   ${ns_action_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Execute NS K8s Action
-    [Documentation]   Execute an action over the desired K8s NS.
-    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
-    ...               Return the ID of the operation associated to the executed action.
-    ...               Examples of execution:
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
-    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
-
-    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   ${kdu_name}   @{action_params}
-
-    ${params}=   Set Variable   ${EMPTY}
-    FOR   ${param}   IN   @{action_params}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
-        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
-    END
-    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index} --kdu_name ${kdu_name}
-    ${osm_ns_action_command}=   Run Keyword If   '${params}'!='${EMPTY}'   Catenate   ${osm_ns_action_command}   --params '{${params}}'
-    ...   ELSE   Set Variable   ${osm_ns_action_command}
-    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_ns_action_command}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${ns_action_max_wait_time}   ${ns_action_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Execute Manual VNF Scale
-    [Documentation]   Execute a manual VNF Scale action.
-    ...               The parameter 'scale_type' must be SCALE_IN or SCALE_OUT.
-    ...               Return the ID of the operation associated to the executed scale action.
-
-    [Arguments]   ${ns_name}   ${vnf_member_index}   ${scaling_group}   ${scale_type}   ${vnf_scale_max_wait_time}=2min
-
-    ${vnf_scale_max_wait_time}=   Convert Time   ${vnf_scale_max_wait_time}   result_format=number
-    ${vnf_scale_max_wait_time}=   Evaluate   ${vnf_scale_max_wait_time} * ${vim_timeout_multiplier}
-    Should Contain Any   ${scale_type}   SCALE_IN   SCALE_OUT   msg=Unknown scale type: ${scale_type}   values=False
-    ${osm_vnf_scale_command}=   Set Variable   osm vnf-scale --scaling-group ${scaling_group}
-    ${osm_vnf_scale_command}=   Run Keyword If   '${scale_type}'=='SCALE_IN'   Catenate   ${osm_vnf_scale_command}   --scale-in
-    ...   ELSE   Catenate   ${osm_vnf_scale_command}   --scale-out
-    ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   ${ns_name}   ${vnf_member_index}
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_vnf_scale_command}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${vnf_scale_max_wait_time}   ${vnf_scale_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Heal Network Service
-    [Documentation]   Execute healing operation over one NS.
-    ...               Return the ID of the operation associated to the executed healing action.
-
-    [Arguments]   ${ns_name}   ${params}   ${healing_max_wait_time}=10m
-
-    Should Not Be Empty   ${ns_name}
-    Should Not Be Empty   ${params}
-    ${healing_max_wait_time}=   Convert Time   ${healing_max_wait_time}   result_format=number
-    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${vim_timeout_multiplier}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-heal ${ns_name} ${params}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${healing_pol_time}   Check For NS Operation Ended   ${stdout}
-    Check For NS Operation Completed   ${stdout}
-    [Return]   ${stdout}
-
-
-Get Operations List
-    [Arguments]   ${ns_name}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-list ${ns_name}
-    Log   ${stdout}
-    Log   ${rc}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check For NS Operation Completed
-    [Documentation]   Check whether the status of the desired operation is "COMPLETED" or not.
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   COMPLETED   msg=The ns-action with id ${ns_operation_id} was not completed   values=False
-
-
-Check For NS Operation Failed
-    [Documentation]   Check whether the status of the desired operation is "FAILED" or not.
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   FAILED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
-
-
-Check For NS Operation Ended
-    [Documentation]   Check whether the status of the desired operation is "FAILED" or "COMPLETED".
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain Any   ${stdout}   FAILED   COMPLETED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
-
-
-Check For NS Operation Cancelled
-    [Documentation]   Check whether the operation was cancelled or not.
-
-    [Arguments]   ${ns_operation_id}
-
-    Should Not Be Empty   ${ns_operation_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-show ${ns_operation_id} --literal | yq -r '.operationState, .isCancelPending'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   FAILED_TEMP\nfalse   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
-
-
-Get Ns Vnfr Ids
-    [Documentation]   Return a list with the IDs of the VNF records of a NS instance.
-
-    [Arguments]   ${ns_id}
-
-    Should Not Be Empty   ${ns_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list --ns ${ns_id} | grep ${ns_id} | awk '{print $2}' 2>&1
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{vdur} =   Split String   ${stdout}
-    [Return]   @{vdur}
-
-
-Get Vnf Vdur Names
-    [Documentation]   Return a list with the names of the VDU records of a VNF instance.
-
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq -r .vdur[].name
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{vdur} =   Split String   ${stdout}
-    [Return]   @{vdur}
-
-
-Get Vnf Kdu Replica Count
-    [Documentation]   Return the number of KDU replicas (empty if none) of a VNF instance.
-
-    [Arguments]   ${vnf_id}   ${kdu_name}
-
-    Should Not Be Empty   ${vnf_id}
-    Should Not Be Empty   ${kdu_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --kdu ${kdu_name} | yq -r .config.replicaCount
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    ${return} =   Set Variable If   '${stdout}' == 'null'   ${EMPTY}   ${stdout}
-    [Return]   ${return}
-
-
-Get Application Names
-    [Documentation]   Return the list of the application of a VNF instance.
-
-    [Arguments]   ${ns_name}
-
-    Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | yq -r ._admin.deployed.VCA[].application
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{app_names} =   Split String   ${stdout}
-    [Return]   ${app_names}
-
-
-Get VDU Affinity Group Name
-    [Documentation]   Return the affinity group name for a NF
-
-    [Arguments]   ${ns_name}   ${vnf_id}   ${vdur_id}
-
-    ${rc}   ${affinity_group_id}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq -r '."affinity-or-anti-affinity-group-id"[0]' 2>&1
-    Log   ${affinity_group_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${affinity_group_id}   values=False
-    ${rc}   ${affinity_group_name}=   Run and Return RC and Output   osm ns-show ${ns_name} --literal | yq '."affinity-or-anti-affinity-group"[] | select(.id == "'${affinity_group_id}'")' | yq -r '.name' 2>&1
-    Log   ${affinity_group_name}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${affinity_group_name}   values=False
-    [Return]   ${affinity_group_name}
-
-Get Operations By Type
-    [Documentation]   Keyword to get the operation by type
-
-    [Arguments]   ${ns_id}   ${type}
-
-    Should Not Be Empty   ${ns_id}
-    Should Not Be Empty   ${type}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-list ${ns_id} | grep ${type} | awk '{print $2}' 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Empty   ${stdout}
-    [Return]   ${stdout}
-
-Cancel operation By Id
-    [Documentation]   Cancels an ongoing operation by operation ID
-
-    [Arguments]   ${op_id}   ${cancel_mode}=GRACEFUL
-
-    Should Not Be Empty   ${op_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-op-cancel ${op_id} --cancel_mode ${cancel_mode} --wait
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-GET Dual Ip
-    [Documentation]   Get dual ip from the ns list
-    [Arguments]   ${ns_id}
-    Should Not Be Empty   ${ns_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-show ${ns_id} --literal | grep -A2 ip-address | awk '{print $2}' | paste -sd ',' | sed 's/^,//; s/,/, /g' | sed 's/^/[/; s/$/]/'
-    Log   ${stdout}
-    [Return]   ${stdout}
-
diff --git a/robot-systest/lib/ns_operation_lib.resource b/robot-systest/lib/ns_operation_lib.resource
new file mode 100644
index 0000000..71be6bf
--- /dev/null
+++ b/robot-systest/lib/ns_operation_lib.resource
@@ -0,0 +1,198 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library to deploy and delete NS, and run operations on them.
+
+Library   Collections
+Library   DateTime
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NS_ACTION_MAX_WAIT_TIME}   1min
+${NS_ACTION_POL_TIME}   15sec
+${VNF_SCALE_POL_TIME}   15sec
+${HEALING_POL_TIME}   15sec
+${VIM_TIMEOUT_MULTIPLIER}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
+
+
+*** Keywords ***
+Update Network Service
+    [Documentation]   Run an update operation over a NS instance, and return the operation id.
+    [Arguments]   ${ns_id}   ${update_type}   ${ns_update_config}   ${ns_update_timeout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-update ${ns_id} --updatetype ${update_type} --config ${ns_update_config} --timeout ${ns_update_timeout} --wait
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Execute NS Action
+    [Documentation]   Execute an action over the desired NS.
+    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
+    ...               Return the ID of the operation associated to the executed action.
+    ...               Examples of execution:
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
+
+    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   @{action_params}
+    ${params}=   Set Variable   ${EMPTY}
+    FOR   ${param}   IN   @{action_params}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
+        Log   ${match},${param_name},${param_value}
+        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
+    END
+    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index}
+    IF   '${params}' != '${EMPTY}'
+        ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   --params '{${params}}'
+    ELSE
+        ${osm_ns_action_command}=   Set Variable   ${osm_ns_action_command}
+    END
+    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_ns_action_command}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${NS_ACTION_MAX_WAIT_TIME}   ${NS_ACTION_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Execute NS K8s Action
+    [Documentation]   Execute an action over the desired K8s NS.
+    ...               Parameters are given to this function in key=value format (one argument per key/value pair).
+    ...               Return the ID of the operation associated to the executed action.
+    ...               Examples of execution:
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}
+    ...                   \${ns_op_id}=   Execute NS Action   \${ns_name}   \${ns_action}   \${vnf_member_index}   \${param1}=\${value1}   \${param2}=\${value2}
+
+    [Arguments]   ${ns_name}   ${ns_action}   ${vnf_member_index}   ${kdu_name}   @{action_params}
+
+    ${params}=   Set Variable   ${EMPTY}
+    FOR   ${param}   IN   @{action_params}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in parameters
+        Log   ${match},${param_name},${param_value}
+        ${params}=   Catenate   SEPARATOR=   ${params}   "${param_name}":"${param_value}",
+    END
+    ${osm_ns_action_command}=   Set Variable   osm ns-action --action_name ${ns_action} --vnf_name ${vnf_member_index} --kdu_name ${kdu_name}
+    IF   '${params}' != '${EMPTY}'
+        ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   --params '{${params}}'
+    ELSE
+        ${osm_ns_action_command}=   Set Variable   ${osm_ns_action_command}
+    END
+    ${osm_ns_action_command}=   Catenate   ${osm_ns_action_command}   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_ns_action_command}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${NS_ACTION_MAX_WAIT_TIME}   ${NS_ACTION_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Execute Manual VNF Scale
+    [Documentation]   Execute a manual VNF Scale action.
+    ...               The parameter 'scale_type' must be SCALE_IN or SCALE_OUT.
+    ...               Return the ID of the operation associated to the executed scale action.
+    [Arguments]   ${ns_name}   ${vnf_member_index}   ${scaling_group}   ${scale_type}   ${vnf_scale_max_wait_time}=2min
+    ${vnf_scale_max_wait_time}=   Convert Time   ${vnf_scale_max_wait_time}   result_format=number
+    ${vnf_scale_max_wait_time}=   Evaluate   ${vnf_scale_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Should Contain Any   ${scale_type}   SCALE_IN   SCALE_OUT   msg=Unknown scale type: ${scale_type}   values=False
+    ${osm_vnf_scale_command}=   Set Variable   osm vnf-scale --scaling-group ${scaling_group}
+    IF   '${scale_type}'=='SCALE_IN'
+        ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   --scale-in
+    ELSE
+        ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   --scale-out
+    END
+    ${osm_vnf_scale_command}=   Catenate   ${osm_vnf_scale_command}   ${ns_name}   ${vnf_member_index}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_vnf_scale_command}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${vnf_scale_max_wait_time}   ${VNF_SCALE_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Heal Network Service
+    [Documentation]   Execute healing operation over one NS.
+    ...               Return the ID of the operation associated to the executed healing action.
+    [Arguments]   ${ns_name}   ${params}   ${healing_max_wait_time}=10m
+    Should Not Be Empty   ${ns_name}
+    Should Not Be Empty   ${params}
+    ${healing_max_wait_time}=   Convert Time   ${healing_max_wait_time}   result_format=number
+    ${healing_max_wait_time}=   Evaluate   ${healing_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-heal ${ns_name} ${params}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${healing_max_wait_time}   ${HEALING_POL_TIME}   Check For NS Operation Ended   ${stdout}
+    Check For NS Operation Completed   ${stdout}
+    RETURN   ${stdout}
+
+Get Operations List
+    [Documentation]   Get the list of operations of a given NS instance.
+    [Arguments]   ${ns_name}
+    Should Not Be Empty   ${ns_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-list ${ns_name}
+    Log   ${stdout}
+    Log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For NS Operation Completed
+    [Documentation]   Check wheter the status of the desired operation is "COMPLETED" or not.
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   COMPLETED   msg=The ns-action with id ${ns_operation_id} was not completed   values=False
+
+Check For NS Operation Failed
+    [Documentation]   Check wheter the status of the desired operation is "FAILED" or not.
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   FAILED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
+
+Check For NS Operation Ended
+    [Documentation]   Check wheter the status of the desired operation is "FAILED" or "COMPLETED".
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r .operationState
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain Any   ${stdout}   FAILED   COMPLETED   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
+
+Check For NS Operation Cancelled
+    [Documentation]   Check whether the operation was cancelled or not.
+    [Arguments]   ${ns_operation_id}
+    Should Not Be Empty   ${ns_operation_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-show ${ns_operation_id} --literal | yq -r '.operationState, .isCancelPending'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   FAILED_TEMP\nfalse   msg=Timeout waiting for ns-action with id ${ns_operation_id}   values=False
+
+Get Operations By Type
+    [Documentation]   Keyword to get the operation by type
+    [Arguments]   ${ns_id}   ${type}
+    Should Not Be Empty   ${ns_id}
+    Should Not Be Empty   ${type}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-op-list ${ns_id} | grep ${type} | awk '{print $2}' 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Empty   ${stdout}
+    RETURN   ${stdout}
+
+Cancel Operation By Id
+    [Documentation]   Cancels an ongoing operation by operation ID
+    [Arguments]   ${op_id}   ${cancel_mode}=GRACEFUL
+
+    Should Not Be Empty   ${op_id}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm ns-op-cancel ${op_id} --cancel_mode ${cancel_mode} --wait
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/nsd_lib.resource b/robot-systest/lib/nsd_lib.resource
new file mode 100644
index 0000000..175322b
--- /dev/null
+++ b/robot-systest/lib/nsd_lib.resource
@@ -0,0 +1,63 @@
+*** Comments ***
+# Copyright 2019 Tech Mahindra Limited
+#
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over NSD/NSpkg with OSM client.
+
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NSD_DELETE_MAX_WAIT_TIME}   1min
+${NSD_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get NSDs List
+    [Documentation]   Get the list of NS packages and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nspkg-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create NSD
+    [Documentation]   Upload a NS package to OSM and return the id.
+    [Arguments]   ${nsd_pkg}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nspkg-create ${nsd_pkg}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    ${lines}=   Get Line Count   ${stdout}
+    ${last}=   Evaluate   ${lines} - 1
+    ${id}=   Get Line   ${stdout}   ${last}
+    RETURN   ${id}
+
+Delete NSD
+    [Documentation]   Delete a NS package from OSM.
+    [Arguments]   ${nsd_id}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return Rc And Output   osm nspkg-delete ${nsd_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    Wait Until Keyword Succeeds   ${NSD_DELETE_MAX_WAIT_TIME}   ${NSD_DELETE_POL_TIME}   Check For NSD   ${nsd_id}
+
+Check For NSD
+    [Documentation]   Check that a NS package exists in OSM.
+    [Arguments]   ${nsd_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nspkg-list | awk '{print $2}' | grep ${nsd_id}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${nsd_id}
diff --git a/robot-systest/lib/nsd_lib.robot b/robot-systest/lib/nsd_lib.robot
deleted file mode 100644
index 40132d7..0000000
--- a/robot-systest/lib/nsd_lib.robot
+++ /dev/null
@@ -1,67 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright 2019 Tech Mahindra Limited
-#
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-##
-
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
-
-*** Settings ***
-Library   String
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-
-
-*** Keywords ***
-Get NSDs List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nspkg-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create NSD
-    [Arguments]   ${nsd_pkg}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nspkg-create ${nsd_pkg}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    ${lines}=   Get Line Count   ${stdout}
-    ${last}=   Evaluate   ${lines} - 1
-    ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
-
-Delete NSD
-    [Arguments]   ${nsd_id}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm nspkg-delete ${nsd_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Log   ${stdout}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For NSD   ${nsd_id}
-
-
-Check For NSD
-    [Arguments]   ${nsd_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nspkg-list | awk '{print $2}' | grep ${nsd_id}
-    Should Not Be Equal As Strings   ${stdout}   ${nsd_id}
diff --git a/robot-systest/lib/nsi_lib.robot b/robot-systest/lib/nsi_lib.resource
similarity index 75%
rename from robot-systest/lib/nsi_lib.robot
rename to robot-systest/lib/nsi_lib.resource
index 1b88396..74c67a6 100644
--- a/robot-systest/lib/nsi_lib.robot
+++ b/robot-systest/lib/nsi_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Copyright 2020 Atos
 #
 #   Licensed under the Apache License, Version 2.0 (the "License");
@@ -12,19 +13,26 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
+Documentation   Library providing keywords for CRUD operations over Network Slice Instances with OSM client.
+
 Library   Collections
+Library   OperatingSystem
+Library   DateTime
+Library   String
+
+Resource   ns_lib.resource
 
 
 *** Variables ***
-${success_return_code}   0
-${slice_launch_pol_time}   30sec
-${slice_delete_pol_time}   15sec
-${vim_timeout_multiplier}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
+${SUCCESS_RETURN_CODE}   0
+${SLICE_LAUNCH_POL_TIME}   30sec
+${SLICE_DELETE_POL_TIME}   15sec
+${VIM_TIMEOUT_MULTIPLIER}   %{OSM_VIM_MULTIPLIER_TIMEOUT=1.0}
 
 
 *** Keywords ***
-
 Create Network Slice
     [Documentation]   Instantiates a NST and returns an instantiation id (nsi), verifying the slice is successfully instantiated
     ...               Parameters:
@@ -35,22 +43,17 @@
     ...                  publickey: SSH public key of the local machine
     ...               Execution example:
     ...                  \${nsi}=   Create Network Slice   \${nst}   \${vim_name}   \${slice_name}   \${slice_config}   \${publickey}
-
     [Arguments]   ${nst}   ${vim_name}   ${slice_name}   ${slice_config}   ${publickey}   ${slice_launch_max_wait_time}=6min   ${config_file}=${EMPTY}
-
     ${slice_launch_max_wait_time}=   Convert Time   ${slice_launch_max_wait_time}   result_format=number
-    ${slice_launch_max_wait_time}=   Evaluate   ${slice_launch_max_wait_time} * ${vim_timeout_multiplier}
-    ${config_attr}   Set Variable If   '${slice_config}'!='${EMPTY}'   --config '${slice_config}'   \
-    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
-    ${config_file_attr}   Set Variable If   '${config_file}'!='${EMPTY}'   --config_file '${config_file}'   \
-
+    ${slice_launch_max_wait_time}=   Evaluate   ${slice_launch_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    ${config_attr}=   Set Variable If   "${slice_config}" != "${EMPTY}"   --config '${slice_config}'   ${EMPTY}
+    ${sshkeys_attr}=   Set Variable If   "${publickey}" != "${EMPTY}"   --ssh_keys ${publickey}   ${EMPTY}
+    ${config_file_attr}=   Set Variable If   "${config_file}" != "${EMPTY}"   --config_file '${config_file}'   ${EMPTY}
     ${nsi_id}=   Instantiate Network Slice   ${slice_name}   ${nst}   ${vim_name}   ${config_attr} ${config_file_attr}   ${sshkeys_attr}
     Log   ${nsi_id}
-
-    WAIT UNTIL KEYWORD SUCCEEDS   ${slice_launch_max_wait_time}   ${slice_launch_pol_time}   Check For Network Slice Instance To Configured   ${slice_name}
+    Wait Until Keyword Succeeds   ${slice_launch_max_wait_time}   ${SLICE_LAUNCH_POL_TIME}   Check For Network Slice Instance To Configured   ${slice_name}
     Check For Network Slice Instance For Failure   ${slice_name}
-    [Return]   ${nsi_id}
-
+    RETURN   ${nsi_id}
 
 Instantiate Network Slice
     [Documentation]   Instantiates a NST and returns an instantiation id (nsi)
@@ -61,14 +64,11 @@
     ...                  slice_extra_args: Extra parameters that might require the slice instantiation i.e. configuration attributes
     ...               Execution example:
     ...                  \${nsi}=   Instantiate Network Slice   \${slice_name}   \${nst}   \${vim_name}   \${config_attr}
-
     [Arguments]   ${slice_name}   ${nst}   ${vim_name}   ${slice_extra_args}   ${sshkeys_attr}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-create --nsi_name ${slice_name} --nst_name ${nst} --vim_account ${vim_name} ${sshkeys_attr} ${slice_extra_args}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-create --nsi_name ${slice_name} --nst_name ${nst} --vim_account ${vim_name} ${sshkeys_attr} ${slice_extra_args}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Get Slice Ns List
     [Documentation]   Retrieves the list of NS in a slice
@@ -76,16 +76,13 @@
     ...                  slice_name: Name of the slice instance
     ...               Execution example:
     ...                  \@{slice_ns_list}=   Get Slice Ns List   \${slice_name}
-
     [Arguments]   ${slice_name}
-
     Should Not Be Empty   ${slice_name}
-    @{ns_list_string}=   Run and Return RC and Output   osm ns-list | grep ${slice_name} | awk '{print $4}' 2>&1
+    @{ns_list_string}=   Run And Return Rc And Output   osm ns-list | grep ${slice_name} | awk '{print $4}' 2>&1
     # Returns a String of ns_id and needs to be converted into a list
-    @{ns_list} =   Split String   ${ns_list_string}[1]
+    @{ns_list}=   Split String   ${ns_list_string}[1]
     Log List   ${ns_list}
-    [Return]   @{ns_list}
-
+    RETURN   @{ns_list}
 
 Get Slice Ns List Except One
     [Documentation]   Retrieves the list of NS in a slice removing one from the list. This is done to save time in the tests, avoiding one VNF to ping itself.
@@ -94,18 +91,14 @@
     ...                  exception_ns: Name of the ns that will not appear in the final list
     ...               Execution example:
     ...                  \@{slice_ns_list}=   Get Slice Ns List Except One   \${slice_name}   \${exception_ns}
-
     [Arguments]   ${slice_name}   ${exception_ns}
-
     Should Not Be Empty   ${slice_name}
     Should Not Be Empty   ${exception_ns}
-
-    @{ns_list_string}=   Run and Return RC and Output   osm ns-list | grep ${slice_name} | awk '!/${exception_ns}/' | awk '{print $4}' 2>&1
+    @{ns_list_string}=   Run And Return Rc And Output   osm ns-list | grep ${slice_name} | awk '!/${exception_ns}/' | awk '{print $4}' 2>&1
     # Returns a String of ns_id and needs to be converted into a list
-    @{ns_list} =   Split String   ${ns_list_string}[1]
+    @{ns_list}=   Split String   ${ns_list_string}[1]
     Log List   ${ns_list}
-    [Return]   @{ns_list}
-
+    RETURN   @{ns_list}
 
 Get Slice Ns Count
     [Documentation]   Returns the count of all the NS in a slice
@@ -113,15 +106,12 @@
     ...                  slice_name: Name of the slice instance
     ...               Execution example:
     ...                  \${slice_ns_count}=   Get Slice Ns Count   \${slice_name}
-
     [Arguments]   ${slice_name}
-
     Should Not Be Empty   ${slice_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm ns-list | grep ${slice_name} | wc -l 2>&1
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm ns-list | grep ${slice_name} | wc -l 2>&1
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Get Slice Vnf Ip Addresses
     [Documentation]   Retrieves the list of IP addresses that belong to each of the VNFs in the slice
@@ -129,24 +119,21 @@
     ...                  slice_name: Name of the slice instance
     ...               Execution example:
     ...                  \@{slice_ip_address_list}=   Get Slice Vnf Ip Addresses   \${slice_name}
-
     [Arguments]   ${slice_name}
-
     # Get all the ns_id in the slice
-    @{slice_ns_list}   Get Slice Ns List   ${slice_name}
+    @{slice_ns_list}=   Get Slice Ns List   ${slice_name}
     Log Many   @{slice_ns_list}
     @{temp_list}=   Create List
     # For each ns_id in the list, get all the vnf_id and their IP addresses
     FOR   ${ns_id}   IN   @{slice_ns_list}
         Log   ${ns_id}
-        @{vnf_id_list}   Get Ns Vnf List   ${ns_id}
+        @{vnf_id_list}=   Get Ns Vnf List   ${ns_id}
         # For each vnf_id in the list, get all its IP addresses
-        @{ns_ip_list}   Get Ns Ip List   @{vnf_id_list}
+        @{ns_ip_list}=   Get Ns Ip List   @{vnf_id_list}
         @{temp_list}=   Combine Lists   ${temp_list}   ${ns_ip_list}
     END
     Log List   ${temp_list}
-    [Return]   @{temp_list}
-
+    RETURN   @{temp_list}
 
 Check For Network Slice Instance To Configured
     [Documentation]   Verify the slice has been instantiated
@@ -154,30 +141,24 @@
     ...                  slice_name: Name of the slice instance
     ...               Execution example:
     ...                  Check For Network Slice Instance To Configured   \${slice_name}
-
     [Arguments]   ${slice_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-list --filter name="${slice_name}"
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-list --filter name="${slice_name}"
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     Should Contain Any   ${stdout}   READY   BROKEN   configured
 
-
 Check For Network Slice Instance For Failure
     [Documentation]   Verify the slice instance is not in failure
     ...               Parameters:
     ...                  slice_name: Name of the slice instance
     ...               Execution example:
     ...                  Check For Network Slice Instance For Failure   \${slice_name}
-
     [Arguments]   ${slice_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-list --filter name="${slice_name}"
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-list --filter name="${slice_name}"
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     Should Not Contain   ${stdout}   failed
 
-
 Delete NSI
     [Documentation]   Delete Network Slice Instance (NSI)
     ...               Parameters:
@@ -185,17 +166,13 @@
     ...                  slice_delete_max_wait_time: Delete operation timeout
     ...               Execution example:
     ...                  Delete NST   \${slice_name}
-
     [Arguments]   ${slice_name}   ${slice_delete_max_wait_time}=4min
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-delete ${slice_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-delete ${slice_name}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     ${slice_delete_max_wait_time}=   Convert Time   ${slice_delete_max_wait_time}   result_format=number
-    ${slice_delete_max_wait_time}=   Evaluate   ${slice_delete_max_wait_time} * ${vim_timeout_multiplier}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${slice_delete_max_wait_time}   ${slice_delete_pol_time}   Check For Network Slice Instance To Be Deleted   ${slice_name}
-
+    ${slice_delete_max_wait_time}=   Evaluate   ${slice_delete_max_wait_time} * ${VIM_TIMEOUT_MULTIPLIER}
+    Wait Until Keyword Succeeds   ${slice_delete_max_wait_time}   ${SLICE_DELETE_POL_TIME}   Check For Network Slice Instance To Be Deleted   ${slice_name}
 
 Check For Network Slice Instance To Be Deleted
     [Documentation]   Verify the slice instance is not present
@@ -203,10 +180,7 @@
     ...                  slice_name: Name of the slice instance
     ...               Execution example:
     ...                  Check For Network Slice Instance   \${slice_name}
-
     [Arguments]   ${slice_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm nsi-list | awk '{print $2}' | grep ${slice_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm nsi-list | awk '{print $2}' | grep ${slice_name}
+    Log   ${rc},${stdout}
     Should Not Be Equal As Strings   ${stdout}   ${slice_name}
-
-
diff --git a/robot-systest/lib/nst_lib.resource b/robot-systest/lib/nst_lib.resource
new file mode 100644
index 0000000..0bb2e1b
--- /dev/null
+++ b/robot-systest/lib/nst_lib.resource
@@ -0,0 +1,57 @@
+*** Comments ***
+#   Copyright 2020 Atos
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Network Slice Templates with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${NST_DELETE_MAX_WAIT_TIME}   1min
+${NST_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get NST List
+    [Documentation]   Get the list of Network Slice Templates (NST) and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-list
+    Log   ${stdout}
+    Log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create NST
+    [Documentation]   Upload a Network Slice Template (NST) to OSM and return the id.
+    [Arguments]   ${nst}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-create ${nst}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete NST
+    [Documentation]   Delete a Network Slice Template (NST) from OSM.
+    [Arguments]   ${nst_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-delete ${nst_id}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${NST_DELETE_MAX_WAIT_TIME}   ${NST_DELETE_POL_TIME}   Check For NST   ${nst_id}
+
+Check For NST
+    [Documentation]   Check that a Network Slice Template (NST) exists in OSM.
+    [Arguments]   ${nst_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm netslice-template-list | awk '{print $2}' | grep ${nst_id}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${nst_id}
diff --git a/robot-systest/lib/nst_lib.robot b/robot-systest/lib/nst_lib.robot
deleted file mode 100644
index 6fac729..0000000
--- a/robot-systest/lib/nst_lib.robot
+++ /dev/null
@@ -1,53 +0,0 @@
-#   Copyright 2020 Atos
-#
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Variables ***
-${success_return_code}   0
-${ns_launch_max_wait_time}   5min
-${ns_launch_pol_time}   30sec
-${ns_delete_max_wait_time}   1min
-${ns_delete_pol_time}   15sec
-
-*** Keywords ***
-Get NST List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-list
-    Log   ${stdout}
-    Log   ${rc}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create NST
-    [Arguments]   ${nst}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-create ${nst}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete NST
-    [Arguments]   ${nst_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-delete ${nst_id}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For NST   ${nst_id}
-
-
-Check For NST
-    [Arguments]   ${nst_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm netslice-template-list | awk '{print $2}' | grep ${nst_id}
-    Should Not Be Equal As Strings   ${stdout}   ${nst_id}
-
diff --git a/robot-systest/lib/openstack_lib.robot b/robot-systest/lib/openstack_lib.resource
similarity index 62%
rename from robot-systest/lib/openstack_lib.robot
rename to robot-systest/lib/openstack_lib.resource
index b654cfd..ff4b46d 100644
--- a/robot-systest/lib/openstack_lib.robot
+++ b/robot-systest/lib/openstack_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
@@ -10,204 +11,183 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
+*** Settings ***
+Documentation   Library providing keywords to interact with Openstack with openstack client.
+
+Library   OperatingSystem
+Library   String
+
+Resource   ns_lib.resource
+Resource   vnf_lib.resource
+
+
 *** Variables ***
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Keywords ***
 Get Server Flavor ID
+    [Documentation]   Get from Openstack the flavor id of a server/VM passed as argument.
     [Arguments]   ${server_id}
-
     Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server show ${server_id} | grep flavor | awk 'NR>1{print $1}' RS='(' FS=')'
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server show ${server_id} | grep flavor | awk 'NR>1{print $1}' RS='(' FS=')'
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Get Flavor Properties
+    [Documentation]   Get from Openstack the properties of a flavor passed as argument.
     [Arguments]   ${flavor_id}
-
     Should Not Be Empty   ${flavor_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack flavor show ${flavor_id} | grep properties | awk -F '|' '{print $3}'
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack flavor show ${flavor_id} | grep properties | awk -F '|' '{print $3}'
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Check NS Servers In VIM
     [Documentation]   Check if the number of servers in Openstack by filtering by NS name is as expected.
     [Arguments]   ${ns_name}   ${number}
-
     Should Not Be Empty   ${ns_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server list | grep ${ns_name} | awk '{print $4}'
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server list | grep ${ns_name} | awk '{print $4}'
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    @{servers} =   Split String   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    @{servers}=   Split String   ${stdout}
     ${n_servers}=   Get Length   ${servers}
     Should Be Equal As Integers   ${number}   ${n_servers}
 
-
 Check If Volume Bootable
     [Documentation]   Check the volume properties and return whether it is bootable or not.
     [Arguments]   ${volume_id}
-
     Should Not Be Empty   ${volume_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume show ${volume_id} | grep bootable | awk '{print $4}'
-    log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack volume show ${volume_id} | grep bootable | awk '{print $4}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Get Project Quota
     [Documentation]   Get a field (ram, cores, ports, etc.) from quota in current project.
     [Arguments]   ${field}
-
     Should Not Be Empty   ${field}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack quota show -f yaml | yq '.[] | select(.Resource=="${field}") | .Limit'
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack quota show -f yaml | yq '.[] | select(.Resource=="${field}") | .Limit'
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Get Server Property
     [Documentation]   Get a field (flavor, image, volumes_attached, etc.) from a server.
     [Arguments]   ${server_id}   ${field}
-
     Should Not Be Empty   ${server_id}
     Should Not Be Empty   ${field}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server show ${server_id} -c ${field} -f value
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server show ${server_id} -c ${field} -f value
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Check VM In Server Group
     [Documentation]   Check if a given server is included in an Openstack server group
     [Arguments]   ${server_id}   ${server_group_name}
-
     Should Not Be Empty   ${server_group_name}
     Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server group show ${server_group_name} -c members -f value
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server group show ${server_group_name} -c members -f value
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     Should Contain   ${stdout}   ${server_id}
 
-
 Set Volume Id
     [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
     [Arguments]   ${volume_match}   ${index}
-
     Should Not Be Empty   ${volume_match}   ${index}
     ${bootable}=   Check If Volume Bootable   ${volume_match}[${index}]
-    Set Suite Variable   ${bootable}
     IF   '${bootable}'=='true'
-        Set Suite Variable   ${root_vol_id}   ${volume_match}[${index}]
-        IF   ${index}==0
-            Set Suite Variable   ${ordinary_vol_id}   ${volume_match}[1]
+        Set Suite Variable   ${ROOT_VOL_ID}   ${volume_match}[${index}]
+        IF   not ${index}
+            Set Suite Variable   ${ORDINARY_VOL_ID}   ${volume_match}[1]
         ELSE
-            Set Suite Variable   ${ordinary_vol_id}   ${volume_match}[0]
+            Set Suite Variable   ${ORDINARY_VOL_ID}   ${volume_match}[0]
         END
     END
 
-
 Get Persistent Volumes Attached To Vm
     [Documentation]   Sets the root volume ID and ordinary volume ID by checking bootable property of volumes
     [Arguments]   ${ns_id}
-
     Variable Should Exist   ${ns_id}   msg=NS is not available
     ${vnfs_list}=   Get Ns Vnf List   ${ns_id}
     ${vim_id}=   Get VNF VIM ID   ${vnfs_list}[0]
     ${volumes_attached}=   Get Server Property   ${vim_id}   volumes_attached
-    log   ${volumes_attached}
+    Log   ${volumes_attached}
     ${stdout}=   Get Regexp Matches   ${volumes_attached}   '([0-9a-f\-]+)'   1
-    log   ${stdout}
-    [Return]   ${stdout}
-
+    Log   ${stdout}
+    RETURN   ${stdout}
 
 Check If Volume Exists
     [Documentation]   Checks if a volume id exists
     [Arguments]   ${volume_id}
-
     Should Not Be Empty   ${volume_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume list | grep ${volume_id} | wc -l
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack volume list | grep ${volume_id} | wc -l
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Delete Volume
     [Documentation]   Delete a volume by its identifier
     [Arguments]   ${volume_id}
-
     Should Not Be Empty   ${volume_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack volume delete ${volume_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack volume delete ${volume_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Get Subnet
     [Documentation]   Get subnet information in JSON format
     [Arguments]   ${subnet_id}
-
     Should Not Be Empty   ${subnet_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack subnet show ${subnet_id} -f json
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack subnet show ${subnet_id} -f json
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Stop Server
     [Documentation]   Stop a server
     [Arguments]   ${server_id}
-
     Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server stop ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server stop ${server_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Halt Server
     [Documentation]   Reset a server
     [Arguments]   ${server_id}
-
     Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server set --state error ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server set --state error ${server_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Delete Server
     [Documentation]   Delete a server
     [Arguments]   ${server_id}
-
     Should Not Be Empty   ${server_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack server delete ${server_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack server delete ${server_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Create Flavor
     [Documentation]   Create a Flavor
     [Arguments]   ${flavor_name}   ${cpu}=1   ${ram}=1024   ${disk}=10
-
     Should Not Be Empty   ${flavor_name}
-    ${rc}   ${flavor_id}=   Run and Return RC and Output   openstack flavor create ${flavor_name} --ram ${ram} --disk ${disk} --vcpus ${cpu} -c id -f value
+    ${rc}   ${flavor_id}=   Run And Return Rc And Output   openstack flavor create ${flavor_name} --ram ${ram} --disk ${disk} --vcpus ${cpu} -c id -f value
     Log   ${flavor_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${flavor_id}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${flavor_id}
 
 Delete Flavor
     [Documentation]   Delete a Flavor
     [Arguments]   ${flavor_id}
-
     Should Not Be Empty   ${flavor_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   openstack flavor delete ${flavor_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   openstack flavor delete ${flavor_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/package_lib.resource b/robot-systest/lib/package_lib.resource
new file mode 100644
index 0000000..b563463
--- /dev/null
+++ b/robot-systest/lib/package_lib.resource
@@ -0,0 +1,67 @@
+*** Comments ***
+# Copyright ETSI Contributors and Others.
+#
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords for building, validating and uploading tar.gz NS and VNF package files with OSM client.
+Library   String
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Upload Package
+    [Documentation]   Onboards ("creates") a NF Package into OSM.
+    ...               - Parameters:
+    ...                 - pkg: Name (and location) of the NF Package
+    [Arguments]   ${pkg}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   tar -czf ${pkg}.tar.gz -C ${pkg} .
+    Log   ${rc},${stdout}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm upload-package ${pkg}.tar.gz
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete Package
+    [Documentation]   Delete a tar.gz package passed as argument from the filesystem.
+    [Arguments]   ${pkg}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   rm ${pkg}.tar.gz
+    Log   ${rc},${stdout}
+
+Package Build
+    [Documentation]   Build the package NS, VNF given the package_folder
+    [Arguments]   ${pkg_folder}   ${skip_charm_build}=${EMPTY}
+    ${skip_charm}=   Set Variable If   "${skip_charm_build}" != "${EMPTY}"   "--skip-charm-build"   ${EMPTY}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm package-build ${pkg_folder} ${skip_charm}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   Package created
+    ${package}=   Get Line   ${stdout}   -1
+    RETURN   ${package}
+
+Package Validate
+    [Documentation]   Validate descriptors given a base directory
+    [Arguments]   ${pkg_folder}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm package-validate ${pkg_folder} | awk -F\| '$2 !~ /-/ && $4 ~ /OK|ERROR/ {print $4}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Contain   ${stdout}   'OK'
+    ${package}=   Get Line   ${stdout}   -1
+    RETURN   ${package}
diff --git a/robot-systest/lib/package_lib.robot b/robot-systest/lib/package_lib.robot
deleted file mode 100644
index a9d3804..0000000
--- a/robot-systest/lib/package_lib.robot
+++ /dev/null
@@ -1,79 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##
-# Copyright ETSI Contributors and Others.
-#
-# All Rights Reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may
-# not use this file except in compliance with the License. You may obtain
-# a copy of the License at
-#
-#         http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-# License for the specific language governing permissions and limitations
-# under the License.
-##
-
-*** Settings ***
-Library   String
-Library   OperatingSystem
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-
-
-*** Keywords ***
-Upload Package
-    [Documentation]   Onboards ("creates") a NF Package into OSM.
-    ...               - Parameters:
-    ...                 - pkg: Name (and location) of the NF Package
-
-    [Arguments]   ${pkg}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   tar -czf ${pkg}.tar.gz -C ${pkg} .
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm upload-package ${pkg}.tar.gz
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete Package
-    [Arguments]   ${pkg}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   rm ${pkg}.tar.gz
-
-
-Package Build
-    [Documentation]   Build the package NS, VNF given the package_folder
-
-    [Arguments]   ${pkg_folder}   ${skip_charm_build}=${EMPTY}
-
-    ${skip_charm}   Set Variable If   '${skip_charm_build}'!='${EMPTY}'   --skip-charm-build   \
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm package-build ${pkg_folder} ${skip_charm}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   Package created
-    ${package}=   Get Line   ${stdout}   -1
-
-    [Return]   ${package}
-
-
-Package Validate
-    [Documentation]   Validate descriptors given a base directory
-
-    [Arguments]   ${pkg_folder}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm package-validate ${pkg_folder} | awk -F\| '$2 !~ /-/ && $4 ~ /OK|ERROR/ {print $4}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Contain   ${stdout}   'OK'
-    ${package}=   Get Line   ${stdout}   -1
-
-    [Return]   ${package}
-
diff --git a/robot-systest/lib/project_lib.resource b/robot-systest/lib/project_lib.resource
new file mode 100644
index 0000000..a46ee61
--- /dev/null
+++ b/robot-systest/lib/project_lib.resource
@@ -0,0 +1,125 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over projects with OSM client.
+Library   OperatingSystem
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Create Project
+    [Documentation]   Create a project in OSM with the name passed as argument, and return the project id.
+    [Arguments]   ${project_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-create ${project_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Create Project With Quotas
+    [Documentation]   Create a project in OSM with the name and quotas passed as arguments, and return the project id.
+    [Arguments]   ${project_name}   ${project_quotas}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${project_quotas}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-create ${project_name} --quotas ${project_quotas}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get Project Quotas
+    [Documentation]   Get from OSM a specific quota parameter from the project passed as argument.
+    [Arguments]   ${project_name}   ${quotas_name}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${quotas_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-show ${project_name} | grep '${quotas_name}' | awk -F ',|: ' '{print $2}' | awk '{print $1}'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Update Project Quotas
+    [Documentation]   Update in OSM the quotas of a project with the new quotas passed as arguments.
+    [Arguments]   ${project_name}   ${project_quotas}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${project_quotas}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-update ${project_name} --quotas ${project_quotas}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Update Project Name
+    [Documentation]   Update in OSM the name of a project with the new name passed as argument.
+    [Arguments]   ${project_name}   ${new_name}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${new_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-update ${project_name} --name ${new_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check If User Is Assigned To Project
+    [Documentation]   Check in OSM if a user exists in a project passed as argument.
+    [Arguments]   ${user_name}   ${project_name}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep "project_name" | grep "${project_name}"
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create VNFD In Project
+    [Documentation]   Onboards a VNF package into an OSM project.
+    ...                 Extra parameters (such as 'override') are given to this function in name=value format. These parameters will be appended to the 'osm vnfpkg-create' command with the next syntax: --param_name=param_value
+    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}   @{optional_parameters}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${vnfd_pkg}
+    Should Not Be Empty   ${project_user}
+    Should Not Be Empty   ${user_password}
+    ${osm_pkg_create_command}=   Set Variable   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-create ${vnfd_pkg}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_pkg_create_command}=   Catenate   ${osm_pkg_create_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_pkg_create_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete VNFD In Project
+    [Documentation]   Deletes a VNF package from an OSM project.
+    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}
+    Should Not Be Empty   ${project_name}
+    Should Not Be Empty   ${vnfd_pkg}
+    Should Not Be Empty   ${project_user}
+    Should Not Be Empty   ${user_password}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-delete ${vnfd_pkg}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Remove User From Project
+    [Documentation]   Remove a specific user from a specific project in OSM.
+    [Arguments]   ${user_name}   ${project_name}
+    Should Not Be Empty   ${user_name}
+    Should Not Be Empty   ${project_name}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-update ${user_name} --remove-project ${project_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Delete Project
+    [Documentation]   Delete from OSM the project passed as argument.
+    [Arguments]   ${project_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm project-delete ${project_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
diff --git a/robot-systest/lib/project_lib.robot b/robot-systest/lib/project_lib.robot
deleted file mode 100644
index 35366e2..0000000
--- a/robot-systest/lib/project_lib.robot
+++ /dev/null
@@ -1,130 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Create Project
-    [Arguments]   ${project_name}
-
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-create ${project_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Create Project With Quotas
-    [Arguments]   ${project_name}   ${project_quotas}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${project_quotas}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-create ${project_name} --quotas ${project_quotas}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get Project Quotas
-    [Arguments]   ${project_name}   ${quotas_name}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${quotas_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-show ${project_name} | grep '${quotas_name}' | awk -F ',|: ' '{print $2}' | awk '{print $1}'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Update Project Quotas
-    [Arguments]   ${project_name}   ${project_quotas}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${project_quotas}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-update ${project_name} --quotas ${project_quotas}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Update Project Name
-    [Arguments]   ${project_name}   ${new_name}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${new_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-update ${project_name} --name ${new_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check If User Is Assigned To Project
-    [Arguments]   ${user_name}   ${project_name}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep "project_name" | grep "${project_name}"
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create VNFD In Project
-    [Documentation]   Onboards a VNFD package into an OSM project.
-    ...                 Extra parameters (such as 'override') are given to this function in name=value format. These parameters will be appended to the 'osm vnfpkg-create' command with the next syntax: --param_name=param_value
-
-    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}   @{optional_parameters}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${vnfd_pkg}
-    Should Not Be Empty   ${project_user}
-    Should Not Be Empty   ${user_password}
-
-    ${osm_pkg_create_command}=   Set Variable   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-create ${vnfd_pkg}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_pkg_create_command}=   Catenate   ${osm_pkg_create_command}   --${param_name}=${param_value}
-    END
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_pkg_create_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete VNFD In Project
-    [Arguments]   ${project_name}   ${vnfd_pkg}   ${project_user}   ${user_password}
-
-    Should Not Be Empty   ${project_name}
-    Should Not Be Empty   ${vnfd_pkg}
-    Should Not Be Empty   ${project_user}
-    Should Not Be Empty   ${user_password}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm --project ${project_name} --user ${project_user} --password ${user_password} vnfpkg-delete ${vnfd_pkg}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Remove User From Project
-    [Arguments]   ${user_name}   ${project_name}
-
-    Should Not Be Empty   ${user_name}
-    Should Not Be Empty   ${project_name}
-    ${rc}   ${stdout}=   Run And Return RC And Output   osm user-update ${user_name} --remove-project ${project_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Delete Project
-    [Arguments]   ${project_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm project-delete ${project_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
diff --git a/robot-systest/lib/prometheus_lib.robot b/robot-systest/lib/prometheus_lib.resource
similarity index 71%
rename from robot-systest/lib/prometheus_lib.robot
rename to robot-systest/lib/prometheus_lib.resource
index 0f4f07c..be3c120 100644
--- a/robot-systest/lib/prometheus_lib.robot
+++ b/robot-systest/lib/prometheus_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
@@ -10,6 +11,7 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
 *** Settings ***
 Documentation   Library to obtain metrics from Prometheus.
 
@@ -20,28 +22,27 @@
 
 
 *** Variables ***
-${timeout}   30
-${max_retries}   1
-${prometheus_host}   %{PROMETHEUS_HOSTNAME=UNKNOWN}
-${prometheus_port}   %{PROMETHEUS_PORT=9090}
-${prometheus_user}   %{PROMETHEUS_USER=""}
-${prometheus_password}   %{PROMETHEUS_PASSWORD=""}
+${TIMEOUT}   30
+${MAX_RETRIES}   1
+${PROMETHEUS_HOST}   %{PROMETHEUS_HOSTNAME=UNKNOWN}
+${PROMETHEUS_PORT}   %{PROMETHEUS_PORT=9090}
+${PROMETHEUS_USER}   %{PROMETHEUS_USER=""}
+${PROMETHEUS_PASSWORD}   %{PROMETHEUS_PASSWORD=""}
 
 
 *** Keywords ***
 Set Testsuite Prometheus Variables
     [Documentation]   Set Testsuite Prometheus Variables to be used in subsequent test cases
 
-    IF   '${prometheus_host}' == 'UNKNOWN'
+    IF   ${PROMETHEUS_HOST} == 'UNKNOWN'
         ${local_prometheus_host}=   Get Environment Variable   OSM_HOSTNAME
-        Set Suite Variable   ${prometheus_host}   ${local_prometheus_host}
-        Set Suite Variable   ${prometheus_port}   9091
+        Set Suite Variable   ${PROMETHEUS_HOST}   ${local_prometheus_host}
+        Set Suite Variable   ${PROMETHEUS_HOST}   9091
     END
-    Log   ${prometheus_port}
-    Log   ${prometheus_host}
-    Log   ${prometheus_user}
-    Log   ${prometheus_password}
-
+    Log   ${PROMETHEUS_PORT}
+    Log   ${PROMETHEUS_HOST}
+    Log   ${PROMETHEUS_USER}
+    Log   ${PROMETHEUS_PASSWORD}
 
 Get Metric
     [Documentation]   Get the instant value of a metric from Prometheus using multiple filter parameters.
@@ -50,30 +51,27 @@
     ...                 Examples of execution:
     ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}
     ...                     \${metric}=   Get Metric   \${prometheus_ip}   \${prometheus_port}   ${prometheus_password}   \${metric}   \${param1}=\${value1}   \${param2}=\${value2}
-
     [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${metric}   @{filter_parameters}
-
     ${filter}=   Set Variable   ${EMPTY}
     FOR   ${param}   IN   @{filter_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in filter parameters
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in filter parameters
+        Log   ${match},${param_name},${param_value}
         ${filter}=   Catenate   SEPARATOR=   ${filter}   ${param_name}="${param_value}",
     END
-    ${resp}=   Execute Prometheus Instant Query   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   query=${metric}{${filter}}
+    ${resp}=   Execute Prometheus Instant Query   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   query=${metric}{${filter}}
     ${result_list}=   Convert To List   ${resp["data"]["result"]}
     ${results}=   Get Length   ${result_list}
     Should Not Be Equal As Numbers   0   ${results}   msg=Metric ${metric} not found   values=false
     Should Be Equal As Integers   1   ${results}   msg=Metric ${metric} with multiple values   values=false
-    [Return]   ${result_list[0]["value"][1]}
-
+    RETURN   ${result_list[0]["value"][1]}
 
 Execute Prometheus Instant Query
     [Documentation]   Execute a Prometheus Instant Query using HTTP API.
     ...                 Return an inline json with the result of the query.
     ...                 The requested URL is the next: http://\${prometheus_ip}:\${prometheus_port}/api/v1/query?\${querystring}
-
     [Arguments]   ${prometheus_ip}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   ${querystring}
-    ${auth}=   IF   '${prometheus_password}'!='${EMPTY}'   Create List   ${prometheus_user}   ${prometheus_password}   ELSE   Set Variable   None
-    Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${timeout}   max_retries=${max_retries}   verify=false   auth=${auth}
-    ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${timeout}
+    ${auth}=   IF   '${prometheus_password}' != '${EMPTY}'   Create List   ${prometheus_user}   ${prometheus_password}   ELSE   Set Variable   None
+    Create Session   prometheus   http://${prometheus_ip}:${prometheus_port}   timeout=${TIMEOUT}   max_retries=${MAX_RETRIES}   verify=false   auth=${auth}
+    ${resp}=   GET On Session   prometheus   /api/v1/query?${querystring}   timeout=${TIMEOUT}
     Status Should Be   200   ${resp}
-    [Return]   ${resp.json()}
+    RETURN   ${resp.json()}
diff --git a/robot-systest/lib/repo_lib.resource b/robot-systest/lib/repo_lib.resource
new file mode 100644
index 0000000..a339255
--- /dev/null
+++ b/robot-systest/lib/repo_lib.resource
@@ -0,0 +1,59 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library to deploy and delete OSM repos.
+
+Library   OperatingSystem
+
+Resource   ../lib/nsd_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${REPO_DELETE_MAX_WAIT_TIME}   1min
+${REPO_DELETE_POL_TIME}   15sec
+
+
+*** Keywords ***
+Get Repos List
+    [Documentation]   Get the list of repos and log it.
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Create Repo
+    [Documentation]   Create a repository in OSM with the name and options passed as arguments, and return the repo id.
+    [Arguments]   ${repo_name}   ${repo_uri}   ${repo_type}   ${user}   ${password}   ${additional_options}=""
+    ${user_attr}=   Set Variable If   '${user}'!='${EMPTY}'   --user ${user}   \
+    ${password_attr}=   Set Variable If   '${password}'!='${EMPTY}'   --password ${password}   \
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-add --type ${repo_type} ${user_attr} ${password_attr} ${additional_options} ${repo_name} ${repo_uri}
+    Log   ${rc},${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete Repo
+    [Documentation]   Delete from OSM the repo passed as argument.
+    [Arguments]   ${repo_id}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return RC And Output   osm repo-delete ${repo_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Log   ${stdout}
+    WAIT UNTIL KEYWORD SUCCEEDS   ${REPO_DELETE_MAX_WAIT_TIME}   ${REPO_DELETE_POL_TIME}   Check For NSD   ${repo_id}
+
+Check For Repo
+    [Documentation]   Check that a repository exists in OSM.
+    [Arguments]   ${repo_id}
+    ${rc}   ${stdout}=   Run And Return RC And Output   osm repo-list | awk '{print $2}' | grep ${repo_id}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${repo_id}
diff --git a/robot-systest/lib/repo_lib.robot b/robot-systest/lib/repo_lib.robot
deleted file mode 100644
index 8237b18..0000000
--- a/robot-systest/lib/repo_lib.robot
+++ /dev/null
@@ -1,52 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Settings ***
-Documentation   Library to deploy and delete OSM repos.
-
-
-*** Variables ***
-${success_return_code}   0
-
-*** Keywords ***
-Get Repos List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm repo-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Create Repo
-    [Arguments]   ${repo_name}   ${repo_uri}   ${repo_type}   ${user}   ${password}   ${additional_options}=""
-
-    ${user_attr}   Set Variable If   '${user}'!='${EMPTY}'   --user ${user}   \
-    ${password_attr}   Set Variable If   '${password}'!='${EMPTY}'   --password ${password}   \
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm repo-add --type ${repo_type} ${user_attr} ${password_attr} ${additional_options} ${repo_name} ${repo_uri}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete Repo
-    [Arguments]   ${repo_id}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm repo-delete ${repo_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Log   ${stdout}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For NSD   ${repo_id}
-
-
-Check For Repo
-    [Arguments]   ${repo_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm repo-list | awk '{print $2}' | grep ${repo_id}
-    Should Not Be Equal As Strings   ${stdout}   ${repo_id}
diff --git a/robot-systest/lib/rest_lib.resource b/robot-systest/lib/rest_lib.resource
new file mode 100644
index 0000000..74e97e9
--- /dev/null
+++ b/robot-systest/lib/rest_lib.resource
@@ -0,0 +1,109 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License
+
+
+*** Settings ***
+Documentation   Library with sol003 keywords and variables .
+
+Library   String
+Library   OperatingSystem
+Library   RequestsLibrary
+Library   JsonValidator
+Library   yaml
+Library   JSONLibrary
+
+Resource   ../lib/vim_lib.resource
+
+
+*** Variables ***
+@{SUCCESS_STATUS_CODE_LIST}   200   201   202   204
+${AUTH_TOKEN_URI}   /osm/admin/v1/tokens
+${REST_API_HOST}   ${EMPTY}
+${OSM_USER}   %{OSM_USER=admin}
+${OSM_PASSWORD}   %{OSM_PASSWORD=admin}
+${OSM_PROJECT}   %{OSM_PROJECT=admin}
+
+
+*** Keywords ***
+Get Auth Token
+    [Documentation]   Send a REST POST message to OSM to get an authentication token,
+    ...               and store the authentication token in a suite variable to be used later on.
+    Set REST API Host
+    Create Session   osmhit   ${REST_API_HOST}   disable_warnings=1
+    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json
+    &{data}=   Create Dictionary   username=${OSM_USER}   password=${OSM_PASSWORD}   project-id=${OSM_PROJECT}
+    ${resp}=   Post On Session   osmhit   ${AUTH_TOKEN_URI}   json=${data}   headers=${headers}
+    Log   ${resp}
+    Pass Execution If   ${resp.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Get Auth Token completed
+    Set Suite Variable   ${TOKEN_STATUS_CODE}   ${resp.status_code}
+    ${access_token}=   Get Value From Json   ${resp.json()}   $..id
+    Set Test Variable   ${ACCESS_TOKEN}   ${access_token[0]}
+    Set Test Variable   ${TOKEN_RESPONSE}   ${resp}
+    Sleep   2s
+
+Set Dockerized Host
+    [Documentation]   Set the suite variable REST_API_HOST to be used in this library and the testsuites using it.
+    ...               This method must be used if the tests are run from a container in the same K8s cluster where OSM is running.
+    [Arguments]   ${env_host}
+    Set Suite Variable   ${REST_API_HOST}   https://${env_host}
+
+Set Standalone Host
+    [Documentation]   Set a suite variable REST_API_HOST to be used in this library and the testsuites using it.
+    ...               This method must be used if the tests are run from any place outside the K8s cluster where OSM is running.
+    [Arguments]   ${env_host}
+    Set Suite Variable   ${REST_API_HOST}   https://${env_host}:9999
+
+Read Directory
+    [Documentation]   Read Current Directory and return it
+    ${Directory}=   Replace String   ${CURDIR}   lib   resources/
+    ${json_path}=   Set Variable   ${Directory}
+    RETURN   ${json_path}
+
+Post Api Request
+    [Documentation]   Send to OSM a POST API message to OSM to the given uri with the given json data,
+    ...               and save response and status code in suite variables to be used later on.
+    [Arguments]   ${PostApi}   ${json_data}
+    Create Session   APISession   ${REST_API_HOST}
+    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
+    ${request_response}=   Post On Session   APISession   ${PostApi}   json=${json_data}   headers=${headers}
+    Set Suite Variable   ${REQUEST_RESPONSE}   ${request_response}
+    ${response_statuscode}=   Convert To String   ${request_response.status_code}
+    Set Suite Variable   ${RESPONSE_STATUSCODE}   ${response_statuscode}
+
+Set REST API Host
+    [Documentation]   Set the REST_API_HOST suite variable from OSM_HOSTNAME env variable
+    ${nbi_host}=   Get Environment Variable   OSM_HOSTNAME
+    ${passed}=   Run Keyword And Return Status   Should Contain   ${nbi_host}   :
+    IF   ${passed}
+        Set Dockerized Host   ${nbi_host}
+    ELSE
+        Set Standalone Host   ${nbi_host}
+    END
+
+Get ID
+    [Documentation]   Examine a REQUEST_RESPONSE dictionary as JSON and return the requested key passed as argument.
+    [Arguments]   ${Key}
+    Pass Execution If   ${REQUEST_RESPONSE.status_code} in ${SUCCESS_STATUS_CODE_LIST}   Get Auth Token completed
+    ${id}=   Get Value From Json   ${REQUEST_RESPONSE.json()}   $..${Key}
+    RETURN   ${id[0]}
+
+Get Api Request
+    [Documentation]   Send to OSM a GET API message to OSM to the given uri,
+    ...               and save response and status code in suite variables to be used later on.
+    [Arguments]   ${uri}
+    Create Session   Session   ${REST_API_HOST}
+    &{headers}=   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${ACCESS_TOKEN}
+    ${request_response}=   Get On Session   Session   ${uri}   headers=${headers}
+    Set Suite Variable   ${REQUEST_RESPONSE}   ${request_response}
+    ${response_statuscode}=   Convert To String   ${request_response.status_code}
+    Set Suite Variable   ${RESPONSE_STATUSCODE}   ${response_statuscode}
diff --git a/robot-systest/lib/rest_lib.robot b/robot-systest/lib/rest_lib.robot
deleted file mode 100644
index ced8a21..0000000
--- a/robot-systest/lib/rest_lib.robot
+++ /dev/null
@@ -1,95 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License
-
-*** Settings ***
-Documentation   Library with sol003 keywords and variables .
-
-Library   RequestsLibrary
-Library   JsonValidator
-Library   yaml
-Library   JSONLibrary
-Library   String
-Library   OperatingSystem
-
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/vim_lib.robot
-
-*** Variables ***
-@{success_status_code_list}   200   201   202   204
-${auth_token_uri}   /osm/admin/v1/tokens
-${HOST}   ${EMPTY}
-${osm_user}   %{OSM_USER=admin}
-${osm_password}   %{OSM_PASSWORD=admin}
-${osm_project}   %{OSM_PROJECT=admin}
-
-*** Keywords ***
-Get Auth Token
-    [Tags]   auth_token
-    Get Hostname
-    Create Session   osmhit   ${HOST}   disable_warnings=1
-    &{headers}   Create Dictionary   Content-Type=application/json   Accept=application/json
-    &{data}   Create Dictionary   username=${osm_user}   password=${osm_password}   project-id=${osm_project}
-    ${resp}=   Post On Session   osmhit   ${auth_token_uri}   json=${data}   headers=${headers}
-    Log   ${resp}
-    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Get Auth Token completed
-    Set Suite Variable   ${token_status_code}   ${resp.status_code}
-    ${access_token}=   Get Value From Json   ${resp.json()}   $..id
-    Set Test Variable   ${access_token}   ${access_token[0]}
-    Set Test Variable   ${token_response}   ${resp}
-    sleep   2s
-
-Set Dockerized Host
-    [Arguments]   ${env_host}
-    Set Suite Variable   ${HOST}   https://${env_host}
-
-Set Standalone Host
-    [Arguments]   ${env_host}
-    Set Suite Variable   ${HOST}   https://${env_host}:9999
-
-Read Directory
-    [Documentation]   To Read Current Direct ory
-    ${Directory}=   Replace String   ${CURDIR}   lib   resources/
-    ${json_path}=   Set Variable   ${Directory}
-    [Return]   ${JsonPath}
-
-Post Api Request
-    [Arguments]   ${PostApi}
-    [Documentation]   Keword to Post API Request
-    Create Session   APISession   ${HOST}
-    &{headers}   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${access_token}
-    ${request_response}=   Post On Session   APISession   ${PostApi}   json=${updated_json_obj}   headers=${headers}
-    Set Suite Variable   ${request_response}
-    ${response_statuscode}   Convert To String   ${request_response.status_code}
-    Set Suite Variable   ${response_statuscode}
-
-Get Hostname
-    [Documentation]   Keyword to get the default osm Hostname
-    ${nbi_host}=   Get Environment Variable   OSM_HOSTNAME
-    ${passed}=   Run Keyword And Return Status   Should Contain   ${nbi_host}   :
-    Run Keyword If   ${passed}   Set Dockerized Host   ${nbi_host}
-    ...    ELSE   Set Standalone Host   ${nbi_host}
-
-Get ID
-    [Arguments]   ${Key}
-    Pass Execution If   ${request_response.status_code} in ${success_status_code_list}   Get Auth Token completed
-    ${id}=   Get Value From Json   ${request_response.json()}   $..${Key}
-    Set Suite Variable   ${value}   ${id[0]}
-    [Return]   ${value}
-
-Get Api Request
-    [Arguments]   ${uri}
-    [Documentation]   Keyword to Get API Request
-    Create Session   Session   ${HOST}
-    &{headers}   Create Dictionary   Content-Type=application/json   Accept=application/json   Authorization=Bearer ${access_token}
-    ${request_response}=   Get On Session   Session   ${uri}   headers=${Headers}
-    Set Suite Variable   ${request_response}
-    ${response_statuscode}   Convert To String   ${request_response.status_code}
-    Set Suite Variable   ${response_statuscode}
diff --git a/robot-systest/lib/role_lib.robot b/robot-systest/lib/role_lib.resource
similarity index 62%
rename from robot-systest/lib/role_lib.robot
rename to robot-systest/lib/role_lib.resource
index 984b69a..1ba3a2d 100644
--- a/robot-systest/lib/role_lib.robot
+++ b/robot-systest/lib/role_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
@@ -10,62 +11,63 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over roles with OSM client.
+Library   OperatingSystem
+
+
 *** Variables ***
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Keywords ***
 Create Role
+    [Documentation]   Create a role in OSM with the name passed as argument, and return the role id.
     [Arguments]   ${role_name}
-
     Should Not Be Empty   ${role_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm role-create ${role_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm role-create ${role_name}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Update Role
-    [Documentation]   Updates a role in OSM.
+    [Documentation]   Update a role in OSM.
     ...                 The extra parameters (like '--add') are given to this function in name=value format. These parameters will be appended to the 'osm role-update' command with the next syntax: --param_name=param_value
     ...                 Example of execution:
     ...                     Update Role   \${role_name}   add='vims: true'
-
     [Arguments]   ${role_name}   @{optional_parameters}
-
     ${osm_update_command}=   Set Variable   osm role-update ${role_name}
     FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
         ${osm_update_command}=   Catenate   ${osm_update_command}   --${param_name}=${param_value}
     END
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_update_command}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_update_command}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Check If Role Exists
+    [Documentation]   Check if a role exists in OSM.
     [Arguments]   ${role_name}
-
     Should Not Be Empty   ${role_name}
     ${rc}   ${stdout}=   Run And Return RC And Output   osm role-list | awk 'NR>3 {print $2}' | grep "${role_name}"
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Check If User Has Role
+    [Documentation]   Check if a user has a role in a specific project in OSM.
     [Arguments]   ${user_name}   ${role_name}   ${project_name}
-
     Should Not Be Empty   ${user_name}
     Should Not Be Empty   ${role_name}
     Should Not Be Empty   ${project_name}
     ${rc}   ${stdout}=   Run And Return RC And Output   osm user-show ${user_name} | grep -B1 "role_name" | grep -B1 "${role_name}" | grep "project_name" | grep "${project_name}"
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Delete Role
+    [Documentation]   Delete from OSM the role passed as argument.
     [Arguments]   ${role_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm role-delete ${role_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm role-delete ${role_name}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
diff --git a/robot-systest/lib/sdnc_lib.resource b/robot-systest/lib/sdnc_lib.resource
new file mode 100644
index 0000000..c9cd8c7
--- /dev/null
+++ b/robot-systest/lib/sdnc_lib.resource
@@ -0,0 +1,97 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library to manage SDNCs.
+
+Library   String
+Library   Collections
+Library   OperatingSystem
+
+Resource   ../lib/prometheus_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${SDNC_DELETE_MAX_WAIT_TIME}   1min
+${SDNC_DELETE_POL_TIME}   15sec
+${SDNC_STATUS_MAX_WAIT_TIME}   6min
+${SDNC_STATUS_POL_TIME}   1min
+
+
+*** Keywords ***
+Create SDNC
+    [Documentation]   Register an SDN Controller in OSM.
+    ...                 The optional parameters (such as 'switch_dpid' or 'ip-address') are given to this function in name=value format. These parameters will be appended to the 'osm sdnc-create' command with the next syntax: --param_name=param_value
+    ...                 Returns the ID of the created SDNC Target.
+    ...                 Example of execution:
+    ...                     \${sdnc_id}=   Create SDNC   \${sdnc_name}   \${sdnc_user}   \${sdnc_password}   \${sdnc_url}   \${sdnc_type}   switch_dpid='{...}'
+    [Arguments]   ${sdnc_name}   ${sdnc_user}   ${sdnc_password}   ${sdnc_url}   ${sdnc_type}   @{optional_parameters}
+    ${osm_sdnc_create_command}=   Set Variable   osm sdnc-create --name ${sdnc_name} --user ${sdnc_user} --password ${sdnc_password} --url ${sdnc_url} --type ${sdnc_type}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_sdnc_create_command}=   Catenate   ${osm_sdnc_create_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_sdnc_create_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Check For SDNC To Be Deleted
+    [Documentation]   Check if an SDN controller identified by name is not present in OSM.
+    [Arguments]   ${sdnc_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-list | awk '{print $2}' | grep ${sdnc_name}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${sdnc_name}
+
+Delete SDNC
+    [Documentation]   Unregister/delete from OSM an SDN controller identified by name.
+    [Arguments]   ${sdnc_name}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return Rc And Output   osm sdnc-delete ${sdnc_name}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    Wait Until Keyword Succeeds   ${SDNC_DELETE_MAX_WAIT_TIME}   ${SDNC_DELETE_POL_TIME}   Check For SDNC To Be Deleted   ${sdnc_name}
+
+Get SDNC List
+    [Documentation]   Get the list of SDN controllers from OSM and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For SDNC
+    [Documentation]   Check if an SDN Controller identified by name or id exists in OSM and is enabled.
+    [Arguments]   ${sdnc_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-show ${sdnc_id} | grep -io ENABLED
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For SDNC Status
+    [Documentation]   Check in a loop if the value of the metric osm_sdnc_status in Prometheus for the SDN controller is 1 (reachable).
+    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    Wait Until Keyword Succeeds   ${SDNC_STATUS_MAX_WAIT_TIME}   ${SDNC_STATUS_POL_TIME}   Check If SDNC Is Available   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+
+Get SDNC ID
+    [Documentation]   Check if an SDN controller identified by name exists in OSM, and return the id.
+    [Arguments]   ${sdnc_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm sdnc-list | grep " ${sdnc_name} " | awk '{print $4}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=SDNC '${sdnc_name}' not found   values=false
+    RETURN   ${stdout}
+
+Check If SDNC Is Available
+    [Documentation]   Check if the value of the metric osm_sdnc_status in Prometheus for the SDN controller is 1 (reachable).
+    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_sdnc_status   sdnc_id=${sdnc_id}
+    Should Be Equal As Integers   ${metric}   1   msg=SDNC '${sdnc_id}' is not active   values=false
diff --git a/robot-systest/lib/sdnc_lib.robot b/robot-systest/lib/sdnc_lib.robot
deleted file mode 100644
index a897675..0000000
--- a/robot-systest/lib/sdnc_lib.robot
+++ /dev/null
@@ -1,101 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Settings ***
-Documentation   Library to manage SDNCs.
-
-Library   String
-Library   Collections
-Library   OperatingSystem
-
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-${sdnc_status_max_wait_time}   6min
-${sdnc_status_pol_time}   1min
-
-
-*** Keywords ***
-Create SDNC
-    [Documentation]   Creates an SDNC in OSM.
-    ...                 The optional parameters (such as 'switch_dpid' or 'ip-address') are given to this function in name=value format. These parameters will be appended to the 'osm sdnc-create' command with the next syntax: --param_name=param_value
-    ...                 Returns the ID of the created SDNC Target.
-    ...                 Example of execution:
-    ...                     \${sdnc_id}=   Create SDNC   \${sdnc_name}   \${sdnc_user}   \${sdnc_password}   \${sdnc_url}   \${sdnc_type}   switch_dpid='{...}'
-
-    [Arguments]   ${sdnc_name}   ${sdnc_user}   ${sdnc_password}   ${sdnc_url}   ${sdnc_type}   @{optional_parameters}
-
-    ${osm_sdnc_create_command}=   Set Variable   osm sdnc-create --name ${sdnc_name} --user ${sdnc_user} --password ${sdnc_password} --url ${sdnc_url} --type ${sdnc_type}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_sdnc_create_command}=   Catenate   ${osm_sdnc_create_command}   --${param_name}=${param_value}
-    END
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_sdnc_create_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Check for SDNC To Be Deleted
-    [Arguments]   ${sdnc_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-list | awk '{print $2}' | grep ${sdnc_name}
-    Should Not Be Equal As Strings   ${stdout}   ${sdnc_name}
-
-
-Delete SDNC
-    [Arguments]   ${sdnc_name}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm sdnc-delete ${sdnc_name}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    Wait Until Keyword Succeeds   ${delete_max_wait_time}   ${delete_pol_time}   Check for SDNC To Be Deleted   ${sdnc_name}
-
-
-Get SDNC List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check for SDNC
-    [Arguments]   ${sdnc_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-show ${sdnc_id} | grep -io ENABLED
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check for SDNC Status
-    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    Wait Until Keyword Succeeds   ${sdnc_status_max_wait_time}   ${sdnc_status_pol_time}   Check If SDNC Is Available   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-
-Get SDNC ID
-    [Arguments]   ${sdnc_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm sdnc-list | grep " ${sdnc_name} " | awk '{print $4}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=SDNC '${sdnc_name}' not found   values=false
-    [Return]   ${stdout}
-
-
-Check If SDNC Is Available
-    [Arguments]   ${sdnc_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_sdnc_status   sdnc_id=${sdnc_id}
-    Should Be Equal As Integers   ${metric}   1   msg=SDNC '${sdnc_id}' is not active   values=false
diff --git a/robot-systest/lib/ssh_lib.resource b/robot-systest/lib/ssh_lib.resource
new file mode 100644
index 0000000..15d48a6
--- /dev/null
+++ b/robot-systest/lib/ssh_lib.resource
@@ -0,0 +1,102 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords to interact with NF via SSH.
+Library   SSHLibrary
+
+
+*** Keywords ***
+Test SSH Connection
+    [Documentation]   Test the SSH connection to the host with the user and credentials passed as arguments.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    Execute Command   hostname
+    Close All Connections
+
+Check If Remote File Exists
+    [Documentation]   Check via SSH if a file exists in in the remote host, using the user and credentials passed as arguments.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${rc}=   Execute Command   ls ${file} >& /dev/null   return_stdout=False   return_rc=True
+    Close All Connections
+    Should Be Equal As Integers   ${rc}   0
+
+Check If Remote Folder Exists
+    [Documentation]   Check via SSH if a folder exists in in the remote host, using the user and credentials passed as arguments.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${folder}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${output}=   Execute Command   ls -d ${folder}
+    Close All Connections
+    Should Be Equal As Strings   ${output}   ${folder}
+
+Get Remote File Content
+    [Documentation]   Get via SSH the content of a remote file and return it.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${output}=   Execute Command   cat ${file}
+    Close All Connections
+    RETURN   ${output}
+
+Ping Many
+    [Documentation]   Connect via SSH to a remote host and test ping to a list of IP addresses, passed as argument.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   @{ip_list}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    FOR   ${ip}   IN   @{ip_list}
+        ${result}=   Execute Command   ping -c 5 -W 1 ${ip} > /dev/null && echo OK   shell=True
+        Log   ${result}
+        Should Contain   ${result}   OK
+    END
+    Close All Connections
+
+Execute Remote Command Check Rc Return Output
+    [Documentation]   Execute via SSH a command in a remote host and, if the command succeeds, return the output.
+    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${command}
+    Open Connection   ${host}
+    IF   "${password}" != "${EMPTY}"
+        Login   ${username}   ${password}
+    ELSE
+        Login With Public Key   ${username}   ${privatekey}
+    END
+    ${stdout}   ${rc}=   Execute Command   ${command}   return_rc=True   return_stdout=True
+    Log   ${rc}
+    Log   ${stdout}
+    Close All Connections
+    Should Be Equal As Integers   ${rc}   0
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/ssh_lib.robot b/robot-systest/lib/ssh_lib.robot
deleted file mode 100644
index 3e3c00b..0000000
--- a/robot-systest/lib/ssh_lib.robot
+++ /dev/null
@@ -1,79 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Keywords ***
-Test SSH Connection
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    Execute Command   hostname
-    Close All Connections
-
-Check If remote File Exists
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${rc}=   Execute Command   ls ${file} >& /dev/null   return_stdout=False   return_rc=True
-    Close All Connections
-    Should Be Equal As Integers   ${rc}   0
-
-Check If Remote Folder Exists
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${folder}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${output}=   Execute Command   ls -d ${folder}
-    Close All Connections
-    Should Be Equal As Strings   ${output}   ${folder}
-
-Get Remote File Content
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${file}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${output}=   Execute Command   cat ${file}
-    Close All Connections
-    [Return]   ${output}
-
-Ping Many
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   @{ip_list}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    FOR   ${ip}   IN   @{ip_list}
-        ${result}=   Execute Command   ping -c 5 -W 1 ${ip} > /dev/null && echo OK   shell=True
-        Log   ${result}
-        Should Contain   ${result}   OK
-    END
-    Close All Connections
-
-
-Execute Remote Command Check Rc Return Output
-    [Arguments]   ${host}   ${username}   ${password}   ${privatekey}   ${command}
-
-    Open Connection   ${host}
-    Run Keyword If   '${password}'!='${EMPTY}'   Login   ${username}   ${password}
-    ...   ELSE   Login With Public Key   ${username}   ${privatekey}
-    ${stdout}   ${rc}=   Execute Command   ${command}   return_rc=True   return_stdout=True
-    Log   ${rc}
-    Log   ${stdout}
-    Close All Connections
-    Should Be Equal As Integers   ${rc}   0
-    [Return]   ${stdout}
-
diff --git a/robot-systest/lib/user_lib.robot b/robot-systest/lib/user_lib.resource
similarity index 60%
rename from robot-systest/lib/user_lib.robot
rename to robot-systest/lib/user_lib.resource
index 4e5893c..8dd7601 100644
--- a/robot-systest/lib/user_lib.robot
+++ b/robot-systest/lib/user_lib.resource
@@ -1,3 +1,4 @@
+*** Comments ***
 #   Licensed under the Apache License, Version 2.0 (the "License");
 #   you may not use this file except in compliance with the License.
 #   You may obtain a copy of the License at
@@ -10,56 +11,58 @@
 #   See the License for the specific language governing permissions and
 #   limitations under the License.
 
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over Network Slice Templates with OSM client.
+Library   OperatingSystem
+
+
 *** Variables ***
-${success_return_code}   0
+${SUCCESS_RETURN_CODE}   0
 
 
 *** Keywords ***
 Create User
+    [Documentation]   Create a user in OSM with the name and password passed as arguments, and return the user id.
     [Arguments]   ${user_name}   ${user_password}
-
     Should Not Be Empty   ${user_name}
     Should Not Be Empty   ${user_password}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-create ${user_name} --password ${user_password}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-create ${user_name} --password ${user_password}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
 
 Update User Password
+    [Documentation]   Update the password of a user in OSM.
     [Arguments]   ${user_name}   ${user_password}   ${user_new_password}
-
     Should Not Be Empty   ${user_name}
     Should Not Be Empty   ${user_password}
     Should Not Be Empty   ${user_new_password}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-update ${user_name} --current-password ${user_password} --new-password ${user_new_password}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-update ${user_name} --current-password ${user_password} --new-password ${user_new_password}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Update User Role
+    [Documentation]   Update the role of a user in a project in OSM.
     [Arguments]   ${user_name}   ${project_name}   ${role_name}
-
     Should Not Be Empty   ${user_name}
     Should Not Be Empty   ${project_name}
     Should Not Be Empty   ${role_name}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-update --add-project-role '${project_name},${role_name}' ${user_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-update --add-project-role '${project_name},${role_name}' ${user_name}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Check If User Exists
+    [Documentation]   Check if a user exists in OSM.
     [Arguments]   ${user_name}
-
     Should Not Be Empty   ${user_name}
     ${rc}   ${stdout}=   Run And Return RC And Output   osm user-list | awk 'NR>3 {print $2}' | grep "${user_name}"
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Delete User
+    [Documentation]   Delete from OSM the user passed as argument.
     [Arguments]   ${user_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm user-delete ${user_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm user-delete ${user_name}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
diff --git a/robot-systest/lib/vim_lib.resource b/robot-systest/lib/vim_lib.resource
new file mode 100644
index 0000000..e46f632
--- /dev/null
+++ b/robot-systest/lib/vim_lib.resource
@@ -0,0 +1,116 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library to manage VIM Targets.
+
+Library   String
+Library   Collections
+Library   OperatingSystem
+
+Resource   ../lib/prometheus_lib.resource
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+${VIM_DELETE_MAX_WAIT_TIME}   1min
+${VIM_DELETE_POL_TIME}   15sec
+${VIM_STATUS_MAX_WAIT_TIME}   3min
+${VIM_STATUS_POL_TIME}   15sec
+${VIM_OPSTATE_MAX_WAIT_TIME}   40sec
+${VIM_OPSTATE_POL_TIME}   10sec
+
+
+*** Keywords ***
+Create VIM Target
+    [Documentation]   Register a VIM account in OSM and return the id.
+    ...                 The optional parameters (such as 'config' or 'sdn_controller') are given to this function in name=value format. These parameters will be appended to the 'osm vim-create' command with the next syntax: --param_name=param_value
+    ...                 Return the ID of the created VIM Target.
+    ...                 Example of execution:
+    ...                     \${vim_account_id}=   Create VIM Target   \${vim_name}   \${vim_user}   \${vim_password}   \${vim_auth_url}   \${vim_tenant}   \${vim_account_type}   config='{...}'
+    [Arguments]   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}   @{optional_parameters}
+    ${osm_vim_create_command}=   Set Variable   osm vim-create --name ${vim_name} --user ${vim_user} --password ${vim_password} --auth_url ${vim_auth_url} --tenant ${vim_tenant} --account_type ${vim_account_type}
+    FOR   ${param}   IN   @{optional_parameters}
+        ${match}   ${param_name}   ${param_value}=   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
+        Log   ${match},${param_name},${param_value}
+        ${osm_vim_create_command}=   Catenate   ${osm_vim_create_command}   --${param_name}=${param_value}
+    END
+    ${rc}   ${stdout}=   Run And Return Rc And Output   ${osm_vim_create_command}
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Delete VIM Target
+    [Documentation]   Unregister/delete a VIM account from OSM.
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run And Return Rc And Output   osm vim-delete ${vim_name}
+    Log   ${rc},${stdout}
+    Wait Until Keyword Succeeds   ${VIM_DELETE_MAX_WAIT_TIME}   ${VIM_DELETE_POL_TIME}   Check For VIM Target   ${vim_name}
+
+Get VIM Targets
+    [Documentation]   Get the list of VIM accounts in OSM.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+
+Check For VIM Target
+    [Documentation]   Check if a VIM account has been registered in OSM.
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list | awk '{print $2}' | grep ${vim_name}
+    Log   ${rc},${stdout}
+    Should Not Be Equal As Strings   ${stdout}   ${vim_name}
+
+Check For VIM Target Metric
+    [Documentation]   Check in a loop if the metric of osm_vim_status is present in Prometheus for the VIM account in OSM.
+    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
+    Wait Until Keyword Succeeds   ${VIM_STATUS_MAX_WAIT_TIME}   ${VIM_STATUS_POL_TIME}   Check If VIM Target Has Metric   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+
+Check For VIM Target Status
+    [Documentation]   Check in a loop if the value of the metric osm_vim_status in Prometheus for the VIM account is 1 (reachable).
+    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
+    Wait Until Keyword Succeeds   ${VIM_STATUS_MAX_WAIT_TIME}   ${VIM_STATUS_POL_TIME}   Check If VIM Target Is Available   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+
+Get VIM Target ID
+    [Documentation]   Get from OSM the VIM account id associated to the VIM account name passed as parameter.
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list | grep " ${vim_name} " | awk '{print $4}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=VIM Target '${vim_name}' not found   values=false
+    RETURN   ${stdout}
+
+Check VIM Target Operational State
+    [Documentation]   Check if the VIM account in OSM is enabled.
+    [Arguments]   ${vim_name}
+    Wait Until Keyword Succeeds   ${VIM_OPSTATE_MAX_WAIT_TIME}   ${VIM_OPSTATE_POL_TIME}   Check If VIM Target Is Enabled   ${vim_name}
+
+Check If VIM Target Is Enabled
+    [Documentation]   Check if the VIM account passed as argument is enabled in OSM (meaning that the RO could reach the VIM account).
+    [Arguments]   ${vim_name}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vim-list | grep " ${vim_name} " | awk '{print $6}'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Should Be Equal As Strings   ${stdout}   ENABLED   msg=VIM Target '${vim_name}' is not enabled   values=false
+
+Check If VIM Target Is Available
+    [Documentation]   Check if the value of the metric osm_vim_status in Prometheus for the VIM account is 1 (reachable).
+    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
+    Should Be Equal As Integers   ${metric}   1   msg=VIM Target '${vim_account_id}' is not active   values=false
+
+Check If VIM Target Has Metric
+    [Documentation]   Check if the metric of osm_vim_status is present in Prometheus for the VIM account in OSM.
+    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
+    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
+    Should Be True   ${metric} <2   msg=VIM Target '${vim_account_id}' has no metric
diff --git a/robot-systest/lib/vim_lib.robot b/robot-systest/lib/vim_lib.robot
deleted file mode 100644
index 2c96802..0000000
--- a/robot-systest/lib/vim_lib.robot
+++ /dev/null
@@ -1,124 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Settings ***
-Documentation   Library to manage VIM Targets.
-
-Library   String
-Library   Collections
-Library   OperatingSystem
-
-# Gerardo
-Resource   %{ROBOT_DEVOPS_FOLDER}/lib/prometheus_lib.robot
-
-
-*** Variables ***
-${success_return_code}   0
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
-${vim_status_max_wait_time}   3min
-${vim_status_pol_time}   15sec
-${vim_opstate_max_wait_time}   40sec
-${vim_opstate_pol_time}   10sec
-
-
-*** Keywords ***
-Create VIM Target
-    [Documentation]   Create a VIM Target in OSM.
-    ...                 The optional parameters (such as 'config' or 'sdn_controller') are given to this function in name=value format. These parameters will be appended to the 'osm vim-create' command with the next syntax: --param_name=param_value
-    ...                 Return the ID of the created VIM Target.
-    ...                 Example of execution:
-    ...                     \${vim_account_id}=   Create VIM Target   \${vim_name}   \${vim_user}   \${vim_password}   \${vim_auth_url}   \${vim_tenant}   \${vim_account_type}   config='{...}'
-
-    [Arguments]   ${vim_name}   ${vim_user}   ${vim_password}   ${vim_auth_url}   ${vim_tenant}   ${vim_account_type}   @{optional_parameters}
-
-    ${osm_vim_create_command}=   Set Variable   osm vim-create --name ${vim_name} --user ${vim_user} --password ${vim_password} --auth_url ${vim_auth_url} --tenant ${vim_tenant} --account_type ${vim_account_type}
-    FOR   ${param}   IN   @{optional_parameters}
-        ${match}   ${param_name}   ${param_value} =   Should Match Regexp   ${param}   (.+)=(.+)   msg=Syntax error in optional parameters
-        ${osm_vim_create_command}=   Catenate   ${osm_vim_create_command}   --${param_name}=${param_value}
-    END
-    ${rc}   ${stdout}=   Run and Return RC and Output   ${osm_vim_create_command}
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Delete VIM Target
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm vim-delete ${vim_name}
-    Log   ${stdout}
-    Wait Until Keyword Succeeds   ${delete_max_wait_time}   ${delete_pol_time}   Check for VIM Target   ${vim_name}
-
-
-Get VIM Targets
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
-
-Check for VIM Target
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list | awk '{print $2}' | grep ${vim_name}
-    Should Not Be Equal As Strings   ${stdout}   ${vim_name}
-
-
-Check for VIM Target Metric
-    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Wait Until Keyword Succeeds   ${vim_status_max_wait_time}   ${vim_status_pol_time}   Check If VIM Target Has Metric   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-
-Check for VIM Target Status
-    [Arguments]   ${vim_name}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${vim_account_id}=   Get VIM Target ID   ${vim_name}
-    Wait Until Keyword Succeeds   ${vim_status_max_wait_time}   ${vim_status_pol_time}   Check If VIM Target Is Available   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-
-Get VIM Target ID
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list | grep " ${vim_name} " | awk '{print $4}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Not Be Equal As Strings   ${stdout}   ${EMPTY}   msg=VIM Target '${vim_name}' not found   values=false
-    [Return]   ${stdout}
-
-
-Check VIM Target Operational State
-    [Arguments]   ${vim_name}
-
-    Wait Until Keyword Succeeds   ${vim_opstate_max_wait_time}   ${vim_opstate_pol_time}   Check If VIM Target Is Enabled   ${vim_name}
-
-
-Check If VIM Target Is Enabled
-    [Arguments]   ${vim_name}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vim-list | grep " ${vim_name} " | awk '{print $6}'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    Should Be Equal As Strings   ${stdout}   ENABLED   msg=VIM Target '${vim_name}' is not enabled   values=false
-
-
-Check If VIM Target Is Available
-    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
-    Should Be Equal As Integers   ${metric}   1   msg=VIM Target '${vim_account_id}' is not active   values=false
-
-
-Check If VIM Target Has Metric
-    [Arguments]   ${vim_account_id}   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}
-
-    ${metric}=   Get Metric   ${prometheus_host}   ${prometheus_port}   ${prometheus_user}   ${prometheus_password}   osm_vim_status   vim_account_id=${vim_account_id}
-    Should Be True   ${metric} <2   msg=VIM Target '${vim_account_id}' has no metric
diff --git a/robot-systest/lib/vnf_lib.resource b/robot-systest/lib/vnf_lib.resource
new file mode 100644
index 0000000..2700135
--- /dev/null
+++ b/robot-systest/lib/vnf_lib.resource
@@ -0,0 +1,77 @@
+*** Comments ***
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+
+*** Settings ***
+Documentation   Library providing keywords for CRUD operations over VNF instances with OSM client.
+Library   OperatingSystem
+Library   String
+
+
+*** Variables ***
+${SUCCESS_RETURN_CODE}   0
+
+
+*** Keywords ***
+Get Vnf List
+    [Documentation]   Get the list of VNF instances and return it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-list 2>&1
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get VNF VIM ID
+    [Documentation]   Get the identifier of the first VDU of a VNF instance. Useful to get the id when a VNF has a single VDU.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq -r '.vdur[]."vim-id"'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    RETURN   ${stdout}
+
+Get VDU List From VNF
+    [Documentation]   Return a list of the VDU instance ids of a VNF instance
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].id'
+    Log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{vdur_ids}=   Split String   ${stdout}
+    RETURN   @{vdur_ids}
+
+Get VDU VIM Id
+    [Documentation]   Return the VIM VM ID for a VDU
+    [Arguments]   ${vnf_id}   ${vdur_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${vm_vim_id}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq -r '."vim-id"'
+    Log   ${vm_vim_id}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${vm_vim_id}   values=False
+    RETURN   ${vm_vim_id}
+
+Get Vnf Vdur IPs
+    [Documentation]   Return a list with the IP addresses of the VDU records of a VNF instance.
+    [Arguments]   ${vnf_id}
+    Should Not Be Empty   ${vnf_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq -r '.vdur[].interfaces[]."ip-address"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    @{ip}=   Split String   ${stdout}
+    RETURN   @{ip}
+
+Get Vdu Attribute
+    [Documentation]   Return an attribute from VDU records selected by count_index of a VNF instance.
+    [Arguments]   ${vnf_id}   ${attribute}   ${count_index}=0
+    Should Not Be Empty   ${vnf_id}
+    Should Not Be Empty   ${attribute}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(."count-index" == ${count_index})' | yq -r '."${attribute}"'
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}   msg=${stdout}   values=False
+    RETURN   ${stdout}
diff --git a/robot-systest/lib/vnf_lib.robot b/robot-systest/lib/vnf_lib.robot
deleted file mode 100644
index b7d6cc3..0000000
--- a/robot-systest/lib/vnf_lib.robot
+++ /dev/null
@@ -1,81 +0,0 @@
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-*** Variables ***
-${success_return_code}   0
-
-
-*** Keywords ***
-Get Vnf List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-list 2>&1
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get VNF VIM ID
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq -r '.vdur[]."vim-id"'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    [Return]   ${stdout}
-
-
-Get VDU list from VNF
-    [Documentation]   Return a list of the VDUr ids for a VNF
-
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[].id'
-    Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{vdur_ids}=   Split String   ${stdout}
-    [Return]   @{vdur_ids}
-
-
-Get VDU VIM Id
-    [Documentation]   Return the VIM VM ID for a VDU
-
-    [Arguments]   ${vnf_id}   ${vdur_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${vm_vim_id}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(.id == "'${vdur_id}'")' | yq -r '."vim-id"'
-    Log   ${vm_vim_id}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${vm_vim_id}   values=False
-    [Return]   ${vm_vim_id}
-
-
-Get Vnf Vdur IPs
-    [Documentation]   Return a list with the IP addresses of the VDU records of a VNF instance.
-
-    [Arguments]   ${vnf_id}
-
-    Should Not Be Empty   ${vnf_id}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq -r '.vdur[].interfaces[]."ip-address"'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    @{ip} =   Split String   ${stdout}
-    [Return]   @{ip}
-
-
-Get Vdu Attribute
-    [Documentation]   Return an attribute from VDU records selected by count_index of a VNF instance.
-
-    [Arguments]   ${vnf_id}   ${attribute}   ${count_index}=0
-
-    Should Not Be Empty   ${vnf_id}
-    Should Not Be Empty   ${attribute}
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnf-show ${vnf_id} --literal | yq '.vdur[] | select(."count-index" == ${count_index})' | yq -r '."${attribute}"'
-    Should Be Equal As Integers   ${rc}   ${success_return_code}   msg=${stdout}   values=False
-    [Return]   ${stdout}
diff --git a/robot-systest/lib/vnfd_lib.robot b/robot-systest/lib/vnfd_lib.resource
similarity index 72%
rename from robot-systest/lib/vnfd_lib.robot
rename to robot-systest/lib/vnfd_lib.resource
index 4433a48..2e4e2a6 100644
--- a/robot-systest/lib/vnfd_lib.robot
+++ b/robot-systest/lib/vnfd_lib.resource
@@ -1,6 +1,4 @@
-# -*- coding: utf-8 -*-
-
-##
+*** Comments ***
 # Copyright 2019 Tech Mahindra Limited
 #
 # All Rights Reserved.
@@ -16,30 +14,28 @@
 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 # License for the specific language governing permissions and limitations
 # under the License.
-##
 
-## Change log:
-# 1. Feature 7829: Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 06-sep-2019
-##
 
 *** Settings ***
+Documentation   Library providing keywords for CRUD operations over VNFD / VNF packages with OSM client.
+Library   OperatingSystem
 Library   String
 
 
 *** Variables ***
-${success_return_code}   0
-${failure_return_code}   1
-${delete_max_wait_time}   1min
-${delete_pol_time}   15sec
+${SUCCESS_RETURN_CODE}   0
+${FAILURE_RETURN_CODE}   1
+${VNFD_DELETE_MAX_WAIT_TIME}   1min
+${VNFD_DELETE_POL_TIME}   15sec
 
 
 *** Keywords ***
 Get VNFDs List
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-list
+    [Documentation]   Get the list of VNF packages and log it.
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-list
     Log   ${stdout}
     Log   ${rc}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
 
 Create VNFD
     [Documentation]   Onboards ("creates") a NF Package into OSM.
@@ -55,39 +51,32 @@
     ...               - Relevant environment variables:
     ...                  - OVERRIDES: If the environment variable "OVERRIDES" exists, it prevails over the value in the argument.
     ...                               This is often more convenient to enforce the same behaviour for every test run in a given VIM.
-
     [Arguments]   ${vnfd_pkg}   ${overrides}=${EMPTY}
-
     # If env variable "OVERRIDES" exists, it prevails over the value in the argument
     ${overrides}=   Get Environment Variable   OVERRIDES   default=${overrides}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-create ${overrides} ${vnfd_pkg}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-create ${overrides} ${vnfd_pkg}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     ${lines}=   Get Line Count   ${stdout}
     ${last}=   Evaluate   ${lines} - 1
     ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
+    RETURN   ${id}
 
 Update VNFD
-    [Documentation]   Onboards ("Updates") a NF Package into OSM.
+    [Documentation]   Onboard ("Update") a NF Package into OSM.
     ...               - Parameters:
     ...                 - vnfd_pkg: Name (and location) of the NF Package
     ...                 - vnfd_name: Name of the existing NF Package
-
     [Arguments]   ${vnfd_pkg}   ${vnfd_name}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-update --content ${vnfd_pkg} ${vnfd_name}
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-update --content ${vnfd_pkg} ${vnfd_name}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     ${lines}=   Get Line Count   ${stdout}
     ${last}=   Evaluate   ${lines} - 1
     ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
+    RETURN   ${id}
 
 Create VNFD Overriding Fields
     [Documentation]   Onboards ("creates") a NF Package into OSM.
@@ -104,46 +93,42 @@
     ...               - Relevant environment variables:
     ...                  - OVERRIDES: If the environment variable "OVERRIDES" exists, it prevails over the value in the argument.
     ...                               This is often more convenient to enforce the same behaviour for every test run in a given VIM.
-
     [Arguments]   ${vnfd_pkg}   ${override_fields}   ${overrides}=${EMPTY}
-
     # If env variable "OVERRIDES" exists, it prevails over the value in the argument
     ${overrides}=   Get Environment Variable   OVERRIDES   default=${overrides}
-
-    # Proceedes with the onboarding with the appropriate arguments
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-create ${overrides} ${vnfd_pkg} --override '${override_fields}'
+    # Proceeds with the onboarding with the appropriate arguments
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-create ${overrides} ${vnfd_pkg} --override '${override_fields}'
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
     ${lines}=   Get Line Count   ${stdout}
     ${last}=   Evaluate   ${lines} - 1
     ${id}=   Get Line   ${stdout}   ${last}
-    [Return]   ${id}
-
+    RETURN   ${id}
 
 Delete VNFD
+    [Documentation]   Delete a VNF package from OSM.
     [Arguments]   ${vnfd_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-delete ${vnfd_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-delete ${vnfd_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${success_return_code}
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}
-
+    Should Be Equal As Integers   ${rc}   ${SUCCESS_RETURN_CODE}
+    Wait Until Keyword Succeeds   ${VNFD_DELETE_MAX_WAIT_TIME}   ${VNFD_DELETE_POL_TIME}   Check For VNFD   ${vnfd_id}
 
 Assert Failure Delete VNFD
     [Documentation]   Deletes a NF Package that cannot be deleted and asserts the failure
     [Arguments]   ${vnfd_id}
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-delete ${vnfd_id}
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-delete ${vnfd_id}
     Log   ${stdout}
-    Should Be Equal As Integers   ${rc}   ${failure_return_code}
+    Should Be Equal As Integers   ${rc}   ${FAILURE_RETURN_CODE}
     Should Contain   ${stdout}   409   msg=Expected Conflict   values=False
-    WAIT UNTIL KEYWORD SUCCEEDS   ${delete_max_wait_time}   ${delete_pol_time}   Check For VNFD   ${vnfd_id}   True
-
+    Wait Until Keyword Succeeds   ${VNFD_DELETE_MAX_WAIT_TIME}   ${VNFD_DELETE_POL_TIME}   Check For VNFD   ${vnfd_id}   True
 
 Check For VNFD
+    [Documentation]   Check that a VNF package exists in OSM.
     [Arguments]   ${vnfd_id}   ${exists}=False
-
-    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfpkg-list | awk '{print $2}' | grep ${vnfd_id}
-    Run Keyword If   ${exists}   Should Be Equal As Strings   ${stdout}   ${vnfd_id}
-    ...   ELSE   Should Not Be Equal As Strings   ${stdout}   ${vnfd_id}
-
+    ${rc}   ${stdout}=   Run And Return Rc And Output   osm vnfpkg-list | awk '{print $2}' | grep ${vnfd_id}
+    Log   ${rc},${stdout}
+    IF   ${exists}
+        Should Be Equal As Strings   ${stdout}   ${vnfd_id}
+    ELSE
+        Should Not Be Equal As Strings   ${stdout}   ${vnfd_id}
+    END
