diff --git a/quiche/http2/decoder/http2_structure_decoder_test.cc b/quiche/http2/decoder/http2_structure_decoder_test.cc
index bbb4ba8..0b2d0c8 100644
--- a/quiche/http2/decoder/http2_structure_decoder_test.cc
+++ b/quiche/http2/decoder/http2_structure_decoder_test.cc
@@ -22,6 +22,7 @@
 
 #include <cstdint>
 #include <string>
+#include <utility>
 
 #include "absl/strings/string_view.h"
 #include "quiche/http2/decoder/decode_buffer.h"
@@ -109,7 +110,7 @@
 
     // Before that, validate that decoding is done and that we've advanced
     // the cursor the expected amount.
-    validator = ValidateDoneAndOffset(S::EncodedSize(), validator);
+    validator = ValidateDoneAndOffset(S::EncodedSize(), std::move(validator));
 
     // Decode several times, with several segmentations of the input buffer.
     fast_decode_count_ = 0;
diff --git a/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc b/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc
index 064ae44..1fc7550 100644
--- a/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc
+++ b/quiche/http2/hpack/decoder/hpack_block_decoder_test.cc
@@ -177,12 +177,10 @@
   expected.ExpectIndexedHeader(4);
   expected.ExpectNameIndexAndLiteralValue(HpackEntryType::kIndexedLiteralHeader,
                                           1, false, "www.example.com");
-  NoArgValidator do_check = [expected, this]() {
-    return collector_.VerifyEq(expected);
-  };
   EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays(
-      example, ValidateDoneAndEmpty(do_check)));
-  EXPECT_TRUE(do_check());
+      example,
+      ValidateDoneAndEmpty([&] { return collector_.VerifyEq(expected); })));
+  EXPECT_TRUE(collector_.VerifyEq(expected));
 }
 
 // http://httpwg.org/specs/rfc7541.html#rfc.section.C.5.1
@@ -227,12 +225,10 @@
                                           "Mon, 21 Oct 2013 20:13:21 GMT");
   expected.ExpectNameIndexAndLiteralValue(HpackEntryType::kIndexedLiteralHeader,
                                           46, false, "https://www.example.com");
-  NoArgValidator do_check = [expected, this]() {
-    return collector_.VerifyEq(expected);
-  };
   EXPECT_TRUE(DecodeHpackExampleAndValidateSeveralWays(
-      example, ValidateDoneAndEmpty(do_check)));
-  EXPECT_TRUE(do_check());
+      example,
+      ValidateDoneAndEmpty([&] { return collector_.VerifyEq(expected); })));
+  EXPECT_TRUE(collector_.VerifyEq(expected));
 }
 
 // Generate a bunch of HPACK block entries to expect, use those expectations
@@ -277,12 +273,10 @@
   HpackBlockBuilder hbb;
   expected.AppendToHpackBlockBuilder(&hbb);
 
-  NoArgValidator do_check = [expected, this]() {
-    return collector_.VerifyEq(expected);
-  };
-  EXPECT_TRUE(
-      DecodeAndValidateSeveralWays(hbb, ValidateDoneAndEmpty(do_check)));
-  EXPECT_TRUE(do_check());
+  EXPECT_TRUE(DecodeAndValidateSeveralWays(
+      hbb,
+      ValidateDoneAndEmpty([&] { return collector_.VerifyEq(expected); })));
+  EXPECT_TRUE(collector_.VerifyEq(expected));
 }
 
 }  // namespace
diff --git a/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc b/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc
index 950b01a..d895183 100644
--- a/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc
+++ b/quiche/http2/hpack/varint/hpack_varint_decoder_test.cc
@@ -8,6 +8,8 @@
 
 #include <stddef.h>
 
+#include <utility>
+
 #include "absl/base/macros.h"
 #include "absl/strings/escaping.h"
 #include "absl/strings/string_view.h"
@@ -44,9 +46,10 @@
 
     // First validate that decoding is done and that we've advanced the cursor
     // the expected amount.
-    validator = ValidateDoneAndOffset(/* offset = */ data.size(), validator);
+    validator =
+        ValidateDoneAndOffset(/* offset = */ data.size(), std::move(validator));
 
-    EXPECT_TRUE(Decode(data, prefix_length, validator));
+    EXPECT_TRUE(Decode(data, prefix_length, std::move(validator)));
 
     EXPECT_EQ(expected_value, decoder_.value());
   }
@@ -58,7 +61,7 @@
       return AssertionSuccess();
     };
 
-    EXPECT_TRUE(Decode(data, prefix_length, validator));
+    EXPECT_TRUE(Decode(data, prefix_length, std::move(validator)));
   }
 
  private:
