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..b919361 100644
--- a/vdsm/storage/iscsi.py
+++ b/vdsm/storage/iscsi.py
@@ -33,6 +33,9 @@ import misc
 import devicemapper
 from threading import RLock
 
+# FIXME: after moving transport choose to higher level remove this import
+from config import config
+
 import iscsiadm
 
 IscsiPortal = namedtuple("IscsiPortal", "hostname, port")
@@ -69,15 +72,29 @@ def getDevIscsiInfo(dev):
 
 def getSessionInfo(sessionID):
     sessionName = "session%d" % sessionID
+    connectionName = "connection%d:0" % sessionID
     sessionDir = glob.glob("/sys/devices/platform/host*/%s/" % sessionName)
-    if len(sessionDir) == 0:
-        raise OSError(errno.ENOENT, "No such session")
+    if len(sessionDir) > 0:
+        sessionDir = sessionDir[0]
+        iscsi_session = os.path.join(sessionDir, "iscsi_session", sessionName)
+
+        if not os.path.exists(iscsi_session):
+            raise OSError(errno.ENOENT, "No such session")
+
+        conn_pattern = os.path.join(sessionDir, "connection*")
+        try:
+            connectiondir = glob.glob(conn_pattern)[0]
+        except IndexError:
+            raise OSError(errno.ENOENT, "No such session")
 
-    sessionDir = sessionDir[0]
+        connection = os.path.basename(connectiondir)
+        iscsi_connection = os.path.join(connectiondir, "iscsi_connection", connection)
 
-    iscsi_session = os.path.join(sessionDir, "iscsi_session", sessionName)
-    if not os.path.exists(iscsi_session):
-        raise OSError(errno.ENOENT, "No such session")
+    else:
+	iscsi_session = "/sys/class/iscsi_session/%s/" % sessionName
+	iscsi_connection = "/sys/class/iscsi_connection/%s/" % connectionName
+	if not os.path.isdir(iscsi_session) or not os.path.isdir(iscsi_connection):
+	    raise OSError(errno.ENOENT, "No such session")
 
     targetname = os.path.join(iscsi_session, "targetname")
     iface = os.path.join(iscsi_session, "ifacename")
@@ -86,14 +103,6 @@ def getSessionInfo(sessionID):
     user = os.path.join(iscsi_session, "username")
     passwd = os.path.join(iscsi_session, "password")
 
-    conn_pattern = os.path.join(sessionDir, "connection*")
-    try:
-        connectiondir = glob.glob(conn_pattern)[0]
-    except IndexError:
-        raise OSError(errno.ENOENT, "No such session")
-
-    connection = os.path.basename(connectiondir)
-    iscsi_connection = os.path.join(connectiondir, "iscsi_connection", connection)
     paddr = os.path.join(iscsi_connection, "persistent_address")
     pport = os.path.join(iscsi_connection, "persistent_port")
 
@@ -138,7 +147,34 @@ 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)
+        # FIXME: get transport from higher level instead of doing fallback
+        transports = config.get('irs', 'iscsi_transports').split(',')
+        if len(transports) == 1 and transports[0] == "tcp":
+            # if we just want tcp keep it simple
+            iscsiadm.node_login(iface.name, portalStr, targetName)
+        else:
+            iser_node = False
+            for transport in transports:
+                last_e = None
+                if transport.strip() == 'iser':
+                    iscsiadm.node_new('iser', portalStr, targetName)
+                    ifname = 'iser'
+                    iser_node = True
+                else:
+                    if iser_node:
+                        iscsiadm.node_new(iface.name, portalStr, targetName)
+                        iser_node = False
+                    ifname = iface.name
+                try:
+                    iscsiadm.node_login(ifname, 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
