diff --git a/vdsm/config.py.in b/vdsm/config.py.in
index d27fcdb..e67c6f1 100644
--- a/vdsm/config.py.in
+++ b/vdsm/config.py.in
@@ -213,6 +213,10 @@ parameters = [
 
         ('process_pool_max_slots_per_domain', '10', None),
 
+        ('iscsi_transports', 'tcp',
+            'Comma seperated transports to connect with. '
+            'i.e. iser,tcp' ),
+
     ]),
 
     # Section: [addresses]
diff --git a/vdsm/storage/iscsi.py b/vdsm/storage/iscsi.py
index a8a1e4f..54d255a 100644
--- a/vdsm/storage/iscsi.py
+++ b/vdsm/storage/iscsi.py
@@ -138,7 +138,36 @@ def addIscsiNode(iface, target, credentials=None):
                 key = "node.session." + key
                 iscsiadm.node_update(iface.name, portalStr, targetName, key, value, hideValue=True)
 
-        iscsiadm.node_login(iface.name, portalStr, targetName)
+        # check transport to use
+        transports = config.get('irs', 'iscsi_transports').split(',')
+        if transports == "tcp":
+            # if we just want tcp keep it simple
+            iscsiadm.node_login(iface.name, portalStr, targetName)
+        else:
+            # get default header digest value so we can restore it later
+            hdr_dg = iscsiadm.node_get_conn_param(iface.name, portalStr, targetName, 'HeaderDigest')
+            for transport in transports:
+                last_e = None
+                if transport == 'iser':
+                    # iser does not support header digest
+                    node_set_conn_param(iface.name, portalStr, targetName,
+                        "HeaderDigest", "None")
+                else:
+                    # restore header digest
+                    node_set_conn_param(iface.name, portalStr, targetName,
+                        "HeaderDigest", hdr_dg)
+                # FIXME: patch iscsiadm to accept transport flag on login
+                iscsiadm.node_set_transport(iface.name, portalStr, targetName, transport.strip())
+                try:
+                    iscsiadm.node_login(iface.name, portalStr, targetName)
+                    break
+                except iscsiadm.IscsiNodeError as e:
+                    if e[0] == iscsiadm.ISCSI_ERR_SESS_EXISTS:
+                        raise
+                    last_e = e
+            # raise last exception if we tried all transports and failed
+            if last_e:
+                raise e
     except:
         removeIscsiNode(iface, target)
         raise
diff --git a/vdsm/storage/iscsiadm.py b/vdsm/storage/iscsiadm.py
index edce315..78c9e96 100644
--- a/vdsm/storage/iscsiadm.py
+++ b/vdsm/storage/iscsiadm.py
@@ -216,6 +216,33 @@ def node_disconnect(iface, portal, targetName):
 
     raise IscsiNodeError(rc, out, err)
 
+def node_set_transport(iface, portal, targetName, transport):
+    node_update(iface, portal, targetName, "iface.transport_name", transport)
+
+def node_set_conn_param(iface, portal, targetName, param, val):
+    node_update(iface, portal, targetName,
+        "node.conn[0].iscsi." + param, val)
+
+def node_get_conn_param(iface, portal, targetName, param):
+    rc, out, err = _runCmd(["-m", "node", "-T", targetName, "-I", iface, "-p",
+        portal, "-l"])
+
+    if rc == 0:
+        key = "node.conn[0].iscsi." + param + " = "
+        val = None
+        for line in out:
+            if line.startswith(key):
+                val = line.split('=')[1].strip()
+        return val
+
+    if not iface_exists(iface):
+        raise IscsiInterfaceDoesNotExistError(iface)
+
+    if rc == ISCSI_ERR_LOGIN_AUTH_FAILED:
+        raise IscsiAuthenticationError(rc, out, err)
+
+    raise IscsiNodeError(rc, out, err)
+
 def node_login(iface, portal, targetName):
     rc, out, err = _runCmd(["-m", "node", "-T", targetName, "-I", iface, "-p",
         portal, "-l"])
