diff --git a/test/Makefile b/test/Makefile
index 37330cf8..6777f4af 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -1,7 +1,10 @@
all: test
-test: test_snapshot
+test: test_snapshot test_ovf
test_snapshot: run_snapshot_tests.pl
./run_snapshot_tests.pl
./test_get_replicatable_volumes.pl
+
+test_ovf: run_ovf_tests.pl
+ ./run_ovf_tests.pl
diff --git a/test/ovf_manifests/Win10-Liz-disk1.vmdk b/test/ovf_manifests/Win10-Liz-disk1.vmdk
new file mode 100644
index 00000000..662354a3
Binary files /dev/null and b/test/ovf_manifests/Win10-Liz-disk1.vmdk differ
diff --git a/test/ovf_manifests/Win10-Liz.ovf b/test/ovf_manifests/Win10-Liz.ovf
new file mode 100755
index 00000000..46642c04
--- /dev/null
+++ b/test/ovf_manifests/Win10-Liz.ovf
@@ -0,0 +1,142 @@
+
+
+
+
+
+
+
+ Virtual disk information
+
+
+
+ The list of logical networks
+
+ The bridged network
+
+
+
+ A virtual machine
+ Win10-Liz
+
+ The kind of installed guest operating system
+
+
+ Virtual hardware requirements
+
+ Virtual Hardware Family
+ 0
+ Win10-Liz
+ vmx-11
+
+ -
+ hertz * 10^6
+ Number of Virtual CPUs
+ 4 virtual CPU(s)
+ 1
+ 3
+ 4
+
+ -
+ byte * 2^20
+ Memory Size
+ 6144MB of memory
+ 2
+ 4
+ 6144
+
+ -
+ 0
+ SATA Controller
+ sataController0
+ 3
+ vmware.sata.ahci
+ 20
+
+ -
+ 0
+ USB Controller (XHCI)
+ usb3
+ 4
+ vmware.usb.xhci
+ 23
+
+ -
+ 0
+ USB Controller (EHCI)
+ usb
+ 5
+ vmware.usb.ehci
+ 23
+
+
+ -
+ 0
+ SCSI Controller
+ scsiController0
+ 6
+ lsilogicsas
+ 6
+
+ -
+ true
+ serial0
+ 7
+ 21
+
+
+ -
+ 0
+ disk0
+ ovf:/disk/vmdisk1
+ 8
+ 6
+ 17
+
+ -
+ 2
+ true
+ bridged
+ E1000e ethernet adapter on "bridged"
+ ethernet0
+ 9
+ E1000e
+ 10
+
+
+ -
+ false
+ sound
+ 10
+ vmware.soundcard.hdaudio
+ 1
+
+ -
+ false
+ video
+ 11
+ 24
+
+
+ -
+ false
+ vmci
+ 12
+ vmware.vmci
+ 1
+
+ -
+ 1
+ false
+ cdrom0
+ 13
+ 3
+ 15
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/ovf_manifests/Win_2008_R2_two-disks.ovf b/test/ovf_manifests/Win_2008_R2_two-disks.ovf
new file mode 100755
index 00000000..a563aabb
--- /dev/null
+++ b/test/ovf_manifests/Win_2008_R2_two-disks.ovf
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+ Virtual disk information
+
+
+
+
+ The list of logical networks
+
+ The bridged network
+
+
+
+ A virtual machine
+ Win_2008-R2x64
+
+ The kind of installed guest operating system
+
+
+ Virtual hardware requirements
+
+ Virtual Hardware Family
+ 0
+ Win_2008-R2x64
+ vmx-11
+
+ -
+ hertz * 10^6
+ Number of Virtual CPUs
+ 1 virtual CPU(s)
+ 1
+ 3
+ 1
+
+ -
+ byte * 2^20
+ Memory Size
+ 2048MB of memory
+ 2
+ 4
+ 2048
+
+ -
+ 0
+ SATA Controller
+ sataController0
+ 3
+ vmware.sata.ahci
+ 20
+
+ -
+ 0
+ USB Controller (EHCI)
+ usb
+ 4
+ vmware.usb.ehci
+ 23
+
+
+ -
+ 0
+ SCSI Controller
+ scsiController0
+ 5
+ lsilogicsas
+ 6
+
+ -
+ true
+ serial0
+ 6
+ 21
+
+
+ -
+ 0
+ disk0
+ ovf:/disk/vmdisk1
+ 7
+ 5
+ 17
+
+ -
+ 1
+ disk1
+ ovf:/disk/vmdisk2
+ 8
+ 5
+ 17
+
+ -
+ 2
+ true
+ bridged
+ E1000 ethernet adapter on "bridged"
+ ethernet0
+ 9
+ E1000
+ 10
+
+
+ -
+ false
+ sound
+ 10
+ vmware.soundcard.hdaudio
+ 1
+
+ -
+ false
+ video
+ 11
+ 24
+
+
+ -
+ false
+ vmci
+ 12
+ vmware.vmci
+ 1
+
+ -
+ 1
+ false
+ cdrom0
+ 13
+ 3
+ 15
+
+
+
+
+
+
+
+
+
+
diff --git a/test/ovf_manifests/disk1.vmdk b/test/ovf_manifests/disk1.vmdk
new file mode 100644
index 00000000..86606023
Binary files /dev/null and b/test/ovf_manifests/disk1.vmdk differ
diff --git a/test/ovf_manifests/disk2.vmdk b/test/ovf_manifests/disk2.vmdk
new file mode 100644
index 00000000..c4634513
Binary files /dev/null and b/test/ovf_manifests/disk2.vmdk differ
diff --git a/test/run_ovf_tests.pl b/test/run_ovf_tests.pl
new file mode 100755
index 00000000..b9e48256
--- /dev/null
+++ b/test/run_ovf_tests.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+use lib qw(..); # prepend .. to @INC so we use the local version of PVE packages
+
+use FindBin '$Bin';
+use PVE::QemuServer::OVF;
+use Test::More;
+
+use Data::Dumper;
+
+my $test_manifests = join ('/', $Bin, 'ovf_manifests');
+
+my $win2008 = PVE::QemuServer::OVF::parse_ovf("$test_manifests/Win_2008_R2_two-disks.ovf");
+my $win10 = PVE::QemuServer::OVF::parse_ovf("$test_manifests/Win10-Liz.ovf");
+
+print "testing disks\n";
+
+is($win2008->{disks}->[0]->{disk_address}, 'scsi0', 'multidisk vm has the correct first disk controller');
+is($win2008->{disks}->[0]->{backing_file}, "$test_manifests/disk1.vmdk", 'multidisk vm has the correct first disk backing device');
+is($win2008->{disks}->[0]->{virtual_size}, 2048, 'multidisk vm has the correct first disk size');
+
+is($win2008->{disks}->[1]->{disk_address}, 'scsi1', 'multidisk vm has the correct second disk controller');
+is($win2008->{disks}->[1]->{backing_file}, "$test_manifests/disk2.vmdk", 'multidisk vm has the correct second disk backing device');
+is($win2008->{disks}->[1]->{virtual_size}, 2048, 'multidisk vm has the correct second disk size');
+
+is($win10->{disks}->[0]->{disk_address}, 'scsi0', 'single disk vm has the correct disk controller');
+is($win10->{disks}->[0]->{backing_file}, "$test_manifests/Win10-Liz-disk1.vmdk", 'single disk vm has the correct disk backing device');
+is($win10->{disks}->[0]->{virtual_size}, 2048, 'single disk vm has the correct size');
+
+print "\ntesting vm.conf extraction\n";
+
+is($win2008->{qm}->{name}, 'Win2008-R2x64', 'win2008 VM name is correct');
+is($win2008->{qm}->{memory}, '2048', 'win2008 VM memory is correct');
+is($win2008->{qm}->{cores}, '1', 'win2008 VM cores are correct');
+
+is($win10->{qm}->{name}, 'Win10-Liz', 'win10 VM name is correct');
+is($win10->{qm}->{memory}, '6144', 'win10 VM memory is correct');
+is($win10->{qm}->{cores}, '4', 'win10 VM cores are correct');
+
+done_testing();