diff --git a/Android.bp b/Android.bp
index 819732d..9207656 100644
--- a/Android.bp
+++ b/Android.bp
@@ -30,8 +30,8 @@
 }
 
 cc_library_headers {
-    name: "libhidl_gtest_helpers",
-    export_include_dirs: ["gtest_helpers"],
+    name: "libhidl_gtest_helper",
+    export_include_dirs: ["gtest_helper"],
 }
 
 cc_test {
diff --git a/base/Status.cpp b/base/Status.cpp
index 08631cc..7698ff8 100644
--- a/base/Status.cpp
+++ b/base/Status.cpp
@@ -155,6 +155,20 @@
         }
     }
 
+    void return_status::onIgnored() const {
+        if (gReturnRestriction == HidlReturnRestriction::NONE) {
+            return;
+        }
+
+        if (gReturnRestriction == HidlReturnRestriction::ERROR_IF_UNCHECKED) {
+            LOG(ERROR) << "Failed to check status of HIDL Return.";
+            CallStack::logStack("unchecked HIDL return", CallStack::getCurrent(10).get(),
+                                ANDROID_LOG_ERROR);
+        } else {
+            LOG(FATAL) << "Failed to check status of HIDL Return.";
+        }
+    }
+
     void return_status::assertOk() const {
         if (!isOk()) {
             LOG(FATAL) << "Failed HIDL return status not checked. Usually this happens because of "
@@ -171,22 +185,13 @@
         if (mCheckedStatus) return;
 
         assertOk();
-
-        if (gReturnRestriction == HidlReturnRestriction::NONE) {
-            return;
-        }
-
-        if (gReturnRestriction == HidlReturnRestriction::ERROR_IF_UNCHECKED) {
-            LOG(ERROR) << "Failed to check status of HIDL Return.";
-            CallStack::logStack("unchecked HIDL return", CallStack::getCurrent(10).get(), ANDROID_LOG_ERROR);
-        } else {
-            LOG(FATAL) << "Failed to check status of HIDL Return.";
-        }
+        onIgnored();
     }
 
     return_status& return_status::operator=(return_status&& other) noexcept {
         if (!mCheckedStatus) {
             assertOk();
+            onIgnored();
         }
 
         std::swap(mStatus, other.mStatus);
diff --git a/base/include/hidl/Status.h b/base/include/hidl/Status.h
index 07d352f..74901bb 100644
--- a/base/include/hidl/Status.h
+++ b/base/include/hidl/Status.h
@@ -141,6 +141,11 @@
         Status mStatus {};
         mutable bool mCheckedStatus = false;
 
+        // called when an unchecked status is discarded
+        // makes sure this status is checked according to the preference
+        // set by setProcessHidlReturnRestriction
+        void onIgnored() const;
+
         template <typename T, typename U>
         friend Return<U> StatusOf(const Return<T> &other);
     protected:
diff --git a/gtest_helper/hidl/GtestPrinter.h b/gtest_helper/hidl/GtestPrinter.h
new file mode 100644
index 0000000..4b5ac2d
--- /dev/null
+++ b/gtest_helper/hidl/GtestPrinter.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+namespace android {
+namespace hardware {
+
+static inline std::string Sanitize(std::string name) {
+    for (size_t i = 0; i < name.size(); i++) {
+        // gtest test names must only contain alphanumeric characters
+        if (!std::isalnum(name[i])) name[i] = '_';
+    }
+    return name;
+}
+
+static inline std::string PrintInstanceNameToString(
+        const testing::TestParamInfo<std::string>& info) {
+    // test names need to be unique -> index prefix
+    std::string name = std::to_string(info.index) + "/" + info.param;
+    return Sanitize(name);
+}
+
+template <typename... T>
+static inline std::string PrintInstanceTupleNameToString(
+        const testing::TestParamInfo<std::tuple<T...>>& info) {
+    std::vector<std::string> instances = std::apply(
+            [](auto&&... elems) {
+                std::vector<std::string> instances;
+                instances.reserve(sizeof...(elems));
+                (instances.push_back(std::forward<decltype(elems)>(elems)), ...);
+                return instances;
+            },
+            info.param);
+    std::string param_string;
+    for (const std::string& instance : instances) {
+        param_string += instance + "_";
+    }
+    param_string += std::to_string(info.index);
+
+    return Sanitize(param_string);
+}
+
+}  // namespace hardware
+}  // namespace android
diff --git a/gtest_helpers/hidl/GtestPrinter.h b/gtest_helpers/hidl/GtestPrinter.h
deleted file mode 100644
index c9f5dd3..0000000
--- a/gtest_helpers/hidl/GtestPrinter.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <gtest/gtest.h>
-
-namespace android {
-namespace hardware {
-
-static inline std::string PrintInstanceNameToString(
-        const testing::TestParamInfo<std::string>& info) {
-    // test names need to be unique -> index prefix
-    std::string name = std::to_string(info.index) + "/" + info.param;
-
-    for (size_t i = 0; i < name.size(); i++) {
-        // gtest test names must only contain alphanumeric characters
-        if (!std::isalnum(name[i])) name[i] = '_';
-    }
-
-    return name;
-}
-
-}  // namespace hardware
-}  // namespace android
diff --git a/test_main.cpp b/test_main.cpp
index fc71231..e4cdd29 100644
--- a/test_main.cpp
+++ b/test_main.cpp
@@ -546,6 +546,36 @@
             "");
 }
 
+TEST_F(LibHidlTest, DetectUncheckedReturn) {
+    using ::android::hardware::HidlReturnRestriction;
+    using ::android::hardware::Return;
+    using ::android::hardware::setProcessHidlReturnRestriction;
+    using ::android::hardware::Status;
+
+    setProcessHidlReturnRestriction(HidlReturnRestriction::FATAL_IF_UNCHECKED);
+
+    EXPECT_DEATH(
+            {
+                auto ret = Return<void>(Status::ok());
+                (void)ret;
+            },
+            "");
+    EXPECT_DEATH(
+            {
+                auto ret = Return<void>(Status::ok());
+                ret = Return<void>(Status::ok());
+                ret.isOk();
+            },
+            "");
+
+    auto ret = Return<void>(Status::ok());
+    (void)ret.isOk();
+    ret = Return<void>(Status::ok());
+    (void)ret.isOk();
+
+    setProcessHidlReturnRestriction(HidlReturnRestriction::NONE);
+}
+
 std::string toString(const ::android::hardware::Status &s) {
     using ::android::hardware::operator<<;
     std::ostringstream oss;