diff --git a/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc b/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc
index d307ea0..d045d99 100644
--- a/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc
+++ b/quiche/http2/hpack/varint/hpack_varint_round_trip_test.cc
@@ -11,6 +11,7 @@
 
 #include <iterator>
 #include <set>
+#include <utility>
 #include <vector>
 
 #include "absl/strings/str_cat.h"
@@ -68,7 +69,7 @@
 
     // First validate that decoding is done and that we've advanced the cursor
     // the expected amount.
-    validator = ValidateDoneAndOffset(expected_offset, validator);
+    validator = ValidateDoneAndOffset(expected_offset, std::move(validator));
 
     // StartDecoding, above, requires the DecodeBuffer be non-empty so that it
     // can call Start with the prefix byte.
diff --git a/quiche/http2/test_tools/payload_decoder_base_test_util.h b/quiche/http2/test_tools/payload_decoder_base_test_util.h
index 9f7a5f3..937cea8 100644
--- a/quiche/http2/test_tools/payload_decoder_base_test_util.h
+++ b/quiche/http2/test_tools/payload_decoder_base_test_util.h
@@ -212,14 +212,13 @@
       absl::string_view payload, const Http2FrameHeader& header,
       WrappedValidator wrapped_validator) {
     set_frame_header(header);
-    // If wrapped_validator is not a RandomDecoderTest::Validator, make it so.
-    Validator validator = ToValidator(wrapped_validator);
-    // And wrap that validator in another which will check that we've reached
+    // Wrap that validator in another which will check that we've reached
     // the expected state of kDecodeError with OnFrameSizeError having been
     // called by the payload decoder.
-    validator = [header, validator, this](
-                    const DecodeBuffer& input,
-                    DecodeStatus status) -> ::testing::AssertionResult {
+    Validator validator =
+        [header, validator = ToValidator(wrapped_validator), this](
+            const DecodeBuffer& input,
+            DecodeStatus status) -> ::testing::AssertionResult {
       QUICHE_DVLOG(2) << "VerifyDetectsFrameSizeError validator; status="
                       << status << "; input.Remaining=" << input.Remaining();
       HTTP2_VERIFY_EQ(DecodeStatus::kDecodeError, status);
@@ -234,7 +233,7 @@
       return validator(input, status);
     };
     return PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays(
-        payload, validator);
+        payload, std::move(validator));
   }
 
   // Confirm that we get OnFrameSizeError when trying to decode unpadded_payload
@@ -397,7 +396,7 @@
       return ::testing::AssertionSuccess();
     };
     return PayloadDecoderBaseTest::DecodePayloadAndValidateSeveralWays(
-        payload, validator);
+        payload, std::move(validator));
   }
 
   // Verifies that we get OnPaddingTooLong for a padded frame payload whose
diff --git a/quiche/http2/test_tools/random_decoder_test_base.h b/quiche/http2/test_tools/random_decoder_test_base.h
index a01ea8d..bdd0273 100644
--- a/quiche/http2/test_tools/random_decoder_test_base.h
+++ b/quiche/http2/test_tools/random_decoder_test_base.h
@@ -13,9 +13,8 @@
 #include <stddef.h>
 
 #include <cstdint>
-#include <functional>
-#include <memory>
 #include <type_traits>
+#include <utility>
 
 #include "absl/strings/string_view.h"
 #include "quiche/http2/decoder/decode_buffer.h"
@@ -23,8 +22,8 @@
 #include "quiche/http2/test_tools/http2_random.h"
 #include "quiche/http2/test_tools/verify_macros.h"
 #include "quiche/common/platform/api/quiche_export.h"
-#include "quiche/common/platform/api/quiche_logging.h"
 #include "quiche/common/platform/api/quiche_test.h"
+#include "quiche/common/quiche_callbacks.h"
 
 namespace http2 {
 namespace test {
@@ -61,16 +60,15 @@
   // decoder. Note that RandomDecoderTest allows that size to be zero, though
   // some decoders can't deal with that on the first byte, hence the |first|
   // parameter.
-  typedef std::function<size_t(bool first, size_t offset, size_t remaining)>
-      SelectSize;
+  using SelectSize = quiche::MultiUseCallback<size_t(bool first, size_t offset,
+                                                     size_t remaining)>;
 
   // Validator returns an AssertionResult so test can do:
   // EXPECT_THAT(DecodeAndValidate(..., validator));
-  typedef ::testing::AssertionResult AssertionResult;
-  typedef std::function<AssertionResult(const DecodeBuffer& input,
-                                        DecodeStatus status)>
-      Validator;
-  typedef std::function<AssertionResult()> NoArgValidator;
+  using AssertionResult = ::testing::AssertionResult;
+  using Validator = quiche::MultiUseCallback<AssertionResult(
+      const DecodeBuffer& input, DecodeStatus status)>;
+  using NoArgValidator = quiche::MultiUseCallback<AssertionResult()>;
 
   RandomDecoderTest();
 
@@ -149,18 +147,19 @@
     };
   }
 
