diff --git a/src/types.hpp b/src/types.hpp
index f7c0fa3..7db6a37 100644
--- a/src/types.hpp
+++ b/src/types.hpp
@@ -3,6 +3,7 @@
 #include <netinet/in.h>
 
 #include <stdplus/net/addr/ether.hpp>
+#include <stdplus/numeric/endian.hpp>
 
 #include <algorithm>
 #include <array>
@@ -131,91 +132,6 @@
 
 namespace detail
 {
-
-template <typename T, uint8_t size = sizeof(T)>
-struct BswapAlign
-{
-    using type = T;
-};
-
-template <typename T>
-struct BswapAlign<T, 2>
-{
-    using type alignas(uint16_t) = T;
-};
-
-template <typename T>
-struct BswapAlign<T, 4>
-{
-    using type alignas(uint32_t) = T;
-};
-
-template <typename T>
-struct BswapAlign<T, 8>
-{
-    using type alignas(uint64_t) = T;
-};
-
-template <typename T>
-constexpr T bswapInt(typename BswapAlign<T>::type n) noexcept
-{
-    static_assert(std::is_trivially_copyable_v<T>);
-    if constexpr (sizeof(T) == 2)
-    {
-        reinterpret_cast<uint16_t&>(n) =
-            __builtin_bswap16(reinterpret_cast<uint16_t&>(n));
-    }
-    else if constexpr (sizeof(T) == 4)
-    {
-        reinterpret_cast<uint32_t&>(n) =
-            __builtin_bswap32(reinterpret_cast<uint32_t&>(n));
-    }
-    else if constexpr (sizeof(T) == 8)
-    {
-        reinterpret_cast<uint64_t&>(n) =
-            __builtin_bswap64(reinterpret_cast<uint64_t&>(n));
-    }
-    else
-    {
-        auto b = reinterpret_cast<std::byte*>(&n);
-        std::reverse(b, b + sizeof(n));
-    }
-    return n;
-}
-
-} // namespace detail
-
-template <typename T>
-constexpr T bswap(T n) noexcept
-{
-    return detail::bswapInt<T>(n);
-}
-
-template <typename T>
-constexpr T hton(T n) noexcept
-{
-    if constexpr (std::endian::native == std::endian::big)
-    {
-        return n;
-    }
-    else if constexpr (std::endian::native == std::endian::little)
-    {
-        return bswap(n);
-    }
-    else
-    {
-        static_assert(std::is_same_v<T, void>);
-    }
-}
-
-template <typename T>
-constexpr T ntoh(T n) noexcept
-{
-    return hton(n);
-}
-
-namespace detail
-{
 inline constexpr auto charLookup = []() {
     std::array<int8_t, 256> ret;
     std::fill(ret.begin(), ret.end(), -1);
@@ -369,7 +285,7 @@
             }
         }
         addr |= di(str);
-        return {hton(addr)};
+        return {stdplus::hton(addr)};
     }
 };
 
