--- a/docs/schemas/domaincommon.rng.orig	2016-01-04 17:00:06.332000000 -0800
+++ b/docs/schemas/domaincommon.rng	2016-01-07 18:53:02.889000000 -0800
@@ -1369,6 +1369,7 @@
             <value>ftp</value>
             <value>ftps</value>
             <value>tftp</value>
+            <value>oflame</value>
           </choice>
         </attribute>
         <optional>
--- a/src/storage/storage_driver.c.orig	2016-01-04 17:00:01.149000000 -0800
+++ b/src/storage/storage_driver.c	2016-01-07 18:53:02.890000000 -0800
@@ -1534,6 +1534,7 @@
             case VIR_STORAGE_POOL_RBD:
             case VIR_STORAGE_POOL_SHEEPDOG:
             case VIR_STORAGE_POOL_ZFS:
+            case VIR_STORAGE_POOL_OFLAME:
             case VIR_STORAGE_POOL_LAST:
                 if (VIR_STRDUP(stable_path, path) < 0) {
                      virStoragePoolObjUnlock(pool);
@@ -3345,6 +3346,7 @@
     case VIR_STORAGE_POOL_RBD:
     case VIR_STORAGE_POOL_SHEEPDOG:
     case VIR_STORAGE_POOL_GLUSTER:
+    case VIR_STORAGE_POOL_OFLAME:
     case VIR_STORAGE_POOL_LAST:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                        _("using '%s' pools for backing 'volume' disks "
--- a/tools/virsh-pool.c.orig	2015-06-25 07:00:33.000000000 -0700
+++ b/tools/virsh-pool.c	2016-01-07 18:53:02.895000000 -0800
@@ -1115,6 +1115,9 @@
             case VIR_STORAGE_POOL_ZFS:
                 flags |= VIR_CONNECT_LIST_STORAGE_POOLS_ZFS;
                 break;
+            case VIR_STORAGE_POOL_OFLAME:
+                flags |= VIR_CONNECT_LIST_STORAGE_POOLS_OFLAME;
+                break;
             case VIR_STORAGE_POOL_LAST:
                 break;
             }
--- a/src/util/virstoragefile.h.orig	2016-01-04 16:59:52.034000000 -0800
+++ b/src/util/virstoragefile.h	2016-01-07 18:53:02.895000000 -0800
@@ -130,6 +130,7 @@
     VIR_STORAGE_NET_PROTOCOL_FTP,
     VIR_STORAGE_NET_PROTOCOL_FTPS,
     VIR_STORAGE_NET_PROTOCOL_TFTP,
+    VIR_STORAGE_NET_PROTOCOL_OFLAME,
 
     VIR_STORAGE_NET_PROTOCOL_LAST
 } virStorageNetProtocol;
--- a/src/conf/storage_conf.h.orig	2015-06-25 07:00:33.000000000 -0700
+++ b/src/conf/storage_conf.h	2016-01-07 18:53:02.895000000 -0800
@@ -94,6 +94,7 @@
     VIR_STORAGE_POOL_SHEEPDOG, /* Sheepdog device */
     VIR_STORAGE_POOL_GLUSTER,  /* Gluster device */
     VIR_STORAGE_POOL_ZFS,      /* ZFS */
+    VIR_STORAGE_POOL_OFLAME,      /* ZFS */
 
     VIR_STORAGE_POOL_LAST,
 } virStoragePoolType;
--- a/src/qemu/qemu_driver.c.orig	2016-01-04 17:00:15.036000000 -0800
+++ b/src/qemu/qemu_driver.c	2016-01-07 18:53:02.900000000 -0800
@@ -13843,6 +13843,7 @@
         case VIR_STORAGE_NET_PROTOCOL_FTP:
         case VIR_STORAGE_NET_PROTOCOL_FTPS:
         case VIR_STORAGE_NET_PROTOCOL_TFTP:
