diff --git a/multi-node-aio/README.rst b/multi-node-aio/README.rst
index 7b19ff2f..1b309030 100644
--- a/multi-node-aio/README.rst
+++ b/multi-node-aio/README.rst
@@ -263,9 +263,9 @@ backing store) for the VM's, then set the following option before executing
 
 If you wish to save the current file-based images in order to implement a
 thin-provisioned set of VM's which can be saved and re-used, then use the
-``save-vms.yml`` playbook. This will stop the VM's and save the files to
-``/var/lib/libvirt/images/*-base.img``. Re-executing the ``deploy-vms.yml``
-playbook afterwards will rebuild the VMs from those images.
+``save-vms.yml`` playbook. This will stop the VM's and rename the files to
+``*-base.img``. Re-executing the ``deploy-vms.yml`` playbook afterwards will
+rebuild the VMs from those images.
 
 .. code-block:: bash
 
diff --git a/multi-node-aio/playbooks/deploy-vms.yml b/multi-node-aio/playbooks/deploy-vms.yml
index 6dbc44bf..c7a2256f 100644
--- a/multi-node-aio/playbooks/deploy-vms.yml
+++ b/multi-node-aio/playbooks/deploy-vms.yml
@@ -31,6 +31,11 @@
       tags:
         - always
 
+    - name: Get info about the virt storage pools
+      virt_pool:
+        command: info
+      register: _virt_pools
+
     - name: Stop running VMs
       virt:
         name: "{{ hostvars[item]['server_hostname'] }}"
@@ -53,7 +58,7 @@
 
     - name: Delete VM Disk Image
       file:
-        path: "/var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img"
+        path: "{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img"
         state: absent
       when:
         - hostvars[item]['server_vm'] | default(false) | bool
@@ -84,7 +89,7 @@
       block:
         - name: Find existing base image files
           find:
-            paths: /var/lib/libvirt/images
+            paths: "{{ _virt_pools.pools.default.path | default('/data') }}"
             patterns: '*-base.img'
           register: _base_images
 
@@ -99,9 +104,9 @@
             qemu-img create
             -f qcow2
             {% if vm_use_snapshot | bool %}
-            -b /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}-base.img
+            -b {{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}-base.img
             {% endif %}
-            /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img
+            {{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img
             {{ default_vm_storage }}m
           when:
             - hostvars[item]['server_vm'] | default(false) | bool
diff --git a/multi-node-aio/playbooks/kvm/kvm-vm.xml.j2 b/multi-node-aio/playbooks/kvm/kvm-vm.xml.j2
index 5b0e50a9..20c29091 100644
--- a/multi-node-aio/playbooks/kvm/kvm-vm.xml.j2
+++ b/multi-node-aio/playbooks/kvm/kvm-vm.xml.j2
@@ -41,7 +41,7 @@
 {% elif default_vm_disk_mode == "file" %}
     <disk type='file' device='disk'>
       <driver name='qemu' type='qcow2' cache='none' io='native'/>
-      <source file='/var/lib/libvirt/images/{{ hostvars[item]["server_hostname"] }}.img'/>
+      <source file='{{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]["server_hostname"] }}.img'/>
 {% endif %}
       <target dev='vda' bus='virtio'/>
       <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
diff --git a/multi-node-aio/playbooks/save-vms.yml b/multi-node-aio/playbooks/save-vms.yml
index 61f063f1..7ef0782d 100644
--- a/multi-node-aio/playbooks/save-vms.yml
+++ b/multi-node-aio/playbooks/save-vms.yml
@@ -31,6 +31,11 @@
       tags:
         - always
 
+    - name: Get info about the virt storage pools
+      virt_pool:
+        command: info
+      register: _virt_pools
+
     - name: Stop running VMs
       command: "virsh destroy {{ hostvars[item]['server_hostname'] }}"
       failed_when: false
@@ -41,8 +46,8 @@
     - name: Save VM Disk Image
       command: >-
         mv
-        /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}.img
-        /var/lib/libvirt/images/{{ hostvars[item]['server_hostname'] }}-base.img
+        {{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}.img
+        {{ _virt_pools.pools.default.path | default('/data') }}/{{ hostvars[item]['server_hostname'] }}-base.img
       when:
         - hostvars[item]['server_vm'] | default(false) | bool
       with_items: "{{ groups['pxe_servers'] }}"
diff --git a/multi-node-aio/playbooks/setup-host.yml b/multi-node-aio/playbooks/setup-host.yml
index 08b2cb4b..6d563139 100644
--- a/multi-node-aio/playbooks/setup-host.yml
+++ b/multi-node-aio/playbooks/setup-host.yml
@@ -242,77 +242,153 @@
       with_dict: "{{ mnaio_host_networks }}"
       when: "item.value.iface not in vm_networks.list_nets"
 
-    - name: Locate data volume
-      command: "vgdisplay vg01"
-      failed_when: false
+    - name: Locate the largest writable data disk if mnaio_data_disk is not set
+      shell: >
+        lsblk -brndo NAME,TYPE,FSTYPE,RO,SIZE | awk '/d[b-z]+ disk +0/{ if ($4>m){m=$4; d=$1}}; END{print d}'
+      register: lsblk
+      changed_when: false
       when:
-        - default_vm_disk_mode == "lvm"
-      register: data_volume
+        - mnaio_data_disk is undefined
 
-    - name: Setup the data volume (LVM)
+    - name: Get info about existing virt storage pools
+      virt_pool:
+        command: info
+      register: _virt_pools
+
+    - name: If an existing virt pool does not match default_vm_disk_mode, remove it
       when:
-        - default_vm_disk_mode == "lvm"
-        - data_volume.rc != 0
+        - _virt_pools.pools.default is defined
+        - (default_vm_disk_mode == "file" and _virt_pools.pools.default.format is defined) or
+          (default_vm_disk_mode == "lvm" and _virt_pools.pools.default.format is not defined)
       block:
-        - name: Locate data disk
-          shell: >
-            lsblk -brndo NAME,TYPE,FSTYPE,RO,SIZE | awk '/d[b-z]+ disk +0/{ if ($4>m){m=$4; d=$1}}; END{print d}'
-          register: lsblk
+        - name: Dismount the mount point if default_vm_disk_mode is 'lvm'
+          mount:
+            path: /data
+            state: unmounted
           when:
-            - mnaio_data_disk is undefined
+            - default_vm_disk_mode == "lvm"
 
-        - name: Create data disk label
-          command: "parted --script /dev/{{ mnaio_data_disk | default(lsblk.stdout) }} mklabel gpt"
+        - name: Stop the pool
+          virt_pool:
+            command: destroy
+            name: default
 
-        - name: Create data disk partition
-          command: "parted --align optimal --script /dev/{{ mnaio_data_disk | default(lsblk.stdout) }} mkpart data1 ext4 0% 100%"
+        - name: Delete the pool, destroying its contents
+          virt_pool:
+            command: delete
+            name: default
 
-        - name: Create data volume group
+        - name: Undefine the pool
+          virt_pool:
+            command: undefine
+            name: default
+
+        - name: Remove the mount point if default_vm_disk_mode is 'lvm'
+          mount:
+            path: /data
+            state: absent
+          when:
+            - default_vm_disk_mode == "lvm"
+
+        - name: Reload systemd to remove generated unit files for mount
+          systemd:
+            daemon_reload: yes
+          when:
+            - default_vm_disk_mode == "lvm"
+
+        - name: Remove the volume group if default_vm_disk_mode is 'file'
+          lvg:
+            vg: vg01
+            state: absent
+          register: _remove_vg
+          when:
+            - default_vm_disk_mode == "file"
+
+        - name: Remove the existing disk partition
+          parted:
+            device: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}"
+            number: 1
+            state: absent
+
+    - name: Setup the data disk partition
+      parted:
+        device: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}"
+        label: gpt
+        number: 1
+        name: data1
+        state: present
+      register: _add_partition
+
+    - name: Prepare the data disk for 'lvm' default_vm_disk_mode
+      when:
+        - default_vm_disk_mode == "lvm"
+      block:
+        - name: Create the volume group
           lvg:
             vg: vg01
             pvs: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
 
-    - name: Locate virt data volume
-      virt_pool:
-        name: "vg01"
-        command: info
-      failed_when: false
+        - name: Define the default virt storage pool
+          virt_pool:
+            name: default
+            state: present
+            xml: |
+              <pool type='logical'>
+                <name>default</name>
+                <source>
+                  <name>vg01</name>
+                  <format type='lvm2'/>
+                </source>
+                <target>
+                  <path>/dev/vg01</path>
+                </target>
+              </pool>
+
+    - name: Prepare the data disk for 'file' default_vm_disk_mode
       when:
-        - default_vm_disk_mode == "lvm"
-      register: virt_data_volume
-
-    - name: Create /etc/libvirt/storage directory
-      file:
-        path: "/etc/libvirt/storage/"
-        state: "directory"
-
-    - name: Create virt data volume
+        - default_vm_disk_mode == "file"
       block:
-        - name: Create virt pool
-          virt_pool:
-            command: create
-            name: vg01
+        - name: Prepare the data disk file system
+          filesystem:
+            fstype: ext4
+            dev: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
+            force: yes
+          when:
+            - _add_partition is changed
 
-        - name: Get virt pool xml
-          virt_pool:
-            command: get_xml
-            name: vg01
-          register: virt_pool_xml
+        - name: Mount the data disk
+          mount:
+            src: "/dev/{{ mnaio_data_disk | default(lsblk.stdout) }}1"
+            path: /data
+            state: mounted
+            fstype: ext4
 
-        - name: Write data volume xml
-          copy:
-            content: "{{ virt_pool_xml.get_xml }}"
-            dest: "/etc/libvirt/storage/vg01.xml"
-
-        - name: Define virt data volume
+        - name: Define the default virt storage pool
           virt_pool:
-            command: define
-            name: vg01
-            xml: "/etc/libvirt/storage/vg01.xml"
-            autostart: true
-      when:
-        - default_vm_disk_mode == "lvm"
-        - virt_data_volume.pools is not defined
+            name: default
+            state: present
+            xml: |
+              <pool type='dir'>
+                <name>default</name>
+                <target>
+                  <path>/data</path>
+                  <permissions>
+                    <mode>0755</mode>
+                    <owner>0</owner>
+                    <group>0</group>
+                  </permissions>
+                </target>
+              </pool>
+
+    - name: Set default virt storage pool to active
+      virt_pool:
+        name: default
+        state: active
+
+    - name: Set default virt storage pool to autostart
+      virt_pool:
+        name: default
+        autostart: yes
 
     - name: Load virtio kernel modules
       shell: |