diff --git a/scripts/agent.py b/scripts/agent.py
new file mode 100644
index 0000000..56189f9
--- /dev/null
+++ b/scripts/agent.py
@@ -0,0 +1,66 @@
+import argparse
+import subprocess
+import sys
+
+
+def make_tunnels(ips, base_port=12345, delete=False):
+    node_port = {}
+
+    if delete is True:
+        mode = "-D"
+    else:
+        mode = "-A"
+
+    for ip in ips:
+        p = subprocess.Popen(["iptables -t nat " + mode + " PREROUTING " +
+                              "-p tcp -i eth1 --dport " + str(base_port) +
+                              " -j DNAT --to " + str(ip) + ":22"],
+                             stdin=subprocess.PIPE,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.STDOUT,
+                             shell=True)
+
+        out, err = p.communicate()
+
+        if not out is None:
+            print out
+
+        if not err is None:
+            print err
+
+        node_port[ip] = base_port
+        base_port += 1
+
+    return node_port
+
+
+def parse_command_line(argv):
+    parser = argparse.ArgumentParser(description=
+                                     "Connect to fuel master "
+                                     "and setup ssh agent")
+    parser.add_argument(
+        "--base_port", type=int, required=True)
+
+    # To do: fix clean to be False when string is False
+    parser.add_argument(
+        "--clean", type=bool, default=False)
+
+    parser.add_argument(
+        "--ports", type=str, nargs='+')
+
+    return parser.parse_args(argv)
+
+
+def main(argv):
+    arg_object = parse_command_line(argv)
+    mapping = make_tunnels(arg_object.ports,
+                           base_port=arg_object.base_port,
+                           delete=arg_object.clean)
+
+    if arg_object.clean is False:
+        for k in mapping:
+            print k + " " + str(mapping[k])
+
+
+if __name__ == "__main__":
+    main(sys.argv[1:])
diff --git a/scripts/connector.py b/scripts/connector.py
new file mode 100644
index 0000000..4d9d32f
--- /dev/null
+++ b/scripts/connector.py
@@ -0,0 +1,122 @@
+import argparse
+import sys
+import os
+import paramiko
+
+from urlparse import urlparse
+
+
+from keystone import KeystoneAuth
+
+
+def discover_fuel_nodes(fuel_url, creds, cluster_id):
+    admin_ip = urlparse(fuel_url).hostname
+    fuel = KeystoneAuth(fuel_url, creds, headers=None, echo=None,
+                        admin_node_ip=admin_ip)
+    nodes = fuel.do("get", path="/api/nodes?cluster_id=" + str(cluster_id))
+    ips = [node["ip"] for node in nodes]
+    roles = [node["roles"] for node in nodes]
+
+    host = urlparse(fuel_url).hostname
+
+    return run_agent(ips, roles, host)
+
+
+def discover_fuel_nodes_clean(fuel_url, ssh_creds, nodes, base_port=12345):
+    admin_ip = urlparse(fuel_url).hostname
+    ssh = paramiko.SSHClient()
+    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+    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=" \
+              + str(base_port) + " --ports"
+
+    for node in nodes:
+        ip = urlparse(node[0]).hostname
+        command += " " + ip
+
+    (stdin, stdout, stderr) = ssh.exec_command(command)
+    for line in stdout.readlines():
+        print line
+
+    os.remove('/tmp/fuel_id_rsa')
+
+
+def run_agent(ip_addresses, roles, host, password="test37", port=22,
+              base_port=12345):
+    ssh = paramiko.SSHClient()
+    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+    ssh.connect(hostname=host, port=port, password=password, username="root")
+    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'
+    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"
+
+    for address in ip_addresses:
+        command += " " + address
+
+    (stdin, stdout, stderr) = ssh.exec_command(command)
+    node_port_mapping = {}
+
+    for line in stdout.readlines():
+        results = line.split(' ')
+
+        if len(results) != 2:
+            continue
+
+        node, port = results
+        node_port_mapping[node] = port
+
+    nodes = []
+
+    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))
+
+    ssh.close()
+    print 'Files has been transfered successefully to Fuel node, ' \
+          'agent has been launched'
+    print nodes
+
+    return nodes
+
+
+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")
+
+    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)
+    discover_fuel_nodes_clean(args.fuel_url, {"username": "root",
+                                              "password": "test37",
+                                              "port": 22}, nodes)
+
+
+if __name__ == "__main__":
+    main(sys.argv[1:])
