diff --git a/src/json.hpp b/src/json.hpp
index fd27d83f..4435102e 100644
--- a/src/json.hpp
+++ b/src/json.hpp
@@ -398,40 +398,30 @@ struct is_compatible_object_type
         typename BasicJson::object_t, CompatibleObjectType>::value;
 };
 
-template <bool B, class BasicJson, class CompatibleArrayType>
-struct is_compatible_array_type_impl : std::false_type {};
-
-template <class BasicJson, class CompatibleArrayType>
-struct is_compatible_array_type_impl<true, BasicJson, CompatibleArrayType>
+template <typename BasicJson, typename T>
+struct is_basic_json_nested_type
 {
-    static constexpr auto value =
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::const_iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::reverse_iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::const_reverse_iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::array_t::iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::array_t::const_iterator>::value;
+    static auto constexpr value = std::is_same<T, typename BasicJson::iterator>::value or
+                                  std::is_same<T, typename BasicJson::const_iterator>::value or
+                                  std::is_same<T, typename BasicJson::reverse_iterator>::value or
+                                  std::is_same<T, typename BasicJson::const_reverse_iterator>::value or
+                                  std::is_same<T, typename BasicJson::json_pointer>::value;
 };
 
 template <class BasicJson, class CompatibleArrayType>
 struct is_compatible_array_type
 {
-    // the check for CompatibleArrayType = void is done in
-    // `is_compatible_object_type`, but we need the conjunction here as well
-    static auto constexpr value = is_compatible_array_type_impl<
-        conjunction<negation<is_compatible_object_type<
+  // TODO concept Container?
+  // this might not make VS happy
+    static auto constexpr value = 
+        conjunction<negation<std::is_same<void, CompatibleArrayType>>,
+                    negation<is_compatible_object_type<
                         BasicJson, CompatibleArrayType>>,
                     negation<std::is_constructible<typename BasicJson::string_t,
                                                    CompatibleArrayType>>,
+                    negation<is_basic_json_nested_type<BasicJson, CompatibleArrayType>>,
                     has_value_type<CompatibleArrayType>,
-                    has_iterator<CompatibleArrayType>>::value,
-        BasicJson, CompatibleArrayType>::value;
+                    has_iterator<CompatibleArrayType>>::value;
 };
 
 template <bool, typename, typename>
@@ -461,16 +451,6 @@ struct is_compatible_integer_type
       RealIntegerType, CompatibleNumberIntegerType > ::value;
 };
 
-template <typename BasicJson, typename T>
-struct is_basic_json_nested_type
-{
-    static auto constexpr value = std::is_same<T, typename BasicJson::iterator>::value or
-                                  std::is_same<T, typename BasicJson::const_iterator>::value or
-                                  std::is_same<T, typename BasicJson::reverse_iterator>::value or
-                                  std::is_same<T, typename BasicJson::const_reverse_iterator>::value or
-                                  std::is_same<T, typename BasicJson::json_pointer>::value;
-};
-
 // This trait checks if JSONSerializer<T>::from_json(json const&, udt&) exists
 template <template <typename, typename> class JSONSerializer, typename Json, typename T>
 struct has_from_json
@@ -519,8 +499,6 @@ struct has_to_json
                                       detect(std::declval<JSONSerializer<T, void>>()))>::value;
 };
 
-template <typename Json, typename >
-
 // those declarations are needed to workaround a MSVC bug related to ADL
 // (taken from MSVC-Ranges implementation)
 void to_json();
@@ -737,12 +715,9 @@ template <
     typename Json, typename ArithmeticType,
     enable_if_t<
         std::is_arithmetic<ArithmeticType>::value and
-            not std::is_same<ArithmeticType,
-                             typename Json::number_unsigned_t>::value and
-            not std::is_same<ArithmeticType,
-                             typename Json::number_integer_t>::value and
-            not std::is_same<ArithmeticType,
-                             typename Json::number_float_t>::value and
+            not std::is_same<ArithmeticType, typename Json::number_unsigned_t>::value and
+            not std::is_same<ArithmeticType, typename Json::number_integer_t>::value and
+            not std::is_same<ArithmeticType, typename Json::number_float_t>::value and
             not std::is_same<ArithmeticType, typename Json::boolean_t>::value,
         int> = 0>
 void from_json(Json const &j, ArithmeticType &val)
diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index 702f3fd3..412a9b49 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -398,40 +398,30 @@ struct is_compatible_object_type
         typename BasicJson::object_t, CompatibleObjectType>::value;
 };
 
