diff --git a/robot-systest/lib/api/common.robot b/robot-systest/lib/api/common.robot
deleted file mode 100644
index 4724016..0000000
--- a/robot-systest/lib/api/common.robot
+++ /dev/null
@@ -1,64 +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
-##
-
-
-*** Variables ***
-${token}=  ${EMPTY}
-${HOST}=  ${EMPTY}
-
-
-*** Keywords ***
-Get Auth Token
-    [Tags]  auth_token
-
-    ${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}
-
-    Create Session    osmhit    ${HOST}    verify=${FALSE}    debug=1    headers=${HEADERS}
-
-    Log Many    ${auth_token_uri}    @{data}    ${data}
-
-    ${resp}=    Post Request    osmhit    ${auth_token_uri}    data=${data}
-    log    ${resp}
-
-    Pass Execution If   ${resp.status_code} in ${success_status_code_list}   Get Auth Token completed
-
-    ${content}=     To Json   ${resp.content}
-    ${t}=    Get From Dictionary	${content}	    _id
-
-    Set Suite Variable     ${token}   ${t}
-
-
-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
diff --git a/robot-systest/lib/api/vim_lib.robot b/robot-systest/lib/api/vim_lib.robot
deleted file mode 100644
index a52354f..0000000
--- a/robot-systest/lib/api/vim_lib.robot
+++ /dev/null
@@ -1,60 +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
-##
-
-
-*** Keywords ***
-Create Vim
-    [Arguments]  ${vim_name}     ${account_type}     ${auth_url}     ${user}     ${password}     ${tenant}       ${description}
-
-    &{request_data}=        Create Dictionary      vim_user=${user}    vim_password=${password}    vim_url=${auth_url}     vim_tenant_name=${tenant}   vim_type=${account_type}    description=${description}  name=${vim_name}
-
-    &{headers}=    Create Dictionary     Authorization=Bearer ${token}      Content-Type=application/json   Accept=application/json
-
-    Create Session    osmvim    ${HOST}    verify=${FALSE}    headers=${headers}
-
-    LOG   ${request_data}
-    ${res}=     Post Request    osmvim  ${create_vim_uri}   data=${request_data}
-    log    ${res.content}
-    Pass Execution If   ${res.status_code} in ${success_status_code_list}   Create Vim Request completed
-    Get Vim ID      ${res.content}
-
-
-Delete Vim
-    [Arguments]  ${vim_id}
-
-    ${uri} =	Catenate	SEPARATOR=/     ${create_vim_uri}      ${vim_id}
-    ${resp}=    Delete Request   osmvim   ${uri}
-
-    log   ${resp.content}
-    Pass Execution If      ${resp.status_code} in ${success_status_code_list}   Delete Vim Request completed
-
-
-Get Vim ID
-    [Arguments]  ${res}
-
-#    log to console      ${res}
-    ${content}=     To Json     ${res}
-    ${id}=      Get From Dictionary     ${content}	    id
-    Set Suite Variable     ${vim_id}   ${id}
-    log   Vim Id is ${vim_id}
diff --git a/robot-systest/lib/cli/network_slicing_lib.robot b/robot-systest/lib/cli/network_slicing_lib.robot
deleted file mode 100644
index 9a3ff37..0000000
--- a/robot-systest/lib/cli/network_slicing_lib.robot
+++ /dev/null
@@ -1,118 +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. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019
-##
-
-*** Variables ***
-${success_return_code}    0
-${delete_max_wait_time}    1min
-${delete_pol_time}    15sec
-${ns_launch_max_wait_time}    5min
-${ns_launch_pol_time}    30sec
-
-
-*** Keywords ***
-Create NST
-    [Documentation]  Create nst at osm
-    [Arguments]  ${nst_pkg}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm nst-create ${nst_pkg}
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    [Return]  ${stdout}
-
-
-Delete NST
-    [Documentation]  delete nst at osm
-    [Arguments]  ${nst}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm nst-delete ${nst}
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    [Return]  ${stdout}
-
-
-Launch Network Slice Instance
-    [Arguments]  ${vim_name}    ${nst_name}    ${ns_config}=''
-
-    ${nsi_name}=    GENERATE NAME
-    Run Keyword If   ${ns_config}!=''   Create Network Slice With Config    ${nsi_name}    ${nst_name}    ${vim_name}    ${ns_config}
-    ...    ELSE    Create Network Slice Without Config    ${nsi_name}    ${nst_name}    ${vim_name}
-
-    WAIT UNTIL KEYWORD SUCCEEDS     ${ns_launch_max_wait_time}   ${ns_launch_pol_time}   Check For Network Slice Instance To Configured   ${nsi_name}
-    Check For Network Slice Instance For Failure    ${nsi_name}
-
-
-Create Network Slice With Config
-    [Arguments]  ${nsi_name}    ${nst_name}    ${vim}    ${config}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-create --nsi_name ${nsi_name} --nst_name ${nst_name} --vim_account ${vim} --config ${config}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Append To List     ${nsi_list}       ${nsi_name}
-
-
-Create Network Slice Without Config
-    [Arguments]  ${nsi_name}    ${nst_name}    ${vim}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-create --nsi_name ${nsi_name} --nst_name ${nst_name} --vim_account ${vim}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Append To List     ${nsi_list}       ${nsi_name}
-
-
-Check For Network Slice Instance For Failure
-    [Arguments]  ${nsi_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list --filter name="${nsi_name}"
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   failed
-
-
-Check For Network Slice Instance To Configured
-    [Arguments]  ${nsi_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list --filter name="${nsi_name}"
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Contain Any      ${stdout}   configured    failed
-
-
-Delete Network Slice Instance
-    [Documentation]  Delete ns
-    [Arguments]  ${nsi}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-delete ${nsi}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-    WAIT UNTIL KEYWORD SUCCEEDS  ${delete_max_wait_time}   ${delete_pol_time}   Check For NSI Instance To Be Delete   ${nsi}
-
-
-Check For NSI Instance To Be Delete
-    [Arguments]  ${nsi}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm nsi-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   ${nsi}
diff --git a/robot-systest/lib/cli/ns_lib.robot b/robot-systest/lib/cli/ns_lib.robot
deleted file mode 100644
index e0eb0c2..0000000
--- a/robot-systest/lib/cli/ns_lib.robot
+++ /dev/null
@@ -1,193 +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-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-*** 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
-${nsconfig}
-
-*** Keywords ***
-Get NS List
-    [Documentation]  Get ns instance list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Get NS Instance ID
-    [Arguments]    ${ns_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list --filter name="${ns_name}" | awk 'NR==4{print $4}'
-    log     ${stdout}
-    [Return]    ${stdout}
-
-
-Verify All JUJU Applications Status
-    [Arguments]    ${ns}    ${api_ip}    ${api_port}    ${username}    ${password}    ${api_cert_path}
-
-    ${juju_model}=    Get NS Instance ID    ${ns}
-
-    Import Library    robot_juju.JujuLibrary    ${api_ip}    ${api_port}    ${juju_model}    ${username}    ${password}    ${api_cert_path}
-    Assert status of applications is  ${status_active}
-
-
-Launch Network Services and Return
-    [Arguments]  ${vim_name}  ${ns_config}=''
-    [Documentation]  Get Configuration parameter to create Newtork service
-
-    Run Keyword If    ${ns_config}==''    Get NS Config
-    ...  ELSE  Set NS Config    ${ns_config}
-    Log To Console    \n${nsconfig}
-    Should Not Be Empty    ${nsd_ids}    There are no NS descriptors to launch the NS
-    :FOR    ${nsd}    IN    @{nsd_ids}
-    \    ${ns_name}=    GENERATE NAME
-    \    Append To List     ${ns_ids}       ${ns_name}
-    \    Create Network Service    ${nsd}   ${vim_name}    ${ns_name}    ${nsconfig}
-
-
-Set NS Config
-    [Arguments]   ${ns_config}
-    [Documentation]  Set NS Configuration variable
-
-    ${nsconfig}=    Get Variable Value    ${ns_config}    ''
-    Set Test Variable    ${nsconfig}
-
-
-Get NS Config
-    [Documentation]  Get NS Configuration from Environment Variable
-
-    ${nsconfig}=    Get Environment Variable    NS_CONFIG    ''
-    Set Test Variable    ${nsconfig}
-
-
-Create Network Service
-    [Documentation]  Create ns at osm
-    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}    ${ns_config}
-
-    Run Keyword If   ${ns_config}!=''   Create Network Service With Config    ${nsd}    ${vim_name}    ${ns_name}    ${ns_config}
-    ...    ELSE    Create Network Service Without Config    ${nsd}   ${vim_name}    ${ns_name}
-
-    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}
-
-
-Create Network Service Without Config
-    [Documentation]  Create ns at osm
-    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Create Network Service With Config
-    [Documentation]  Create ns at osm
-    [Arguments]  ${nsd}   ${vim_name}    ${ns_name}    ${ns_config}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-create --ns_name ${ns_name} --nsd_name ${nsd} --vim_account ${vim_name} --config ${ns_config}
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Delete NS
-    [Documentation]  Delete ns
-    [Arguments]  ${ns}
-
-    ${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 Delete   ${ns}
-
-
-Check For NS Instance To Configured
-    [Arguments]  ${ns_name}
-
-    ${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    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 Delete
-    [Arguments]  ${ns}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   ${ns}
-
-
-Force Delete NS
-    [Documentation]  Forcely Delete ns
-    [Arguments]  ${ns}
-
-    ${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 Delete   ${ns}
-
-
-Perform VNF Scale-in Operation
-    [Arguments]  ${ns}    ${vnf_member}    ${scaling_group}
-
-    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
-    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
-    log to console  Scaled VNF befor scale-in operation is ${scaled_vnf}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnf-scale --scale-in --scaling-group ${scaling_group} ${ns} ${vnf_member}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Sleep    1m    Waiting for scale-in operation to complete
-    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
-    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
-    log to console  Scaled VNF after scale-in operation is ${scaled_vnf}
-
-
-Perform VNF Scale-out Operation
-    [Arguments]  ${ns}    ${vnf_member}    ${scaling_group}
-
-    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
-    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
-    log to console  Scaled VNF befor scale-out operation is ${scaled_vnf}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnf-scale --scale-out --scaling-group ${scaling_group} ${ns} ${vnf_member}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    log     ${stdout}
-    Sleep    1m    Waiting for scale-out operation to complete
-    ${rc}    ${nsr}=    Run and Return RC and Output    osm ns-show ${ns} --literal
-    ${scaled_vnf}=    Get Scaled Vnf    ${nsr}
-    log to console  Scaled VNF befor scale-out operation is ${scaled_vnf}
diff --git a/robot-systest/lib/cli/nsd_lib.robot b/robot-systest/lib/cli/nsd_lib.robot
deleted file mode 100644
index da27b4f..0000000
--- a/robot-systest/lib/cli/nsd_lib.robot
+++ /dev/null
@@ -1,85 +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
-##
-
-*** Variables ***
-${success_return_code}    0
-${delete_max_wait_time}    1min
-${delete_pol_time}    15sec
-
-
-*** Keywords ***
-Get NSDs List
-    [Documentation]  Get nsds list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm nsd-list
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Create NSD
-    [Documentation]  Create nsd at osm
-    [Arguments]  ${nsd_pkg}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm nsd-create ${nsd_pkg}
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    [Return]  ${stdout}
-
-
-Delete NSD
-    [Documentation]  Delete nsd
-    [Arguments]  ${nsd_id}
-
-    # For timebeing exception thrown by nsd-delete api was ignor because nsd was deleted successfully. The cause of exception is need to debug further
-    ${rc}   ${stdout}=      Run Keyword And Continue On Failure    Run and Return RC and Output	    osm nsd-delete ${nsd_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 NSD   ${nsd_id}
-
-
-Check For NSD
-    [Arguments]  ${nsd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm nsd-list
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    Should Not Contain      ${stdout}   ${nsd_id}
-
-
-Force Delete NSD
-    [Documentation]  Forcely Delete nsd
-    [Arguments]  ${nsd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm nsd-delete ${nsd_id}
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}   ${success_return_code}
-
-
-Build NS Descriptor
-    [Documentation]  Build NS Descriptor from the descriptor-packages
-    [Arguments]  ${nsd path}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    make -C '${CURDIR}${/}../../..${nsd path}'
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}   ${success_return_code}
diff --git a/robot-systest/lib/cli/osm_package_tools_lib.robot b/robot-systest/lib/cli/osm_package_tools_lib.robot
deleted file mode 100644
index c8a864c..0000000
--- a/robot-systest/lib/cli/osm_package_tools_lib.robot
+++ /dev/null
@@ -1,88 +0,0 @@
-# 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. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 18-Dec-2019
-##
-
-*** Keywords ***
-Create OSM NS Package
-    [Arguments]  ${pkg_name}
-    ${ns_pkg}=    Catenate	SEPARATOR=_     ${pkg_name}      ns
-    ${ns_yaml}=   Catenate	SEPARATOR=_     ${pkg_name}      nsd
-    ${ns_yaml}=   Catenate	SEPARATOR=.     ${ns_yaml}      yaml
-    ${nsd_path}=    Join Path    ${ns_pkg}    ${ns_yaml}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-create ns ${pkg_name}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    File Should Exist    ${nsd_path}
-    log  ${stdout}
-
-
-Create OSM VNF Package
-    [Arguments]  ${pkg_name}
-    ${vnf_pkg}=    Catenate    SEPARATOR=_     ${pkg_name}      vnf
-    ${vnf_yaml}=   Catenate	   SEPARATOR=_     ${pkg_name}      vnfd
-    ${vnf_yaml}=   Catenate	   SEPARATOR=.     ${vnf_yaml}      yaml
-    ${vnfd_path}=    Join Path    ${vnf_pkg}    ${vnf_yaml}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-create vnf ${pkg_name}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    File Should Exist    ${vnfd_path}
-    log  ${stdout}
-
-
-Validate OSM NS Package
-    [Arguments]  ${pkg_name}
-    ${ns_pkg}=    Catenate	SEPARATOR=_     ${pkg_name}      ns
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-validate ${ns_pkg}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Verify Package Validation Result    ${ns_pkg}
-    log  ${stdout}
-
-
-Validate OSM VNF Package
-    [Arguments]  ${pkg_name}
-    ${vnf_pkg}= 	Catenate	SEPARATOR=_     ${pkg_name}      vnf
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-validate ${vnf_pkg}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Verify Package Validation Result    ${vnf_pkg}
-    log  ${stdout}
-
-
-Verify Package Validation Result
-    [Arguments]  ${pkg}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-validate ${pkg} | awk 'NR==6{print $6}'
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain    ${stdout}    ERROR
-    log  ${stdout}
-
-
-Build OSM VNF Package
-    [Arguments]  ${pkg_name}
-    ${vnf_pkg}= 	Catenate	SEPARATOR=_     ${pkg_name}      vnf
-    ${vnf_pkg_tar}= 	Catenate	SEPARATOR=.     ${vnf_pkg}      tar    gz
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-build ${vnf_pkg}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    File Should Exist    ${vnf_pkg_tar}
-    log  ${stdout}
-
-
-Build OSM NS Package
-    [Arguments]  ${pkg_name}
-    ${ns_pkg}= 	  Catenate	  SEPARATOR=_     ${pkg_name}      ns
-    ${ns_pkg_tar}= 	  Catenate	  SEPARATOR=.     ${ns_pkg}      tar    gz
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm package-build ${ns_pkg}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    File Should Exist    ${ns_pkg_tar}
-    log  ${stdout}
diff --git a/robot-systest/lib/cli/osm_platform_resiliancy_recovery_lib.robot b/robot-systest/lib/cli/osm_platform_resiliancy_recovery_lib.robot
deleted file mode 100644
index fb86768..0000000
--- a/robot-systest/lib/cli/osm_platform_resiliancy_recovery_lib.robot
+++ /dev/null
@@ -1,55 +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. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 08-nov-2019
-##
-
-
-*** Variables ***
-${success_return_code}    0
-${er_replicas}    0/1
-
-
-*** Keywords ***
-Check If OSM Working
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm vnfpkg-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm vim-list
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Check All Service Are Running
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    docker service ls
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Should Not Contain      ${stdout}   ${er_replicas}
-
-
-Kill Docker Container
-    [Arguments]  ${name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    docker rm -f \$(docker ps |grep -i ${name}|awk '{print $1}')
-    log     ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
\ No newline at end of file
diff --git a/robot-systest/lib/cli/rbac_lib.robot b/robot-systest/lib/cli/rbac_lib.robot
deleted file mode 100644
index bbf717a..0000000
--- a/robot-systest/lib/cli/rbac_lib.robot
+++ /dev/null
@@ -1,245 +0,0 @@
-##
-# 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. Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com : 21-nov-2019
-##
-
-*** Keywords ***
-Configure NBI For RBAC
-    ${rc}   ${stdout}=      Run and Return RC and Output    docker service update osm_nbi --force --env-add OSMNBI_AUTHENTICATION_BACKEND=keystone --env-add OSMNBI_AUTHENTICATION_AUTH_URL=keystone --env-add OSMNBI_AUTHENTICATION_AUTH_PORT=5000 --env-add OSMNBI_AUTHENTICATION_USER_DOMAIN_NAME=default --env-add OSMNBI_AUTHENTICATION_PROJECT_DOMAIN_NAME=default --env-add OSMNBI_AUTHENTICATION_SERVICE_USERNAME=nbi --env-add OSMNBI_AUTHENTICATION_SERVICE_PROJECT=service
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    Sleep    30s    Wait for NBI service to be update
-
-
-Create User
-    [Arguments]  ${user}    ${password}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-create ${user} --password ${password}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log     ${stdout}
-    [Return]    ${stdout}
-
-
-List User
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-list
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log     ${stdout}
-    [Return]    ${stdout}
-
-
-List User And Check For The Created User
-    [Arguments]  ${user}
-    ${user list}=    List User
-    Should Contain    ${user list}    ${user}
-
-
-Get User Info By Name
-    [Arguments]  ${user_name}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user_name}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log     ${stdout}
-
-
-Get User Info By ID
-    [Arguments]  ${user_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user_id}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log     ${stdout}
-
-
-Update User
-    [Arguments]  ${user}    ${field}    ${value}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-update ${field} ${value} ${user}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log     ${stdout}
-
-
-Update User And Verify Info
-    [Arguments]    ${user}  @{args}
-    FOR    ${arg}    IN    @{args}
-        ${fields}=    Get Dictionary Items    ${arg}
-        Update User    ${user}    ${fields[0]}    ${fields[1]}
-    END
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-show ${user}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log     ${stdout}
-
-
-Login With User And Perform Operation
-    [Arguments]  ${user}    ${password}    ${project}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_USER=${user}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PROJECT=${project}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PASSWORD=${password}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log    ${stdout}
-    Logout and Login With Admin
-
-
-Logout and Login With Admin
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_USER=admin
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    export OSM_PASSWORD=admin
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm ns-list
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Delete User
-    [Arguments]  ${user}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-delete ${user}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Delete User And Check
-    [Arguments]  ${user}
-    Delete User    ${user}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm user-list
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    Should Not Contain      ${stdout}   ${user}
-
-
-Create Project
-    [Arguments]  ${project}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-create ${project}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Project
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-list
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Project And Verify
-    [Arguments]  ${project}
-    ${project list}=    List Project
-    Should Contain    ${project list}    ${project}
-
-
-Get Project Info By Name
-    [Arguments]  ${project_name}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-show ${project_name}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Get Project Info By ID
-    [Arguments]  ${project_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-show ${project_id}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Update Project
-    [Arguments]  ${project}    ${feild}    ${value}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-update ${feild} ${value} ${project}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-
-
-Update Project Name And Verify
-    [Arguments]  ${old_name}    ${new_name}
-    Update Project    ${old_name}    --name    ${new_name}
-    List Project And Verify    ${new_name}
-
-
-Delete Project
-    [Arguments]  ${project}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm project-delete ${project}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Delete Project And Verify
-    [Arguments]  ${project}
-    Delete Project    ${project}
-    ${project_list}=    List Project
-    Should Not Contain    ${project_list}    ${project}
-
-
-Create Role
-    [Arguments]  ${role}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-create ${role}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Roles
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-list
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-List Roles And Verify
-    [Arguments]  ${role}
-    ${role_list}=    List Roles
-    Should Contain    ${role_list}    ${role}
-
-
-Get Role Info By Name
-    [Arguments]  ${role}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-show ${role}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Get Role Info By ID
-    [Arguments]  ${role_id}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-show ${role_id}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-    [Return]  ${stdout}
-
-
-Update Role
-    [Arguments]  ${role}    ${feild}    ${value}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-update ${feild} ${value} ${role}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    log  ${stdout}
-
-
-Add Role And Verify
-    [Arguments]  ${role}    ${role_to_add}
-    Update Role    ${role}    --add    ${role_to_add}
-    ${role_info}=    Get Role Info By Name    ${role}
-#    Should Contain    ${role_info}    ${role_to_add}
-
-
-Delete Role
-    [Arguments]  ${role}
-    ${rc}   ${stdout}=      Run and Return RC and Output    osm role-delete ${role}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Delete Role And Verify
-    [Arguments]  ${role}
-    Delete Role    ${role}
-    ${role_list}=    List Roles
-    Should Not Contain    ${role_list}    ${role}
diff --git a/robot-systest/lib/cli/sdnc_account_lib.robot b/robot-systest/lib/cli/sdnc_account_lib.robot
deleted file mode 100644
index 71680b8..0000000
--- a/robot-systest/lib/cli/sdnc_account_lib.robot
+++ /dev/null
@@ -1,65 +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.
-##
-
-
-*** Variables ***
-${success_return_code}    0
-${name}     "OpenSite"
-${user}     "admin"
-${password}     "admin"
-${ip}      "1.1.1.1"
-${type}     "onos"
-${port}     "5858"
-${dpid}   "a7:2f:aa:be:C3:c1:fe:C9"
-
-
-*** Keywords ***
-Create SDNC Account
-    [Documentation]  create new sdnc account
-
-     ${rc}    ${stdout}=      Run and Return RC and Output	 osm sdnc-create --name ${name} --type ${type} --ip_address ${ip} --user ${user} --password ${password} --port ${port} --switch_dpid ${dpid}
-    log  ${rc}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Get SDNC List
-    [Documentation]  Get a sdnc account list
-
-    ${rc}    ${stdout}=      Run and Return RC and Output	 osm sdnc-list
-    log     ${stdout}
-
-
-Show SDNC Account
-    [Documentation]  Get sdnc account details
-
-    ${rc}    ${stdout}=      Run and Return RC and Output	 osm sdnc-show ${name}
-    log  ${rc}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-
-
-Delete SDNC Account
-    [Documentation]  Get sdnc account details
-
-    ${rc}    ${stdout}=      Run and Return RC and Output	 osm sdnc-delete ${name}
-    log  ${rc}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
\ No newline at end of file
diff --git a/robot-systest/lib/cli/vim_account_lib.robot b/robot-systest/lib/cli/vim_account_lib.robot
deleted file mode 100644
index c3c8242..0000000
--- a/robot-systest/lib/cli/vim_account_lib.robot
+++ /dev/null
@@ -1,136 +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     OperatingSystem
-Library     String
-Library     Collections
-Library     ../custom_lib.py
-
-
-*** Variables ***
-${success_return_code}    0
-${user}     "robottest"
-${password}     "fred"
-${authurl}      "https://127.0.0.1/"
-${type}     "openstack"
-${desc}     "a test vim"
-${tenant}   "robottest2"
-
-
-*** Keywords ***
-Create Vim Account
-    [Documentation]   Create a new vim account
-
-    ${vim-name}=     Generate Random String  8  [NUMBERS]
-    ${vim-name}=     Catenate  SEPARATOR=  vim_  ${vim-name}
-    set global variable  ${vim-name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vim-create --name ${vim-name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc}
-    log  ${stdout}
-    Should Be Equal As Integers 	${rc}    ${success_return_code}
-
-
-Get Vim List
-    [Documentation]  Get a vim account list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vim-list
-    log     ${stdout}
-    Log To Console  ${stdout}
-    Should Be Equal As Integers 	${rc}    ${success_return_code}
-
-
-Delete Vim Account
-    [Documentation]  delete vim account details
-    [Arguments]  ${vim_name}=${vim-name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vim-delete ${vim_name}
-    log  ${stdout}
-    Should Be Equal As Integers 	${rc}    ${success_return_code}
-
-
-VIM Setup To Launch Network Services
-    [Documentation]  Setup a VIM to launch network services
-
-    set global variable    @{vim}
-    ${vmware_url}=  Get Environment Variable    VCD_AUTH_URL   ${EMPTY}
-    ${openstack_url}=   Get Environment Variable    OS_AUTH_URL   ${EMPTY}
-    ${vmware_vim}=    Run Keyword And Return If   '${vmware_url}'!='${EMPTY}'   Setup Vmware Vim   ${vmware_url}   'vmware'      'pytest system test'
-    ${openstack_vim}=    Run Keyword And Return If   '${openstack_url}'!='${EMPTY}'   Setup Openstack Vim    ${openstack_url}    'openstack'   'pytest system test'
-    Should Not Be Empty    ${vim}    VIM details not provided
-    Log Many   @{vim}
-
-
-Setup Openstack Vim
-    [Documentation]  Openstack Vim Account Setup
-    [Tags]    vim-setup
-    [Arguments]  ${authurl}  ${type}     ${desc}
-
-    ${user}=  Get Environment Variable    OS_USERNAME   ''
-    ${password}=  Get Environment Variable    OS_PASSWORD   ''
-    ${tenant}=  Get Environment Variable    OS_PROJECT_NAME   ''
-    ${vim-config}=  Get Environment Variable    OS_VIM_CONFIG   ''
-    ${vim_name}=    GENERATE NAME
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vim-create --name ${vim_name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc} --config ${vim-config}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Sleep    30s    Wait for to get vim ready
-    ${rc}   ${vim_detail}=      Run and Return RC and Output    osm vim-show ${vim_name}
-    Should Contain    ${vim_detail}    "operationalState": "ENABLED"    msg=Openstack vim is not available    values=False
-    Append To List     ${vim}       ${stdout}
-
-    [Return]  ${stdout}
-
-
-Setup Vmware Vim
-    [Documentation]  Vmware Vim Account Setup
-    [Tags]    vim-setup
-    [Arguments]  ${authurl}  ${type}     ${desc}
-
-    ${user}=  Get Environment Variable    VCD_USERNAME   ''
-    ${password}=  Get Environment Variable    VCD_PASSWORD   ''
-    ${tenant}=  Get Environment Variable    VCD_TENANT_NAME   ''
-    ${vcd-org}=  Get Environment Variable    VCD_ORGANIZATION   ''
-    ${vim-config}=  Get Environment Variable    VCD_VIM_CONFIG   ''
-    ${vim_name}=    GENERATE NAME
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vim-create --name ${vim_name} --user ${user} --password ${password} --auth_url ${authurl} --tenant ${tenant} --account_type ${type} --description ${desc} --config ${vim-config}
-    log  ${stdout}
-    Should Be Equal As Integers    ${rc}    ${success_return_code}
-    Sleep    30s    Wait for to get vim ready
-    ${rc}   ${vim_detail}=      Run and Return RC and Output    osm vim-show ${vim_name}
-    Should Contain    ${vim_detail}    "operationalState": "ENABLED"    msg=VMWare VCD vim is not available    values=False
-    Append To List     ${vim}       ${stdout}
-
-    [Return]  ${stdout}
-
-
-Force Delete Vim Account
-    [Documentation]  delete vim account details
-    [Arguments]  ${vim_name}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vim-delete ${vim_name}
-    log  ${stdout}
-    Should Be Equal As Integers 	${rc}    ${success_return_code}
diff --git a/robot-systest/lib/cli/vnfd_lib.robot b/robot-systest/lib/cli/vnfd_lib.robot
deleted file mode 100644
index 1b99f43..0000000
--- a/robot-systest/lib/cli/vnfd_lib.robot
+++ /dev/null
@@ -1,85 +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
-##
-
-*** Variables ***
-${success_return_code}    0
-${delete_max_wait_time}    1min
-${delete_pol_time}    15sec
-
-
-*** Keywords ***
-Get VNFDs List
-    [Documentation]  Get vnfds list
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vnfd-list
-    log     ${stdout}
-    log     ${rc}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Create VNFD
-    [Documentation]  Create vnfd at osm
-    [Arguments]  ${vnfd_pkg}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vnfd-create ${vnfd_pkg}
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    [Return]  ${stdout}
-
-
-Delete VNFD
-    [Documentation]  Delete vnfd
-    [Arguments]  ${vnfd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vnfd-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}
-
-
-Check For VNFD
-    [Arguments]  ${vnfd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vnfd-list
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-    Should Not Contain      ${stdout}   ${vnfd_id}
-
-
-Force Delete VNFD
-    [Documentation]  Forcely Delete vnfd
-    [Arguments]  ${vnfd_id}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    osm vnfd-delete ${vnfd_id}
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
-
-
-Build VNF Descriptor
-    [Documentation]  Build VNF Descriptor from the descriptor-packages
-    [Arguments]  ${vnfd path}
-
-    ${rc}   ${stdout}=      Run and Return RC and Output	    make -C '${CURDIR}${/}../../..${vnfd path}'
-    log     ${stdout}
-    Should Be Equal As Integers 	${rc}	  ${success_return_code}
diff --git a/robot-systest/lib/client_lib/client_lib.py b/robot-systest/lib/client_lib/client_lib.py
deleted file mode 100644
index c9390ae..0000000
--- a/robot-systest/lib/client_lib/client_lib.py
+++ /dev/null
@@ -1,69 +0,0 @@
-##
-# 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.
-##
-
-
-from osmclient import client
-from robot.api import logger
-import json
-
-
-class ClientLib:
-    def __init__(self, host="127.0.0.1", user=None, password=None, project=None):
-
-        kwargs = {}
-        if user is not None:
-            kwargs['user'] = user
-        if password is not None:
-            kwargs['password'] = password
-        if project is not None:
-            kwargs['project'] = project
-        self.client = client.Client(host=host, sol005=True, **kwargs)
-
-    def get_vim_list(self):
-        resp = self.client.vim.list()
-        logger.info('VIM List: {}'.format(resp))
-        return json.dumps(resp)
-
-    def create_vim_account(self, name, vim_type, user, password, auth_url, tenant, desc='', config=None):
-        vim_access = {}
-        if config is not None:
-            vim_access['config'] = config
-        vim_access['vim-type'] = vim_type
-        vim_access['vim-username'] = user
-        vim_access['vim-password'] = password
-        vim_access['vim-url'] = auth_url
-        vim_access['vim-tenant-name'] = tenant
-        vim_access['description'] = desc
-
-        resp = self.client.vim.create(name, vim_access)
-        logger.info('Create VIM Account: {}'.format(resp))
-        return json.dumps(resp)
-
-    def delete_vim_account(self, name):
-        resp = self.client.vim.delete(name)
-        return json.dumps(resp)
-
-    def get_vnfd_list(self):
-        resp = self.client.vnfd.list()
-        logger.info('VNF Descriptor List: {}'.format(resp))
-        return json.dumps(resp)
-
-    def get_nsd_list(self):
-        resp = self.client.nsd.list()
-        logger.info('NS Descriptor List: {}'.format(resp))
-        return json.dumps(resp)
diff --git a/robot-systest/lib/connectivity_lib.robot b/robot-systest/lib/connectivity_lib.robot
new file mode 100644
index 0000000..7b86593
--- /dev/null
+++ b/robot-systest/lib/connectivity_lib.robot
@@ -0,0 +1,19 @@
+#   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 Connectivity
+    [Arguments]  ${host}
+
+    ${result}  Run Process  ping -c 5 -W 1 ${host} > /dev/null && echo OK  shell=True
+    Log     all output: ${result.stdout}
+    Should Contain  ${result.stdout}  OK
diff --git a/robot-systest/lib/custom_lib.py b/robot-systest/lib/custom_lib.py
deleted file mode 100644
index 2a3d23f..0000000
--- a/robot-systest/lib/custom_lib.py
+++ /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:
-# Jayant Madavi, Mrityunjay Yadav : MY00514913@techmahindra.com
-##̥
-
-
-import random
-from haikunator import Haikunator
-import yaml
-from os.path import basename
-import hashlib
-
-from robot.api import logger
-from robot.api.deco import keyword
-
-
-def generate_name():
-    haikunator = Haikunator()
-    name = haikunator.haikunate(delimiter='_', token_length=2)
-    return name
-
-
-def get_random_item_from_list(l):
-    assert isinstance(l, list), "List should be provided"
-    return random.choice(l)
-
-
-def get_scaled_vnf(nsr):
-    nsr = yaml.load(nsr)
-    if 'scaling-group' in nsr['_admin']:
-        return nsr['_admin']['scaling-group'][0]['nb-scale-op']
-    else:
-        return 0
-
-
-@keyword('Get File Name From Path')
-def get_filename(path):
-    filename = basename(path)
-    return filename, filename.split('.')[0]
-
-
-@keyword('Generate MD5')
-def generate_md5(fpath):
-    hash_md5 = hashlib.md5()
-    with open(fpath, "rb") as f:
-        for chunk in iter(lambda: f.read(1024), b""):
-            hash_md5.update(chunk)
-    return hash_md5.hexdigest()
diff --git a/robot-systest/lib/gui/login_gui.robot b/robot-systest/lib/gui/login_gui.robot
deleted file mode 100644
index c125664..0000000
--- a/robot-systest/lib/gui/login_gui.robot
+++ /dev/null
@@ -1,87 +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-aug-2019 : Improvement to the code, robot framework initial seed code.
-##
-
-
-*** Variables ***
-${DESIRED_CAPABILITIES}    desired_capabilities
-${BROWSER}        Chrome
-${DELAY}          0
-${VALID USER}     admin
-${VALID PASSWORD}    admin
-${LOGIN URL}      /auth/
-${WELCOME URL}    /projects/
-${NS LIST URL}    /packages/ns/list
-${VNF LIST URL}    /packages/vnf/list
-
-
-*** Keywords ***
-Set Server URL
-    ${env_host}=    Get Environment Variable    OSM_HOSTNAME
-    ${passed}=    Run Keyword And Return Status    Should Contain    ${env_host}    :
-    Run Keyword If    ${passed}    Set Dockerized Host
-    ...    ELSE    Set Standalone Host    ${env_host}
-
-
-Open Browser To Login Page
-    ${chrome_options} =     Evaluate    sys.modules['selenium.webdriver'].ChromeOptions()    sys, selenium.webdriver
-    Call Method    ${chrome_options}   add_argument    headless
-    Call Method    ${chrome_options}   add_argument    disable-gpu
-    Call Method    ${chrome_options}   add_argument    no-sandbox
-    ${options}=     Call Method     ${chrome_options}    to_capabilities
-    Open Browser    ${SERVER}${LOGIN URL}    ${BROWSER}    desired_capabilities=${options}
-    Maximize Browser Window
-    Set Selenium Speed    ${DELAY}
-    Login Page Should Be Open
-
-
-Login Page Should Be Open
-    Element Text Should Be    //*[@id="main_content"]/div/div[2]/p    Sign in to start your session
-
-
-Enter Credentials
-    [Arguments]    ${username}    ${password}
-    Input Text    name:username    ${username}
-    Input Password    name:password    ${password}
-
-
-Submit Credentials
-    Click Button    //*[@id="main_content"]/div/div[2]/form/div[3]/div[2]/button
-
-
-Home Page Should Be Open
-    Location Should Be    ${SERVER}${WELCOME URL}
-#    Element Should Contain    id:title_header    6e3a8415-9014-4100-9727-90e0150263be    ignore_case=True
-    Element Attribute Value Should Be    //*[@id="main_content"]/div/div[2]/div[1]/div[1]/div/a    href    ${SERVER}${NS LIST URL}
-    Element Attribute Value Should Be    //*[@id="main_content"]/div/div[2]/div[1]/div[2]/div/a    href    ${SERVER}${VNF LIST URL}
-
-
-Set Dockerized Host
-
-    Set Suite Variable     ${SERVER}   http://light-ui
-
-
-Set Standalone Host
-    [Arguments]  ${env_host}
-
-    Set Suite Variable     ${SERVER}   http://${env_host}
diff --git a/robot-systest/lib/ns_lib.robot b/robot-systest/lib/ns_lib.robot
new file mode 100644
index 0000000..cc252fb
--- /dev/null
+++ b/robot-systest/lib/ns_lib.robot
@@ -0,0 +1,82 @@
+#   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 ***
+Create Network Service
+    [Arguments]   ${nsd}   ${vim_name}   ${ns_name}   ${ns_config}   ${publickey}
+
+    ${config_attr}   Set Variable If   '${ns_config}'!='${EMPTY}'   --config '${ns_config}'   \
+    ${sshkeys_attr}   Set Variable If   '${publickey}'!='${EMPTY}'   --ssh_keys ${publickey}   \
+
+    ${ns_id}=   Instantiate Network Service   ${ns_name}   ${nsd}   ${vim_name}   ${config_attr} ${sshkeys_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}
+
+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}
+
+Check For NS Instance To Configured
+    [Arguments]  ${ns_name}
+
+    ${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   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   osm ns-list | awk '{print $2}' | grep ${ns}
+    Should Not Be Equal As Strings   ${stdout}   ${ns}
+
+Delete NS
+    [Documentation]  Delete ns
+    [Arguments]  ${ns}
+
+    ${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}
diff --git a/robot-systest/lib/nsd_lib.robot b/robot-systest/lib/nsd_lib.robot
new file mode 100644
index 0000000..8af1379
--- /dev/null
+++ b/robot-systest/lib/nsd_lib.robot
@@ -0,0 +1,59 @@
+# -*- 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
+##
+
+*** 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 nsd-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 nsd-create ${nsd_pkg}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete NSD
+    [Arguments]   ${nsd_id}
+
+    ${rc}   ${stdout}=   Run Keyword And Continue On Failure   Run and Return RC and Output   osm nsd-delete ${nsd_id}
+    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 nsd-list | awk '{print $2}' | grep ${nsd_id}
+    Should Not Be Equal As Strings   ${stdout}   ${nsd_id}
diff --git a/robot-systest/lib/ssh_lib.robot b/robot-systest/lib/ssh_lib.robot
new file mode 100644
index 0000000..3d2d708
--- /dev/null
+++ b/robot-systest/lib/ssh_lib.robot
@@ -0,0 +1,54 @@
+#   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
+
+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}
+
+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}
\ No newline at end of file
diff --git a/robot-systest/lib/vnfd_lib.robot b/robot-systest/lib/vnfd_lib.robot
new file mode 100644
index 0000000..828ea0a
--- /dev/null
+++ b/robot-systest/lib/vnfd_lib.robot
@@ -0,0 +1,61 @@
+# -*- 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
+##
+
+*** Variables ***
+${success_return_code}   0
+${delete_max_wait_time}   1min
+${delete_pol_time}   15sec
+
+
+*** Keywords ***
+Get VNFDs List
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-list
+    log   ${stdout}
+    log   ${rc}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+
+
+Create VNFD
+    [Arguments]   ${vnfd_pkg}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-create ${vnfd_pkg}
+    log   ${stdout}
+    Should Be Equal As Integers   ${rc}   ${success_return_code}
+    [Return]  ${stdout}
+
+
+Delete VNFD
+    [Arguments]   ${vnfd_id}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-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}
+
+
+Check For VNFD
+    [Arguments]   ${vnfd_id}
+
+    ${rc}   ${stdout}=   Run and Return RC and Output   osm vnfd-list | awk '{print $2}' | grep ${vnfd_id}
+    Should Not Be Equal As Strings   ${stdout}   ${vnfd_id}
