diff --git a/include/sdbusplus/message/read.hpp b/include/sdbusplus/message/read.hpp
index 84e9ee0..9d69bd5 100644
--- a/include/sdbusplus/message/read.hpp
+++ b/include/sdbusplus/message/read.hpp
@@ -42,67 +42,6 @@
 namespace details
 {
 
-/** @brief Utility to identify C++ types that may not be grouped into a
- *         single sd_bus_message_read call and instead need special
- *         handling.
- *
- *  @tparam T - Type for identification.
- *
- *  User-defined types are expected to inherit from std::false_type.
- *  Enums are converted from strings, so must be done one at a time.
- *
- */
-template <typename T, typename Enable = void>
-struct can_read_multiple :
-    std::conditional_t<std::is_enum_v<T>, std::false_type, std::true_type>
-{};
-// unix_fd's int needs to be wrapped
-template <>
-struct can_read_multiple<unix_fd> : std::false_type
-{};
-// std::string needs a char* conversion.
-template <>
-struct can_read_multiple<std::string> : std::false_type
-{};
-// object_path needs a char* conversion.
-template <>
-struct can_read_multiple<object_path> : std::false_type
-{};
-// signature needs a char* conversion.
-template <>
-struct can_read_multiple<signature> : std::false_type
-{};
-// bool needs to be resized to int, per sdbus documentation.
-template <>
-struct can_read_multiple<bool> : std::false_type
-{};
-
-// std::vector/map/unordered_vector/set need loops
-template <utility::has_emplace T>
-struct can_read_multiple<T> : std::false_type
-{};
-
-template <utility::has_emplace_back T>
-struct can_read_multiple<T> : std::false_type
-{};
-
-// std::pair needs to be broken down into components.
-template <typename T1, typename T2>
-struct can_read_multiple<std::pair<T1, T2>> : std::false_type
-{};
-
-// std::tuple needs to be broken down into components.
-template <typename... Args>
-struct can_read_multiple<std::tuple<Args...>> : std::false_type
-{};
-// variant needs to be broken down into components.
-template <typename... Args>
-struct can_read_multiple<std::variant<Args...>> : std::false_type
-{};
-
-template <typename... Args>
-inline constexpr bool can_read_multiple_v = can_read_multiple<Args...>::value;
-
 /** @brief Utility to read a single C++ element from a sd_bus_message.
  *
  *  User-defined types are expected to specialize this template in order to
@@ -456,162 +395,12 @@
     static void op(sdbusplus::SdBusInterface*, sd_bus_message*, S&) {}
 };
 
-template <typename T>
-void tuple_item_read(sdbusplus::SdBusInterface* intf, sd_bus_message* m, T&& t)
-{
-    sdbusplus::message::read(intf, m, t);
-}
-
-template <int Index>
-struct ReadHelper
-{
-    template <typename... Fields>
-    static void op(sdbusplus::SdBusInterface* intf, sd_bus_message* m,
-                   std::tuple<Fields...> field_tuple)
-    {
-        auto& field = std::get<Index - 1>(field_tuple);
-
-        if constexpr (Index > 1)
-        {
-            ReadHelper<Index - 1>::op(intf, m, std::move(field_tuple));
-        }
-
-        tuple_item_read(intf, m, field);
-    }
-};
-
-/** @brief Read a tuple from the sd_bus_message.
- *
- *  @tparam Tuple - The tuple type to read.
- *  @param[out] t - The tuple to read into.
- *
- *  A tuple of 2 or more entries can be read as a set with
- *  sd_bus_message_read.
- *
- *  A tuple of 1 entry can be read with sd_bus_message_read_basic.
- *
- *  A tuple of 0 entries is a no-op.
- *
- */
-template <typename Tuple>
-void read_tuple(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t)
-{
-    if constexpr (std::tuple_size_v<Tuple> >= 2)
-    {
-        ReadHelper<std::tuple_size_v<Tuple>>::op(intf, m, std::move(t));
-    }
-    else if constexpr (std::tuple_size_v<Tuple> == 1)
-    {
-        using itemType = decltype(std::get<0>(t));
-        read_single_t<itemType>::op(intf, m,
-                                    std::forward<itemType>(std::get<0>(t)));
-    }
-}
-
-/** @brief Group a sequence of C++ types for reading from an sd_bus_message.
- *  @tparam Tuple - A tuple of previously analyzed types.
- *  @tparam Arg - The argument to analyze for grouping.
- *
- *  Specialization for when can_read_multiple_v<Arg> is true.
- */
-template <typename Tuple, typename Arg>
-std::enable_if_t<can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg);
-/** @brief Group a sequence of C++ types for reading from an sd_bus_message.
- *  @tparam Tuple - A tuple of previously analyzed types.
- *  @tparam Arg - The argument to analyze for grouping.
- *
- *  Specialization for when can_read_multiple_v<Arg> is false.
- */
-template <typename Tuple, typename Arg>
-std::enable_if_t<!can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg);
-/** @brief Group a sequence of C++ types for reading from an sd_bus_message.
- *  @tparam Tuple - A tuple of previously analyzed types.
- *  @tparam Arg - The argument to analyze for grouping.
- *  @tparam Rest - The remaining arguments left to analyze.
- *
- *  Specialization for when can_read_multiple_v<Arg> is true.
- */
-template <typename Tuple, typename Arg, typename... Rest>
-std::enable_if_t<can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg, Rest&&... rest);
-/** @brief Group a sequence of C++ types for reading from an sd_bus_message.
- *  @tparam Tuple - A tuple of previously analyzed types.
- *  @tparam Arg - The argument to analyze for grouping.
- *  @tparam Rest - The remaining arguments left to analyze.
- *
- *  Specialization for when can_read_multiple_v<Arg> is false.
- */
-template <typename Tuple, typename Arg, typename... Rest>
-std::enable_if_t<!can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg, Rest&&... rest);
-
-template <typename Tuple, typename Arg>
-std::enable_if_t<can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg)
-{
-    // Last element of a sequence and can_read_multiple, so add it to
-    // the tuple and call read_tuple.
-
-    read_tuple(intf, m,
-               std::tuple_cat(std::forward<Tuple>(t),
-                              std::forward_as_tuple(std::forward<Arg>(arg))));
-}
-
-template <typename Tuple, typename Arg>
-std::enable_if_t<!can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg)
-{
-    // Last element of a sequence but !can_read_multiple, so call
-    // read_tuple on the previous elements and separately this single
-    // element.
-
-    read_tuple(intf, m, std::forward<Tuple>(t));
-    read_tuple(intf, m, std::forward_as_tuple(std::forward<Arg>(arg)));
-}
-
-template <typename Tuple, typename Arg, typename... Rest>
-std::enable_if_t<can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg, Rest&&... rest)
-{
-    // Not the last element of a sequence and can_read_multiple, so add it
-    // to the tuple and keep grouping.
-
-    read_grouping(intf, m,
-                  std::tuple_cat(std::forward<Tuple>(t),
-                                 std::forward_as_tuple(std::forward<Arg>(arg))),
-                  std::forward<Rest>(rest)...);
-}
-
-template <typename Tuple, typename Arg, typename... Rest>
-std::enable_if_t<!can_read_multiple_v<types::details::type_id_downcast_t<Arg>>>
-    read_grouping(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Tuple&& t,
-                  Arg&& arg, Rest&&... rest)
-{
-    // Not the last element of a sequence but !can_read_multiple, so call
-    // read_tuple on the previous elements and separately this single
-    // element and then group the remaining elements.
-
-    read_tuple(intf, m, std::forward<Tuple>(t));
-    read_tuple(intf, m, std::forward_as_tuple(std::forward<Arg>(arg)));
-    read_grouping(intf, m, std::make_tuple(), std::forward<Rest>(rest)...);
-}
-
 } // namespace details
 
 template <typename... Args>
 void read(sdbusplus::SdBusInterface* intf, sd_bus_message* m, Args&&... args)
 {
-    details::read_grouping(intf, m, std::make_tuple(),
-                           std::forward<Args>(args)...);
+    (details::read_single_t<Args>::op(intf, m, args), ...);
 }
 
 } // namespace message
