diff --git a/Makefile b/Makefile
index 004dc337..66023444 100644
--- a/Makefile
+++ b/Makefile
@@ -2,28 +2,28 @@
 
 SRCS = develop/json.hpp \
        develop/json_fwd.hpp \
-       develop/detail/macro_scope.hpp \
-       develop/detail/macro_unscope.hpp \
-       develop/detail/meta.hpp \
-       develop/detail/exceptions.hpp \
-       develop/detail/value_t.hpp \
+       develop/adl_serializer.hpp \
        develop/detail/conversions/from_json.hpp \
        develop/detail/conversions/to_chars.hpp \
        develop/detail/conversions/to_json.hpp \
-       develop/detail/parsing/input_adapters.hpp \
-       develop/detail/parsing/lexer.hpp \
-       develop/detail/parsing/parser.hpp \
-       develop/detail/iterators/primitive_iterator.hpp \
+       develop/detail/exceptions.hpp \
+       develop/detail/input/binary_reader.hpp \
+       develop/detail/input/input_adapters.hpp \
+       develop/detail/input/lexer.hpp \
+       develop/detail/input/parser.hpp \
        develop/detail/iterators/internal_iterator.hpp \
        develop/detail/iterators/iter_impl.hpp \
        develop/detail/iterators/iteration_proxy.hpp \
        develop/detail/iterators/json_reverse_iterator.hpp \
-       develop/detail/parsing/output_adapters.hpp \
-       develop/detail/parsing/binary_reader.hpp \
-       develop/detail/parsing/binary_writer.hpp \
-       develop/detail/serializer.hpp \
+       develop/detail/iterators/primitive_iterator.hpp \
        develop/detail/json_ref.hpp \
-       develop/adl_serializer.hpp
+       develop/detail/macro_scope.hpp \
+       develop/detail/macro_unscope.hpp \
+       develop/detail/meta.hpp \
+       develop/detail/output/binary_writer.hpp \
+       develop/detail/output/output_adapters.hpp \
+       develop/detail/output/serializer.hpp \
+       develop/detail/value_t.hpp
 
 UNAME = $(shell uname)
 CXX=clang++
diff --git a/develop/detail/parsing/binary_reader.hpp b/develop/detail/input/binary_reader.hpp
similarity index 97%
rename from develop/detail/parsing/binary_reader.hpp
rename to develop/detail/input/binary_reader.hpp
index 174528c5..dbd0b305 100644
--- a/develop/detail/parsing/binary_reader.hpp
+++ b/develop/detail/input/binary_reader.hpp
@@ -17,7 +17,6 @@
 
 #include "detail/exceptions.hpp"
 #include "detail/macro_scope.hpp"
-#include "detail/parsing/input_adapters.hpp"
 #include "detail/value_t.hpp"
 
 namespace nlohmann
@@ -64,7 +63,7 @@ class binary_reader
         if (strict)
         {
             get();
-            check_eof(true);
+            expect_eof();
         }
         return res;
     }
@@ -85,7 +84,7 @@ class binary_reader
         if (strict)
         {
             get();
-            check_eof(true);
+            expect_eof();
         }
         return res;
     }
@@ -106,7 +105,7 @@ class binary_reader
         if (strict)
         {
             get_ignore_noop();
-            check_eof(true);
+            expect_eof();
         }
         return res;
     }
@@ -205,7 +204,6 @@ class binary_reader
 
             case 0x38: // Negative integer (one-byte uint8_t follows)
             {
-                // must be uint8_t !
                 return static_cast<number_integer_t>(-1) - get_number<uint8_t>();
             }
 
