diff --git a/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch b/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch
new file mode 100644
index 0000000..652b0b7
--- /dev/null
+++ b/SOURCES/lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch
@@ -0,0 +1,25 @@
+ tools/command-lines.in | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tools/command-lines.in b/tools/command-lines.in
+index 1107c1e..67c37ff 100644
+--- a/tools/command-lines.in
++++ b/tools/command-lines.in
+@@ -534,7 +534,7 @@ RULE: all and lv_is_visible
+ 
+ ---
+ 
+-lvconvert --type thin-pool LV_linear_striped_raid_cache_error_zero
++lvconvert --type thin-pool LV_linear_striped_raid_cache_writecache_error_zero
+ OO: --stripes_long Number, --stripesize SizeKB,
+ OO_LVCONVERT_THINPOOL, OO_LVCONVERT_POOL, OO_LVCONVERT
+ OP: PV ...
+@@ -566,7 +566,7 @@ RULE: --poolmetadata not --readahead --stripesize --stripes_long
+ # This command syntax is deprecated, and the primary forms
+ # of creating a pool or swapping metadata should be used.
+ 
+-lvconvert --thinpool LV_linear_striped_raid_cache_thinpool
++lvconvert --thinpool LV_linear_striped_raid_cache_writecache_thinpool
+ OO: --stripes_long Number, --stripesize SizeKB,
+ OO_LVCONVERT_THINPOOL, OO_LVCONVERT_POOL, OO_LVCONVERT
+ OP: PV ...
diff --git a/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch b/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch
new file mode 100644
index 0000000..45a878d
--- /dev/null
+++ b/SOURCES/lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch
@@ -0,0 +1,150 @@
+ lib/metadata/lv_manip.c                | 19 +++++++++
+ lib/metadata/metadata-exported.h       |  2 +
+ lib/metadata/thin_manip.c              | 12 ++++++
+ test/shell/lvremove-thindata-caches.sh | 71 ++++++++++++++++++++++++++++++++++
+ 4 files changed, 104 insertions(+)
+ create mode 100644 test/shell/lvremove-thindata-caches.sh
+
+diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
+index 508f78c..37dd361 100644
+--- a/lib/metadata/lv_manip.c
++++ b/lib/metadata/lv_manip.c
+@@ -6692,6 +6692,25 @@ int lv_remove_single(struct cmd_context *cmd, struct logical_volume *lv,
+ 			return_0;
+ 	}
+ 
++	/* if thin pool data lv is writecache, then detach and remove the writecache */
++	if (lv_is_thin_pool(lv)) {
++		struct logical_volume *data_lv = data_lv_from_thin_pool(lv);
++
++		if (data_lv && lv_is_writecache(data_lv)) {
++			struct logical_volume *cachevol_lv = first_seg(data_lv)->writecache;
++
++			if (!lv_detach_writecache_cachevol(data_lv, 1)) {
++				log_error("Failed to detach writecache from %s", display_lvname(data_lv));
++				return 0;
++			}
++
++			if (!lv_remove_single(cmd, cachevol_lv, force, 1)) {
++				log_error("Failed to remove cachevol %s.", display_lvname(cachevol_lv));
++				return 0;
++			}
++		}
++	}
++
+ 	if (lv_is_writecache(lv)) {
+ 		struct logical_volume *cachevol_lv = first_seg(lv)->writecache;
+ 
+diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
+index c611635..54bc0d0 100644
+--- a/lib/metadata/metadata-exported.h
++++ b/lib/metadata/metadata-exported.h
+@@ -927,6 +927,8 @@ int handle_pool_metadata_spare(struct volume_group *vg, uint32_t extents,
+ int vg_set_pool_metadata_spare(struct logical_volume *lv);
+ int vg_remove_pool_metadata_spare(struct volume_group *vg);
+ 
++struct logical_volume *data_lv_from_thin_pool(struct logical_volume *pool_lv);
++
+ int attach_thin_external_origin(struct lv_segment *seg,
+ 				struct logical_volume *external_lv);
+ int detach_thin_external_origin(struct lv_segment *seg);
+diff --git a/lib/metadata/thin_manip.c b/lib/metadata/thin_manip.c
+index 451c382..6ce88bd 100644
+--- a/lib/metadata/thin_manip.c
++++ b/lib/metadata/thin_manip.c
+@@ -21,6 +21,18 @@
+ #include "lib/config/defaults.h"
+ #include "lib/display/display.h"
+ 
++struct logical_volume *data_lv_from_thin_pool(struct logical_volume *pool_lv)
++{
++	struct lv_segment *seg_thinpool = first_seg(pool_lv);
++
++	if (!seg_thinpool || !seg_is_thin_pool(seg_thinpool)) {
++		log_error(INTERNAL_ERROR "data_lv_from_thin_pool arg not thin pool %s", pool_lv->name);
++		return NULL;
++	}
++
++	return seg_thinpool->areas[0].u.lv.lv;
++}
++
+ /* TODO: drop unused no_update */
+ int attach_pool_message(struct lv_segment *pool_seg, dm_thin_message_t type,
+ 			struct logical_volume *lv, uint32_t delete_id,
+diff --git a/test/shell/lvremove-thindata-caches.sh b/test/shell/lvremove-thindata-caches.sh
+new file mode 100644
+index 0000000..ba099c3
+--- /dev/null
++++ b/test/shell/lvremove-thindata-caches.sh
+@@ -0,0 +1,71 @@
++#!/usr/bin/env bash
++
++# Copyright (C) 2017-2020 Red Hat, Inc. All rights reserved.
++#
++# 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
++
++SKIP_WITH_LVMPOLLD=1
++
++. lib/inittest
++
++aux have_cache 1 10 0 || skip
++aux have_writecache 1 0 0 || skip
++which mkfs.xfs || skip
++
++aux prepare_devs 6 70 # want 64M of usable space from each dev
++
++vgcreate $SHARED $vg "$dev1" "$dev2" "$dev3" "$dev4" "$dev5" "$dev6"
++
++# lv1 is thinpool LV: 128M
++# lv2 is fast LV:      64M
++# lv3 is thin LV:       1G
++
++#
++# Test lvremove of a thinpool that uses cache|writecache on data
++#
++
++# attach writecache to thinpool data
++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2"
++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg
++lvcreate -n $lv2 -L64M -an $vg "$dev3"
++lvconvert -y --type writecache --cachevol $lv2 $vg/$lv1
++lvchange -ay $vg/$lv1
++lvs -a $vg
++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3"
++lvremove -y $vg/$lv1
++
++# attach cache/writeback (cachevol) to thinpool data
++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2"
++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg
++lvcreate -n $lv2 -L64M -an $vg "$dev3"
++lvconvert -y --type cache --cachevol $lv2 --cachemode writeback $vg/$lv1
++lvchange -ay $vg/$lv1
++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3"
++lvremove -y $vg/$lv1
++
++# attach cache/writethrough (cachevol) to thinpool data
++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2"
++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg
++lvcreate -n $lv2 -L64M -an $vg "$dev3"
++lvconvert -y --type cache --cachevol $lv2 --cachemode writethrough $vg/$lv1
++lvchange -ay $vg/$lv1
++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3"
++lvremove -y $vg/$lv1
++
++# attach cache (cachepool) to thinpool data
++lvcreate --type thin-pool -n $lv1 -L128M --poolmetadataspare n $vg "$dev1" "$dev2"
++lvcreate --type thin -n $lv3 -V1G --thinpool $lv1 $vg
++lvcreate -y --type cache-pool -n $lv2 -L64M --poolmetadataspare n $vg "$dev3" "$dev6"
++lvconvert -y --type cache --cachepool $lv2 --poolmetadataspare n $vg/$lv1
++lvchange -ay $vg/$lv1
++mkfs.xfs -f -s size=4096 "$DM_DEV_DIR/$vg/$lv3"
++lvremove -y $vg/$lv1
++
++vgremove -f $vg
++
diff --git a/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch b/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch
new file mode 100644
index 0000000..1457f7f
--- /dev/null
+++ b/SOURCES/lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch
@@ -0,0 +1,23 @@
+ tools/pvmove.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/tools/pvmove.c b/tools/pvmove.c
+index da635a6..bb372f7 100644
+--- a/tools/pvmove.c
++++ b/tools/pvmove.c
+@@ -387,6 +387,15 @@ static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
+ 			return NULL;
+ 		}
+ 
++		if (lv_is_writecache(lv)) {
++			struct logical_volume *lv_cachevol = first_seg(lv)->writecache;
++			if (lv_is_on_pvs(lv_cachevol, source_pvl)) {
++				log_error("Unable to move device used for writecache cachevol %s.", display_lvname(lv_cachevol));
++				return NULL;
++			}
++
++		}
++
+ 		if (lv_is_raid(lv) && lv_raid_has_integrity(lv)) {
+ 			log_error("Unable to pvmove device used for raid with integrity.");
+ 			return NULL;
diff --git a/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch b/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch
new file mode 100644
index 0000000..b926cac
--- /dev/null
+++ b/SOURCES/lvm2-2_03_13-writecache-fix-lv_on_pmem.patch
@@ -0,0 +1,17 @@
+ lib/metadata/metadata.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
+index 002d80c..1f65045 100644
+--- a/lib/metadata/metadata.c
++++ b/lib/metadata/metadata.c
+@@ -4402,6 +4402,9 @@ int lv_on_pmem(struct logical_volume *lv)
+ 
+ 	dm_list_iterate_items(seg, &lv->segments) {
+ 		for (s = 0; s < seg->area_count; s++) {
++			if (seg_type(seg, s) != AREA_PV)
++				continue;
++
+ 			pv = seg_pv(seg, s);
+ 
+ 			if (dev_is_pmem(lv->vg->cmd->dev_types, pv->dev)) {
diff --git a/SPECS/lvm2.spec b/SPECS/lvm2.spec
index 925cc61..ef6edec 100644
--- a/SPECS/lvm2.spec
+++ b/SPECS/lvm2.spec
@@ -67,7 +67,7 @@ Version: 2.03.12
 %if 0%{?from_snapshot}
 Release: 0.1.20210426git%{shortcommit}%{?dist}%{?rel_suffix}
 %else
-Release: 2%{?dist}%{?rel_suffix}
+Release: 3%{?dist}%{?rel_suffix}
 %endif
 License: GPLv2
 URL: http://sourceware.org/lvm2
@@ -81,6 +81,13 @@ Patch1: lvm2-set-default-preferred_names.patch
 Patch2: lvm2-test-skip-problematic-tests.patch
 # BZ 1961890
 Patch3: lvm2-2_03_13-vdo-fix-preload-of-kvdo.patch
+# BZ 1964622:
+Patch4: lvm2-2_03_13-lvremove-fix-removing-thin-pool-with-writecache-on-d.patch
+# BZ 1957898:
+Patch5: lvm2-2_03_13-enable-command-syntax-for-thin-and-writecache.patch
+# BZ 1872903:
+Patch6: lvm2-2_03_13-writecache-fix-lv_on_pmem.patch
+Patch7: lvm2-2_03_13-writecache-don-t-pvmove-device-used-by-writecache.patch
 
 BuildRequires: gcc
 %if %{enable_testsuite}
@@ -144,6 +151,10 @@ or more physical volumes and creating one or more logical volumes
 %patch1 -p1 -b .backup1
 %patch2 -p1 -b .backup2
 %patch3 -p1 -b .backup3
+%patch4 -p1 -b .backup4
+%patch5 -p1 -b .backup5
+%patch6 -p1 -b .backup6
+%patch7 -p1 -b .backup7
 
 %build
 %global _default_pid_dir /run
@@ -752,6 +763,10 @@ An extensive functional testsuite for LVM2.
 %endif
 
 %changelog
+* Tue Jun 15 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-3
+- Allow extending thin-pool data with writecache on top.
+- Fix removing thin-pool data converted to writeache.
+
 * Tue Jun 01 2021 Marian Csontos <mcsontos@redhat.com> - 2.03.12-2
 - Fix loading of VDO kernel module.