+        case VIR_STORAGE_NET_PROTOCOL_OFLAME:
         case VIR_STORAGE_NET_PROTOCOL_LAST:
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("external inactive snapshots are not supported on "
@@ -13905,6 +13906,7 @@
         case VIR_STORAGE_NET_PROTOCOL_FTP:
         case VIR_STORAGE_NET_PROTOCOL_FTPS:
         case VIR_STORAGE_NET_PROTOCOL_TFTP:
+        case VIR_STORAGE_NET_PROTOCOL_OFLAME:
         case VIR_STORAGE_NET_PROTOCOL_LAST:
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("external active snapshots are not supported on "
@@ -14049,6 +14051,7 @@
         case VIR_STORAGE_NET_PROTOCOL_FTP:
         case VIR_STORAGE_NET_PROTOCOL_FTPS:
         case VIR_STORAGE_NET_PROTOCOL_TFTP:
+        case VIR_STORAGE_NET_PROTOCOL_OFLAME:
         case VIR_STORAGE_NET_PROTOCOL_LAST:
             virReportError(VIR_ERR_INTERNAL_ERROR,
                            _("internal inactive snapshots are not supported on "
--- a/include/libvirt/libvirt-storage.h.orig	2015-02-23 22:04:12.000000000 -0800
+++ b/include/libvirt/libvirt-storage.h	2016-01-07 19:27:37.983000000 -0800
@@ -211,6 +211,7 @@
     VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG      = 1 << 15,
     VIR_CONNECT_LIST_STORAGE_POOLS_GLUSTER       = 1 << 16,
     VIR_CONNECT_LIST_STORAGE_POOLS_ZFS           = 1 << 17,
+    VIR_CONNECT_LIST_STORAGE_POOLS_OFLAME        = 1 << 18,
 } virConnectListAllStoragePoolsFlags;
 
 int                     virConnectListAllStoragePools(virConnectPtr conn,
--- a/src/conf/storage_conf.c.orig	2015-06-30 23:09:47.000000000 -0700
+++ b/src/conf/storage_conf.c	2016-01-08 13:31:59.350000000 -0800
@@ -59,7 +59,7 @@
               "dir", "fs", "netfs",
               "logical", "disk", "iscsi",
               "scsi", "mpath", "rbd",
-              "sheepdog", "gluster", "zfs")
+              "sheepdog", "gluster", "zfs", "oflame")
 
 VIR_ENUM_IMPL(virStoragePoolFormatFileSystem,
               VIR_STORAGE_POOL_FS_LAST,
@@ -272,6 +272,19 @@
          .defaultFormat = VIR_STORAGE_FILE_RAW,
      },
     },
+    {.poolType = VIR_STORAGE_POOL_OFLAME,
+     .poolOptions = {
+         .flags = (VIR_STORAGE_POOL_SOURCE_HOST |
+                   VIR_STORAGE_POOL_SOURCE_NETWORK |
+                   VIR_STORAGE_POOL_SOURCE_NAME |
+                   VIR_STORAGE_POOL_SOURCE_DIR),
+     },
+     .volOptions = {
+         .defaultFormat = VIR_STORAGE_FILE_RAW,
+         .formatFromString = virStorageVolumeFormatFromString,
+         .formatToString = virStorageFileFormatTypeToString,
+     }
+    },
 };
 
 
@@ -1173,6 +1186,7 @@
      * files, so they don't have a target */
     if (def->type != VIR_STORAGE_POOL_RBD &&
         def->type != VIR_STORAGE_POOL_SHEEPDOG &&
+        def->type != VIR_STORAGE_POOL_OFLAME &&
         def->type != VIR_STORAGE_POOL_GLUSTER) {
         virBufferAddLit(buf, "<target>\n");
         virBufferAdjustIndent(buf, 2);
@@ -2572,6 +2586,13 @@
             /* Only one mpath pool is valid per host */
             matchpool = pool;
             break;
+        case VIR_STORAGE_POOL_OFLAME:
+            if (STREQ(pool->def->source.name, def->source.name) &&
+                STREQ_NULLABLE(pool->def->source.dir, def->source.dir) &&
+                virStoragePoolSourceMatchSingleHost(&pool->def->source,
+                                                    &def->source))
+                matchpool = pool;
+            break;
         case VIR_STORAGE_POOL_RBD:
         case VIR_STORAGE_POOL_LAST:
             break;
@@ -2655,7 +2676,9 @@
               (MATCH(VIR_CONNECT_LIST_STORAGE_POOLS_SHEEPDOG) &&
                (poolobj->def->type == VIR_STORAGE_POOL_SHEEPDOG)) ||
               (MATCH(VIR_CONNECT_LIST_STORAGE_POOLS_GLUSTER) &&
-               (poolobj->def->type == VIR_STORAGE_POOL_GLUSTER))))
+               (poolobj->def->type == VIR_STORAGE_POOL_GLUSTER)) ||
+              (MATCH(VIR_CONNECT_LIST_STORAGE_POOLS_OFLAME) &&
+               (poolobj->def->type == VIR_STORAGE_POOL_OFLAME))))
             return false;
     }
 
--- a/src/qemu/qemu_command.c.orig	2016-01-04 17:00:15.978000000 -0800
+++ b/src/qemu/qemu_command.c	2016-04-05 14:30:15.033000000 -0700
@@ -3074,6 +3074,16 @@
     return -1;
 }
 
+static int
+qemuParseOflameString(virDomainDiskDefPtr def)
+{
+    virURIPtr uri = NULL;
+
+    if (!(uri = virURIParse(def->src->path)))
+        return -1;
+
+    return qemuParseDriveURIString(def, uri, "oflame");
+}
 
 static int
 qemuNetworkDriveGetPort(int protocol,
@@ -3122,6 +3132,7 @@
         case VIR_STORAGE_NET_PROTOCOL_RBD:
         case VIR_STORAGE_NET_PROTOCOL_LAST:
         case VIR_STORAGE_NET_PROTOCOL_NONE:
+        case VIR_STORAGE_NET_PROTOCOL_OFLAME:
             /* not applicable */
             return -1;
     }