-  static Validator ToValidator(const Validator& validator) {
+  static Validator ToValidator(Validator validator) {
     if (validator == nullptr) {
       return ToValidator(nullptr);
     }
     return validator;
   }
 
-  static Validator ToValidator(const NoArgValidator& validator) {
+  static Validator ToValidator(NoArgValidator validator) {
     if (validator == nullptr) {
       return ToValidator(nullptr);
     }
-    return [validator](const DecodeBuffer& /*input*/, DecodeStatus /*status*/) {
+    return [validator = std::move(validator)](const DecodeBuffer& /*input*/,
+                                              DecodeStatus /*status*/) {
       return validator();
     };
   }
@@ -171,9 +170,10 @@
   // TODO(jamessynge): Replace this overload with the next, as using this method
   // usually means that the wrapped function doesn't need to be passed the
   // DecodeBuffer nor the DecodeStatus.
-  static Validator ValidateDoneAndEmpty(const Validator& wrapped) {
-    return [wrapped](const DecodeBuffer& input,
-                     DecodeStatus status) -> AssertionResult {
+  static Validator ValidateDoneAndEmpty(Validator wrapped) {
+    return [wrapped = std::move(wrapped)](
+               const DecodeBuffer& input,
+               DecodeStatus status) -> AssertionResult {
       HTTP2_VERIFY_EQ(status, DecodeStatus::kDecodeDone);
       HTTP2_VERIFY_EQ(0u, input.Remaining()) << "\nOffset=" << input.Offset();
       if (wrapped) {
@@ -183,8 +183,9 @@
     };
   }
   static Validator ValidateDoneAndEmpty(NoArgValidator wrapped) {
-    return [wrapped](const DecodeBuffer& input,
-                     DecodeStatus status) -> AssertionResult {
+    return [wrapped = std::move(wrapped)](
+               const DecodeBuffer& input,
+               DecodeStatus status) -> AssertionResult {
       HTTP2_VERIFY_EQ(status, DecodeStatus::kDecodeDone);
       HTTP2_VERIFY_EQ(0u, input.Remaining()) << "\nOffset=" << input.Offset();
       if (wrapped) {
@@ -194,8 +195,7 @@
     };
   }
   static Validator ValidateDoneAndEmpty() {
-    NoArgValidator validator;
-    return ValidateDoneAndEmpty(validator);
+    return ValidateDoneAndEmpty(NoArgValidator());
   }
 
   // Wraps a validator with another validator
@@ -204,10 +204,10 @@
   // TODO(jamessynge): Replace this overload with the next, as using this method
   // usually means that the wrapped function doesn't need to be passed the
   // DecodeBuffer nor the DecodeStatus.
-  static Validator ValidateDoneAndOffset(uint32_t offset,
-                                         const Validator& wrapped) {
-    return [wrapped, offset](const DecodeBuffer& input,
-                             DecodeStatus status) -> AssertionResult {
+  static Validator ValidateDoneAndOffset(uint32_t offset, Validator wrapped) {
+    return [wrapped = std::move(wrapped), offset](
+               const DecodeBuffer& input,
+               DecodeStatus status) -> AssertionResult {
       HTTP2_VERIFY_EQ(status, DecodeStatus::kDecodeDone);
       HTTP2_VERIFY_EQ(offset, input.Offset())
           << "\nRemaining=" << input.Remaining();
@@ -219,8 +219,9 @@
   }
   static Validator ValidateDoneAndOffset(uint32_t offset,
                                          NoArgValidator wrapped) {
-    return [wrapped, offset](const DecodeBuffer& input,
-                             DecodeStatus status) -> AssertionResult {
+    return [wrapped = std::move(wrapped), offset](
+               const DecodeBuffer& input,
+               DecodeStatus status) -> AssertionResult {
       HTTP2_VERIFY_EQ(status, DecodeStatus::kDecodeDone);
       HTTP2_VERIFY_EQ(offset, input.Offset())
           << "\nRemaining=" << input.Remaining();
@@ -231,8 +232,7 @@
     };
   }
   static Validator ValidateDoneAndOffset(uint32_t offset) {
-    NoArgValidator validator;
-    return ValidateDoneAndOffset(offset, validator);
+    return ValidateDoneAndOffset(offset, NoArgValidator());
   }
 
   // Expose |random_| as Http2Random so callers don't have to care about which
