diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go
index 415468e..f0ac60d 100644
--- a/lxd/api_1.0.go
+++ b/lxd/api_1.0.go
@@ -161,6 +161,11 @@ func api10Put(d *Daemon, r *http.Request) Response {
 			if err != nil {
 				return InternalError(err)
 			}
+		} else if key == "storage.lvm_fstype" {
+			err := storageLVMSetFsTypeConfig(d, value.(string))
+			if err != nil {
+				return InternalError(err)
+			}
 		} else if key == "storage.zfs_pool_name" {
 			err := storageZFSSetPoolNameConfig(d, value.(string))
 			if err != nil {
diff --git a/lxd/daemon.go b/lxd/daemon.go
index 598b6fa..bc6bf5b 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -1076,6 +1076,8 @@ func (d *Daemon) ConfigKeyIsValid(key string) bool {
 		return true
 	case "storage.lvm_thinpool_name":
 		return true
+	case "storage.lvm_fstype":
+		return true
 	case "storage.zfs_pool_name":
 		return true
 	case "images.remote_cache_expiry":
diff --git a/lxd/storage_lvm.go b/lxd/storage_lvm.go
index c9c1a5a..3d79feb 100644
--- a/lxd/storage_lvm.go
+++ b/lxd/storage_lvm.go
@@ -160,6 +160,15 @@ func storageLVMSetVolumeGroupNameConfig(d *Daemon, vgname string) error {
 	return nil
 }
 
+func storageLVMSetFsTypeConfig(d *Daemon, fstype string) error {
+	err := d.ConfigValueSet("storage.lvm_fstype", fstype)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func containerNameToLVName(containerName string) string {
 	lvName := strings.Replace(containerName, "-", "--", -1)
 	return strings.Replace(lvName, shared.SnapshotDelimiter, "-", -1)
@@ -291,7 +300,25 @@ func (s *storageLvm) ContainerCreateFromImage(
 		return err
 	}
 
-	err = s.tryMount(lvpath, destPath, "ext4", 0, "discard")
+	var fstype string
+	fstype, err = s.d.ConfigValueGet("storage.lvm_fstype")
+	if err != nil {
+		return fmt.Errorf("Error checking server config, err=%v", err)
+	}
+
+	// Generate a new xfs's UUID
+	if fstype == "xfs" {
+		output, err := exec.Command(
+			"xfs_admin",
+			"-U", "generate",
+			lvpath).CombinedOutput()
+		if err != nil {
+			s.ContainerDelete(container)
+			return fmt.Errorf("Error mounting snapshot LV: %v\noutput:'%s'", err, string(output))
+		}
+	}
+
+	err = s.tryMount(lvpath, destPath, fstype, 0, "discard")
 	if err != nil {
 		s.ContainerDelete(container)
 		return fmt.Errorf("Error mounting snapshot LV: %v", err)
@@ -385,7 +412,13 @@ func (s *storageLvm) ContainerCopy(container container, sourceContainer containe
 func (s *storageLvm) ContainerStart(container container) error {
 	lvName := containerNameToLVName(container.Name())
 	lvpath := fmt.Sprintf("/dev/%s/%s", s.vgName, lvName)
-	err := s.tryMount(lvpath, container.Path(), "ext4", 0, "discard")
+
+	fstype, err := s.d.ConfigValueGet("storage.lvm_fstype")
+	if err != nil {
+		return fmt.Errorf("Error checking server config, err=%v", err)
+	}
+
+	err = s.tryMount(lvpath, container.Path(), fstype, 0, "discard")
 	if err != nil {
 		return fmt.Errorf(
 			"Error mounting snapshot LV path='%s': %v",
@@ -666,7 +699,25 @@ func (s *storageLvm) ContainerSnapshotStart(container container) error {
 		}
 	}
 
-	err = s.tryMount(lvpath, container.Path(), "ext4", 0, "discard")
+	var fstype string
+	fstype, err = s.d.ConfigValueGet("storage.lvm_fstype")
+	if err != nil {
+		return fmt.Errorf("Error checking server config, err=%v", err)
+	}
+
+	// Generate a new xfs's UUID
+	if fstype == "xfs" {
+		output, err := exec.Command(
+			"xfs_admin",
+			"-U", "generate",
+			lvpath).CombinedOutput()
+		if err != nil {
+			s.ContainerDelete(container)
+			return fmt.Errorf("Error mounting snapshot LV: %v\noutput:'%s'", err, string(output))
+		}
+	}
+
+	err = s.tryMount(lvpath, container.Path(), fstype, 0, "discard")
 	if err != nil {
 		return fmt.Errorf(
 			"Error mounting snapshot LV path='%s': %v",
@@ -720,7 +771,25 @@ func (s *storageLvm) ImageCreate(fingerprint string) error {
 		}
 	}()
 
-	err = s.tryMount(lvpath, tempLVMountPoint, "ext4", 0, "discard")
+	var fstype string
+	fstype, err = s.d.ConfigValueGet("storage.lvm_fstype")
+	if err != nil {
+		return fmt.Errorf("Error checking server config, err=%v", err)
+	}
+
+	// Generate a new xfs's UUID
+	if fstype == "xfs" {
+		output, err := exec.Command(
+			"xfs_admin",
+			"-U", "generate",
+			lvpath).CombinedOutput()
+		if err != nil {
+			s.ContainerDelete(container)
+			return fmt.Errorf("Error mounting snapshot LV: %v\noutput:'%s'", err, string(output))
+		}
+	}
+
+	err = s.tryMount(lvpath, tempLVMountPoint, fstype, 0, "discard")
 	if err != nil {
 		shared.Logf("Error mounting image LV for untarring: %v", err)
 		return fmt.Errorf("Error mounting image LV: %v", err)
@@ -837,13 +906,23 @@ func (s *storageLvm) createThinLV(lvname string) (string, error) {
 
 	lvpath := fmt.Sprintf("/dev/%s/%s", s.vgName, lvname)
 
-	output, err = s.tryExec(
-		"mkfs.ext4",
-		"-E", "nodiscard,lazy_itable_init=0,lazy_journal_init=0",
-		lvpath)
+	fstype, err := s.d.ConfigValueGet("storage.lvm_fstype")
+
+	switch fstype {
+	case "xfs":
+		output, err = s.tryExec(
+			"mkfs.xfs",
+			lvpath)
+	default:
+		// default = ext4
+		output, err = s.tryExec(
+			"mkfs.ext4",
+			"-E", "nodiscard,lazy_itable_init=0,lazy_journal_init=0",
+			lvpath)
+	}
 
 	if err != nil {
-		s.log.Error("mkfs.ext4", log.Ctx{"output": string(output)})
+		s.log.Error("mkfs", log.Ctx{"output": string(output)})
 		return "", fmt.Errorf("Error making filesystem on image LV: %v", err)
 	}
 
