diff --git a/http/app.h b/http/app.h
index ff8642d..86cebd3 100644
--- a/http/app.h
+++ b/http/app.h
@@ -17,7 +17,7 @@
 #include <utility>
 
 #define BMCWEB_ROUTE(app, url)                                                 \
-    app.template route<crow::black_magic::get_parameter_tag(url)>(url)
+    app.template route<crow::black_magic::getParameterTag(url)>(url)
 
 namespace crow
 {
diff --git a/http/routing.h b/http/routing.h
index f07e51b..b49e15e 100644
--- a/http/routing.h
+++ b/http/routing.h
@@ -270,7 +270,7 @@
         using type =
             std::function<void(const crow::Request&, crow::Response&, Args...)>;
         using args_type =
-            black_magic::S<typename black_magic::promote_t<Args>...>;
+            black_magic::S<typename black_magic::PromoteT<Args>...>;
     };
 
     template <typename... Args>
@@ -279,7 +279,7 @@
         using type =
             std::function<void(const crow::Request&, crow::Response&, Args...)>;
         using args_type =
-            black_magic::S<typename black_magic::promote_t<Args>...>;
+            black_magic::S<typename black_magic::PromoteT<Args>...>;
     };
 
     template <typename... Args>
@@ -288,7 +288,7 @@
         using type =
             std::function<void(const crow::Request&, crow::Response&, Args...)>;
         using args_type =
-            black_magic::S<typename black_magic::promote_t<Args>...>;
+            black_magic::S<typename black_magic::PromoteT<Args>...>;
     };
 
     typename HandlerTypeHelper<ArgsWrapped...>::type handler;
@@ -469,9 +469,9 @@
     void operator()(Func f)
     {
         using function_t = utility::function_traits<Func>;
-
         erasedHandler =
-            wrap(std::move(f), black_magic::gen_seq<function_t::arity>());
+            wrap(std::move(f),
+                 std::make_integer_sequence<unsigned, function_t::arity>{});
     }
 
     // enable_if Arg1 == request && Arg2 == Response
@@ -479,15 +479,14 @@
     // enable_if Arg1 != request
 
     template <typename Func, unsigned... Indices>
-
     std::function<void(const Request&, Response&, const RoutingParams&)>