@@ -396,9 +394,9 @@ class binary_reader
             case 0xF9: // Half-Precision Float (two-byte IEEE 754)
             {
                 const int byte1 = get();
-                check_eof();
+                unexpect_eof();
                 const int byte2 = get();
-                check_eof();
+                unexpect_eof();
 
                 // code from RFC 7049, Appendix D, Figure 3:
                 // As half-precision floating-point numbers were only added
@@ -831,7 +829,7 @@ class binary_reader
         for (std::size_t i = 0; i < sizeof(NumberType); ++i)
         {
             get();
-            check_eof();
+            unexpect_eof();
 
             // reverse byte order prior to conversion if necessary
             if (is_little_endian)
@@ -856,7 +854,7 @@ class binary_reader
     @param[in] len number of bytes to read
 
     @note We can not reserve @a len bytes for the result, because @a len
-          may be too large. Usually, @ref check_eof() detects the end of
+          may be too large. Usually, @ref unexpect_eof() detects the end of
           the input before we run out of string memory.
 
     @return string created by reading @a len bytes
@@ -870,7 +868,7 @@ class binary_reader
         std::generate_n(std::back_inserter(result), len, [this]()
         {
             get();
-            check_eof();
+            unexpect_eof();
             return static_cast<char>(current);
         });
         return result;
@@ -890,7 +888,7 @@ class binary_reader
     */
     std::string get_cbor_string()
     {
-        check_eof();
+        unexpect_eof();
 
         switch (current)
         {
@@ -948,7 +946,7 @@ class binary_reader
                 std::string result;
                 while (get() != 0xFF)
                 {
-                    check_eof();
+                    unexpect_eof();
                     result.push_back(static_cast<char>(current));
                 }
                 return result;
@@ -1003,7 +1001,7 @@ class binary_reader
     */
     std::string get_msgpack_string()
     {
-        check_eof();
+        unexpect_eof();
 
         switch (current)
         {
@@ -1119,7 +1117,7 @@ class binary_reader
             get();  // TODO: may we ignore N here?
         }
 
-        check_eof();
+        unexpect_eof();
 
         switch (current)
         {
@@ -1159,7 +1157,7 @@ class binary_reader
         if (current == '$')
         {
             tc = get();  // must not ignore 'N', because 'N' maybe the type
-            check_eof();
+            unexpect_eof();
 
             get_ignore_noop();
             if (current != '#')
@@ -1212,7 +1210,7 @@ class binary_reader
             case 'C':  // char
             {
                 get();
-                check_eof();
+                unexpect_eof();
                 if (JSON_UNLIKELY(current > 127))
                 {
                     std::stringstream ss;
@@ -1321,24 +1319,26 @@ class binary_reader
     }
 
     /*!
-    @brief check if input ended
+    @brief throw if end of input is not reached
+    @throw parse_error.110 if input not ended
+    */
+    void expect_eof() const
+    {
+        if (JSON_UNLIKELY(current != std::char_traits<char>::eof()))
+        {
+            JSON_THROW(parse_error::create(110, chars_read, "expected end of input"));
+        }
+    }
+
+    /*!
+    @briefthrow if end of input is reached
     @throw parse_error.110 if input ended
     */
-    void check_eof(const bool expect_eof = false) const
+    void unexpect_eof() const
     {
-        if (expect_eof)
+        if (JSON_UNLIKELY(current == std::char_traits<char>::eof()))
         {
-            if (JSON_UNLIKELY(current != std::char_traits<char>::eof()))
-            {
-                JSON_THROW(parse_error::create(110, chars_read, "expected end of input"));
-            }
-        }
-        else
-        {
-            if (JSON_UNLIKELY(current == std::char_traits<char>::eof()))
-            {
-                JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input"));
-            }
+            JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input"));
         }
     }
 
diff --git a/develop/detail/parsing/input_adapters.hpp b/develop/detail/input/input_adapters.hpp
similarity index 100%
rename from develop/detail/parsing/input_adapters.hpp
rename to develop/detail/input/input_adapters.hpp
diff --git a/develop/detail/parsing/lexer.hpp b/develop/detail/input/lexer.hpp
similarity index 99%
rename from develop/detail/parsing/lexer.hpp
rename to develop/detail/input/lexer.hpp
index de222a6c..58e40001 100644
--- a/develop/detail/parsing/lexer.hpp
+++ b/develop/detail/input/lexer.hpp
@@ -11,7 +11,7 @@
 #include <vector> // vector
 
 #include "detail/macro_scope.hpp"
-#include "detail/parsing/input_adapters.hpp"
+#include "detail/input/input_adapters.hpp"
 
 namespace nlohmann
 {
diff --git a/develop/detail/parsing/parser.hpp b/develop/detail/input/parser.hpp
similarity index 99%
rename from develop/detail/parsing/parser.hpp
rename to develop/detail/input/parser.hpp
index b0322204..799ea920 100644
--- a/develop/detail/parsing/parser.hpp
+++ b/develop/detail/input/parser.hpp
@@ -9,8 +9,8 @@
 
 #include "detail/exceptions.hpp"
 #include "detail/macro_scope.hpp"
-#include "detail/parsing/input_adapters.hpp"
-#include "detail/parsing/lexer.hpp"
+#include "detail/input/input_adapters.hpp"
+#include "detail/input/lexer.hpp"
 #include "detail/value_t.hpp"
 
 namespace nlohmann
diff --git a/develop/detail/parsing/binary_writer.hpp b/develop/detail/output/binary_writer.hpp
similarity index 99%
rename from develop/detail/parsing/binary_writer.hpp
rename to develop/detail/output/binary_writer.hpp
index 87aaffa8..63b16f3e 100644
--- a/develop/detail/parsing/binary_writer.hpp
+++ b/develop/detail/output/binary_writer.hpp
@@ -6,8 +6,8 @@
 #include <cstring> // memcpy
 #include <limits> // numeric_limits
 
-#include "detail/parsing/binary_reader.hpp"
-#include "detail/parsing/output_adapters.hpp"
+#include "detail/input/binary_reader.hpp"
+#include "detail/output/output_adapters.hpp"
 
 namespace nlohmann
 {
diff --git a/develop/detail/parsing/output_adapters.hpp b/develop/detail/output/output_adapters.hpp
similarity index 100%
rename from develop/detail/parsing/output_adapters.hpp
rename to develop/detail/output/output_adapters.hpp
diff --git a/develop/detail/serializer.hpp b/develop/detail/output/serializer.hpp
similarity index 99%
rename from develop/detail/serializer.hpp
rename to develop/detail/output/serializer.hpp
index 717399f9..84aa83af 100644
--- a/develop/detail/serializer.hpp
+++ b/develop/detail/output/serializer.hpp
@@ -17,7 +17,7 @@
 #include "detail/conversions/to_chars.hpp"
 #include "detail/macro_scope.hpp"
 #include "detail/meta.hpp"
-#include "detail/parsing/output_adapters.hpp"
+#include "detail/output/output_adapters.hpp"
 #include "detail/value_t.hpp"
 
 namespace nlohmann
diff --git a/develop/json.hpp b/develop/json.hpp
index 467cea97..2544d84d 100644
--- a/develop/json.hpp
+++ b/develop/json.hpp
@@ -48,18 +48,18 @@ SOFTWARE.
 #include "detail/value_t.hpp"
 #include "detail/conversions/from_json.hpp"
 #include "detail/conversions/to_json.hpp"
-#include "detail/parsing/input_adapters.hpp"
-#include "detail/parsing/lexer.hpp"
-#include "detail/parsing/parser.hpp"
+#include "detail/input/input_adapters.hpp"
+#include "detail/input/lexer.hpp"
+#include "detail/input/parser.hpp"
 #include "detail/iterators/primitive_iterator.hpp"
 #include "detail/iterators/internal_iterator.hpp"
 #include "detail/iterators/iter_impl.hpp"
 #include "detail/iterators/iteration_proxy.hpp"
 #include "detail/iterators/json_reverse_iterator.hpp"
-#include "detail/parsing/output_adapters.hpp"
-#include "detail/parsing/binary_reader.hpp"
-#include "detail/parsing/binary_writer.hpp"
-#include "detail/serializer.hpp"
+#include "detail/output/output_adapters.hpp"
+#include "detail/input/binary_reader.hpp"
+#include "detail/output/binary_writer.hpp"
+#include "detail/output/serializer.hpp"
 #include "detail/json_ref.hpp"
 #include "adl_serializer.hpp"
 
@@ -140,7 +140,7 @@ class json_pointer
     */
     static int array_index(const std::string& s)
     {
-        size_t processed_chars = 0;
+        std::size_t processed_chars = 0;
         const int res = std::stoi(s, &processed_chars);
 
         // check if the string was completely read
diff --git a/src/json.hpp b/src/json.hpp
index f7e3ab17..deee4504 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -1543,7 +1543,7 @@ constexpr const auto& to_json = detail::static_const<detail::to_json_fn>::value;
 }
 }
 
-// #include "detail/parsing/input_adapters.hpp"
+// #include "detail/input/input_adapters.hpp"
 
 
 #include <algorithm> // min
@@ -1808,7 +1808,7 @@ class input_adapter
 }
 }
 
-// #include "detail/parsing/lexer.hpp"
+// #include "detail/input/lexer.hpp"
 
 
 #include <clocale> // localeconv
@@ -1823,7 +1823,7 @@ class input_adapter
 
 // #include "detail/macro_scope.hpp"
 
-// #include "detail/parsing/input_adapters.hpp"
+// #include "detail/input/input_adapters.hpp"
 
 
 namespace nlohmann
@@ -3088,7 +3088,7 @@ scan_number_done:
 }
 }
 
-// #include "detail/parsing/parser.hpp"
+// #include "detail/input/parser.hpp"
 
 
 #include <cassert> // assert
@@ -3102,9 +3102,9 @@ scan_number_done:
 
 // #include "detail/macro_scope.hpp"
 
-// #include "detail/parsing/input_adapters.hpp"
+// #include "detail/input/input_adapters.hpp"
 
-// #include "detail/parsing/lexer.hpp"
+// #include "detail/input/lexer.hpp"
 
 // #include "detail/value_t.hpp"
 
@@ -4678,7 +4678,7 @@ class json_reverse_iterator : public std::reverse_iterator<Base>
 }
 }
 
-// #include "detail/parsing/output_adapters.hpp"
+// #include "detail/output/output_adapters.hpp"
 
 
 #include <algorithm> // copy
@@ -4793,7 +4793,7 @@ class output_adapter
 }
 }
 
-// #include "detail/parsing/binary_reader.hpp"
+// #include "detail/input/binary_reader.hpp"
 
 
 #include <algorithm> // generate_n
@@ -4815,8 +4815,6 @@ class output_adapter
 
 // #include "detail/macro_scope.hpp"
 
-// #include "detail/parsing/input_adapters.hpp"
-
 // #include "detail/value_t.hpp"
 
 
@@ -4864,7 +4862,7 @@ class binary_reader
         if (strict)
         {
             get();
-            check_eof(true);
+            expect_eof();
         }
         return res;
     }
