diff --git a/src/json.hpp.re2c b/src/json.hpp.re2c
index a733f097..474cb750 100644
--- a/src/json.hpp.re2c
+++ b/src/json.hpp.re2c
@@ -2416,6 +2416,19 @@ class basic_json
         return is_number_float() ? &m_value.number_float : nullptr;
     }
 
+	/// helper function to implement get_ref without code duplication 
+	/// for const and non-const overloads
+	/// ThisType will be deduced as 'basic_jason' or 'const basic_json'
+	template<typename ReferenceType, typename ThisType>
+    static ReferenceType get_ref_impl(ThisType& obj)
+    {
+		using PointerType = std::add_pointer<ReferenceType>::type;
+        // delegate the call to get_ptr<>()
+        auto ptr = obj.get_ptr<PointerType>();
+		if (ptr) return *ptr;
+		throw std::domain_error("incompatible ReferenceType for get_ref, actual type is " + obj.type_name());
+    }
+
   public:
 
     /// @name value access
@@ -2563,6 +2576,52 @@ class basic_json
         return get_impl_ptr(static_cast<const PointerType>(nullptr));
     }
 
+	/*!
+    @brief get a reference value (implicit)
+
+    Implict reference access to the internally stored JSON value. No copies are
+    made.
+
+    @warning Writing data to the referee of the result yields an undefined
+    state.
+
+    @tparam ReferenceType reference type; must be a reference to @ref array_t, @ref
+    object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or @ref
+    number_float_t.
+
+    @return reference to the internally stored JSON value if the requested reference
+    type @a ReferenceType fits to the JSON value; throws std::domain_error otherwise
+
+	@throw std::domain_error in case passed type @a ReferenceType is incompatible
+    with the stored JSON value
+
+    @complexity Constant.
+    */
+    template<typename ReferenceType, typename
+             std::enable_if<
+                 std::is_reference<ReferenceType>::value
+                 , int>::type = 0>
+    ReferenceType get_ref()
+    {
+		// delegate call to get_ref_impl
+		return get_ref_impl<ReferenceType>(*this);
+    }
+
+    /*!
+    @brief get a reference value (implicit)
+    @copydoc get_ref()
+    */
+    template<typename ReferenceType, typename
+             std::enable_if<
+                 std::is_reference<ReferenceType>::value
+                 and std::is_const< typename std::remove_reference<ReferenceType>::type >::value
+                 , int>::type = 0>
+    ReferenceType get_ref() const
+    {
+		// delegate call to get_ref_impl
+		return get_ref_impl<ReferenceType>(*this);
+    }
+
     /*!
     @brief get a value (implicit)