diff --git a/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch b/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch
new file mode 100644
index 0000000..2250e1c
--- /dev/null
+++ b/SOURCES/lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch
@@ -0,0 +1,1137 @@
+ WHATS_NEW                 |   4 +
+ configure                 |   6 +-
+ configure.ac              |   8 +-
+ include/configure.h.in    |   2 +-
+ man/Makefile.in           |   2 +-
+ man/lvm_import_vdo.8_main |  92 ++++++++++++
+ man/vdoimport.8_main      |  92 ------------
+ scripts/Makefile.in       |   2 +-
+ scripts/lvm_import_vdo.sh | 376 ++++++++++++++++++++++++++++++++++++++++++++++
+ scripts/vdoimport.sh      | 376 ----------------------------------------------
+ test/Makefile.in          |   2 +-
+ test/shell/vdo-convert.sh |  12 +-
+ 12 files changed, 489 insertions(+), 485 deletions(-)
+ create mode 100644 man/lvm_import_vdo.8_main
+ delete mode 100644 man/vdoimport.8_main
+ create mode 100755 scripts/lvm_import_vdo.sh
+ delete mode 100755 scripts/vdoimport.sh
+
+diff --git a/WHATS_NEW b/WHATS_NEW
+index 5556789..3637e31 100644
+--- a/WHATS_NEW
++++ b/WHATS_NEW
+@@ -1,3 +1,7 @@
++Version 2.03.14 - 
++==================================
++  Rename vdoimport to lvm_import_vdo.
++
+ Version 2.03.13 - 
+ ===============================
+   Support --poolmetadataspare with vgsplit and vgmerge.
+diff --git a/configure b/configure
+index 661702d..897a810 100755
+--- a/configure
++++ b/configure
+@@ -12379,8 +12379,8 @@ $as_echo "$FSADM" >&6; }
+ 
+ 
+ ################################################################################
+-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install vdoimport" >&5
+-$as_echo_n "checking whether to install vdoimport... " >&6; }
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install lvm_import_vdo" >&5
++$as_echo_n "checking whether to install lvm_import_vdo... " >&6; }
+ # Check whether --enable-vdoimport was given.
+ if test "${enable_vdoimport+set}" = set; then :
+   enableval=$enable_vdoimport; VDOIMPORT=$enableval
+@@ -13875,7 +13875,7 @@ cat >>confdefs.h <<_ACEOF
+ _ACEOF
+ 
+ 
+-VDOIMPORT_PATH="$SBINDIR/vdoimport"
++VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo"
+ 
+ cat >>confdefs.h <<_ACEOF
+ #define VDOIMPORT_PATH "$VDOIMPORT_PATH"
+diff --git a/configure.ac b/configure.ac
+index 5a8b486..f769a63 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1295,8 +1295,8 @@ AC_MSG_RESULT($FSADM)
+ 
+ 
+ ################################################################################
+-dnl -- Enable vdoimport
+-AC_MSG_CHECKING(whether to install vdoimport)
++dnl -- Enable lvm_import_vdo
++AC_MSG_CHECKING(whether to install lvm_import_vdo)
+ AC_ARG_ENABLE(vdoimport, AC_HELP_STRING([--disable-vdoimport], [disable vdoimport]),
+ 	      VDOIMPORT=$enableval)
+ AC_MSG_RESULT($VDOIMPORT)
+@@ -1656,8 +1656,8 @@ USRSBINDIR="$(eval echo $(eval echo $usrsbindir))"
+ FSADM_PATH="$SBINDIR/fsadm"
+ AC_DEFINE_UNQUOTED(FSADM_PATH, ["$FSADM_PATH"], [Path to fsadm binary.])
+ 
+-VDOIMPORT_PATH="$SBINDIR/vdoimport"
+-AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to vdoimport binary.])
++VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo"
++AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to lvm_import_vdo binary.])
+ 
+ ################################################################################
+ dnl -- dmeventd pidfile and executable path
+diff --git a/include/configure.h.in b/include/configure.h.in
+index 6df8d89..028ae48 100644
+--- a/include/configure.h.in
++++ b/include/configure.h.in
+@@ -684,7 +684,7 @@
+ /* Enable a valgrind aware build of pool */
+ #undef VALGRIND_POOL
+ 
+-/* Path to vdoimport binary. */
++/* Path to lvm_import_vdo binary. */
+ #undef VDOIMPORT_PATH
+ 
+ /* The path to 'vdoformat', if available. */
+diff --git a/man/Makefile.in b/man/Makefile.in
+index d60a92c..45ebf54 100644
+--- a/man/Makefile.in
++++ b/man/Makefile.in
+@@ -23,7 +23,7 @@ else
+ endif
+ 
+ FSADMMAN = fsadm.8
+-VDOIMPORTMAN = vdoimport.8
++VDOIMPORTMAN = lvm_import_vdo.8
+ BLKDEACTIVATEMAN = blkdeactivate.8
+ DMEVENTDMAN = dmeventd.8
+ DMFILEMAPDMAN = dmfilemapd.8
+diff --git a/man/lvm_import_vdo.8_main b/man/lvm_import_vdo.8_main
+new file mode 100644
+index 0000000..ee817a0
+--- /dev/null
++++ b/man/lvm_import_vdo.8_main
+@@ -0,0 +1,92 @@
++.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
++.
++.SH "NAME"
++.
++lvm_import_vdo \(em utility to import VDO volumes into a new volume group.
++.
++.SH SYNOPSIS
++.
++.PD 0
++.ad l
++.TP 10
++.B lvm_import_vdo
++.RI [ options ]
++.IR device
++.
++.PD
++.
++.SH DESCRIPTION
++.
++lvm_import_vdo utility imports VDO volumes created and managed by
++.BR vdo (8)
++manager into
++.BR lvm2 (8)
++managed VDO LV. This is realized by moving VDO superblock by 2MiB
++and creating lvm2 metadata at the front of this device. The operation is not reversible,
++thus after conversion to lvm2 the access to VDO data is only possible with
++.BR lvm2 (8)
++commands,
++.BR vdo (8)
++manager no longer control such volume.
++.
++.SH OPTIONS
++.
++.TP
++.BR -f | --force
++Bypass some sanity checks.
++.
++.TP
++.BR -h | --help
++Display the help text.
++.
++.TP
++.BR -n | --name
++Specifies the name of converted VDO LV. When the name is not specified,
++some automatic name is selected. In case the converted VDO volume is
++already using LV a backend device, the name of this LV is used for VDO LV.
++In this case also the of volume group must stay same.
++.
++.TP
++.BR -v | --verbose
++Be more verbose.
++.
++.TP
++.BR -y | --yes
++Answer "yes" at any prompts.
++.
++.TP
++.BR --dry-run
++Print commands without running them.
++.
++.
++.SH DIAGNOSTICS
++.
++On successful completion, the status code is 0.
++A status code of 1 is used for failure.
++.
++.SH EXAMPLES
++.
++Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1.
++.P
++#
++.B lvm_import_vdo --name VG1/LV1 /dev/mapper/vdo-volume
++.
++.SH ENVIRONMENT VARIABLES
++.
++.TP
++.B TMPDIR
++The temporary directory name for mount points. Defaults to "\fI/tmp\fP".
++.TP
++.B DM_DEV_DIR
++The device directory name.
++Defaults to "\fI/dev\fP" and must be an absolute path.
++.
++.SH SEE ALSO
++.
++.nh
++.ad l
++.BR lvm (8),
++.BR lvm.conf (5),
++.P
++.BR vdo (8),
++.BR vdo2lvm (8),
+diff --git a/man/vdoimport.8_main b/man/vdoimport.8_main
+deleted file mode 100644
+index 1f32909..0000000
+--- a/man/vdoimport.8_main
++++ /dev/null
+@@ -1,92 +0,0 @@
+-.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
+-.
+-.SH "NAME"
+-.
+-vdoimport \(em utility to import VDO volumes into a new volume group.
+-.
+-.SH SYNOPSIS
+-.
+-.PD 0
+-.ad l
+-.TP 10
+-.B vdoimport
+-.RI [ options ]
+-.IR device
+-.
+-.PD
+-.
+-.SH DESCRIPTION
+-.
+-vdoimport utility imports VDO volumes created and managed by
+-.BR vdo (8)
+-manager into
+-.BR lvm2 (8)
+-managed VDO LV. This is realized by moving VDO superblock by 2MiB
+-and creating lvm2 metadata at the front of this device. The operation is not reversible,
+-thus after conversion to lvm2 the access to VDO data is only possible with
+-.BR lvm2 (8)
+-commands,
+-.BR vdo (8)
+-manager no longer control such volume.
+-.
+-.SH OPTIONS
+-.
+-.TP
+-.BR -f | --force
+-Bypass some sanity checks.
+-.
+-.TP
+-.BR -h | --help
+-Display the help text.
+-.
+-.TP
+-.BR -n | --name
+-Specifies the name of converted VDO LV. When the name is not specified,
+-some automatic name is selected. In case the converted VDO volume is
+-already using LV a backend device, the name of this LV is used for VDO LV.
+-In this case also the of volume group must stay same.
+-.
+-.TP
+-.BR -v | --verbose
+-Be more verbose.
+-.
+-.TP
+-.BR -y | --yes
+-Answer "yes" at any prompts.
+-.
+-.TP
+-.BR --dry-run
+-Print commands without running them.
+-.
+-.
+-.SH DIAGNOSTICS
+-.
+-On successful completion, the status code is 0.
+-A status code of 1 is used for failure.
+-.
+-.SH EXAMPLES
+-.
+-Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1.
+-.P
+-#
+-.B vdoimport --name VG1/LV1 /dev/mapper/vdo-volume
+-.
+-.SH ENVIRONMENT VARIABLES
+-.
+-.TP
+-.B TMPDIR
+-The temporary directory name for mount points. Defaults to "\fI/tmp\fP".
+-.TP
+-.B DM_DEV_DIR
+-The device directory name.
+-Defaults to "\fI/dev\fP" and must be an absolute path.
+-.
+-.SH SEE ALSO
+-.
+-.nh
+-.ad l
+-.BR lvm (8),
+-.BR lvm.conf (5),
+-.P
+-.BR vdo (8),
+-.BR vdo2lvm (8),
+diff --git a/scripts/Makefile.in b/scripts/Makefile.in
+index 1fe88ca..f16c37d 100644
+--- a/scripts/Makefile.in
++++ b/scripts/Makefile.in
+@@ -32,7 +32,7 @@ ifeq ("@FSADM@", "yes")
+ endif
+ 
+ ifeq ("@VDOIMPORT@", "yes")
+-	LVM_SCRIPTS += vdoimport.sh
++	LVM_SCRIPTS += lvm_import_vdo.sh
+ endif
+ 
+ ifeq ("@BLKDEACTIVATE@", "yes")
+diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh
+new file mode 100755
+index 0000000..35140a0
+--- /dev/null
++++ b/scripts/lvm_import_vdo.sh
+@@ -0,0 +1,376 @@
++#!/bin/bash
++#
++# Copyright (C) 2021 Red Hat, Inc. All rights reserved.
++#
++# This file is part of LVM2.
++#
++# This copyrighted material is made available to anyone wishing to use,
++# modify, copy, or redistribute it subject to the terms and conditions
++# of the GNU General Public License v.2.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program; if not, write to the Free Software Foundation,
++# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
++#
++# Author: Zdenek Kabelac <zkabelac at redhat.com>
++#
++# Script for converting VDO volumes to lvm2 VDO LVs
++#
++# Needed utilities:
++#  lvm, dmsetup,
++#  vdo, vdo2lvm,
++#  grep, awk, sed, blockdev, readlink, mkdir
++#
++# Conversion is using  'vdo convert' support from VDO manager to move
++# existing VDO header by 2M which makes space to place in PV header
++# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG.
++#
++
++set -euE -o pipefail
++
++TOOL=lvm_import_vdo
++
++_SAVEPATH=$PATH
++PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH"
++
++# user may override lvm location by setting LVM_BINARY
++LVM=${LVM_BINARY:-lvm}
++VDO=${VDO_BINARY:-vdo}
++VDOCONF=${VDOCONF:-}
++BLOCKDEV="blockdev"
++READLINK="readlink"
++READLINK_E="-e"
++MKDIR="mkdir"
++
++TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$"
++DM_DEV_DIR="${DM_DEV_DIR:-/dev}"
++
++DRY=0
++VERB=""
++FORCE=""
++YES=""
++
++# default name for converted VG and its VDO LV
++NAME="vdovg/vdolvol"
++
++# help message
++tool_usage() {
++	echo "${TOOL}: Utility to convert VDO volume to VDO LV."
++	echo
++	echo "	${TOOL} [options] <vdo_device_path>"
++	echo
++	echo "	Options:"
++	echo "	  -f | --force	      Bypass sanity checks"
++	echo "	  -h | --help	      Show this help message"
++	echo "	  -n | --name	      Specifies VG/LV name for converted VDO volume"
++	echo "	  -v | --verbose      Be verbose"
++	echo "	  -y | --yes	      Answer \"yes\" at any prompts"
++	echo "	       --dry-run      Print commands without running them"
++
++	exit
++}
++
++verbose() {
++	test -z "$VERB" || echo "$TOOL:" "$@"
++}
++
++# Support multi-line error messages
++error() {
++	for i in "$@" ;  do
++		echo "$TOOL: $i" >&2
++	done
++	cleanup 1
++}
++
++dry() {
++	if [ "$DRY" -ne 0 ]; then
++		verbose "Dry execution" "$@"
++		return 0
++	fi
++	verbose "Executing" "$@"
++	"$@"
++}
++
++cleanup() {
++	trap '' 2
++
++	rm -rf "$TEMPDIR"
++	# error exit status for break
++	exit "${1:-1}"
++}
++
++get_enabled_value_() {
++	case "$1" in
++	enabled) echo "1" ;;
++	*) echo "0" ;;
++	esac
++}
++
++get_kb_size_with_unit_() {
++	case "$1" in
++	*[kK]) echo $(( ${1%[kK]} )) ;;
++	*[mM]) echo $(( ${1%[mM]} * 1024 )) ;;
++	*[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;;
++	*[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;;
++	*[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;;
++	esac
++}
++
++get_mb_size_with_unit_() {
++	case "$1" in
++	*[mM]) echo $(( ${1%[mM]} )) ;;
++	*[gG]) echo $(( ${1%[gG]} * 1024 )) ;;
++	*[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;;
++	*[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;;
++	esac
++}
++
++# Figure out largest possible extent size usable for VG
++# $1   physical size
++# $2   logical size
++get_largest_extent_size_() {
++	local max=4
++	local i
++	local d
++
++	for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do
++		d=$(( $1 / i ))
++		test $(( d * i )) -eq "$1" || break
++		d=$(( $2 / i ))
++		test $(( d * i )) -eq "$2" || break
++		max=$i
++	done
++	echo "$max"
++}
++
++# detect LV on the given device
++# dereference device name if it is symbolic link
++detect_lv_() {
++	local DEVICE=$1
++	local MAJOR
++	local MINOR
++	local SYSVOLUME
++	local MAJORMINOR
++
++	DEVICE=${1/#"${DM_DEV_DIR}/"/}
++	DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE")
++	test -n "$DEVICE" || error "Cannot get readlink \"$1\"."
++	RDEVICE=$DEVICE
++	case "$RDEVICE" in
++	  # hardcoded /dev  since udev does not create these entries elsewhere
++	  /dev/dm-[0-9]*)
++		read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME"
++		read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"."
++		MAJOR=${MAJORMINOR%%:*}
++		MINOR=${MAJORMINOR##*:}
++		;;
++	  *)
++		STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE")
++		test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"."
++		eval "$STAT"
++		;;
++	esac
++
++	eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')"
++}
++
++# parse yaml config files into 'prefix_yaml_part_names=("value")' strings
++parse_yaml_() {
++	local yaml_file=$1
++	local prefix=$2
++	local s
++	local w
++	local fs
++
++	s='[[:space:]]*'
++	w='[a-zA-Z0-9_.-]*'
++	fs="$(echo @|tr @ '\034')"
++
++	(
++	    sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
++		-e 's/\$/\\\$/g' \
++		-e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
++		-e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
++		-e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
++
++	    awk -F"$fs" '{
++		indent = length($1)/2;
++		if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
++		vname[indent] = $2;
++		for (i in vname) {if (i > indent) {delete vname[i]}}
++		    if (length($3) > 0) {
++			vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
++			printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3);
++		    }
++		}' |
++
++	    sed -e 's/_=/+=/g' |
++
++	    awk 'BEGIN {
++		    FS="=";
++		    OFS="="
++		}
++		/(-|\.).*=/ {
++		    gsub("-|\\.", "_", $1)
++		}
++		{ print }'
++	) < "$yaml_file"
++}
++
++# convert existing VDO volume into lvm2 volume
++convert2lvm_() {
++	local DEVICE=$1
++	local VGNAME=${NAME%/*}
++	local LVNAME=${NAME#*/}
++	local VDONAME
++	local TRVDONAME
++	local EXTENTSZ
++	local IS_LV=1
++
++	DM_UUID=""
++	detect_lv_ "$DEVICE"
++	case "$DM_UUID" in
++		LVM-*)	eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")"
++			if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ]  ; then
++				VGNAME=$DM_VG_NAME
++			elif test "$VGNAME" != "$DM_VG_NAME" ; then
++				error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"."
++			fi
++			;;
++		*) IS_LV=0
++			# Check $VGNANE does not already exists
++			"$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"."
++			;;
++	esac
++
++	verbose "Checked whether device $1 is already LV ($IS_LV)."
++
++	"$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR."
++
++	verbose "Getting YAML VDO configuration."
++	"$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml"
++
++	VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml")
++	TRVDONAME=$(echo "$VDONAME" | tr '-' '_')
++
++	# When VDO volume is 'active', check it's not mounted/being used
++	eval "$(dmsetup info -c -o open  "$VDONAME" --noheadings --nameprefixes || true)"
++	test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!"
++
++	#parse_yaml_ "$TEMPDIR/vdoconf.yml" _
++	eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")"
++
++	vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize")
++	vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize")
++
++	verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB."
++	verbose "With logical volume of size $vdo_logicalSize KiB."
++
++	PARAMS=$(cat <<EOF
++allocation {
++	vdo_use_compression = $(get_enabled_value_ "$vdo_compression")
++	vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication")
++	vdo_use_metadata_hints=1
++	vdo_minimum_io_size = $vdo_logicalBlockSize
++	vdo_block_map_cache_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
++	vdo_block_map_period = $vdo_blockMapPeriod
++	vdo_check_point_frequency = $vdo_indexCfreq
++	vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse")
++	vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}")
++	vdo_slab_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
++	vdo_ack_threads = $vdo_ackThreads
++	vdo_bio_threads = $vdo_bioThreads
++	vdo_bio_rotation = $vdo_bioRotationInterval
++	vdo_cpu_threads = $vdo_cpuThreads
++	vdo_hash_zone_threads = $vdo_hashZoneThreads
++	vdo_logical_threads = $vdo_logicalThreads
++	vdo_physical_threads = $vdo_physicalThreads
++	vdo_write_policy = $vdo_writePolicy
++	vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 ))
++	vdo_pool_header_size = 0
++}
++EOF
++)
++	verbose "VDO conversion paramaters: $PARAMS"
++
++	verbose "Stopping VDO volume."
++	dry "$VDO" stop $VDOCONF --name "$VDONAME"
++
++	if [ "$IS_LV" = "0" ]; then
++		verbose "Moving VDO header by 2MiB."
++		dry "$VDO" convert $VDOCONF --force --name "$VDONAME"
++
++		dry "$LVM" pvcreate $YES --dataalignment 2M "$DEVICE" || {
++			error "Creation of PV on \"$DEVICE\" failed, while VDO header has been already moved!"
++		}
++
++		# Obtain free space in this new PV
++		# after 'vdo convert/vdo2lvm' call there is +2M free space at the front of the device
++		case "$DRY" in
++		0) pvfree=$("$LVM" pvs -o devsize --units b --nosuffix --noheadings "$DEVICE") ;;
++		*) pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") ;;
++		esac
++
++		pvfree=$(( pvfree / 1024 - 2048 ))	# to KiB
++	else
++		pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$VGNAME/$LVNAME")
++		pvfree=$(( pvfree / 1024 ))		# to KiB
++	fi
++
++	# select largest possible extent size that can exactly express both sizes
++	EXTENTSZ=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize")
++
++	if [ "$IS_LV" = "0" ]; then
++		verbose "Creating VG \"${NAME%/*}\" with extent size $EXTENTSZ KiB."
++		dry "$LVM" vgcreate $YES $VERB -s "${EXTENTSZ}k" "$VGNAME" "$DEVICE" || {
++			error "Creation of VG \"$VGNAME\" failed, while VDO header has been already moved!"
++		}
++
++		verbose "Creating VDO pool data LV from all extents in volume group $VGNAME."
++		dry "$LVM" lvcreate -Zn -Wn $YES $VERB -l100%VG -n "${LVNAME}_vpool" "$VGNAME"
++	else
++		# validate existing  VG extent_size can express virtual VDO size
++		vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME" || true)
++		vg_extent_size=$(( vg_extent_size / 1024 ))
++
++		test "$vg_extent_size" -le "$EXTENTSZ" || {
++			error "Please vgchange extent_size to at most $EXTENTSZ KiB or extend and align virtual size on $vg_extent_size KiB."
++		}
++		verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV."
++		dry "$LVM" lvrename $YES $VERB "$VGNAME/$LVNAME" "$VGNAME/${LVNAME}_vpool" || {
++			error "Rename of LV \"$VGNAME/$LVNAME\" failed, while VDO header has been already moved!"
++		}
++	fi
++
++	verbose "Converting to VDO pool."
++	dry "$LVM" lvconvert $YES $VERB $FORCE --config "$PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool"
++
++	rm -fr "$TEMPDIR"
++}
++
++#############################
++# start point of this script
++# - parsing parameters
++#############################
++trap "cleanup 2" 2
++
++test "$#" -eq 0 && tool_usage
++
++while [ "$#" -ne 0 ]
++do
++	 case "$1" in
++	  "") ;;
++	  "-f"|"--force"  ) FORCE="-f" ;;
++	  "-h"|"--help"   ) tool_usage ;;
++	  "-n"|"--name"   ) shift; NAME=$1 ;;
++	  "-v"|"--verbose") VERB="-v" ;;
++	  "-y"|"--yes"    ) YES="-y" ;;
++	  "--dry-run"     ) DRY="1" ;;
++	  "-*") error "Wrong argument \"$1\". (see: $TOOL --help)" ;;
++	  *) DEVICENAME=$1 ;;  # device name does not start with '-'
++	esac
++	shift
++done
++
++# do conversion
++convert2lvm_ "$DEVICENAME"
+diff --git a/scripts/vdoimport.sh b/scripts/vdoimport.sh
+deleted file mode 100755
+index ef96591..0000000
+--- a/scripts/vdoimport.sh
++++ /dev/null
+@@ -1,376 +0,0 @@
+-#!/bin/bash
+-#
+-# Copyright (C) 2021 Red Hat, Inc. All rights reserved.
+-#
+-# This file is part of LVM2.
+-#
+-# This copyrighted material is made available to anyone wishing to use,
+-# modify, copy, or redistribute it subject to the terms and conditions
+-# of the GNU General Public License v.2.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program; if not, write to the Free Software Foundation,
+-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+-#
+-# Author: Zdenek Kabelac <zkabelac at redhat.com>
+-#
+-# Script for converting VDO volumes to lvm2 VDO LVs
+-#
+-# Needed utilities:
+-#  lvm, dmsetup,
+-#  vdo, vdo2lvm,
+-#  grep, awk, sed, blockdev, readlink, mkdir
+-#
+-# Conversion is using  'vdo convert' support from VDO manager to move
+-# existing VDO header by 2M which makes space to place in PV header
+-# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG.
+-#
+-
+-set -euE -o pipefail
+-
+-TOOL=vdoimport
+-
+-_SAVEPATH=$PATH
+-PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH"
+-
+-# user may override lvm location by setting LVM_BINARY
+-LVM=${LVM_BINARY:-lvm}
+-VDO=${VDO_BINARY:-vdo}
+-VDOCONF=${VDOCONF:-}
+-BLOCKDEV="blockdev"
+-READLINK="readlink"
+-READLINK_E="-e"
+-MKDIR="mkdir"
+-
+-TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$"
+-DM_DEV_DIR="${DM_DEV_DIR:-/dev}"
+-
+-DRY=0
+-VERB=""
+-FORCE=""
+-YES=""
+-
+-# default name for converted VG and its VDO LV
+-NAME="vdovg/vdolvol"
+-
+-# help message
+-tool_usage() {
+-	echo "${TOOL}: Utility to convert VDO volume to VDO LV."
+-	echo
+-	echo "	${TOOL} [options] <vdo_device_path>"
+-	echo
+-	echo "	Options:"
+-	echo "	  -f | --force	      Bypass sanity checks"
+-	echo "	  -h | --help	      Show this help message"
+-	echo "	  -n | --name	      Specifies VG/LV name for converted VDO volume"
+-	echo "	  -v | --verbose      Be verbose"
+-	echo "	  -y | --yes	      Answer \"yes\" at any prompts"
+-	echo "	       --dry-run      Print commands without running them"
+-
+-	exit
+-}
+-
+-verbose() {
+-	test -z "$VERB" || echo "$TOOL:" "$@"
+-}
+-
+-# Support multi-line error messages
+-error() {
+-	for i in "$@" ;  do
+-		echo "$TOOL: $i" >&2
+-	done
+-	cleanup 1
+-}
+-
+-dry() {
+-	if [ "$DRY" -ne 0 ]; then
+-		verbose "Dry execution" "$@"
+-		return 0
+-	fi
+-	verbose "Executing" "$@"
+-	"$@"
+-}
+-
+-cleanup() {
+-	trap '' 2
+-
+-	rm -rf "$TEMPDIR"
+-	# error exit status for break
+-	exit "${1:-1}"
+-}
+-
+-get_enabled_value_() {
+-	case "$1" in
+-	enabled) echo "1" ;;
+-	*) echo "0" ;;
+-	esac
+-}
+-
+-get_kb_size_with_unit_() {
+-	case "$1" in
+-	*[kK]) echo $(( ${1%[kK]} )) ;;
+-	*[mM]) echo $(( ${1%[mM]} * 1024 )) ;;
+-	*[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;;
+-	*[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;;
+-	*[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;;
+-	esac
+-}
+-
+-get_mb_size_with_unit_() {
+-	case "$1" in
+-	*[mM]) echo $(( ${1%[mM]} )) ;;
+-	*[gG]) echo $(( ${1%[gG]} * 1024 )) ;;
+-	*[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;;
+-	*[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;;
+-	esac
+-}
+-
+-# Figure out largest possible extent size usable for VG
+-# $1   physical size
+-# $2   logical size
+-get_largest_extent_size_() {
+-	local max=4
+-	local i
+-	local d
+-
+-	for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do
+-		d=$(( $1 / i ))
+-		test $(( d * i )) -eq "$1" || break
+-		d=$(( $2 / i ))
+-		test $(( d * i )) -eq "$2" || break
+-		max=$i
+-	done
+-	echo "$max"
+-}
+-
+-# detect LV on the given device
+-# dereference device name if it is symbolic link
+-detect_lv_() {
+-	local DEVICE=$1
+-	local MAJOR
+-	local MINOR
+-	local SYSVOLUME
+-	local MAJORMINOR
+-
+-	DEVICE=${1/#"${DM_DEV_DIR}/"/}
+-	DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE")
+-	test -n "$DEVICE" || error "Cannot get readlink \"$1\"."
+-	RDEVICE=$DEVICE
+-	case "$RDEVICE" in
+-	  # hardcoded /dev  since udev does not create these entries elsewhere
+-	  /dev/dm-[0-9]*)
+-		read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME"
+-		read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"."
+-		MAJOR=${MAJORMINOR%%:*}
+-		MINOR=${MAJORMINOR##*:}
+-		;;
+-	  *)
+-		STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE")
+-		test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"."
+-		eval "$STAT"
+-		;;
+-	esac
+-
+-	eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')"
+-}
+-
+-# parse yaml config files into 'prefix_yaml_part_names=("value")' strings
+-parse_yaml_() {
+-	local yaml_file=$1
+-	local prefix=$2
+-	local s
+-	local w
+-	local fs
+-
+-	s='[[:space:]]*'
+-	w='[a-zA-Z0-9_.-]*'
+-	fs="$(echo @|tr @ '\034')"
+-
+-	(
+-	    sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
+-		-e 's/\$/\\\$/g' \
+-		-e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
+-		-e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
+-		-e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
+-
+-	    awk -F"$fs" '{
+-		indent = length($1)/2;
+-		if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
+-		vname[indent] = $2;
+-		for (i in vname) {if (i > indent) {delete vname[i]}}
+-		    if (length($3) > 0) {
+-			vn=""; for (i=0; i<indent; i++) {vn=(vn)(vname[i])("_")}
+-			printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3);
+-		    }
+-		}' |
+-
+-	    sed -e 's/_=/+=/g' |
+-
+-	    awk 'BEGIN {
+-		    FS="=";
+-		    OFS="="
+-		}
+-		/(-|\.).*=/ {
+-		    gsub("-|\\.", "_", $1)
+-		}
+-		{ print }'
+-	) < "$yaml_file"
+-}
+-
+-# convert existing VDO volume into lvm2 volume
+-convert2lvm_() {
+-	local DEVICE=$1
+-	local VGNAME=${NAME%/*}
+-	local LVNAME=${NAME#*/}
+-	local VDONAME
+-	local TRVDONAME
+-	local EXTENTSZ
+-	local IS_LV=1
+-
+-	DM_UUID=""
+-	detect_lv_ "$DEVICE"
+-	case "$DM_UUID" in
+-		LVM-*)	eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")"
+-			if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ]  ; then
+-				VGNAME=$DM_VG_NAME
+-			elif test "$VGNAME" != "$DM_VG_NAME" ; then
+-				error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"."
+-			fi
+-			;;
+-		*) IS_LV=0
+-			# Check $VGNANE does not already exists
+-			"$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"."
+-			;;
+-	esac
+-
+-	verbose "Checked whether device $1 is already LV ($IS_LV)."
+-
+-	"$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR."
+-
+-	verbose "Getting YAML VDO configuration."
+-	"$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml"
+-
+-	VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml")
+-	TRVDONAME=$(echo "$VDONAME" | tr '-' '_')
+-
+-	# When VDO volume is 'active', check it's not mounted/being used
+-	eval "$(dmsetup info -c -o open  "$VDONAME" --noheadings --nameprefixes || true)"
+-	test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!"
+-
+-	#parse_yaml_ "$TEMPDIR/vdoconf.yml" _
+-	eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")"
+-
+-	vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize")
+-	vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize")
+-
+-	verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB."
+-	verbose "With logical volume of size $vdo_logicalSize KiB."
+-
+-	PARAMS=$(cat <<EOF
+-allocation {
+-	vdo_use_compression = $(get_enabled_value_ "$vdo_compression")
+-	vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication")
+-	vdo_use_metadata_hints=1
+-	vdo_minimum_io_size = $vdo_logicalBlockSize
+-	vdo_block_map_cache_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
+-	vdo_block_map_period = $vdo_blockMapPeriod
+-	vdo_check_point_frequency = $vdo_indexCfreq
+-	vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse")
+-	vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}")
+-	vdo_slab_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
+-	vdo_ack_threads = $vdo_ackThreads
+-	vdo_bio_threads = $vdo_bioThreads
+-	vdo_bio_rotation = $vdo_bioRotationInterval
+-	vdo_cpu_threads = $vdo_cpuThreads
+-	vdo_hash_zone_threads = $vdo_hashZoneThreads
+-	vdo_logical_threads = $vdo_logicalThreads
+-	vdo_physical_threads = $vdo_physicalThreads
+-	vdo_write_policy = $vdo_writePolicy
+-	vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 ))
+-	vdo_pool_header_size = 0
+-}
+-EOF
+-)
+-	verbose "VDO conversion paramaters: $PARAMS"
+-
+-	verbose "Stopping VDO volume."
+-	dry "$VDO" stop $VDOCONF --name "$VDONAME"
+-
+-	if [ "$IS_LV" = "0" ]; then
+-		verbose "Moving VDO header by 2MiB."
+-		dry "$VDO" convert $VDOCONF --force --name "$VDONAME"
+-
+-		dry "$LVM" pvcreate $YES --dataalignment 2M "$DEVICE" || {
+-			error "Creation of PV on \"$DEVICE\" failed, while VDO header has been already moved!"
+-		}
+-
+-		# Obtain free space in this new PV
+-		# after 'vdo convert/vdo2lvm' call there is +2M free space at the front of the device
+-		case "$DRY" in
+-		0) pvfree=$("$LVM" pvs -o devsize --units b --nosuffix --noheadings "$DEVICE") ;;
+-		*) pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") ;;
+-		esac
+-
+-		pvfree=$(( pvfree / 1024 - 2048 ))	# to KiB
+-	else
+-		pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$VGNAME/$LVNAME")
+-		pvfree=$(( pvfree / 1024 ))		# to KiB
+-	fi
+-
+-	# select largest possible extent size that can exactly express both sizes
+-	EXTENTSZ=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize")
+-
+-	if [ "$IS_LV" = "0" ]; then
+-		verbose "Creating VG \"${NAME%/*}\" with extent size $EXTENTSZ KiB."
+-		dry "$LVM" vgcreate $YES $VERB -s "${EXTENTSZ}k" "$VGNAME" "$DEVICE" || {
+-			error "Creation of VG \"$VGNAME\" failed, while VDO header has been already moved!"
+-		}
+-
+-		verbose "Creating VDO pool data LV from all extents in volume group $VGNAME."
+-		dry "$LVM" lvcreate -Zn -Wn $YES $VERB -l100%VG -n "${LVNAME}_vpool" "$VGNAME"
+-	else
+-		# validate existing  VG extent_size can express virtual VDO size
+-		vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME" || true)
+-		vg_extent_size=$(( vg_extent_size / 1024 ))
+-
+-		test "$vg_extent_size" -le "$EXTENTSZ" || {
+-			error "Please vgchange extent_size to at most $EXTENTSZ KiB or extend and align virtual size on $vg_extent_size KiB."
+-		}
+-		verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV."
+-		dry "$LVM" lvrename $YES $VERB "$VGNAME/$LVNAME" "$VGNAME/${LVNAME}_vpool" || {
+-			error "Rename of LV \"$VGNAME/$LVNAME\" failed, while VDO header has been already moved!"
+-		}
+-	fi
+-
+-	verbose "Converting to VDO pool."
+-	dry "$LVM" lvconvert $YES $VERB $FORCE --config "$PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool"
+-
+-	rm -fr "$TEMPDIR"
+-}
+-
+-#############################
+-# start point of this script
+-# - parsing parameters
+-#############################
+-trap "cleanup 2" 2
+-
+-test "$#" -eq 0 && tool_usage
+-
+-while [ "$#" -ne 0 ]
+-do
+-	 case "$1" in
+-	  "") ;;
+-	  "-f"|"--force"  ) FORCE="-f" ;;
+-	  "-h"|"--help"   ) tool_usage ;;
+-	  "-n"|"--name"   ) shift; NAME=$1 ;;
+-	  "-v"|"--verbose") VERB="-v" ;;
+-	  "-y"|"--yes"    ) YES="-y" ;;
+-	  "--dry-run"     ) DRY="1" ;;
+-	  "-*") error "Wrong argument \"$1\". (see: $TOOL --help)" ;;
+-	  *) DEVICENAME=$1 ;;  # device name does not start with '-'
+-	esac
+-	shift
+-done
+-
+-# do conversion
+-convert2lvm_ "$DEVICENAME"
+diff --git a/test/Makefile.in b/test/Makefile.in
+index 6be03aa..0f2cc25 100644
+--- a/test/Makefile.in
++++ b/test/Makefile.in
+@@ -353,7 +353,7 @@ LIB = $(addprefix lib/, $(LIB_SECURETEST) $(LIB_DMSECURETEST) $(LIB_SHARED) $(LI
+ 	$(Q) $(LN_S) -f $(abs_top_srcdir)/conf/lvmdbusd.profile lib/
+ 	$(Q) $(LN_S) -f $(abs_top_srcdir)/conf/thin-performance.profile lib/
+ 	$(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/fsadm.sh lib/fsadm
+-	$(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/vdoimport.sh lib/vdoimport
++	$(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/lvm_import_vdo.sh lib/lvm_import_vdo
+ 	@test "$(srcdir)" = . || \
+ 		for i in $(LIB_LVMLOCKD_CONF) $(LIB_MKE2FS_CONF); do \
+ 			test -n "$(Q)" || echo "$(LN_S) -f $(abs_top_srcdir)/test/lib/$$i lib/"; \
+diff --git a/test/shell/vdo-convert.sh b/test/shell/vdo-convert.sh
+index 538147b..2d16c97 100644
+--- a/test/shell/vdo-convert.sh
++++ b/test/shell/vdo-convert.sh
+@@ -54,12 +54,12 @@ vdo create $VDOCONF --name "$VDONAME" --device="$DM_DEV_DIR/$vg/$lv1" --vdoLogic
+ mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME"
+ 
+ # Different VG name fails
+-not vdoimport -y -v --name $vg1/$lv1 "$DM_DEV_DIR/$vg/$lv1"
++not lvm_import_vdo -y -v --name $vg1/$lv1 "$DM_DEV_DIR/$vg/$lv1"
+ 
+ # Try just dry run and observe logging
+-vdoimport --dry-run -y -v --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
++lvm_import_vdo --dry-run -y -v --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
+ 
+-vdoimport -y --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
++lvm_import_vdo -y --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
+ 
+ # ATM needed - since we do not call 'vdo convert' in this case
+ vdo remove $VDOCONF --force --name "$VDONAME" || true
+@@ -79,13 +79,13 @@ vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=31G
+ mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME"
+ 
+ # Fail with an already existing volume group $vg2
+-not vdoimport --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err
++not lvm_import_vdo --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err
+ grep "already existing volume group" err
+ 
+ # User can also convert already stopped VDO volume
+ vdo stop $VDOCONF --name "$VDONAME"
+ 
+-vdoimport -y -v --name $vg/$lv1 "$dev1"
++lvm_import_vdo -y -v --name $vg/$lv1 "$dev1"
+ 
+ fsck -n "$DM_DEV_DIR/$vg/$lv1"
+ 
+@@ -102,7 +102,7 @@ vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=23G
+ 
+ mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME"
+ 
+-vdoimport -y -v --name $vg1/$lv2 "$dev1"
++lvm_import_vdo -y -v --name $vg1/$lv2 "$dev1"
+ 
+ fsck -n "$DM_DEV_DIR/$vg1/$lv2"
+ 
diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec
index bd9d071..12091bb 100644
--- a/SPECS/lvm2.spec
+++ b/SPECS/lvm2.spec
@@ -68,7 +68,7 @@ Version: 2.03.12
 %if 0%{?from_snapshot}
 Release: 0.1.20210426git%{shortcommit}%{?dist}%{?rel_suffix}
 %else
-Release: 6%{?dist}%{?rel_suffix}
+Release: 8%{?dist}%{?rel_suffix}
 %endif
 License: GPLv2
 URL: http://sourceware.org/lvm2
@@ -112,6 +112,8 @@ Patch21: lvm2-2_03_13-test.patch
 Patch22: lvm2-2_03_13-vgmerge-remove-one-of-merge-pmspare-LVs.patch
 Patch23: lvm2-2_03_13-vgmerge-support-option-poolmetadataspare.patch
 Patch24: lvm2-2_03_13-tests-extend-vgmerge-testing.patch
+# BZ 1986930:
+Patch25: lvm2-2_03_14-vdo-Rename-vdoimport-to-lvm_import_vdo.patch
 
 BuildRequires: gcc
 %if %{enable_testsuite}
@@ -196,6 +198,7 @@ or more physical volumes and creating one or more logical volumes
 %patch22 -p1 -b .backup22
 %patch23 -p1 -b .backup23
 %patch24 -p1 -b .backup24
+%patch25 -p1 -b .backup25
 
 %build
 %global _default_pid_dir /run
@@ -314,6 +317,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
 %if %{enable_lvmpolld}
 %{_sbindir}/lvmpolld
 %endif
+%{_sbindir}/lvm_import_vdo
 
 # Other files
 %defattr(444,root,root,-)
@@ -340,7 +344,6 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
 %{_sbindir}/pvresize
 %{_sbindir}/pvs
 %{_sbindir}/pvscan
-%{_sbindir}/vdoimport
 %{_sbindir}/vgcfgbackup
 %{_sbindir}/vgcfgrestore
 %{_sbindir}/vgchange
@@ -409,7 +412,7 @@ systemctl start lvm2-lvmpolld.socket >/dev/null 2>&1 || :
 %{_mandir}/man8/vgdisplay.8.gz
 %{_mandir}/man8/vgexport.8.gz
 %{_mandir}/man8/vgextend.8.gz
-%{_mandir}/man8/vdoimport.8.gz
+%{_mandir}/man8/lvm_import_vdo.8.gz
 %{_mandir}/man8/vgimport.8.gz
 %{_mandir}/man8/vgimportclone.8.gz
 %{_mandir}/man8/vgimportdevices.8.gz
@@ -804,6 +807,12 @@ An extensive functional testsuite for LVM2.
 %endif
 
 %changelog
+* Thu Aug 26 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-8
+- Rename vdoimport to lvm_import_vdo.
+
+* Wed Aug 11 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-7
+- Fix missing executable flag on vdoimport.
+
 * Tue Aug 03 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-6
 - Fix handling of pmspare by vgsplit, vgmerge and vgremove.
 - Fix detection of active components of external origin volume.