-template <bool B, class BasicJson, class CompatibleArrayType>
-struct is_compatible_array_type_impl : std::false_type {};
-
-template <class BasicJson, class CompatibleArrayType>
-struct is_compatible_array_type_impl<true, BasicJson, CompatibleArrayType>
+template <typename BasicJson, typename T>
+struct is_basic_json_nested_type
 {
-    static constexpr auto value =
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::const_iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::reverse_iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::const_reverse_iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::array_t::iterator>::value and
-        not std::is_same<CompatibleArrayType,
-        typename BasicJson::array_t::const_iterator>::value;
+    static auto constexpr value = std::is_same<T, typename BasicJson::iterator>::value or
+                                  std::is_same<T, typename BasicJson::const_iterator>::value or
+                                  std::is_same<T, typename BasicJson::reverse_iterator>::value or
+                                  std::is_same<T, typename BasicJson::const_reverse_iterator>::value or
+                                  std::is_same<T, typename BasicJson::json_pointer>::value;
 };
 
 template <class BasicJson, class CompatibleArrayType>
 struct is_compatible_array_type
 {
-    // the check for CompatibleArrayType = void is done in
-    // `is_compatible_object_type`, but we need the conjunction here as well
-    static auto constexpr value = is_compatible_array_type_impl<
-        conjunction<negation<is_compatible_object_type<
+  // TODO concept Container?
+  // this might not make VS happy
+    static auto constexpr value = 
+        conjunction<negation<std::is_same<void, CompatibleArrayType>>,
+                    negation<is_compatible_object_type<
                         BasicJson, CompatibleArrayType>>,
                     negation<std::is_constructible<typename BasicJson::string_t,
                                                    CompatibleArrayType>>,
+                    negation<is_basic_json_nested_type<BasicJson, CompatibleArrayType>>,
                     has_value_type<CompatibleArrayType>,
-                    has_iterator<CompatibleArrayType>>::value,
-        BasicJson, CompatibleArrayType>::value;
+                    has_iterator<CompatibleArrayType>>::value;
 };
 
 template <bool, typename, typename>
@@ -461,16 +451,6 @@ struct is_compatible_integer_type
       RealIntegerType, CompatibleNumberIntegerType > ::value;
 };
 
-template <typename BasicJson, typename T>
-struct is_basic_json_nested_type
-{
-    static auto constexpr value = std::is_same<T, typename BasicJson::iterator>::value or
-                                  std::is_same<T, typename BasicJson::const_iterator>::value or
-                                  std::is_same<T, typename BasicJson::reverse_iterator>::value or
-                                  std::is_same<T, typename BasicJson::const_reverse_iterator>::value or
-                                  std::is_same<T, typename BasicJson::json_pointer>::value;
-};
-
 // This trait checks if JSONSerializer<T>::from_json(json const&, udt&) exists
 template <template <typename, typename> class JSONSerializer, typename Json, typename T>
 struct has_from_json
@@ -519,8 +499,6 @@ struct has_to_json
                                       detect(std::declval<JSONSerializer<T, void>>()))>::value;
 };
 
-template <typename Json, typename >
-
 // those declarations are needed to workaround a MSVC bug related to ADL
 // (taken from MSVC-Ranges implementation)
 void to_json();
@@ -737,12 +715,9 @@ template <
     typename Json, typename ArithmeticType,
     enable_if_t<
         std::is_arithmetic<ArithmeticType>::value and
-            not std::is_same<ArithmeticType,
-                             typename Json::number_unsigned_t>::value and
-            not std::is_same<ArithmeticType,
-                             typename Json::number_integer_t>::value and
-            not std::is_same<ArithmeticType,
-                             typename Json::number_float_t>::value and
+            not std::is_same<ArithmeticType, typename Json::number_unsigned_t>::value and
+            not std::is_same<ArithmeticType, typename Json::number_integer_t>::value and
+            not std::is_same<ArithmeticType, typename Json::number_float_t>::value and
             not std::is_same<ArithmeticType, typename Json::boolean_t>::value,
         int> = 0>
 void from_json(Json const &j, ArithmeticType &val)