@@ -391,7 +307,7 @@
             }
             if (loc != 0 && !str.empty())
             {
-                ret.s6_addr16[i++] = hton(di(str.substr(0, loc)));
+                ret.s6_addr16[i++] = stdplus::hton(di(str.substr(0, loc)));
             }
             if (i < 8 && str.size() > loc + 1 && str[loc + 1] == ':')
             {
@@ -422,7 +338,7 @@
         {
             auto loc = str.rfind(':');
             ret.s6_addr16[j--] =
-                hton(di(str.substr(loc == str.npos ? 0 : loc + 1)));
+                stdplus::hton(di(str.substr(loc == str.npos ? 0 : loc + 1)));
             str.remove_suffix(loc == str.npos ? str.size() : str.size() - loc);
         }
         if (!str.empty())
@@ -487,7 +403,7 @@
 
     constexpr char* operator()(char* buf, in_addr v) const noexcept
     {
-        auto n = bswap(ntoh(v.s_addr));
+        auto n = stdplus::bswap(stdplus::ntoh(v.s_addr));
         for (size_t i = 0; i < 3; ++i)
         {
             buf = ToStr<char>{}(EncodeInt<uint8_t, 10>{}(buf, n & 0xff), '.');
@@ -508,7 +424,7 @@
     {
         // IPv4 in IPv6 Addr
         if (v.s6_addr32[0] == 0 && v.s6_addr32[1] == 0 &&
-            v.s6_addr32[2] == hton(uint32_t(0xffff)))
+            v.s6_addr32[2] == stdplus::hton(uint32_t(0xffff)))
         {
             constexpr auto prefix = std::string_view("::ffff:");
             return ToStr<in_addr>{}(
@@ -553,7 +469,7 @@
                 i += skip_size - 1;
                 continue;
             }
-            buf = EncodeInt<uint16_t, 16>{}(buf, ntoh(v.s6_addr16[i]));
+            buf = EncodeInt<uint16_t, 16>{}(buf, stdplus::ntoh(v.s6_addr16[i]));
             if (i < 7)
             {
                 *(buf++) = ':';
diff --git a/test/test_rtnetlink.cpp b/test/test_rtnetlink.cpp
index a0dddfe..d5de216 100644
--- a/test/test_rtnetlink.cpp
+++ b/test/test_rtnetlink.cpp
@@ -91,7 +91,7 @@
     EXPECT_EQ(msg.ifa.ifa_flags, ret.flags);
     EXPECT_EQ(msg.ifa.ifa_scope, ret.scope);
     EXPECT_EQ(msg.ifa.ifa_index, ret.ifidx);
-    EXPECT_EQ((IfAddr{in_addr{hton(0xc0a80114)}, 28}), ret.ifaddr);
+    EXPECT_EQ((IfAddr{in_addr{stdplus::hton(0xc0a80114)}, 28}), ret.ifaddr);
 }
 
 TEST(AddrFromRtm, ExtraFlags)
@@ -139,7 +139,7 @@
 
     auto ret = neighFromRtm(stdplus::raw::asView<char>(msg));
     EXPECT_EQ(msg.ndm.ndm_state, ret.state);
-    EXPECT_EQ((in_addr{hton(0xc0a80114)}), ret.addr);
+    EXPECT_EQ((in_addr{stdplus::hton(0xc0a80114)}), ret.addr);
     EXPECT_FALSE(ret.mac);
 }
 
@@ -160,7 +160,7 @@
     msg.mac_hdr.rta_len = RTA_LENGTH(sizeof(msg.mac));
 
     auto ret = neighFromRtm(stdplus::raw::asView<char>(msg));
-    EXPECT_EQ((in_addr{hton(0xc0a80114)}), ret.addr);
+    EXPECT_EQ((in_addr{stdplus::hton(0xc0a80114)}), ret.addr);
     EXPECT_EQ((ether_addr{1, 2, 3, 4, 5, 6}), ret.mac);
 }
 
diff --git a/test/test_types.cpp b/test/test_types.cpp
index 53d05a3..675ee19 100644
--- a/test/test_types.cpp
+++ b/test/test_types.cpp
@@ -30,19 +30,6 @@
 namespace phosphor::network
 {
 
-TEST(Byteswap, Swap)
-{
-    EXPECT_EQ(38, bswap(uint8_t{38}));
-    EXPECT_EQ(38 << 8, bswap(uint16_t{38}));
-    EXPECT_EQ(0x240082fe, bswap(uint32_t{0xfe820024}));
-    EXPECT_EQ(0x240082fe00000000, bswap(uint64_t{0xfe820024}));
-    struct
-    {
-        std::array<char, 4> a = {1, 2, 3, 4};
-    } s;
-    EXPECT_EQ((std::array<char, 4>{4, 3, 2, 1}), bswap(s).a);
-}
-
 TEST(DecodeInt, uint8_10)
 {
     DecodeInt<uint8_t, 10> d;