-        wrap(Func f, black_magic::Seq<Indices...>)
+        wrap(Func f, std::integer_sequence<unsigned, Indices...>)
     {
-        using function_t = utility::function_traits<Func>;
+        using function_t = crow::utility::function_traits<Func>;
 
         if (!black_magic::isParameterTagCompatible(
-                black_magic::getParameterTagRuntime(rule.c_str()),
-                black_magic::compute_parameter_tag_from_args_list<
+                black_magic::getParameterTag(rule.c_str()),
+                black_magic::computeParameterTagFromArgsList<
                     typename function_t::template arg<Indices>...>::value))
         {
             throw std::runtime_error("routeDynamic: Handler type is mismatched "
diff --git a/http/utility.h b/http/utility.h
index 862f1db..5a184cc 100644
--- a/http/utility.h
+++ b/http/utility.h
@@ -16,102 +16,35 @@
 {
 namespace black_magic
 {
-struct OutOfRange
-{
-    OutOfRange(unsigned /*pos*/, unsigned /*length*/)
-    {}
-};
-constexpr unsigned requiresInRange(unsigned i, unsigned len)
-{
-    return i >= len ? throw OutOfRange(i, len) : i;
-}
 
-class ConstStr
-{
-    const char* const beginPtr;
-    unsigned sizeUint;
-
-  public:
-    template <unsigned N>
-    constexpr ConstStr(const char (&arr)[N]) : beginPtr(arr), sizeUint(N - 1)
-    {
-        static_assert(N >= 1, "not a string literal");
-    }
-    constexpr char operator[](unsigned i) const
-    {
-        requiresInRange(i, sizeUint);
-        return beginPtr[i];
-    }
-
-    constexpr operator const char*() const
-    {
-        return beginPtr;
-    }
-
-    constexpr const char* begin() const
-    {
-        return beginPtr;
-    }
-    constexpr const char* end() const
-    {
-        return beginPtr + sizeUint;
-    }
-
-    constexpr unsigned size() const
-    {
-        return sizeUint;
-    }
-};
-
-constexpr unsigned findClosingTag(ConstStr s, unsigned p)
+constexpr unsigned findClosingTag(std::string_view s, unsigned p)
 {
     return s[p] == '>' ? p : findClosingTag(s, p + 1);
 }
 
-constexpr bool isValid(ConstStr s, unsigned i = 0, int f = 0)
+constexpr bool isInt(std::string_view s, unsigned i)
 {
-    return i == s.size()
-               ? f == 0
-               : f < 0 || f >= 2
-                     ? false
-                     : s[i] == '<' ? isValid(s, i + 1, f + 1)
-                                   : s[i] == '>' ? isValid(s, i + 1, f - 1)
-                                                 : isValid(s, i + 1, f);
+    return s.substr(i, 5) == "<int>";
 }
 
-constexpr bool isEquN(ConstStr a, unsigned ai, ConstStr b, unsigned bi,
-                      unsigned n)
+constexpr bool isUint(std::string_view s, unsigned i)
 {
-    return ai + n > a.size() || bi + n > b.size()
-               ? false
-               : n == 0 ? true
-                        : a[ai] != b[bi] ? false
-                                         : isEquN(a, ai + 1, b, bi + 1, n - 1);
+    return s.substr(i, 6) == "<uint>";
 }
 
-constexpr bool isInt(ConstStr s, unsigned i)
+constexpr bool isFloat(std::string_view s, unsigned i)
 {
-    return isEquN(s, i, "<int>", 0, 5);
+    return s.substr(i, 7) == "<float>" || s.substr(i, 8) == "<double>";
 }
 
-constexpr bool isUint(ConstStr s, unsigned i)
+constexpr bool isStr(std::string_view s, unsigned i)
 {
-    return isEquN(s, i, "<uint>", 0, 6);
+    return s.substr(i, 5) == "<str>" || s.substr(i, 8) == "<string>";
 }
 
-constexpr bool isFloat(ConstStr s, unsigned i)
+constexpr bool isPath(std::string_view s, unsigned i)
 {
-    return isEquN(s, i, "<float>", 0, 7) || isEquN(s, i, "<double>", 0, 8);
-}
-
-constexpr bool isStr(ConstStr s, unsigned i)
-{
-    return isEquN(s, i, "<str>", 0, 5) || isEquN(s, i, "<string>", 0, 8);
-}
-
-constexpr bool isPath(ConstStr s, unsigned i)
-{
-    return isEquN(s, i, "<path>", 0, 6);
+    return s.substr(i, 6) == "<path>";
 }
 
 template <typename T>
@@ -169,26 +102,26 @@
 }
 
 template <typename... Args>
-struct compute_parameter_tag_from_args_list;
+struct computeParameterTagFromArgsList;
 
 template <>
-struct compute_parameter_tag_from_args_list<>
+struct computeParameterTagFromArgsList<>
 {
     static constexpr int value = 0;
 };
 
 template <typename Arg, typename... Args>
-struct compute_parameter_tag_from_args_list<Arg, Args...>
+struct computeParameterTagFromArgsList<Arg, Args...>
 {
     static constexpr int subValue =
-        compute_parameter_tag_from_args_list<Args...>::value;
+        computeParameterTagFromArgsList<Args...>::value;
     static constexpr int value =
         getParameterTag<typename std::decay<Arg>::type>()
             ? subValue * 6 + getParameterTag<typename std::decay<Arg>::type>()
             : subValue;
 };
 
-static inline bool isParameterTagCompatible(uint64_t a, uint64_t b)
+inline bool isParameterTagCompatible(uint64_t a, uint64_t b)
 {
     if (a == 0)
     {
@@ -215,87 +148,44 @@
     return isParameterTagCompatible(a / 6, b / 6);
 }
 
-static inline unsigned findClosingTagRuntime(const char* s, unsigned p)
+constexpr uint64_t getParameterTag(std::string_view s, unsigned p = 0)
 {
-    return s[p] == 0 ? throw std::runtime_error("unmatched tag <")
-                     : s[p] == '>' ? p : findClosingTagRuntime(s, p + 1);
-}
+    if (p == s.size())
+    {
+        return 0;
+    }
 
-static inline uint64_t getParameterTagRuntime(const char* s, unsigned p = 0)
-{
-    return s[p] == 0
-               ? 0
-               : s[p] == '<'
-                     ? (std::strncmp(s + p, "<int>", 5) == 0
-                            ? getParameterTagRuntime(
-                                  s, findClosingTagRuntime(s, p)) *
-                                      6 +
-                                  1
-                            : std::strncmp(s + p, "<uint>", 6) == 0
-                                  ? getParameterTagRuntime(
-                                        s, findClosingTagRuntime(s, p)) *
-                                            6 +
-                                        2
-                                  : (std::strncmp(s + p, "<float>", 7) == 0 ||
-                                     std::strncmp(s + p, "<double>", 8) == 0)
-                                        ? getParameterTagRuntime(
-                                              s, findClosingTagRuntime(s, p)) *
-                                                  6 +
-                                              3
-                                        : (std::strncmp(s + p, "<str>", 5) ==
-                                               0 ||
-                                           std::strncmp(s + p, "<string>", 8) ==
-                                               0)
-                                              ? getParameterTagRuntime(
-                                                    s, findClosingTagRuntime(
-                                                           s, p)) *
-                                                        6 +
-                                                    4
-                                              : std::strncmp(s + p, "<path>",
-                                                             6) == 0
-                                                    ? getParameterTagRuntime(
-                                                          s,
-                                                          findClosingTagRuntime(
-                                                              s, p)) *
-                                                              6 +
-                                                          5
-                                                    : throw std::runtime_error(
-                                                          "invalid parameter "
-                                                          "type"))
-                     : getParameterTagRuntime(s, p + 1);
-}
+    if (s[p] != '<')
+    {
+        return getParameterTag(s, p + 1);
+    }
 
-constexpr uint64_t get_parameter_tag(ConstStr s, unsigned p = 0)
-{
-    return p == s.size()
-               ? 0
-               : s[p] == '<'
-                     ? (isInt(s, p)
-                            ? get_parameter_tag(s, findClosingTag(s, p)) * 6 + 1
-                            : isUint(s, p)
-                                  ? get_parameter_tag(s, findClosingTag(s, p)) *
-                                            6 +
-                                        2
-                                  : isFloat(s, p)
-                                        ? get_parameter_tag(
-                                              s, findClosingTag(s, p)) *
-                                                  6 +
-                                              3
-                                        : isStr(s, p)
-                                              ? get_parameter_tag(
-                                                    s, findClosingTag(s, p)) *
-                                                        6 +
-                                                    4
-                                              : isPath(s, p)
-                                                    ? get_parameter_tag(
-                                                          s, findClosingTag(
-                                                                 s, p)) *
-                                                              6 +
-                                                          5
-                                                    : throw std::runtime_error(
-                                                          "invalid parameter "
-                                                          "type"))
-                     : get_parameter_tag(s, p + 1);
+    if (isInt(s, p))
+    {
+        return getParameterTag(s, findClosingTag(s, p)) * 6 + 1;
+    }
+
+    if (isUint(s, p))
+    {
+        return getParameterTag(s, findClosingTag(s, p)) * 6 + 2;
+    }
+
+    if (isFloat(s, p))
+    {
+        return getParameterTag(s, findClosingTag(s, p)) * 6 + 3;
+    }
+
+    if (isStr(s, p))
+    {
+        return getParameterTag(s, findClosingTag(s, p)) * 6 + 4;
+    }
+
+    if (isPath(s, p))
+    {
+        return getParameterTag(s, findClosingTag(s, p)) * 6 + 5;
+    }
+
+    throw std::runtime_error("invalid parameter type");
 }
 
 template <typename... T>
@@ -308,8 +198,10 @@
     template <template <typename... Args> class U>
     using rebind = U<T...>;
 };
+
 template <typename F, typename Set>
 struct CallHelper;
+
 template <typename F, typename... Args>
 struct CallHelper<F, S<Args...>>
 {
@@ -371,129 +263,65 @@
     using type = S<>;
 };
 
-template <typename... T>
-struct LastElementType
-{
-    using type =
-        typename std::tuple_element<sizeof...(T) - 1, std::tuple<T...>>::type;
-};
-
-template <>
-struct LastElementType<>
-{};
-
-// from
-// http://stackoverflow.com/questions/13072359/c11-compile-time-array-with-logarithmic-evaluation-depth
-template <class T>
-using Invoke = typename T::type;
-
-template <unsigned...>
-struct Seq
-{
-    using type = Seq;
-};
-
-template <class S1, class S2>
-struct concat;
-
-template <unsigned... I1, unsigned... I2>
-struct concat<Seq<I1...>, Seq<I2...>> : Seq<I1..., (sizeof...(I1) + I2)...>
-{};
-
-template <class S1, class S2>
-using Concat = Invoke<concat<S1, S2>>;
-
-template <size_t N>
-struct gen_seq;
-template <size_t N>
-using GenSeq = Invoke<gen_seq<N>>;
-
-template <size_t N>
-struct gen_seq : Concat<GenSeq<N / 2>, GenSeq<N - N / 2>>
-{};
-
-template <>
-struct gen_seq<0> : Seq<>
-{};
-template <>
-struct gen_seq<1> : Seq<0>
-{};
-
-template <typename Seq, typename Tuple>
-struct PopBackHelper;
-
-template <unsigned... N, typename Tuple>
-struct PopBackHelper<Seq<N...>, Tuple>
-{
-    template <template <typename... Args> class U>
-    using rebind = U<typename std::tuple_element<N, Tuple>::type...>;
-};
-
-template <typename... T>
-struct PopBack //: public PopBackHelper<typename
-               // gen_seq<sizeof...(T)-1>::type, std::tuple<T...>>
-{
-    template <template <typename... Args> class U>
-    using rebind =
-        typename PopBackHelper<typename gen_seq<sizeof...(T) - 1UL>::type,
-                               std::tuple<T...>>::template rebind<U>;
-};
-
-template <>
-struct PopBack<>
-{
-    template <template <typename... Args> class U>
-    using rebind = U<>;
-};
-
-// from
-// http://stackoverflow.com/questions/2118541/check-if-c0x-parameter-pack-contains-a-type
-template <typename Tp, typename... List>
-struct Contains : std::true_type
-{};
-
-template <typename Tp, typename Head, typename... Rest>
-struct Contains<Tp, Head, Rest...> :
-    std::conditional<std::is_same<Tp, Head>::value, std::true_type,
-                     Contains<Tp, Rest...>>::type
-{};
-
-template <typename Tp>
-struct Contains<Tp> : std::false_type
-{};
-
 template <typename T>
-struct EmptyContext
-{};
-
-template <typename T>
-struct promote
+struct Promote
 {
     using type = T;
 };
 
-#define BMCWEB_INTERNAL_PROMOTE_TYPE(t1, t2)                                   \
-    template <>                                                                \
-    struct promote<t1>                                                         \
-    {                                                                          \
-        using type = t2;                                                       \
-    }
-
-BMCWEB_INTERNAL_PROMOTE_TYPE(char, int64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(short, int64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(int, int64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(long, int64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(long long, int64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(unsigned char, uint64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(unsigned short, uint64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(unsigned int, uint64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(unsigned long, uint64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(unsigned long long, uint64_t);
-BMCWEB_INTERNAL_PROMOTE_TYPE(float, double);
-#undef BMCWEB_INTERNAL_PROMOTE_TYPE
-
 template <typename T>
-using promote_t = typename promote<T>::type;
+using PromoteT = typename Promote<T>::type;
+
+template <>
+struct Promote<char>
+{
+    using type = int64_t;
+};
+template <>
+struct Promote<short>
+{
+    using type = int64_t;
+};
+template <>
+struct Promote<int>
+{
+    using type = int64_t;
+};
+template <>
+struct Promote<long>
+{
+    using type = int64_t;
+};
+template <>
+struct Promote<long long>
+{
+    using type = int64_t;
+};
+template <>
+struct Promote<unsigned char>
+{
+    using type = uint64_t;
+};
+template <>
+struct Promote<unsigned short>
+{
+    using type = uint64_t;
+};
+template <>
+struct Promote<unsigned int>
+{
+    using type = uint64_t;
+};
+template <>
+struct Promote<unsigned long>
+{
+    using type = uint64_t;
+};
+template <>
+struct Promote<unsigned long long>
+{
+    using type = uint64_t;
+};
 
 } // namespace black_magic
 
@@ -576,57 +404,6 @@
     using arg = typename std::tuple_element<i, std::tuple<Args...>>::type;
 };
 
-inline static std::string base64encode(
-    const char* data, size_t size,
-    const char* key =
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")
-{
-    std::string ret;
-    ret.resize((size + 2) / 3 * 4);
-    auto it = ret.begin();
-    while (size >= 3)
-    {
-        *it++ = key[(static_cast<unsigned char>(*data) & 0xFC) >> 2];
-        unsigned char h = static_cast<unsigned char>(
-            (static_cast<unsigned char>(*data++) & 0x03u) << 4u);
-        *it++ = key[h | ((static_cast<unsigned char>(*data) & 0xF0) >> 4)];
-        h = static_cast<unsigned char>(
-            (static_cast<unsigned char>(*data++) & 0x0F) << 2u);
-        *it++ = key[h | ((static_cast<unsigned char>(*data) & 0xC0) >> 6)];
-        *it++ = key[static_cast<unsigned char>(*data++) & 0x3F];
-
-        size -= 3;
-    }
-    if (size == 1)
-    {
-        *it++ = key[(static_cast<unsigned char>(*data) & 0xFC) >> 2];
-        unsigned char h = static_cast<unsigned char>(
-            (static_cast<unsigned char>(*data++) & 0x03) << 4u);
-        *it++ = key[h];
-        *it++ = '=';
-        *it++ = '=';
-    }
-    else if (size == 2)
-    {
-        *it++ = key[(static_cast<unsigned char>(*data) & 0xFC) >> 2];
-        unsigned char h = static_cast<unsigned char>(
-            (static_cast<unsigned char>(*data++) & 0x03) << 4u);
-        *it++ = key[h | ((static_cast<unsigned char>(*data) & 0xF0) >> 4)];
-        h = static_cast<unsigned char>(
-            (static_cast<unsigned char>(*data++) & 0x0F) << 2u);
-        *it++ = key[h];
-        *it++ = '=';
-    }
-    return ret;
-}
-
-inline static std::string base64encodeUrlsafe(const char* data, size_t size)
-{
-    return base64encode(
-        data, size,
-        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_");
-}
-
 // TODO this is temporary and should be deleted once base64 is refactored out of
 // crow
 inline bool base64Decode(const std::string_view input, std::string& output)
diff --git a/src/crow_test.cpp b/src/crow_test.cpp
index 4e0bd40..a685220 100644
--- a/src/crow_test.cpp
+++ b/src/crow_test.cpp
@@ -98,19 +98,19 @@
     static_assert(black_magic::isValid("<int><int><int>"), "valid url");
     static_assert(!black_magic::isValid("<int><int<<int>"), "invalid url");
     static_assert(!black_magic::isValid("nt>"), "invalid url");
-    ASSERT_EQUAL(1, black_magic::get_parameter_tag("<int>"));
-    ASSERT_EQUAL(2, black_magic::get_parameter_tag("<uint>"));
-    ASSERT_EQUAL(3, black_magic::get_parameter_tag("<float>"));
-    ASSERT_EQUAL(3, black_magic::get_parameter_tag("<double>"));
-    ASSERT_EQUAL(4, black_magic::get_parameter_tag("<str>"));
-    ASSERT_EQUAL(4, black_magic::get_parameter_tag("<string>"));
-    ASSERT_EQUAL(5, black_magic::get_parameter_tag("<path>"));
+    ASSERT_EQUAL(1, black_magic::getParameterTag("<int>"));
+    ASSERT_EQUAL(2, black_magic::getParameterTag("<uint>"));
+    ASSERT_EQUAL(3, black_magic::getParameterTag("<float>"));
+    ASSERT_EQUAL(3, black_magic::getParameterTag("<double>"));
+    ASSERT_EQUAL(4, black_magic::getParameterTag("<str>"));
+    ASSERT_EQUAL(4, black_magic::getParameterTag("<string>"));
+    ASSERT_EQUAL(5, black_magic::getParameterTag("<path>"));
     ASSERT_EQUAL(6 * 6 + 6 + 1,
-                 black_magic::get_parameter_tag("<int><int><int>"));
+                 black_magic::getParameterTag("<int><int><int>"));
     ASSERT_EQUAL(6 * 6 + 6 + 2,
-                 black_magic::get_parameter_tag("<uint><int><int>"));
+                 black_magic::getParameterTag("<uint><int><int>"));
     ASSERT_EQUAL(6 * 6 + 6 * 3 + 2,
-                 black_magic::get_parameter_tag("<uint><double><int>"));
+                 black_magic::getParameterTag("<uint><double><int>"));
 
     // url definition parsed in compile time, build into *one number*, and given
     // to template argument