@@ -3335,6 +3346,67 @@
             ret = virBufferContentAndReset(&buf);
             break;
 
+        case VIR_STORAGE_NET_PROTOCOL_OFLAME:
+            if (src->nhosts != 1)
+                virReportError(VIR_ERR_INTERNAL_ERROR,
+                               _("protocol '%s' accepts more than one host, %ld, hostname %s"),
+                               virStorageNetProtocolTypeToString(src->protocol), src->nhosts, src->hosts->name);
+            if (VIR_ALLOC(uri) < 0)
+                goto cleanup;
+
+            if (src->hosts->transport == VIR_STORAGE_NET_HOST_TRANS_TCP) {
+                if (VIR_STRDUP(uri->scheme,
+                               virStorageNetProtocolTypeToString(src->protocol)) < 0)
+                    goto cleanup;
+            } else {
+                if (virAsprintf(&uri->scheme, "%s+%s",
+                                virStorageNetProtocolTypeToString(src->protocol),
+                                virStorageNetHostTransportTypeToString(src->hosts->transport)) < 0)
+                    goto cleanup;
+            }
+
+            if (src->path) {
+                if (src->volume) {
+                    if (virAsprintf(&uri->path, "/%s%s",
+                                    src->volume, src->path) < 0)
+                        goto cleanup;
+                } else {
+                    if (virAsprintf(&uri->path, "%s%s",
+                                    src->path[0] == '/' ? "" : "/",
+                                    src->path) < 0)
+                        goto cleanup;
+                }
+            }
+
+            if (src->hosts->socket &&
+                virAsprintf(&uri->query, "socket=%s", src->hosts->socket) < 0)
+                goto cleanup;
+
+            if (username) {
+                if (secret) {
+                    if (virAsprintf(&uri->user, "%s:%s", username, secret) < 0)
+                        goto cleanup;
+                } else {
+                    if (VIR_STRDUP(uri->user, username) < 0)
+                        goto cleanup;
+                }
+            }
+
+	    for (i = 0; i < src->nhosts; i++) {
+            	    if ((uri->port = qemuNetworkDriveGetPort(src->protocol, src->hosts[i].port)) < 0)
+                	goto cleanup;
+
+		    if (VIR_STRDUP(uri->server, src->hosts[i].name) < 0)
+			goto cleanup;
+
+		    ret = virURIFormat(uri);
+		    virBufferEscape(&buf, ',', ",", "%s", ret);
+		    virReportError(VIR_ERR_INTERNAL_ERROR,
+				_("qemuBuildOFlameString builturi '%s'"), ret);
+                }
+
+            ret = virBufferContentAndReset(&buf);
+            break;
 
         case VIR_STORAGE_NET_PROTOCOL_LAST:
         case VIR_STORAGE_NET_PROTOCOL_NONE:
@@ -11695,6 +11767,12 @@
                     }
 
                     VIR_FREE(p);
+                } else if (STRPREFIX(def->src->path, "oflame:")) {
+                    def->src->type = VIR_STORAGE_TYPE_NETWORK;
+                    def->src->protocol = VIR_STORAGE_NET_PROTOCOL_OFLAME;
+
+                    if (qemuParseOflameString(def) < 0)
+                        goto error;
                 } else if (STRPREFIX(def->src->path, "gluster:") ||
                            STRPREFIX(def->src->path, "gluster+")) {
                     def->src->type = VIR_STORAGE_TYPE_NETWORK;
@@ -13071,6 +13149,11 @@
                         goto error;
 
                     break;
+		case VIR_STORAGE_NET_PROTOCOL_OFLAME:
+		    if (qemuParseOflameString(disk) < 0)
+			goto error;
+
+		    break;
                 case VIR_STORAGE_NET_PROTOCOL_HTTP:
                 case VIR_STORAGE_NET_PROTOCOL_HTTPS:
                 case VIR_STORAGE_NET_PROTOCOL_FTP:
--- a/src/util/virstoragefile.c.orig	2016-01-04 16:59:52.032000000 -0800
+++ b/src/util/virstoragefile.c	2016-01-13 15:14:56.766000000 -0800
@@ -83,7 +83,8 @@
               "https",
               "ftp",
               "ftps",
-              "tftp")
+              "tftp",
+              "oflame")
 
 VIR_ENUM_IMPL(virStorageNetHostTransport, VIR_STORAGE_NET_HOST_TRANS_LAST,
               "tcp",
@@ -2449,7 +2450,6 @@
     return ret;
 }
 
-
 static int
 virStorageSourceParseBackingColon(virStorageSourcePtr src,
                                   const char *path)
@@ -2501,6 +2501,7 @@
     case VIR_STORAGE_NET_PROTOCOL_TFTP:
     case VIR_STORAGE_NET_PROTOCOL_ISCSI:
     case VIR_STORAGE_NET_PROTOCOL_GLUSTER:
+    case VIR_STORAGE_NET_PROTOCOL_OFLAME:
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("malformed backing store path for protocol %s"),
                        protocol);
