diff --git a/ext_scripts/ext_rbd.py b/ext_scripts/ext_rbd.py
index 906184e199abb8ca86c2afca4e9fd4f9064ee916..b74ae1ba9a1ec0bfd8e76d12a28a4ad62151243e 100755
--- a/ext_scripts/ext_rbd.py
+++ b/ext_scripts/ext_rbd.py
@@ -42,6 +42,7 @@ The following variables are optional:
  - EXTP_IMAGE_FEATURES: The enabled features of the new RBD volume
  - EXTP_STRIPE_UNIT Size (in bytes) of a block of data
  - EXTP_STRIPE_COUNT Number of consecutive objects in a stripe
+ - EXTP_USERSPACE_ONLY Number of consecutive objects in a stripe
 
 The code branches to the correct function, depending on the name (sys.argv[0])
 of the executed script (attach, create, etc).
@@ -212,6 +213,13 @@ def read_env():
                               flags=re.IGNORECASE) is not None
         extp_params.pop("reuse_data")
 
+    userspace_only = False
+    if extp_params.get("userspace_only"):
+        userspace_only = re.match(
+            TRUE_PATTERN, os.getenv("EXTP_USERSPACE_ONLY"),
+            flags=re.IGNORECASE) is not None
+        extp_params.pop("userspace_only")
+
     cephx_keys = ['cephx_id', 'cephx_keyring', 'cephx_keyfile']
     cephx = {}
     for k in cephx_keys:
@@ -225,6 +233,7 @@ def read_env():
            "snapshot_name": os.getenv("VOL_SNAPSHOT_NAME"),
            "cephx": cephx,
            "reuse_data": reuse_data,
+           "userspace_only": userspace_only
            }
     env.update(extp_params)
     return env
@@ -282,19 +291,24 @@ def attach(env):
 
     """
 
+    userspace_only = env.get("userspace_only")
     name = env.get("name")
     pool = env.get("rbd_pool")
-    device = RBD.get_device(name)
-    cephx = env.get("cephx")
-    if device is None:
-        device = RBD.map(name, pool=pool, cephx=cephx)
-        sys.stderr.write("Mapped image '%s' to '%s' \n"
-                         % (RBD.format_name(name, pool=pool), device))
+    if userspace_only:
+        device = ""
     else:
-        sys.stderr.write("Image '%s' already mapped to device '%s' \n"
-                         % (RBD.format_name(name, pool=pool), device))
+        device = RBD.get_device(name)
+        cephx = env.get("cephx")
+        if device is None:
+            device = RBD.map(name, pool=pool, cephx=cephx)
+            sys.stderr.write("Mapped image '%s' to '%s' \n"
+                             % (RBD.format_name(name, pool=pool), device))
+        else:
+            sys.stderr.write("Image '%s' already mapped to device '%s' \n"
+                             % (RBD.format_name(name, pool=pool), device))
 
     sys.stdout.write("%s" % device)
+    sys.stdout.write("\nkvm:rbd:%s" % RBD.format_name(name, pool=pool))
     return 0
 
 
@@ -306,14 +320,17 @@ def detach(env):
     If mapping doesn't exist at all, it does nothing.
 
     """
-    name = env.get("name")
-    pool = env.get("rbd_pool")
-    cephx = env.get("cephx")
-    device = RBD.get_device(name, pool=pool)
-    if device:
-        RBD.unmap(device, cephx=cephx)
+    userspace_only = env.get("userspace_only")
+    if not userspace_only:
+        name = env.get("name")
+        pool = env.get("rbd_pool")
+        cephx = env.get("cephx")
+        device = RBD.get_device(name, pool=pool)
+        if device:
+            RBD.unmap(device, cephx=cephx)
+
+        sys.stderr.write("Unmapped %s\n" % RBD.format_name(name, pool=pool))
 
-    sys.stderr.write("Unmapped %s\n" % RBD.format_name(name, pool=pool))
     return 0