diff --git a/http/routing.h b/http/routing.h
index cc5c75f..b2729ef 100644
--- a/http/routing.h
+++ b/http/routing.h
@@ -1,5 +1,12 @@
 #pragma once
 
+#include "common.h"
+#include "http_request.h"
+#include "http_response.h"
+#include "logging.h"
+#include "utility.h"
+#include "websocket.h"
+
 #include "error_messages.hpp"
 #include "privileges.hpp"
 #include "sessions.hpp"
@@ -8,6 +15,7 @@
 #include <boost/container/flat_map.hpp>
 #include <boost/container/small_vector.hpp>
 #include <boost/lexical_cast.hpp>
+
 #include <cerrno>
 #include <cstdint>
 #include <cstdlib>
@@ -17,13 +25,6 @@
 #include <utility>
 #include <vector>
 
-#include "common.h"
-#include "http_request.h"
-#include "http_response.h"
-#include "logging.h"
-#include "utility.h"
-#include "websocket.h"
-
 namespace crow
 {
 
@@ -34,8 +35,7 @@
 {
   public:
     BaseRule(std::string thisRule) : rule(std::move(thisRule))
-    {
-    }
+    {}
 
     virtual ~BaseRule() = default;
 
@@ -99,20 +99,23 @@
     std::unique_ptr<BaseRule> ruleToUpgrade;
 
     friend class Router;
-    template <typename T> friend struct RuleParameterTraits;
+    template <typename T>
+    friend struct RuleParameterTraits;
 };
 
 namespace detail
 {
 namespace routing_handler_call_helper
 {
-template <typename T, int Pos> struct CallPair
+template <typename T, int Pos>
+struct CallPair
 {
     using type = T;
     static const int pos = Pos;
 };
 
-template <typename H1> struct CallParams
+template <typename H1>
+struct CallParams
 {
     H1& handler;
     const RoutingParams& params;
@@ -123,8 +126,7 @@
 template <typename F, int NInt, int NUint, int NDouble, int NString,
           typename S1, typename S2>
 struct Call
-{
-};
+{};
 
 template <typename F, int NInt, int NUint, int NDouble, int NString,
           typename... Args1, typename... Args2>
@@ -195,7 +197,8 @@
     }
 };
 
-template <typename Func, typename... ArgsWrapped> struct Wrapped
+template <typename Func, typename... ArgsWrapped>
+struct Wrapped
 {
     template <typename... Args>
     void set(
@@ -213,11 +216,11 @@
         };
     }
 
-    template <typename Req, typename... Args> struct ReqHandlerWrapper
+    template <typename Req, typename... Args>
+    struct ReqHandlerWrapper
     {
         ReqHandlerWrapper(Func f) : f(std::move(f))
-        {
-        }
+        {}
 
         void operator()(const Request& req, Response& res, Args... args)
         {
@@ -264,7 +267,8 @@
         handler = std::move(f);
     }
 
-    template <typename... Args> struct HandlerTypeHelper
+    template <typename... Args>
+    struct HandlerTypeHelper
     {
         using type =
             std::function<void(const crow::Request&, crow::Response&, Args...)>;
@@ -312,12 +316,10 @@
 
   public:
     WebSocketRule(std::string rule) : BaseRule(std::move(rule))
-    {
-    }
+    {}
 
     void validate() override
-    {
-    }
+    {}
 
     void handle(const Request&, Response& res, const RoutingParams&) override
     {
@@ -351,25 +353,29 @@
     }
 #endif
 
-    template <typename Func> self_t& onopen(Func f)
+    template <typename Func>
+    self_t& onopen(Func f)
     {
         openHandler = f;
         return *this;
     }
 
-    template <typename Func> self_t& onmessage(Func f)
+    template <typename Func>
+    self_t& onmessage(Func f)
     {
         messageHandler = f;
         return *this;
     }
 
-    template <typename Func> self_t& onclose(Func f)
+    template <typename Func>
+    self_t& onclose(Func f)
     {
         closeHandler = f;
         return *this;
     }
 
-    template <typename Func> self_t& onerror(Func f)
+    template <typename Func>
+    self_t& onerror(Func f)
     {
         errorHandler = f;
         return *this;
@@ -386,7 +392,8 @@
     std::function<void(crow::websocket::Connection&)> errorHandler;
 };
 
-template <typename T> struct RuleParameterTraits
+template <typename T>
+struct RuleParameterTraits
 {
     using self_t = T;
     WebSocketRule& websocket()
@@ -444,8 +451,7 @@
 {
   public:
     DynamicRule(std::string rule) : BaseRule(std::move(rule))
-    {
-    }
+    {}
 
     void validate() override
     {
@@ -462,7 +468,8 @@
         erasedHandler(req, res, params);
     }
 
-    template <typename Func> void operator()(Func f)
+    template <typename Func>
+    void operator()(Func f)
     {
         using function_t = utility::function_traits<Func>;
 
@@ -497,7 +504,8 @@
         return ret;
     }
 
-    template <typename Func> void operator()(std::string name, Func&& f)
+    template <typename Func>
+    void operator()(std::string name, Func&& f)
     {
         nameStr = std::move(name);
         (*this).template operator()<Func>(std::forward(f));
@@ -509,15 +517,15 @@
 };
 
 template <typename... Args>
-class TaggedRule : public BaseRule,
-                   public RuleParameterTraits<TaggedRule<Args...>>
+class TaggedRule :
+    public BaseRule,
+    public RuleParameterTraits<TaggedRule<Args...>>
 {
   public:
     using self_t = TaggedRule<Args...>;
 
     TaggedRule(std::string ruleIn) : BaseRule(std::move(ruleIn))
-    {
-    }
+    {}
 
     void validate() override
     {
@@ -606,7 +614,8 @@
         handler = std::move(f);
     }
 
-    template <typename Func> void operator()(std::string name, Func&& f)
+    template <typename Func>
+    void operator()(std::string name, Func&& f)
     {
         nameStr = std::move(name);
         (*this).template operator()<Func>(std::forward(f));
@@ -647,8 +656,7 @@
     };
 
     Trie() : nodes(1)
-    {
-    }
+    {}
 
   private:
     void optimizeNode(Node* node)
@@ -1406,8 +1414,7 @@
         // rule index 0, 1 has special meaning; preallocate it to avoid
         // duplication.
         PerMethod() : rules(2)
-        {
-        }
+        {}
     };
     std::array<PerMethod, maxHttpVerbCount> perMethods;
     std::vector<std::unique_ptr<BaseRule>> allRules;