@@ -4885,7 +4883,7 @@ class binary_reader
         if (strict)
         {
             get();
-            check_eof(true);
+            expect_eof();
         }
         return res;
     }
@@ -4906,7 +4904,7 @@ class binary_reader
         if (strict)
         {
             get_ignore_noop();
-            check_eof(true);
+            expect_eof();
         }
         return res;
     }
@@ -5005,7 +5003,6 @@ class binary_reader
 
             case 0x38: // Negative integer (one-byte uint8_t follows)
             {
-                // must be uint8_t !
                 return static_cast<number_integer_t>(-1) - get_number<uint8_t>();
             }
 
@@ -5196,9 +5193,9 @@ class binary_reader
             case 0xF9: // Half-Precision Float (two-byte IEEE 754)
             {
                 const int byte1 = get();
-                check_eof();
+                unexpect_eof();
                 const int byte2 = get();
-                check_eof();
+                unexpect_eof();
 
                 // code from RFC 7049, Appendix D, Figure 3:
                 // As half-precision floating-point numbers were only added
@@ -5631,7 +5628,7 @@ class binary_reader
         for (std::size_t i = 0; i < sizeof(NumberType); ++i)
         {
             get();
-            check_eof();
+            unexpect_eof();
 
             // reverse byte order prior to conversion if necessary
             if (is_little_endian)
@@ -5656,7 +5653,7 @@ class binary_reader
     @param[in] len number of bytes to read
 
     @note We can not reserve @a len bytes for the result, because @a len
-          may be too large. Usually, @ref check_eof() detects the end of
+          may be too large. Usually, @ref unexpect_eof() detects the end of
           the input before we run out of string memory.
 
     @return string created by reading @a len bytes
@@ -5670,7 +5667,7 @@ class binary_reader
         std::generate_n(std::back_inserter(result), len, [this]()
         {
             get();
-            check_eof();
+            unexpect_eof();
             return static_cast<char>(current);
         });
         return result;
@@ -5690,7 +5687,7 @@ class binary_reader
     */
     std::string get_cbor_string()
     {
-        check_eof();
+        unexpect_eof();
 
         switch (current)
         {
@@ -5748,7 +5745,7 @@ class binary_reader
                 std::string result;
                 while (get() != 0xFF)
                 {
-                    check_eof();
+                    unexpect_eof();
                     result.push_back(static_cast<char>(current));
                 }
                 return result;
@@ -5803,7 +5800,7 @@ class binary_reader
     */
     std::string get_msgpack_string()
     {
-        check_eof();
+        unexpect_eof();
 
         switch (current)
         {
@@ -5919,7 +5916,7 @@ class binary_reader
             get();  // TODO: may we ignore N here?
         }
 
-        check_eof();
+        unexpect_eof();
 
         switch (current)
         {
@@ -5959,7 +5956,7 @@ class binary_reader
         if (current == '$')
         {
             tc = get();  // must not ignore 'N', because 'N' maybe the type
-            check_eof();
+            unexpect_eof();
 
             get_ignore_noop();
             if (current != '#')
@@ -6012,7 +6009,7 @@ class binary_reader
             case 'C':  // char
             {
                 get();
-                check_eof();
+                unexpect_eof();
                 if (JSON_UNLIKELY(current > 127))
                 {
                     std::stringstream ss;
@@ -6121,24 +6118,26 @@ class binary_reader
     }
 
     /*!
-    @brief check if input ended
+    @brief throw if end of input is not reached
+    @throw parse_error.110 if input not ended
+    */
+    void expect_eof() const
+    {
+        if (JSON_UNLIKELY(current != std::char_traits<char>::eof()))
+        {
+            JSON_THROW(parse_error::create(110, chars_read, "expected end of input"));
+        }
+    }
+
+    /*!
+    @briefthrow if end of input is reached
     @throw parse_error.110 if input ended
     */
-    void check_eof(const bool expect_eof = false) const
+    void unexpect_eof() const
     {
-        if (expect_eof)
+        if (JSON_UNLIKELY(current == std::char_traits<char>::eof()))
         {
-            if (JSON_UNLIKELY(current != std::char_traits<char>::eof()))
-            {
-                JSON_THROW(parse_error::create(110, chars_read, "expected end of input"));
-            }
-        }
-        else
-        {
-            if (JSON_UNLIKELY(current == std::char_traits<char>::eof()))
-            {
-                JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input"));
-            }
+            JSON_THROW(parse_error::create(110, chars_read, "unexpected end of input"));
         }
     }
 
@@ -6158,7 +6157,7 @@ class binary_reader
 }
 }
 
-// #include "detail/parsing/binary_writer.hpp"
+// #include "detail/output/binary_writer.hpp"
 
 
 #include <algorithm> // reverse
@@ -6167,9 +6166,9 @@ class binary_reader
 #include <cstring> // memcpy
 #include <limits> // numeric_limits
 
-// #include "detail/parsing/binary_reader.hpp"
+// #include "detail/input/binary_reader.hpp"
 
-// #include "detail/parsing/output_adapters.hpp"
+// #include "detail/output/output_adapters.hpp"
 
 
 namespace nlohmann
@@ -7070,7 +7069,7 @@ class binary_writer
 }
 }
 
-// #include "detail/serializer.hpp"
+// #include "detail/output/serializer.hpp"
 
 
 #include <algorithm> // reverse, remove, fill, find, none_of
@@ -8186,7 +8185,7 @@ char* to_chars(char* first, char* last, FloatType value)
 
 // #include "detail/meta.hpp"
 
-// #include "detail/parsing/output_adapters.hpp"
+// #include "detail/output/output_adapters.hpp"
 
 // #include "detail/value_t.hpp"
 
@@ -8993,7 +8992,7 @@ class json_pointer
     */
     static int array_index(const std::string& s)
     {
-        size_t processed_chars = 0;
+        std::size_t processed_chars = 0;
         const int res = std::stoi(s, &processed_chars);
 
         // check if the string was completely read