diff --git a/run_test.py b/run_test.py
index cafbc59..ec77a41 100755
--- a/run_test.py
+++ b/run_test.py
@@ -6,15 +6,15 @@
 import logging
 import os.path
 import argparse
-from nodes import discover
 
-import ssh_runner
+import ssh_utils
 import io_scenario
+from nodes import discover
 from config import cfg_dict
 from utils import log_error
 from rest_api import add_test
-from itest import IOPerfTest,PgBenchTest
 from formatters import get_formatter
+from itest import IOPerfTest, PgBenchTest
 
 logger = logging.getLogger("io-perf-tool")
 logger.setLevel(logging.DEBUG)
@@ -58,49 +58,49 @@
     parser = argparse.ArgumentParser(
         description="Run disk io performance test")
 
-    parser.add_argument("tool_type", help="test tool type",
-                        choices=['iozone', 'fio', 'pgbench', 'two_scripts'])
-
     parser.add_argument("-l", dest='extra_logs',
                         action='store_true', default=False,
                         help="print some extra log info")
 
-    parser.add_argument("-o", "--test-opts", dest='opts',
-                        help="cmd line options for test")
+    parser.add_argument('stages', nargs="+",
+                        choices=["discover", "connect", "start_new_nodes",
+                                 "deploy_sensors"])
 
-    parser.add_argument("-f", "--test-opts-file", dest='opts_file',
-                        type=argparse.FileType('r'), default=None,
-                        help="file with cmd line options for test")
+    # THIS ALL MOVE TO CONFIG FILE
+    # parser.add_argument("-o", "--test-opts", dest='opts',
+    #                     help="cmd line options for test")
 
-    parser.add_argument("--max-preparation-time", default=300,
-                        type=int, dest="max_preparation_time")
+    # parser.add_argument("-f", "--test-opts-file", dest='opts_file',
+    #                     type=argparse.FileType('r'), default=None,
+    #                     help="file with cmd line options for test")
 
-    parser.add_argument("-b", "--build-info", default=None,
-                        dest="build_name")
+    # parser.add_argument("--max-preparation-time", default=300,
+    #                     type=int, dest="max_preparation_time")
 
-    parser.add_argument("-d", "--data-server-url", default=None,
-                        dest="data_server_url")
+    # parser.add_argument("-b", "--build-info", default=None,
+    #                     dest="build_name")
 
-    parser.add_argument("-n", "--lab-name", default=None,
-                        dest="lab_name")
+    # parser.add_argument("-d", "--data-server-url", default=None,
+    #                     dest="data_server_url")
 
-    parser.add_argument("--create-vms-opts", default=None,
-                        help="Creating vm's before run ssh runner",
-                        dest="create_vms_opts")
+    # parser.add_argument("-n", "--lab-name", default=None,
+    #                     dest="lab_name")
 
-    parser.add_argument("-k", "--keep", default=False,
-                        help="keep temporary files",
-                        dest="keep_temp_files", action='store_true')
+    # parser.add_argument("--create-vms-opts", default=None,
+    #                     help="Creating vm's before run ssh runner",
+    #                     dest="create_vms_opts")
 
-    choices = ["local", "ssh"]
+    # parser.add_argument("-k", "--keep", default=False,
+    #                     help="keep temporary files",
+    #                     dest="keep_temp_files", action='store_true')
 
-    parser.add_argument("--runner", required=True,
-                        choices=choices, help="runner type")
+    # parser.add_argument("--runner", required=True,
+    #                     choices=["local", "ssh"], help="runner type")
 
-    parser.add_argument("--runner-extra-opts", default=None,
-                        dest="runner_opts", help="runner extra options")
+    # parser.add_argument("--runner-extra-opts", default=None,
+    #                     dest="runner_opts", help="runner extra options")
 
-    return parser.parse_args(argv)
+    return parser.parse_args(argv[1:])
 
 
 def format_result(res, formatter):
@@ -111,10 +111,6 @@
     return templ.format(data, formatter(res), "=" * 80)
 
 
-def deploy_and_start_sensors(sensors_conf, nodes):
-    pass
-
-
 def main(argv):
     logging_conf = cfg_dict.get('logging')
     if logging_conf:
@@ -122,13 +118,22 @@
             logger.setLevel(logging.DEBUG)
             ch.setLevel(logging.DEBUG)
 
+    opts = parse_args(argv)
+    if 'discover' in opts.stages:
+        current_data = discover.discover(cfg_dict.get('cluster'))
+
+    if 'connect' in opts.stages:
+        for node in current_data:
+            node.connection = ssh_utils.connect(node.connection_url)
+
+    print "\n".join(map(str, current_data))
+    return 0
     # Discover nodes
-    nodes_to_run = discover.discover(cfg_dict.get('cluster'))
 
     tests = cfg_dict.get("tests", [])
 
     # Deploy and start sensors
-    deploy_and_start_sensors(cfg_dict.get('sensors'), nodes_to_run)
+    # deploy_and_start_sensors(cfg_dict.get('sensors'), nodes_to_run)
 
     for test_name, opts in tests.items():
         cmd_line = " ".join(opts['opts'])
@@ -144,13 +149,13 @@
                           opts.get('keep_temp_files'))
         logger.debug(format_result(res, get_formatter(test_name)))
 
-    if cfg_dict.get('data_server_url'):
-        result = json.loads(get_formatter(opts.tool_type)(res))
-        result['name'] = opts.build_name
-        add_test(opts.build_name, result, opts.data_server_url)
+    # if cfg_dict.get('data_server_url'):
+    #     result = json.loads(get_formatter(opts.tool_type)(res))
+    #     result['name'] = opts.build_name
+    #     add_test(opts.build_name, result, opts.data_server_url)
 
     return 0
 
 
 if __name__ == '__main__':
-    exit(main(sys.argv[1:]))
+    exit(main(sys.argv))
