diff --git a/scripts/connector.py b/scripts/connector.py
index 15bc538..ca72ddc 100644
--- a/scripts/connector.py
+++ b/scripts/connector.py
@@ -1,15 +1,26 @@
 import argparse
 import sys
+import tempfile
 import os
 import paramiko
 
 from urlparse import urlparse
+from nodes.node import Node
+from utils import parse_creds
+from keystone import KeystoneAuth
 
 
-from disk_perf_test_tool.keystone import KeystoneAuth
+from keystone import KeystoneAuth
+
+tmp_file = tempfile.NamedTemporaryFile().name
 
 
 def discover_fuel_nodes(fuel_url, creds, cluster_id):
+    username, tenant_name, password = parse_creds(creds)
+    creds = {"username": username,
+             "tenant_name": tenant_name,
+             "password": password}
+
     admin_ip = urlparse(fuel_url).hostname
     fuel = KeystoneAuth(fuel_url, creds, headers=None, echo=None,
                         admin_node_ip=admin_ip)
@@ -19,7 +30,10 @@
 
     host = urlparse(fuel_url).hostname
 
-    return run_agent(ips, roles, host)
+    nodes, to_clean = run_agent(ips, roles, host, tmp_file)
+    nodes = [Node(node[0], node[1]) for node in nodes]
+
+    return nodes, to_clean
 
 
 def discover_fuel_nodes_clean(fuel_url, ssh_creds, nodes, base_port=12345):
@@ -29,7 +43,7 @@
     ssh.connect(hostname=admin_ip, port=ssh_creds["port"],
                 password=ssh_creds["password"], username=ssh_creds["username"])
 
-    command = "python /tmp/agent.py --clean=True --base_port=" \
+    command = "python /tmp/agent.py --clean=True --ext_ip=" + admin_ip + " --base_port=" \
               + str(base_port) + " --ports"
 
     for node in nodes:
@@ -40,10 +54,8 @@
     for line in stdout.readlines():
         print line
 
-    os.remove('/tmp/fuel_id_rsa')
 
-
-def run_agent(ip_addresses, roles, host, password="test37", port=22,
+def run_agent(ip_addresses, roles, host, tmp_name, password="test37", port=22,
               base_port=12345):
     ssh = paramiko.SSHClient()
     ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
@@ -51,10 +63,11 @@
     sftp = ssh.open_sftp()
     sftp.put(os.path.join(os.path.dirname(__file__), 'agent.py'),
              "/tmp/agent.py")
-    fuel_id_rsa_path = '/tmp/fuel_id_rsa'
+    fuel_id_rsa_path = tmp_name
     sftp.get('/root/.ssh/id_rsa', fuel_id_rsa_path)
-    os.chmod(fuel_id_rsa_path, 700)
-    command = "python /tmp/agent.py --base_port=" + str(base_port) + " --ports"
+    os.chmod(fuel_id_rsa_path, 0o700)
+    command = "python /tmp/agent.py --base_port=" + str(base_port) + " --ext_ip=" \
+              + host + " --ports"
 
     for address in ip_addresses:
         command += " " + address
@@ -72,46 +85,50 @@
         node_port_mapping[node] = port
 
     nodes = []
+    nodes_to_clean = []
 
     for i in range(len(ip_addresses)):
         ip = ip_addresses[i]
         role = roles[i]
         port = node_port_mapping[ip]
 
-        nodes.append(("ssh://root@" + ip + ":" + port +
-                      ":/tmp/fuel_id_rsa", role))
+        nodes_to_clean.append(("ssh://root@" + ip + ":" + port.rstrip('\n')
+                                + ":" + fuel_id_rsa_path, role))
+
+        nodes.append(("ssh://root@" + host + ":" + port.rstrip('\n')
+                      + ":" + fuel_id_rsa_path, role))
 
     ssh.close()
     print 'Files has been transfered successefully to Fuel node, ' \
           'agent has been launched'
     print nodes
 
-    return nodes
+    return nodes, nodes_to_clean
 
 
 def parse_command_line(argv):
     parser = argparse.ArgumentParser(
         description="Connect to fuel master and setup ssh agent")
-    parser.add_argument("--fuel-url", required=True)
-    parser.add_argument("--cluster-id", required=True)
-    parser.add_argument("--username", default="admin")
-    parser.add_argument("--tenantname", default="admin")
-    parser.add_argument("--password", default="admin")
+    parser.add_argument(
+        "--fuel_url", required=True)
+    parser.add_argument(
+        "--cluster_id", required=True)
+    parser.add_argument(
+        "--iface", default="eth1")
+    parser.add_argument(
+        "--creds", default="admin:admin:admin")
+
+
     return parser.parse_args(argv)
 
 
 def main(argv):
     args = parse_command_line(argv)
-    creds = {"username": args.username,
-             "tenant_name": args.tenantname,
-             "password": args.password}
 
-    nodes = discover_fuel_nodes(args.fuel_url, creds, args.cluster_id)
-    print "Ready", nodes
-    sys.stdin.readline()
+    nodes, to_clean = discover_fuel_nodes(args.fuel_url, args.creds, args.cluster_id)
     discover_fuel_nodes_clean(args.fuel_url, {"username": "root",
                                               "password": "test37",
-                                              "port": 22}, nodes)
+                                              "port": 22}, to_clean)
 
 
 if __name__ == "__main__":
