diff --git a/graphics/mapper/2.1/vts/functional/Android.bp b/graphics/mapper/2.1/vts/functional/Android.bp
index 74d6fa8..ac67af8 100644
--- a/graphics/mapper/2.1/vts/functional/Android.bp
+++ b/graphics/mapper/2.1/vts/functional/Android.bp
@@ -24,5 +24,6 @@
         "android.hardware.graphics.mapper@2.0",
         "android.hardware.graphics.mapper@2.1",
         "android.hardware.graphics.mapper@2.0-vts",
+        "android.hardware.graphics.mapper@2.1-vts",
     ],
 }
diff --git a/graphics/mapper/2.1/vts/functional/VtsHalGraphicsMapperV2_1TargetTest.cpp b/graphics/mapper/2.1/vts/functional/VtsHalGraphicsMapperV2_1TargetTest.cpp
index 803c326..5e7cf93 100644
--- a/graphics/mapper/2.1/vts/functional/VtsHalGraphicsMapperV2_1TargetTest.cpp
+++ b/graphics/mapper/2.1/vts/functional/VtsHalGraphicsMapperV2_1TargetTest.cpp
@@ -19,7 +19,7 @@
 #include <VtsHalHidlTargetTestBase.h>
 #include <android-base/logging.h>
 #include <android/hardware/graphics/mapper/2.1/IMapper.h>
-#include <mapper-vts/2.0/MapperVts.h>
+#include <mapper-vts/2.1/MapperVts.h>
 
 namespace android {
 namespace hardware {
@@ -32,25 +32,8 @@
 using android::hardware::graphics::allocator::V2_0::IAllocator;
 using android::hardware::graphics::common::V1_1::BufferUsage;
 using android::hardware::graphics::common::V1_1::PixelFormat;
-using V2_0::BufferDescriptor;
 using V2_0::Error;
 
-// abuse VTS to check binary compatibility between BufferDescriptorInfos
-using OldBufferDescriptorInfo =
-    android::hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo;
-static_assert(sizeof(OldBufferDescriptorInfo) == sizeof(IMapper::BufferDescriptorInfo) &&
-                  offsetof(OldBufferDescriptorInfo, width) ==
-                      offsetof(IMapper::BufferDescriptorInfo, width) &&
-                  offsetof(OldBufferDescriptorInfo, height) ==
-                      offsetof(IMapper::BufferDescriptorInfo, height) &&
-                  offsetof(OldBufferDescriptorInfo, layerCount) ==
-                      offsetof(IMapper::BufferDescriptorInfo, layerCount) &&
-                  offsetof(OldBufferDescriptorInfo, format) ==
-                      offsetof(IMapper::BufferDescriptorInfo, format) &&
-                  offsetof(OldBufferDescriptorInfo, usage) ==
-                      offsetof(IMapper::BufferDescriptorInfo, usage),
-              "");
-
 // Test environment for graphics.mapper.
 class GraphicsMapperHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
    public:
@@ -66,79 +49,6 @@
     }
 };
 
-class Gralloc : public V2_0::vts::Gralloc {
-   public:
-    Gralloc(const std::string& allocatorServiceName, const std::string& mapperServiceName)
-        : V2_0::vts::Gralloc(allocatorServiceName, mapperServiceName) {
-        if (::testing::Test::HasFatalFailure()) {
-            return;
-        }
-
-        init();
-    }
-
-    sp<IMapper> getMapper() const { return mMapper; }
-
-    bool validateBufferSize(const native_handle_t* bufferHandle,
-                            const IMapper::BufferDescriptorInfo& descriptorInfo, uint32_t stride) {
-        auto buffer = const_cast<native_handle_t*>(bufferHandle);
-
-        Error error = mMapper->validateBufferSize(buffer, descriptorInfo, stride);
-        return error == Error::NONE;
-    }
-
-    void getTransportSize(const native_handle_t* bufferHandle, uint32_t* numFds,
-                          uint32_t* numInts) {
-        auto buffer = const_cast<native_handle_t*>(bufferHandle);
-
-        *numFds = 0;
-        *numInts = 0;
-        mMapper->getTransportSize(buffer, [&](const auto& tmpError, const auto& tmpNumFds,
-                                              const auto& tmpNumInts) {
-            ASSERT_EQ(Error::NONE, tmpError) << "failed to get transport size";
-            ASSERT_GE(bufferHandle->numFds, int(tmpNumFds)) << "invalid numFds " << tmpNumFds;
-            ASSERT_GE(bufferHandle->numInts, int(tmpNumInts)) << "invalid numInts " << tmpNumInts;
-
-            *numFds = tmpNumFds;
-            *numInts = tmpNumInts;
-        });
-    }
-
-    BufferDescriptor createDescriptor(const IMapper::BufferDescriptorInfo& descriptorInfo) {
-        BufferDescriptor descriptor;
-        mMapper->createDescriptor_2_1(
-            descriptorInfo, [&](const auto& tmpError, const auto& tmpDescriptor) {
-                ASSERT_EQ(Error::NONE, tmpError) << "failed to create descriptor";
-                descriptor = tmpDescriptor;
-            });
-
-        return descriptor;
-    }
-
-    const native_handle_t* allocate(const IMapper::BufferDescriptorInfo& descriptorInfo,
-                                    bool import, uint32_t* outStride = nullptr) {
-        BufferDescriptor descriptor = createDescriptor(descriptorInfo);
-        if (::testing::Test::HasFatalFailure()) {
-            return nullptr;
-        }
-
-        auto buffers = V2_0::vts::Gralloc::allocate(descriptor, 1, import, outStride);
-        if (::testing::Test::HasFatalFailure()) {
-            return nullptr;
-        }
-
-        return buffers[0];
-    }
-
-   private:
-    void init() {
-        mMapper = IMapper::castFrom(V2_0::vts::Gralloc::getMapper());
-        ASSERT_NE(nullptr, mMapper.get()) << "failed to find IMapper 2.1";
-    }
-
-    sp<IMapper> mMapper;
-};
-
 class GraphicsMapperHidlTest : public ::testing::VtsHalHidlTargetTestBase {
    protected:
     void SetUp() override {