diff --git a/src/json.hpp.re2c.rej b/src/json.hpp.re2c.rej
new file mode 100644
index 00000000..ab8fa89d
--- /dev/null
+++ b/src/json.hpp.re2c.rej
@@ -0,0 +1,98 @@
+diff a/src/json.hpp.re2c b/src/json.hpp.re2c	(rejected hunks)
+@@ -389,40 +389,30 @@ struct is_compatible_object_type
+         typename BasicJson::object_t, CompatibleObjectType>::value;
+ };
+ 
+-template <bool B, class BasicJson, class CompatibleArrayType>
+-struct is_compatible_array_type_impl : std::false_type {};
+-
+-template <class BasicJson, class CompatibleArrayType>
+-struct is_compatible_array_type_impl<true, BasicJson, CompatibleArrayType>
++template <typename BasicJson, typename T>
++struct is_basic_json_nested_type
+ {
+-    static constexpr auto value =
+-        not std::is_same<CompatibleArrayType,
+-        typename BasicJson::iterator>::value and
+-        not std::is_same<CompatibleArrayType,
+-        typename BasicJson::const_iterator>::value and
+-        not std::is_same<CompatibleArrayType,
+-        typename BasicJson::reverse_iterator>::value and
+-        not std::is_same<CompatibleArrayType,
+-        typename BasicJson::const_reverse_iterator>::value and
+-        not std::is_same<CompatibleArrayType,
+-        typename BasicJson::array_t::iterator>::value and
+-        not std::is_same<CompatibleArrayType,
+-        typename BasicJson::array_t::const_iterator>::value;
++    static auto constexpr value = std::is_same<T, typename BasicJson::iterator>::value or
++                                  std::is_same<T, typename BasicJson::const_iterator>::value or
++                                  std::is_same<T, typename BasicJson::reverse_iterator>::value or
++                                  std::is_same<T, typename BasicJson::const_reverse_iterator>::value or
++                                  std::is_same<T, typename BasicJson::json_pointer>::value;
+ };
+ 
+ template <class BasicJson, class CompatibleArrayType>
+ struct is_compatible_array_type
+ {
+-    // the check for CompatibleArrayType = void is done in
+-    // `is_compatible_object_type`, but we need the conjunction here as well
+-    static auto constexpr value = is_compatible_array_type_impl<
+-        conjunction<negation<is_compatible_object_type<
++  // TODO concept Container?
++  // this might not make VS happy
++    static auto constexpr value = 
++        conjunction<negation<std::is_same<void, CompatibleArrayType>>,
++                    negation<is_compatible_object_type<
+                         BasicJson, CompatibleArrayType>>,
+                     negation<std::is_constructible<typename BasicJson::string_t,
+                                                    CompatibleArrayType>>,
++                    negation<is_basic_json_nested_type<BasicJson, CompatibleArrayType>>,
+                     has_value_type<CompatibleArrayType>,
+-                    has_iterator<CompatibleArrayType>>::value,
+-        BasicJson, CompatibleArrayType>::value;
++                    has_iterator<CompatibleArrayType>>::value;
+ };
+ 
+ template <bool, typename, typename>
+@@ -452,16 +442,6 @@ struct is_compatible_integer_type
+       RealIntegerType, CompatibleNumberIntegerType > ::value;
+ };
+ 
+-template <typename BasicJson, typename T>
+-struct is_basic_json_nested_type
+-{
+-    static auto constexpr value = std::is_same<T, typename BasicJson::iterator>::value or
+-                                  std::is_same<T, typename BasicJson::const_iterator>::value or
+-                                  std::is_same<T, typename BasicJson::reverse_iterator>::value or
+-                                  std::is_same<T, typename BasicJson::const_reverse_iterator>::value or
+-                                  std::is_same<T, typename BasicJson::json_pointer>::value;
+-};
+-
+ // This trait checks if JSONSerializer<T>::from_json(json const&, udt&) exists
+ template <template <typename, typename> class JSONSerializer, typename Json, typename T>
+ struct has_from_json
+@@ -510,8 +490,6 @@ struct has_to_json
+                                       detect(std::declval<JSONSerializer<T, void>>()))>::value;
+ };
+ 
+-template <typename Json, typename >
+-
+ // those declarations are needed to workaround a MSVC bug related to ADL
+ // (taken from MSVC-Ranges implementation)
+ void to_json();
+@@ -728,12 +706,9 @@ template <
+     typename Json, typename ArithmeticType,
+     enable_if_t<
+         std::is_arithmetic<ArithmeticType>::value and
+-            not std::is_same<ArithmeticType,
+-                             typename Json::number_unsigned_t>::value and
+-            not std::is_same<ArithmeticType,
+-                             typename Json::number_integer_t>::value and
+-            not std::is_same<ArithmeticType,
+-                             typename Json::number_float_t>::value and
++            not std::is_same<ArithmeticType, typename Json::number_unsigned_t>::value and
++            not std::is_same<ArithmeticType, typename Json::number_integer_t>::value and
++            not std::is_same<ArithmeticType, typename Json::number_float_t>::value and
+             not std::is_same<ArithmeticType, typename Json::boolean_t>::value,
+         int> = 0>
+ void from_json(Json const &j, ArithmeticType &val)