diff --git a/tests/scale/Voltha_Scale_Tests.robot b/tests/scale/Voltha_Scale_Tests.robot
new file mode 100644
index 0000000..c2c1527
--- /dev/null
+++ b/tests/scale/Voltha_Scale_Tests.robot
@@ -0,0 +1,174 @@
+# Copyright 2017 - present Open Networking Foundation
+#
+# 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.
+
+# Tests can be enabled by passing the following tags:
+# - [setup] Creates and enable the OLT devices
+# - [activation] Checks that ONUs are active in VOLTHA and ports discevered in ONOS
+# - [flow-before] Checks that flows are pushed (before subscriber provisioning)
+# - [authentication] Checks that subscribers are correctly authenticated
+# - [provision] Provision the data-plane flows for all the subscribers
+# - [flow-after] Checks that flows are pushed (after subscriber provisioning)
+# - [dhcp] Checks that subscribers have received an IP
+#
+# To run the full test:
+#   robot Voltha_Scale_Tests.robot
+#
+# To run only ceratain tests:
+#   robot -i activation -i flow-before Voltha_Scale_Tests.robot
+#
+# To exclude only ceratain tests:
+#   robot -e -i flow-before Voltha_Scale_Tests.robot
+#
+# Once te test complete you can extrapolate the results by using
+#   python extract-times.py
+
+*** Settings ***
+Documentation     Collect measurements on VOLTHA performances
+Suite Setup       Setup Suite
+#Test Setup        Setup
+#Test Teardown     Teardown
+Suite Teardown    Teardown Suite
+Library           Collections
+Library           String
+Library           OperatingSystem
+Library           XML
+Library           Timer
+Library           RequestsLibrary
+Library           ../../libraries/DependencyLibrary.py
+Resource          ../../libraries/onos.robot
+Resource          ../../libraries/voltctl.robot
+Resource          ../../libraries/voltha.robot
+Resource          ../../libraries/utils.robot
+Resource          ../../libraries/k8s.robot
+Resource          ../../variables/variables.robot
+
+*** Variables ***
+${ONOS_SSH_IP}  127.0.0.1
+${ONOS_SSH_PORT}    8101
+
+# Scale pipeline values
+${olt}  1
+${pon}  1
+${onu}  1
+
+${enableLLDP}   false
+${enableFlowProvisioning}   true
+${enableSubscriberProvisioning}     true
+
+${workflow}     att
+#${flowsBeforeProvisioning}  1
+#${flowsAfterProvisioning}  1
+
+# Per-test logging on failure is turned off by default; set this variable to enable
+${container_log_dir}    ${None}
+
+*** Test Cases ***
+
+Create and Enable devices
+    [Documentation]  Create and enable the OLTs in VOLTHA
+    [Tags]      setup
+    ${olt_device_ids}=      Create List
+    FOR    ${INDEX}    IN RANGE    0    ${olt}
+        ${olt_device_id}=    Create Device  bbsim${INDEX}     50060     openolt     0f:f1:ce:c${INDEX}:ff:ee
+        Enable Device    ${olt_device_id}
+        Append To List  ${olt_device_ids}    ${olt_device_id}
+    END
+
+    Set Suite Variable    ${olt_device_ids}
+
+Onu Activation in VOLTHA
+    [Documentation]    Check that all ONUs reach the ACTIVE/ENABLED state in VOLTHA
+    [Tags]      non-critical    activation    plot-voltha-onus
+    Wait For ONUs In VOLTHA     ${total_onus}
+
+Port Discovery in ONOS
+    [Documentation]    Check that all the UNI ports show up in ONOS
+    [Tags]      non-critical    activation    plot-onos-ports
+    Wait for Ports in ONOS      ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}  ${total_onus}   BBSM
+
+Flows validation in VOLTHA before subscriber provisioning
+    [Documentation]    Check that all the flows has been acknowledged
+    [Tags]      non-critical    flow-before   plot-voltha-flows-before
+    # NOTE fail the test immediately if we're trying to check flows without provisioning them
+    Should Be Equal   ${enableFlowProvisioning}     true
+    Wait for Logical Devices flows   ${workflow}    ${total_onus}    ${olt}    false
+
+Flows validation in ONOS before subscriber provisioning
+    [Documentation]    Check that all the flows has been stored in the logical device
+    [Tags]      non-critical    flow-before   plot-onos-flows-before
+    # NOTE fail the test immediately if we're trying to check flows without provisioning them
+    Should Be Equal   ${enableFlowProvisioning}     true
+    Wait for all flows to in ADDED state    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}
+    ...     ${workflow}    ${total_onus}    ${olt}    false
+
+Wait for subscribers to be Authenticated
+    [Documentation]    Check that all subscribers have successfully authenticated
+    [Tags]      non-critical    authentication    plot-onos-auth
+    Wait for AAA Authentication     ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}  ${total_onus}
+
+Provision subscribers
+    [Documentation]    Provision data plane flows for all the subscribers
+    [Tags]      non-critical    provision
+    Should Be Equal   ${enableSubscriberProvisioning}     true
+    ${olts}=    List OLTs   ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}
+    FOR     ${olt}  IN  @{olts}
+        Provision all subscribers on device  ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}  ${olt}
+    END
+
+Flows validation in VOLTHA after subscriber provisioning
+    [Documentation]    Check that all the flows has been stored in the logical device
+    [Tags]      non-critical    flow-after    plot-voltha-flows-after
+    # NOTE fail the test immediately if we're trying to check flows without provisioning them
+    Should Be Equal   ${enableFlowProvisioning}     true
+    Wait for Logical Devices flows   ${workflow}    ${total_onus}    ${olt}    true
+
+Flows validation in ONOS after subscriber provisioning
+    [Documentation]    Check that all the flows has been acknowledged
+    [Tags]      non-critical    flow-after    plot-onos-flows-after
+    # NOTE fail the test immediately if we're trying to check flows without provisioning them
+    Should Be Equal   ${enableFlowProvisioning}     true
+    Wait for all flows to in ADDED state    ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}
+    ...     ${workflow}    ${total_onus}    ${olt}    true
+
+Wait for subscribers to have an IP
+    [Documentation]    Check that all subscribers have received a DHCP_ACK
+    [Tags]      non-critical    dhcp  plot-onos-dhcp
+    Wait for DHCP Ack     ${ONOS_SSH_IP}    ${ONOS_SSH_PORT}  ${total_onus}
+
+Disable and Delete devices
+    [Documentation]  Disable and delete the OLTs in VOLTHA
+    [Tags]      non-critical    teardown
+    FOR    ${olt_device_id}    IN  @{olt_device_ids}
+        Disable Device  ${olt_device_id}
+        Delete Device  ${olt_device_id}
+    END
+
+    Set Suite Variable    ${olt_device_ids}
+
+*** Keywords ***
+Setup Suite
+    [Documentation]    Setup test global variables and starts a timer
+    Set Suite Variable    ${KUBECTL_CONFIG}    export KUBECONFIG=%{KUBECONFIG}
+    Set Suite Variable    ${VOLTCTL_CONFIG}    export VOLTCONFIG=%{VOLTCONFIG}
+
+    ${total_onus}=   Evaluate    ${olt} * ${pon} * ${onu}
+    Set Suite Variable  ${total_onus}
+
+    Configure Timer     10 minutes  0 seconds   SuiteTimer
+    Start Timer     SuiteTimer
+
+Teardown Suite
+    [Documentation]    Verify the timer
+    Stop Timer     SuiteTimer
+    Verify Single Timer    10 minutes   0 seconds   SuiteTimer
diff --git a/tests/scale/collect-result.py b/tests/scale/collect-result.py
new file mode 100644
index 0000000..f65ae31
--- /dev/null
+++ b/tests/scale/collect-result.py
@@ -0,0 +1,76 @@
+# Copyright 2017-present Open Networking Foundation
+#
+# 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.
+
+import argparse
+import os
+import xml.etree.ElementTree as ET
+from datetime import datetime
+
+dash = "-" * 75
+double_dash = "=" * 75
+
+
+def cut_string(str):
+    return (str[:48] + "..") if len(str) > 50 else str
+
+def format_key(str):
+    return str.replace("plot-", "").replace("-", " ")
+
+def read_file(file, plot_folder):
+    # create element tree object
+    tree = ET.parse(file)
+
+    # get root element
+    root = tree.getroot()
+
+    results = {}
+
+    print(double_dash)
+    print("{:<50}{:>10}{:>15}".format("Test Name", "Status", "Duration (s)"))
+    print(double_dash)
+    for test in root.findall("./suite/test"):
+        status = test.find(".status")
+        name = test.attrib["name"]
+        start = status.attrib["starttime"]
+        end = status.attrib["endtime"]
+        s = datetime.strptime(start[:-4], "%Y%m%d %H:%M:%S")
+        e = datetime.strptime(end[:-4], "%Y%m%d %H:%M:%S")
+        diff = e - s
+        print("{:<50}{:>10}{:>15}".format(cut_string(name), status.attrib["status"], diff.seconds))
+        print(dash)
+
+        # check if the test has a tag that starts with "plot-",
+        # if so store the result to create plot files for Jenkins
+        for tag in test.findall("./tags/tag"):
+            if "plot-" in tag.text:
+                results[tag.text] = diff.seconds
+
+    if not os.path.isdir(plot_folder):
+        os.mkdir(plot_folder)
+
+    for k, v in results.items():
+        f = open("%s/%s.txt" % (plot_folder, k), "a")
+        f.write("%s\n" % format_key(k))
+        f.write(str(v))
+        f.close()
+
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(prog="collect-result")
+    parser.add_argument("-r", "--robot-output", help="he robot output.xml file to process", default="output.xml"),
+    parser.add_argument("-p", "--plot-folder", help="here to output the files needed for the Jenkins plots", default="plots")
+
+    args = parser.parse_args()
+
+    read_file(args.robot_output, args.plot_folder)
