diff --git a/.appveyor.yml b/.appveyor.yml
new file mode 100644
index 0000000..9b5fc0a
--- /dev/null
+++ b/.appveyor.yml
@@ -0,0 +1,40 @@
+
+shallow_clone: true
+
+os:
+  - Visual Studio 2017
+
+build:
+  verbosity: detailed
+
+branches:
+  only:
+    - master
+
+install:
+  ############################################################################
+  # Install EiffelStudio 
+  ############################################################################
+  - mkdir C:\projects\eiffel
+  - cd C:\projects\eiffel
+
+  - set EIFFELSTUDIO_URL="https://ftp.eiffel.com/pub/download/17.05/Eiffel_17.05_gpl_100416-win64.7z"
+  - appveyor DownloadFile %EIFFELSTUDIO_URL% -FileName eiffel_studio.zip
+  - 7z x eiffel_studio.zip -oC:\projects\eiffel\ > nul
+  - cmd: set ISE_C_COMPILER=msc_vc140
+  - cmd: set ISE_PLATFORM=win64
+  - cmd: set ISE_EIFFEL=C:\projects\eiffel\Eiffel_17.05 
+  - cmd: set PATH=%PATH%;%ISE_EIFFEL%/studio/spec/%ISE_PLATFORM%/bin;
+  - cmd: set PATH=%PATH%;%ISE_EIFFEL%/tools/spec/%ISE_PLATFORM%/bin;
+  - ec -version
+  - compile_all -version
+
+before_build:
+  - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" amd64
+
+build_script:
+  - cd C:\projects
+  - git clone https://github.com/jvelilla/HAL
+  - cd HAL
+  - compile_all -ecb -melt -list_failures -clean -options dotnet=false
+
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..2afd697
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,21 @@
+language: eiffel
+before_script:
+  - export current_dir=$PWD ; echo current_dir=$current_dir ; cd ..
+  - export ISE_PLATFORM=linux-x86-64
+  - curl -sSL https://www.eiffel.org/setup/install.sh | bash > eiffel.rc
+  - source ./eiffel.rc
+  - echo `ec -version`
+  - cd $current_dir
+
+# safelist
+branches:
+  only:
+  - master
+  - develop
+
+script: 
+  #compile code  
+  - compile_all -ecb -melt -list_failures -log_verbose -clean -options dotnet=false
+  #testing
+  - ec -config test/test_suite.ecf -c_compile -tests 
+
diff --git a/README b/README
deleted file mode 100644
index 38c5335..0000000
--- a/README
+++ /dev/null
@@ -1,8 +0,0 @@
-Eiffel HAL is a library to work with  http://stateless.co/hal_specification.html#json
-
-HAL is used for exposing RESTful hypermedia APIs. Right now the current implementation only support 
-JSON_HAL
-
-References
-http://tools.ietf.org/html/draft-kelly-json-hal-06
-http://stateless.co/hal_specification.html#json
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..d74ad56
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+[![Build Status](https://travis-ci.org/EiffelWebFramework/HAL.svg?branch=master)](https://travis-ci.org/EiffelWebFramework/HAL/)
+[![AppVeyor status](https://ci.appveyor.com/api/projects/status/01094sp8soowwpku?svg=true)](https://ci.appveyor.com/project/jvelilla/hal-gahly)
+
+Eiffel HAL is a library to work with  http://stateless.co/hal_specification.html#json
+
+HAL is used for exposing RESTful hypermedia APIs. Right now the current implementation only support 
+JSON_HAL
+
+References
+http://tools.ietf.org/html/draft-kelly-json-hal-08
+http://stateless.co/hal_specification.html#json
diff --git a/library/converter/hal_resource_json_deserializer.e b/library/converter/hal_resource_json_deserializer.e
new file mode 100644
index 0000000..2635d17
--- /dev/null
+++ b/library/converter/hal_resource_json_deserializer.e
@@ -0,0 +1,335 @@
+note
+	description: "Summary description for {HAL_RESOURCE_JSON_DESERIALIZER}."
+	date: "$Date$"
+	revision: "$Revision$"
+
+class
+	HAL_RESOURCE_JSON_DESERIALIZER
+
+inherit
+	JSON_DESERIALIZER
+
+	HAL_ACCESS
+
+feature -- Conversion
+
+	from_json (a_json: detachable JSON_VALUE; ctx: JSON_DESERIALIZER_CONTEXT; a_type: detachable TYPE [detachable ANY]): detachable HAL_RESOURCE
+			-- Eiffel value deserialized from `a_json' value, in the eventual context `ctx'.
+		local
+			l_list: LIST [HAL_RESOURCE]
+			js: JSON_STRING
+			l_table: STRING_TABLE [detachable ANY]
+			l_array: ARRAY [detachable ANY]
+		do
+			if attached {JSON_OBJECT} a_json as j then
+				create Result.make
+				across
+					j.current_keys as ic
+				loop
+					js := ic.item
+					if
+						not (js.is_equal (links_key) or js.is_equal (embedded_key)) and then
+						attached j.item (js) as j_rep
+					then
+						if attached {JSON_STRING} j_rep as js_rep then
+							Result.add_string_field (js.item, js_rep.unescaped_string_32)
+						elseif attached {JSON_NUMBER} j_rep as jn_rep then
+							if jn_rep.is_integer then
+								Result.add_integer_field (js.item, jn_rep.integer_64_item)
+							elseif jn_rep.is_double then
+								Result.add_real_field (js.item, jn_rep.real_64_item)
+							else -- natural	
+								Result.add_natural_field (js.item, jn_rep.natural_64_item)
+							end
+						elseif attached {JSON_BOOLEAN} j_rep as jb_rep then
+							Result.add_boolean_field (js.item, jb_rep.item)
+						elseif attached {JSON_NULL} j_rep as jnull then
+							Result.add_null_field (js.item)
+						else
+								-- HAL reference fields: JSON_OBJECT or JSON_ARRAY
+							if attached {JSON_OBJECT} j_rep as j_object then
+								create l_table.make (1)
+								add_reference_field (j_object, l_table)
+								Result.add_object_field (js.item, l_table)
+							elseif attached {JSON_ARRAY} j_rep as j_array  then
+								create l_array.make_filled ({ANY}, 1, j_array.count)
+								add_reference_field (j_array, l_array)
+								Result.add_array_field (js.item, l_array)
+							else
+								check known_json_value: False end
+							end
+						end
+					end
+				end
+
+				if attached {JSON_OBJECT} j.item (links_key) as l_links then
+					Result.add_all_links (from_json_link (l_links, ctx))
+				end
+
+				if attached {JSON_OBJECT} j.item (embedded_key) as l_embedded then
+					across
+						l_embedded.current_keys as ic
+					loop
+						js := ic.item
+						if attached {JSON_OBJECT} l_embedded.item (js) as jo then
+							create {ARRAYED_LIST [HAL_RESOURCE]} l_list.make (1)
+							if attached from_json (jo, ctx, Void) as jo_r then
+								l_list.force (jo_r)
+								Result.add_embedded_resources_with_key (js.item, l_list)
+							end
+						elseif attached {JSON_ARRAY} l_embedded.item (js) as jea then
+							create {ARRAYED_LIST [HAL_RESOURCE]} l_list.make (jea.count)
+							across
+								jea as jea_ic
+							loop
+								if
+									attached {JSON_OBJECT} jea_ic.item as jeai and then
+									attached from_json (jeai, ctx, Void) as jeai_r
+								then
+									l_list.force (jeai_r)
+								end
+							end
+							Result.add_embedded_resources_with_key (js.item, l_list)
+						end
+					end
+				end
+			end
+		end
+
+feature {NONE} -- Converter implementation
+
+	from_json_link (j: JSON_OBJECT; ctx: detachable JSON_DESERIALIZER_CONTEXT): STRING_TABLE [HAL_LINK]
+		local
+			l_keys: ARRAY [JSON_STRING]
+			js: JSON_STRING
+			i, k: INTEGER
+			l_link: HAL_LINK
+		do
+			create Result.make (2)
+			from
+				i := 1
+				l_keys := j.current_keys
+			until
+				i > l_keys.count
+			loop
+				js := l_keys [i]
+				if
+					attached {JSON_OBJECT} j.item (js) as jo and then
+					attached new_link_attributes (jo, ctx) as la
+				then
+					create l_link.make_with_attribute (js.item, la)
+					Result.force (l_link, js.item)
+				elseif attached {JSON_ARRAY} j.item (js) as ja then
+					create l_link.make (l_keys [i].item)
+					from
+						k := 1
+					until
+						k > ja.count
+					loop
+						if
+							attached {JSON_OBJECT} ja.i_th (k) as ji and then
+							attached new_link_attributes (ji, ctx) as lai
+						then
+							l_link.add_attribute (lai)
+						end
+						k := k + 1
+					end
+					Result.force (l_link, js.item)
+				end
+				i := i + 1
+			end
+		end
+
+	new_link_attributes (j: JSON_OBJECT; ctx: detachable JSON_DESERIALIZER_CONTEXT): detachable HAL_LINK_ATTRIBUTE
+			-- create an object LINK_ATTRIBUTE from a JSON_OBJECT
+		do
+				--|TODO refactor to make it simpler
+			if attached {JSON_STRING} j.item (href_key) as j_href then
+				create Result.make (j_href.item)
+				if attached {JSON_STRING} j.item (name_key) as j_name then
+					Result.set_name (j_name.item)
+				end
+				if attached {JSON_STRING} j.item (title_key) as j_title then
+					Result.set_title (j_title.item)
+				end
+				if attached {JSON_STRING} j.item (hreflang_key) as j_hreflang then
+					Result.set_hreflang (j_hreflang.item)
+				end
+				if attached {JSON_BOOLEAN} j.item (templated_key) as j_templated then
+					Result.set_templated (j_templated.item)
+				end
+				if attached {JSON_STRING} j.item (type_key) as j_type then
+					Result.set_type (j_type.item)
+				end
+				if attached {JSON_STRING} j.item (deprecation_key) as j_deprecation then
+					Result.set_deprecation (j_deprecation.item)
+				end
+				if attached {JSON_STRING} j.item (profile_key) as j_profile then
+					Result.set_profile (j_profile.item)
+				end
+			end
+		end
+
+	add_reference_field (a_value: JSON_VALUE; a_reference: ANY )
+			-- Add the field represented by `a_value' (a JSON_OBJECT or JSON_ARRAY)
+			-- into the corresponding `a_reference' data structure (STRING_TABLE [ANY]
+			-- or ARRAY [ANY]).
+			-- Raise a developer exception if it found an unexpected value.
+
+		local
+			js: JSON_STRING
+			l_table: STRING_TABLE [detachable ANY]
+			l_array: ARRAY [detachable ANY]
+			i: INTEGER
+		do
+			if
+				attached {JSON_OBJECT} a_value as j and then
+				attached {STRING_TABLE [detachable ANY]} a_reference as a_table
+			then
+				across
+					j.current_keys as ic
+				loop
+					js := ic.item
+					if
+						attached j.item (js) as j_rep
+					then
+						if attached {JSON_STRING} j_rep as js_rep then
+							a_table.force (js_rep.unescaped_string_32, js.item)
+						elseif attached {JSON_NUMBER} j_rep as jn_rep then
+							if jn_rep.is_integer then
+								a_table.force (jn_rep.integer_64_item, js.item)
+							elseif jn_rep.is_double then
+								a_table.force (jn_rep.real_64_item, js.item)
+							else -- natural	
+								a_table.force (jn_rep.natural_64_item, js.item)
+							end
+						elseif attached {JSON_BOOLEAN} j_rep as jb_rep then
+							a_table.force (jb_rep.item, js.item)
+						elseif attached {JSON_NULL} j_rep as jnull then
+							a_table.force ("null",js.item)
+						else
+								-- JSON_OBJECT
+							if attached {JSON_OBJECT} j_rep as j_object then
+								create l_table.make (1)
+								add_reference_field (j_object, l_table)
+								a_table.force (l_table, js.item)
+								-- JSON_ARRAY
+							elseif attached {JSON_ARRAY} j_rep as j_array  then
+								create l_array.make_filled ({ANY}, 1, j_array.count)
+								add_reference_field (j_array, l_array)
+								a_table.force (l_array, js.item)
+							else
+									-- Unexpected value
+								check known_json_value: False end
+							end
+						end
+					end
+				end
+			elseif
+				attached {JSON_ARRAY} a_value as j_array and then
+				attached {ARRAY [detachable ANY]} a_reference as a_array
+			then
+				i := 1
+				across j_array as ic  loop
+					if attached {JSON_STRING} ic.item as js_rep then
+						a_array.force (js_rep, i)
+					elseif attached {JSON_NUMBER} ic.item as jn_rep then
+						if jn_rep.is_integer then
+							a_array.force (jn_rep.integer_64_item, i)
+						elseif jn_rep.is_double then
+							a_array.force (jn_rep.real_64_item, i)
+						else -- natural	
+							a_array.force (jn_rep.natural_64_item, i)
+						end
+					elseif attached {JSON_BOOLEAN} ic.item as jb_rep then
+						a_array.force (jb_rep.item, i)
+					elseif attached {JSON_NULL} ic.item as jnull then
+						a_array.force ("null", i)
+					else
+							-- JSON_OBJECT
+						if attached {JSON_OBJECT} ic.item as j_object then
+							create l_table.make (1)
+							add_reference_field (ic.item, l_table)
+							a_array.force (l_table, i)
+							-- JSON_ARRAY
+						elseif attached {JSON_ARRAY} ic.item as j_arr  then
+							create l_array.make_filled ({ANY}, 1, j_array.count)
+							add_reference_field (j_array, l_array)
+							a_array.force (l_array, i)
+						else
+								-- Unexpected value
+							check known_json_value: False end
+						end
+					end
+					i := i + 1
+				end
+			end
+		end
+
+feature {NONE} -- Implementation: RESOURCE
+
+	links_key: JSON_STRING
+		once
+			create Result.make_from_string ("_links")
+		end
+
+	embedded_key: JSON_STRING
+		once
+			create Result.make_from_string ("_embedded")
+		end
+
+feature {NONE} -- Implementation: LINK
+
+	href_key: JSON_STRING
+		once
+			create Result.make_from_string ("href")
+		end
+
+	ref_key: JSON_STRING
+		once
+			create Result.make_from_String ("ref")
+		end
+
+feature {NONE} -- Implementation: LINK_ATTRIBUTE
+
+	name_key: JSON_STRING
+		once
+			create Result.make_from_string("name")
+		end
+
+	title_key: JSON_STRING
+		once
+			create Result.make_from_string ("title")
+		end
+
+	hreflang_key: JSON_STRING
+		once
+			create Result.make_from_string ("hreflang")
+		end
+
+	templated_key: JSON_STRING
+		once
+			create Result.make_from_string ("templated")
+		end
+
+	type_key: JSON_STRING
+		once
+			create Result.make_from_string ("type")
+		end
+
+	deprecation_key: JSON_STRING
+		once
+			create Result.make_from_string ("deprecation")
+		end
+
+	profile_key: JSON_STRING
+		once
+			create Result.make_from_string ("profile")
+		end
+
+	curies_key: JSON_STRING
+		once
+			create Result.make_from_string ("curies")
+		end
+
+end
diff --git a/library/converter/hal_resource_json_serializer.e b/library/converter/hal_resource_json_serializer.e
new file mode 100644
index 0000000..7e1baf3
--- /dev/null
+++ b/library/converter/hal_resource_json_serializer.e
@@ -0,0 +1,233 @@
+note
+	description: "Summary description for {HAL_RESOURCE_JSON_SERIALIZER}."
+	author: ""
+	date: "$Date$"
+	revision: "$Revision$"
+
+class
+	HAL_RESOURCE_JSON_SERIALIZER
+
+inherit
+	JSON_SERIALIZER
+
+	HAL_ACCESS
+
+feature -- Convertion
+
+	to_json (obj: detachable ANY; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+			-- JSON value representing the JSON serialization of Eiffel value `obj', in the eventual context `ctx'.	
+		local
+			jo: JSON_OBJECT
+		do
+			if attached {HAL_RESOURCE} obj as o then
+				create jo.make
+				jo.put (to_json_links (o.links, ctx), links_key)
+				if attached o.embedded_resource as l_embedded_resource then
+					jo.put (to_json_embedded_resource (l_embedded_resource, ctx), embedded_key)
+				end
+				if attached o.fields as l_fields then
+					across
+						l_fields as ic
+					loop
+						jo.put (to_json_value (ic.item), ic.key)
+					end
+				end
+				Result := jo
+			else
+				create {JSON_NULL} Result
+			end
+		end
+
+feature {NONE} -- Converter implementation
+
+	to_json_embedded_resource (a_embedded_resource: TABLE_ITERABLE [LIST [HAL_RESOURCE], READABLE_STRING_GENERAL]; ctx: JSON_SERIALIZER_CONTEXT): JSON_OBJECT
+		do
+			create Result.make
+			across
+				a_embedded_resource as ic
+			loop
+				Result.put (to_json_embedded_resource_internal (ic.item, ctx), ic.key)
+			end
+		end
+
+	to_json_embedded_resource_internal (a_resource: LIST [HAL_RESOURCE]; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			l_result_arr: JSON_ARRAY
+		do
+			create {JSON_ARRAY} l_result_arr.make_empty
+			across
+				a_resource as ic
+			loop
+				if attached to_json (ic.item, ctx) as l_iter then
+					l_result_arr.add (l_iter)
+				end
+			end
+			Result := l_result_arr
+		end
+
+	to_json_links (a_links: TABLE_ITERABLE [HAL_LINK, READABLE_STRING_GENERAL]; ctx: JSON_SERIALIZER_CONTEXT): JSON_OBJECT
+		do
+			create Result.make
+			across
+				a_links as ic
+			loop
+				if ic.key.is_case_insensitive_equal (curies_key.item) then
+					Result.put (to_json_link_curies (ic.item, ctx), ic.key)
+				else
+					Result.put (to_json_link_internal (ic.item, ctx), ic.key)
+				end
+			end
+		end
+
+	to_json_link_internal (a_link: HAL_LINK; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			l_result_arr: JSON_ARRAY
+		do
+			if attached a_link.attributes as l_attribs then
+				if l_attribs.count = 1 then
+					Result := to_json_link_attribute (l_attribs.first, ctx)
+				else
+					create {JSON_ARRAY} l_result_arr.make_empty
+					across
+						l_attribs as ic
+					loop
+						l_result_arr.add (to_json_link_attribute (ic.item, ctx))
+					end
+					Result := l_result_arr
+				end
+			else
+				create {JSON_NULL} Result
+			end
+		end
+
+	to_json_link_curies (a_link: HAL_LINK; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			l_result_arr: JSON_ARRAY
+		do
+			create {JSON_ARRAY} l_result_arr.make_empty
+			if attached a_link.attributes as l_attribs then
+				across
+					l_attribs as ic
+				loop
+					l_result_arr.add (to_json_link_attribute (ic.item, ctx))
+				end
+			end
+			Result := l_result_arr
+		end
+
+	to_json_link_attribute (a_link_attribute: HAL_LINK_ATTRIBUTE; ctx: JSON_SERIALIZER_CONTEXT): JSON_OBJECT
+		do
+			create Result.make
+			if attached a_link_attribute.name as l_name then
+				Result.put_string (l_name, name_key)
+			end
+			Result.put_string (a_link_attribute.href, href_key)
+			if attached a_link_attribute.hreflang as l_hreflang then
+				Result.put_string (l_hreflang, hreflang_key)
+			end
+			if attached a_link_attribute.title as l_title then
+				Result.put_string (l_title, title_key)
+			end
+			if attached a_link_attribute.templated as l_templated then
+				Result.put_boolean (l_templated, templated_key)
+			end
+			if attached a_link_attribute.deprecation as l_deprecation then
+				Result.put_string (l_deprecation, deprecation_key)
+			end
+			if attached a_link_attribute.type as l_type then
+				Result.put_string (l_type, type_key)
+			end
+			if attached a_link_attribute.profile as l_profile then
+				Result.put_string (l_profile, profile_key)
+			end
+
+		end
+
+	to_json_value (a_obj: detachable ANY): JSON_VALUE
+			-- Convert an object `a_obj' to JSON_VALUE representation.
+		local
+			obj: ANY
+			conv_to: JSON_REFLECTOR_SERIALIZER
+			ctx: detachable JSON_SERIALIZER_CONTEXT
+		do
+			obj := a_obj
+
+				-- Auto serialization, handling table iterable as JSON Object, and iterable as ARRAY. Without typename.
+			create conv_to
+			create ctx
+			ctx.set_pretty_printing
+			ctx.set_is_type_name_included (False)
+			ctx.set_default_serializer (create {JSON_REFLECTOR_SERIALIZER})
+			ctx.register_serializer (create {TABLE_ITERABLE_JSON_SERIALIZER [detachable ANY, READABLE_STRING_GENERAL]}, {TABLE_ITERABLE [detachable ANY, READABLE_STRING_GENERAL]})
+			ctx.register_serializer (create {ITERABLE_JSON_SERIALIZER [detachable ANY]}, {ITERABLE [detachable ANY]})
+
+			Result := conv_to.to_json (obj, ctx)
+		end
+
+feature {NONE} -- Implementation: RESOURCE
+
+	links_key: JSON_STRING
+		once
+			create Result.make_from_string ("_links")
+		end
+
+	embedded_key: JSON_STRING
+		once
+			create Result.make_from_string ("_embedded")
+		end
+
+feature {NONE} -- Implementation: LINK
+
+	href_key: JSON_STRING
+		once
+			create Result.make_from_string ("href")
+		end
+
+	ref_key: JSON_STRING
+		once
+			create Result.make_from_String ("ref")
+		end
+
+feature {NONE} -- Implementation: LINK_ATTRIBUTE
+
+	name_key: JSON_STRING
+		once
+			create Result.make_from_string("name")
+		end
+
+	title_key: JSON_STRING
+		once
+			create Result.make_from_string ("title")
+		end
+
+	hreflang_key: JSON_STRING
+		once
+			create Result.make_from_string ("hreflang")
+		end
+
+	templated_key: JSON_STRING
+		once
+			create Result.make_from_string ("templated")
+		end
+
+	type_key: JSON_STRING
+		once
+			create Result.make_from_string ("type")
+		end
+
+	deprecation_key: JSON_STRING
+		once
+			create Result.make_from_string ("deprecation")
+		end
+
+	profile_key: JSON_STRING
+		once
+			create Result.make_from_string ("profile")
+		end
+
+	curies_key: JSON_STRING
+		once
+			create Result.make_from_string ("curies")
+		end
+
+end
diff --git a/library/converter/json_hal_resource_converter.e b/library/converter/json_hal_resource_converter.e
index 2766316..b31821f 100644
--- a/library/converter/json_hal_resource_converter.e
+++ b/library/converter/json_hal_resource_converter.e
@@ -10,8 +10,7 @@ class
 	JSON_HAL_RESOURCE_CONVERTER
 
 inherit
-
-	JSON_CONVERTER
+	HAL_ACCESS
 
 create
 	make
@@ -20,356 +19,30 @@ feature {NONE} -- Initialization
 
 	make
 		do
-			create object.make
 		end
 
 feature -- Access
 
-	object: HAL_RESOURCE
-
-	value: detachable JSON_OBJECT
-
-	from_json (j: attached like value): detachable like object
+	from_json (j: JSON_VALUE): detachable HAL_RESOURCE
 			-- Convert from JSON value. Returns Void if unable to convert
 		local
-			l_list: LIST [like object]
-			j_array, l_embedded_keys: ARRAY [JSON_STRING]
-			js: JSON_STRING
-			i, k, l: INTEGER
+			ser: HAL_RESOURCE_JSON_DESERIALIZER
+			ctx: JSON_DESERIALIZER_CONTEXT
 		do
-				--| TODO: Refactor to make it simpler
-			create Result.make
-			from
-				i := 1
-				j_array := j.current_keys
-			until
-				i > j_array.count
-			loop
-				js := j_array [i]
-				if
-					not (js.is_equal (links_key) or js.is_equal (embedded_key)) and then
-					attached j.item (js) as l_rep
-				then
-					Result.add_fields (js.item, l_rep.representation)
-				end
-				i := i + 1
-			end
-			if attached {JSON_OBJECT} j.item (links_key) as ll_links then
-				Result.add_all_links (from_json_link (ll_links))
-			end
-			if attached {JSON_OBJECT} j.item (embedded_key) as ll_embedded then
-				from
-					k := 1
-					l_embedded_keys := ll_embedded.current_keys
-				until
-					k > l_embedded_keys.count
-				loop
-					js := l_embedded_keys [k]
-					if attached {JSON_OBJECT} ll_embedded.item (js) as jo then
-						create {ARRAYED_LIST [like object]} l_list.make (1)
-						if attached from_json (jo) as jo_r then
-							l_list.force (jo_r)
-							Result.add_embedded_resources_with_key (js.item, l_list)
-						end
-					elseif attached {JSON_ARRAY} ll_embedded.item (js) as jea then
-						create {ARRAYED_LIST [like object]} l_list.make (jea.count)
-						from
-							l := 1
-						until
-							l > jea.count
-						loop
-							if
-								attached {JSON_OBJECT} jea.i_th (l) as jeai and then
-								attached from_json (jeai) as jeai_r
-							then
-								l_list.force (jeai_r)
-							end
-							l := l + 1
-						end
-						Result.add_embedded_resources_with_key (js.item, l_list)
-					end
-					k := k + 1
-				end
-			end
+			create ser
+			create ctx
+			Result := ser.from_json (j, ctx, Void)
 		end
 
-	to_json (o: like object): like value
+	to_json (o: HAL_RESOURCE): JSON_VALUE
 			-- Convert to JSON value
-		do
-			create Result.make
-			Result.put (to_json_links (o.links), links_key)
-			if attached o.embedded_resource as l_embedded_resource then
-				Result.put (to_json_embedded_resource (l_embedded_resource), embedded_key)
-			end
-			if attached o.fields as l_properties then
-				from
-					l_properties.start
-				until
-					l_properties.after
-				loop
-					Result.put (json.value (l_properties.item_for_iteration), l_properties.key_for_iteration)
-					l_properties.forth
-				end
-			end
-		end
-
-feature {NONE} -- Converter implementation
-
-	to_json_embedded_resource (an_embedded_resource: HASH_TABLE [LIST [HAL_RESOURCE], STRING]): JSON_OBJECT
-		do
-			create Result.make
-			from
-				an_embedded_resource.start
-			until
-				an_embedded_resource.after
-			loop
-				Result.put (to_json_embedded_resource_internal (an_embedded_resource.item_for_iteration), an_embedded_resource.key_for_iteration)
-				an_embedded_resource.forth
-			end
-		end
-
-	to_json_embedded_resource_internal (a_resource: LIST [HAL_RESOURCE]): JSON_VALUE
-		local
-			l_result_arr: JSON_ARRAY
-		do
-			if a_resource.count = 1 then
-				create {JSON_OBJECT} Result.make
-				if attached to_json (a_resource.at (1)) as l_res then
-					Result := l_res
-				end
-			else
-				create {JSON_ARRAY} l_result_arr.make_empty
-				from
-					a_resource.start
-				until
-					a_resource.after
-				loop
-					if attached to_json (a_resource.item_for_iteration) as l_iter then
-						l_result_arr.add (l_iter)
-					end
-					a_resource.forth
-				end
-				Result := l_result_arr
-			end
-		end
-
-	to_json_links (a_links: HASH_TABLE [HAL_LINK, STRING]): JSON_OBJECT
-		do
-			create Result.make
-			from
-				a_links.start
-			until
-				a_links.after
-			loop
-				if a_links.key_for_iteration.is_case_insensitive_equal (curies_key.item) then
-					Result.put (to_json_link_curies (a_links.item_for_iteration), a_links.key_for_iteration)
-				else
-					Result.put (to_json_link_internal (a_links.item_for_iteration), a_links.key_for_iteration)
-				end
-				a_links.forth
-			end
-		end
-
-	to_json_link_internal (a_link: HAL_LINK): JSON_VALUE
-		local
-			l_result_arr: JSON_ARRAY
-		do
-			if a_link.attributes.count = 1 then
-				Result := to_json_link_attribute (a_link.attributes.first)
-			else
-				create {JSON_ARRAY} l_result_arr.make_empty
-				from
-					a_link.attributes.start
-				until
-					a_link.attributes.after
-				loop
-					l_result_arr.add (to_json_link_attribute (a_link.attributes.item_for_iteration))
-					a_link.attributes.forth
-				end
-				Result := l_result_arr
-			end
-		end
-
-	to_json_link_curies (a_link: HAL_LINK): JSON_VALUE
 		local
-			l_result_arr: JSON_ARRAY
+			ser: HAL_RESOURCE_JSON_SERIALIZER
+			ctx: JSON_SERIALIZER_CONTEXT
 		do
-			create {JSON_ARRAY} l_result_arr.make_empty
-			from
-				a_link.attributes.start
-			until
-				a_link.attributes.after
-			loop
-				l_result_arr.add (to_json_link_attribute (a_link.attributes.item_for_iteration))
-				a_link.attributes.forth
-			end
-			Result := l_result_arr
-		end
-
-	to_json_link_attribute (a_link_attribute: HAL_LINK_ATTRIBUTE): JSON_OBJECT
-		do
-			create Result.make
-			if attached a_link_attribute.name as l_name then
-				Result.put (json.value (a_link_attribute.name), name_key)
-			end
-			Result.put (json.value (a_link_attribute.href), href_key)
-			if attached a_link_attribute.hreflang as l_hreflang then
-				Result.put (json.value (a_link_attribute.hreflang), hreflang_key)
-			end
-			if attached a_link_attribute.title as l_title then
-				Result.put (json.value (a_link_attribute.title), title_key)
-			end
-			if attached a_link_attribute.templated as l_templated then
-				Result.put (json.value (a_link_attribute.templated), templated_key)
-			end
-			if attached a_link_attribute.deprecation as l_deprecation then
-				Result.put (json.value (a_link_attribute.deprecation), deprecation_key)
-			end
-			if attached a_link_attribute.type as l_type then
-				Result.put (json.value (a_link_attribute.type), type_key)
-			end
-			if attached a_link_attribute.profile as l_profile then
-				Result.put (json.value (a_link_attribute.profile), profile_key)
-			end
-
-		end
-
-	from_json_link (j: attached like value): HASH_TABLE [HAL_LINK, STRING]
-		local
-			l_keys: ARRAY [JSON_STRING]
-			js: JSON_STRING
-			i, k: INTEGER
-			l_link: HAL_LINK
-		do
-			create Result.make (2)
-			from
-				i := 1
-				l_keys := j.current_keys
-			until
-				i > l_keys.count
-			loop
-				js := l_keys [i]
-				if
-					attached {JSON_OBJECT} j.item (js) as jo and then
-					attached create_link_attributes (jo) as la
-				then
-					create l_link.make_with_attribute (js.item, la)
-					Result.force (l_link, js.item)
-				elseif attached {JSON_ARRAY} j.item (js) as ja then
-					create l_link.make (l_keys [i].item)
-					from
-						k := 1
-					until
-						k > ja.count
-					loop
-						if
-							attached {JSON_OBJECT} ja.i_th (k) as ji and then
-							attached create_link_attributes (ji) as lai
-						then
-							l_link.add_attribute (lai)
-						end
-						k := k + 1
-					end
-					Result.force (l_link, js.item)
-				end
-				i := i + 1
-			end
-		end
-
-	create_link_attributes (j: JSON_OBJECT): detachable HAL_LINK_ATTRIBUTE
-			-- create an object LINK_ATTRIBUTE from a JSON_OBJECT
-		do
-				--|TODO refactor to make it simpler
-			if attached {JSON_STRING} j.item (href_key) as j_href then
-				create Result.make (j_href.item)
-				if attached {JSON_STRING} j.item (name_key) as j_name then
-					Result.set_name (j_name.item)
-				end
-				if attached {JSON_STRING} j.item (title_key) as j_title then
-					Result.set_title (j_title.item)
-				end
-				if attached {JSON_STRING} j.item (hreflang_key) as j_hreflang then
-					Result.set_hreflang (j_hreflang.item)
-				end
-				if attached {JSON_BOOLEAN} j.item (templated_key) as j_templated then
-					Result.set_templated (j_templated.item)
-				end
-				if attached {JSON_STRING} j.item (type_key) as j_type then
-					Result.set_type (j_type.item)
-				end
-				if attached {JSON_STRING} j.item (deprecation_key) as j_deprecation then
-					Result.set_deprecation (j_deprecation.item)
-				end
-				if attached {JSON_STRING} j.item (profile_key) as j_profile then
-					Result.set_profile (j_profile.item)
-				end
-			end
-		end
-
-feature {NONE} -- Implementation: RESOURCE
-
-	links_key: JSON_STRING
-		once
-			create Result.make_from_string ("_links")
-		end
-
-	embedded_key: JSON_STRING
-		once
-			create Result.make_from_string ("_embedded")
-		end
-
-feature {NONE} -- Implementation: LINK
-
-	href_key: JSON_STRING
-		once
-			create Result.make_from_string ("href")
-		end
-
-	ref_key: JSON_STRING
-		once
-			create Result.make_from_String ("ref")
-		end
-
-feature {NONE} -- Implementation: LINK_ATTRIBUTE
-
-	name_key: JSON_STRING
-		once
-			create Result.make_from_string("name")
-		end
-
-	title_key: JSON_STRING
-		once
-			create Result.make_from_string ("title")
-		end
-
-	hreflang_key: JSON_STRING
-		once
-			create Result.make_from_string ("hreflang")
-		end
-
-	templated_key: JSON_STRING
-		once
-			create Result.make_from_string ("templated")
-		end
-
-	type_key: JSON_STRING
-		once
-			create Result.make_from_string ("type")
-		end
-
-	deprecation_key: JSON_STRING
-		once
-			create Result.make_from_string ("deprecation")
-		end
-
-	profile_key: JSON_STRING
-		once
-			create Result.make_from_string ("profile")
-		end
-
-	curies_key: JSON_STRING
-		once
-			create Result.make_from_string ("curies")
+			create ser
+			create ctx
+			Result := ser.to_json (o, ctx)
 		end
 
 end
diff --git a/library/hal-safe.ecf b/library/hal-safe.ecf
index e59d2e5..7d6696d 100644
--- a/library/hal-safe.ecf
+++ b/library/hal-safe.ecf
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-14-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-14-0 http://www.eiffel.com/developers/xml/configuration-1-14-0.xsd" name="hal" uuid="94C384A6-8CAD-48C2-B448-EFA81264AFFD" library_target="hal">
+<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="hal" uuid="94C384A6-8CAD-48C2-B448-EFA81264AFFD" library_target="hal">
 	<target name="hal">
 		<root all_classes="true"/>
-		<option warning="true" full_class_checking="false" is_attached_by_default="true" void_safety="all" syntax="standard">
+		<option warning="true">
 			<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
 		</option>
+
 		<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
 		<library name="json" location="$ISE_LIBRARY\contrib\library\text\parser\json\library\json-safe.ecf"/>
 		<library name="uri_template" location="$ISE_LIBRARY\contrib\library\text\parser\uri_template\uri_template-safe.ecf"/>
diff --git a/library/hal.ecf b/library/hal.ecf
index e55331f..21cf784 100644
--- a/library/hal.ecf
+++ b/library/hal.ecf
@@ -1,10 +1,12 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-9-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-9-0 http://www.eiffel.com/developers/xml/configuration-1-9-0.xsd" name="hal" uuid="94C384A6-8CAD-48C2-B448-EFA81264AFFD" library_target="hal">
+<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="hal" uuid="94C384A6-8CAD-48C2-B448-EFA81264AFFD" library_target="hal">
+
 	<target name="hal">
 		<root all_classes="true"/>
-		<option warning="true" syntax="transitional">
+		<option warning="true">
 			<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
 		</option>
+
 		<library name="base" location="$ISE_LIBRARY\library\base\base.ecf"/>
 		<library name="json" location="$ISE_LIBRARY\contrib\library\text\parser\json\library\json.ecf"/>
 		<library name="uri_template" location="$ISE_LIBRARY\contrib\library\text\parser\uri_template\uri_template.ecf"/>
diff --git a/library/hal.rc b/library/hal.rc
deleted file mode 100644
index b0ec159..0000000
--- a/library/hal.rc
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <windows.h>
-
-STRINGTABLE
-BEGIN
-	1 "This Program was made using EiffelStudio using Visual Studio C++"
-END
diff --git a/library/hal_access.e b/library/hal_access.e
new file mode 100644
index 0000000..1f82eca
--- /dev/null
+++ b/library/hal_access.e
@@ -0,0 +1,9 @@
+note
+	description: "Summary description for {HAL_ACCESS}."
+	date: "$Date$"
+	revision: "$Revision$"
+
+deferred class
+	HAL_ACCESS
+
+end
diff --git a/library/hal_link_attribute.e b/library/hal_link_attribute.e
index fcea24a..2ba4fb1 100644
--- a/library/hal_link_attribute.e
+++ b/library/hal_link_attribute.e
@@ -15,7 +15,7 @@ feature {NONE} -- Initialization
 
 	make (a_ref: STRING)
 			-- Create a link attribute with an href and
-			-- set if it's a tempalted uri or just a uri.
+			-- set if it's a templated uri or just a uri.
 		do
 			set_href (a_ref)
 			set_templated (is_uri_template)
@@ -63,7 +63,7 @@ feature -- Access
 			-- Its value is a string which is a URI that hints about the profile (as
    			-- defined by [I-D.wilde-profile-link]) of the target resource.	
 
-	title: detachable STRING
+	title: detachable READABLE_STRING_32
 			--@title
 			--OPTIONAL
 			--For labeling the destination of a link with a human-readable identifier.
@@ -123,12 +123,12 @@ feature -- Element change
 			profile_set: profile = a_profile
 		end
 
-	set_title (a_title: STRING)
+	set_title (a_title: READABLE_STRING_GENERAL)
 			-- Set title with `a_title'
 		do
-			title := a_title
+			create {STRING_32} title.make_from_string_general (a_title)
 		ensure
-			assigned: title = a_title
+			assigned: attached title as l_title and then l_title.is_case_insensitive_equal_general (a_title)
 		end
 
 	set_hreflang (a_hreflang: STRING)
@@ -139,7 +139,6 @@ feature -- Element change
 			assigned: hreflang = a_hreflang
 		end
 
-
 feature {NONE} -- Implementation
 
 	is_uri_template: BOOLEAN
diff --git a/library/hal_resource.e b/library/hal_resource.e
index 37088b6..398ebed 100644
--- a/library/hal_resource.e
+++ b/library/hal_resource.e
@@ -24,7 +24,7 @@ feature {NONE} -- Initialization
 		end
 
 	make_with_link (a_link: HAL_LINK)
-			-- Create a new resource with his self.link `a_link'
+			-- Create a new resource with his self.link `a_link'.
 		do
 			make
 			add_link_with_key ("self", a_link)
@@ -54,8 +54,6 @@ feature -- Access
 			valid: Result /= Void
 		end
 
-
-
 	curies: detachable HAL_LINK
 			-- Return the curies link
 			-- For example if you have the following JSON representation
@@ -82,7 +80,7 @@ feature -- Access
 		end
 
 
-	links_keys: ARRAY [STRING]
+	links_keys: ARRAY [READABLE_STRING_GENERAL]
 			-- Return an array of keys, ie rel attributes
 			-- For example if you have the following JSON representation
 			--
@@ -100,7 +98,14 @@ feature -- Access
 			Result := links.current_keys
 		end
 
-	links_by_key (a_key: STRING): detachable HAL_LINK
+	links_by_key (a_key: READABLE_STRING_GENERAL): detachable HAL_LINK
+		obsolete
+			"Use `link_by_key` [2017-11-31]"
+		do
+			Result := link_by_key (a_key)
+		end
+
+	link_by_key (a_key: READABLE_STRING_GENERAL): detachable HAL_LINK
 			-- Retrieve a link given a `a_key', ie a rel attribute if it exist,
 			-- Void in othercase
 			-- For example if you have the following JSON representation
@@ -119,56 +124,225 @@ feature -- Access
 			Result := links.at (a_key)
 		end
 
-	embedded_resources_keys: detachable ARRAY [STRING]
-			-- Retrieve an arrray of resource keys, if exist,
-			-- Void in othercase
+	embedded_resources_keys: detachable ARRAY [READABLE_STRING_GENERAL]
+			-- Retrieve an arrray of resource keys, if exist,Void in other case.
 		do
 			if attached embedded_resource as er then
 				Result := er.current_keys
 			end
 		end
 
-	embedded_resources_by_key (a_key: STRING): detachable LIST [HAL_RESOURCE]
-			-- Return a list embedded resources if it exist or Void in other case
+	embedded_resources_by_key (a_key: READABLE_STRING_GENERAL): detachable LIST [HAL_RESOURCE]
+			-- Return a list embedded resources if it exist or Void in other case.
 		do
 			if attached embedded_resource as er then
-				Result := er.at (a_key)
+				Result := er [a_key]
 			end
 		end
 
-	fields_keys: detachable ARRAY [STRING]
-			-- Return an array of fields keys if exist,
-			-- Void in othercase
+	fields_keys: detachable ARRAY [READABLE_STRING_GENERAL]
+			-- Return an array of fields keys if exist, Void in other case.
 		do
 			if attached fields as p then
 				Result := p.current_keys
 			end
 		end
 
-	fields_by_key (a_key: STRING): detachable STRING
-			-- Return a string value, if key `a_key' exists
-			-- Void in othercase
+	fields_by_key (a_key: READABLE_STRING_GENERAL): detachable READABLE_STRING_32
+			-- Return a string value, if key `a_key' exists, Void in other case.
+		obsolete
+			"Use `field_by_key` or `*_field` [2017-11-31]."
 		do
-			if attached fields as p then
-				Result := p.at (a_key)
+			if attached {STRING_32} field_by_key (a_key) as l_value then
+				Result := l_value
 			end
 		end
 
-feature -- Element Change
+	field_by_key (a_key: READABLE_STRING_GENERAL): detachable ANY
+			-- Return a value, if key `a_key' exists, Void in other case.
+		do
+			if attached fields as l_fields then
+				Result := l_fields [a_key]
+			end
+		end
 
-	add_all_links (all_link: HASH_TABLE [HAL_LINK, STRING])
+	integer_field (a_key: READABLE_STRING_GENERAL): INTEGER_64
+			-- Return a value, if key `a_key' exists and is integer.
+		require
+			is_field_integer: is_integer_field (a_key)
 		do
-			links.copy (all_link)
+			if attached {INTEGER_64} field_by_key (a_key) as l_value then
+				Result := l_value
+			elseif attached {INTEGER_32} field_by_key (a_key) as l_value then
+				Result := l_value.to_integer_64
+			elseif attached {INTEGER_16} field_by_key (a_key) as l_value then
+				Result := l_value.to_integer_64
+			elseif attached {INTEGER_8} field_by_key (a_key) as l_value then
+				Result := l_value.to_integer_64
+			end
 		end
 
-	add_link_with_key (a_key: STRING; a_link: HAL_LINK)
-			-- add an (a_key,a_link) pair
-			-- require a_key is_equal a_link.rel
+	real_field (a_key: READABLE_STRING_GENERAL): REAL_64
+			-- Return a value, if key `a_key' exists and is real.
+		require
+			is_field_real: is_real_field (a_key)
 		do
-			links.force (a_link, a_key)
+			if attached {REAL_64} field_by_key (a_key) as l_value then
+				Result := l_value
+			elseif attached {REAL_32} field_by_key (a_key) as l_value then
+				Result := l_value.to_double
+			end
 		end
 
-	add_link (a_link: HAL_LINK)
+	natural_field (a_key: READABLE_STRING_GENERAL): NATURAL_64
+			-- Return a value, if key `a_key' exists and is natural.
+		require
+			is_field_natural: is_natural_field (a_key)
+		do
+			if attached {NATURAL_64} field_by_key (a_key) as l_value then
+				Result := l_value
+			elseif attached {NATURAL_32} field_by_key (a_key) as l_value then
+				Result := l_value.to_natural_64
+			elseif attached {NATURAL_16} field_by_key (a_key) as l_value then
+				Result := l_value.to_natural_64
+			elseif attached {NATURAL_8} field_by_key (a_key) as l_value then
+				Result := l_value.to_natural_64
+			end
+		end
+
+	boolean_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- Return a value, if key `a_key' exists and is boolean.
+		require
+			is_field_boolean: is_boolean_field (a_key)
+		do
+			if attached {BOOLEAN} field_by_key (a_key) as l_value then
+				Result := l_value
+			end
+		end
+
+	string_field (a_key: READABLE_STRING_GENERAL): detachable STRING_32
+			-- Return a value, if key `a_key' exists and is string.
+		require
+			is_field_string: is_string_field (a_key)
+		do
+			if attached {READABLE_STRING_GENERAL} field_by_key (a_key) as l_value then
+				Result := l_value.to_string_32
+			end
+		end
+
+	object_field (a_key: READABLE_STRING_GENERAL): detachable STRING_TABLE [detachable ANY]
+			-- Return a value, if key `a_key' exists and is an object reference.
+		require
+			is_field_object: is_object_field (a_key)
+		do
+			if attached {STRING_TABLE [detachable ANY]} field_by_key (a_key) as l_value then
+				Result := l_value
+			end
+		end
+
+	array_field (a_key: READABLE_STRING_GENERAL): detachable ARRAY [detachable ANY]
+			-- Return a value, if key `a_key' exists and is an array reference.
+		require
+			is_field_array: is_array_field (a_key)
+		do
+			if attached {ARRAY [detachable ANY]} field_by_key (a_key) as l_value then
+				Result := l_value
+			end
+		end
+
+feature -- Status Report
+
+	is_integer_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' integer?
+		do
+			if
+				attached {INTEGER_64} field_by_key (a_key) or else
+				attached {INTEGER_32} field_by_key (a_key) or else
+				attached {INTEGER_8} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+	is_real_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' real?
+		do
+			if
+				attached {REAL_64} field_by_key (a_key) or else
+				attached {REAL_32} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+	is_natural_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' natural?
+		do
+			if
+				attached {NATURAL_64} field_by_key (a_key) or else
+				attached {NATURAL_32} field_by_key (a_key) or else
+				attached {NATURAL_16} field_by_key (a_key) or else
+				attached {NATURAL_8} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+	is_boolean_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' boolean?
+		do
+			if
+				attached {BOOLEAN} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+	is_string_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' string?
+		do
+			if
+				attached {READABLE_STRING_32} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+	is_object_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' string_table?
+		do
+			if
+				attached {STRING_TABLE [detachable ANY]} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+	is_array_field (a_key: READABLE_STRING_GENERAL): BOOLEAN
+			-- is the field `a_key' array?
+		do
+			if
+				attached {ARRAY [detachable ANY]} field_by_key (a_key)
+			then
+				Result := True
+			end
+		end
+
+feature -- Element Change
+
+	add_all_links (all_link: STRING_TABLE [HAL_LINK])
+			-- add all_links `all_link' to `links'.
+		do
+			across
+				all_link as ic
+			loop
+				add_link_with_key (ic.key, ic.item)
+			end
+		end
+
+	add_link_with_key (a_key: READABLE_STRING_GENERAL; a_link: HAL_LINK)
+			-- add an (a_key,a_link) pair
+			-- require a_key is_equal a_link.rel
 		local
 			l_links: like links
 		do
@@ -177,48 +351,148 @@ feature -- Element Change
 				create l_links.make (10)
 				l_links.compare_objects
 				links := l_links
+			elseif
+				l_links.has (a_link.rel) and then
+				attached {HAL_LINK} l_links [a_link.rel] as l_hal
+			then
+				l_hal.attributes.append (a_link.attributes)
+				l_links := Void
 			end
-			if l_links.has (a_link.rel) then
-				if attached {HAL_LINK} l_links.at (a_link.rel) as l_hal then
-					l_hal.attributes.append (a_link.attributes)
-				end
-			else
-				l_links.force (a_link, a_link.rel)
+			if l_links /= Void then
+				l_links.force (a_link, a_key)
 			end
 		end
 
+	add_link (a_link: HAL_LINK)
+			-- Add a link `a_link' to the `links'.
+		do
+			add_link_with_key (a_link.rel, a_link)
+		end
+
 	add_curie_link (a_attribute: HAL_LINK_ATTRIBUTE)
+			-- Add a curie link `a_atribute' to `links'.
+		do
+			add_link_with_key ("curies", create {HAL_LINK}.make_with_attribute ("curies", a_attribute))
+		end
+
+	add_fields (key: READABLE_STRING_GENERAL; value: ANY)
+		obsolete
+			"Use `add_field` [2017-06-20]. [2017-11-31]"
+		do
+			add_field (key, value)
+		end
+
+	add_field (key: READABLE_STRING_GENERAL; value: ANY)
+		obsolete
+				"Use `add_*_field [2017-06-20]."
 		local
-			l_links: like links
+			l_fields: like fields
 		do
-			l_links := links
-			if l_links = Void then
-				create l_links.make (10)
-				l_links.compare_objects
-				links := l_links
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
+			end
+			l_fields.force (value, key)
+		end
+
+	add_string_field (key: READABLE_STRING_GENERAL; value: READABLE_STRING_32)
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
+			end
+			l_fields.force (value, key)
+		end
+
+	add_integer_field (key: READABLE_STRING_GENERAL; value: INTEGER_64)
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
+			end
+			l_fields.force (value, key)
+		end
+
+	add_real_field (key: READABLE_STRING_GENERAL; value: REAL_64)
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
 			end
-			if l_links.has ("curies") then
-				if attached {HAL_LINK} l_links.at ("curies") as l_hal then
-					l_hal.attributes.force (a_attribute)
-				end
-			else
-				l_links.force (create {HAL_LINK}.make_with_attribute ("curies",a_attribute), "curies")
+			l_fields.force (value, key)
+		end
+
+	add_natural_field (key: READABLE_STRING_GENERAL; value: NATURAL_64)
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
 			end
+			l_fields.force (value, key)
 		end
 
-	add_fields (key: STRING; value: STRING)
+	add_boolean_field (key: READABLE_STRING_GENERAL; value: BOOLEAN)
 		local
 			l_fields: like fields
 		do
 			l_fields := fields
 			if l_fields = Void then
-				create l_fields.make (5)
+				create l_fields.make (1)
 				fields := l_fields
 			end
 			l_fields.force (value, key)
 		end
 
-	add_embedded_resource_with_key (key: STRING; res: HAL_RESOURCE)
+	add_null_field (key: READABLE_STRING_GENERAL)
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
+			end
+			l_fields.force ("null", key)
+		end
+
+	add_array_field (key: READABLE_STRING_GENERAL; a_array: ARRAY [detachable ANY])
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
+			end
+			l_fields.force (a_array, key)
+		end
+
+	add_object_field (key: READABLE_STRING_GENERAL; a_object: STRING_TABLE [detachable ANY])
+		local
+			l_fields: like fields
+		do
+			l_fields := fields
+			if l_fields = Void then
+				create l_fields.make (1)
+				fields := l_fields
+			end
+			l_fields.force (a_object, key)
+		end
+
+	add_embedded_resource_with_key (key: READABLE_STRING_GENERAL; res: HAL_RESOURCE)
 		local
 			er: like embedded_resource
 		do
@@ -233,7 +507,7 @@ feature -- Element Change
 			end
 		end
 
-	add_embedded_resources_with_key (key: STRING; resources: LIST [HAL_RESOURCE])
+	add_embedded_resources_with_key (key: READABLE_STRING_GENERAL; resources: LIST [HAL_RESOURCE])
 		local
 			er: like embedded_resource
 		do
@@ -255,15 +529,17 @@ feature -- Status Report
 			Result := links.has_key ("self") or else links.is_empty
 		end
 
-feature {JSON_HAL_RESOURCE_CONVERTER} -- Implementation
 
-	links: HASH_TABLE [HAL_LINK, STRING]
+feature {HAL_ACCESS} -- Implementation
+
+	links: STRING_TABLE [HAL_LINK]
 			--  contains links to other resources.
 
-	embedded_resource: detachable HASH_TABLE [LIST [HAL_RESOURCE], STRING]
+	embedded_resource: detachable STRING_TABLE [LIST [HAL_RESOURCE]]
 			-- expressing the embedded nature of a given part of the representation.
 
-	fields: detachable HASH_TABLE [STRING, STRING]
-			-- properties that represent the current state of the resource
+	fields: detachable STRING_TABLE [detachable ANY]
+			-- Properties representing current state of Current resource.
+
 
 end
diff --git a/package.iron b/package.iron
new file mode 100644
index 0000000..f620092
--- /dev/null
+++ b/package.iron
@@ -0,0 +1,21 @@
+package hal
+
+project
+	hal = "library/hal.ecf"
+
+note
+	title: HAL
+	description: "[
+Eiffel HAL is a library to work with  http://stateless.co/hal_specification.html#json
+HAL is used for exposing RESTful hypermedia APIs.
+Right now the current implementation only support JSON_HAL.
+				]"
+
+	tags: api, rest, hypermedia, media-type
+	license: Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)
+	link[license]: http://www.eiffel.com/licensing/forum.txt
+	link[source]: "svn" https://svn.eiffel.com/eiffelstudio/trunk/Src/contrib/library/web/communication/mediatype/hal/
+	link[doc]: "Documentation" http://tools.ietf.org/html/draft-kelly-json-hal-07
+	link[examples]: "Api examples" https://github.com/mikekelly/hal_specification/wiki/APIs
+
+end
diff --git a/test/application.e b/test/application.e
index 2f9075d..d566218 100644
--- a/test/application.e
+++ b/test/application.e
@@ -1,51 +1,43 @@
 note
 	description: "HAL application root class"
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
 
 class
 	APPLICATION
 
-inherit
-
-	SHARED_EJSON
-
 create
 	make
 
 feature {NONE} -- Initialization
 
 	make
-		local
---			hlink : LINK
---			hresource : RESOURCE
-			order: ORDER
-			js_cc: JSON_CUSTOMER_CONVERTER
-			js_ic: JSON_ITEM_CONVERTER
-			js_li: JSON_LINE_ITEM_CONVERTER
-			js_oc: JSON_ORDER_CONVERTER
 		do
 			create file_reader
---			test_json_min
---			test_json_hal
+			test_json_min
+			test_json_hal
 --			test_json_link
---			test_hal
---			test_item_line_item
---			test_order
+			test_hal
+			test_item_line_item
+			test_order
+			test_hal_types
+			test_example_with_nested_objects
 
---			example_from_hal_to_domain
+			test_embedded_hal_json
+
+			example_from_hal_to_domain
 			test_build_hal_json
+			test_hal_values
 		end
 
 	test_build_hal_json
 		local
-			l_hal: JSON_HAL_RESOURCE_CONVERTER
+			conv: JSON_HAL_RESOURCE_CONVERTER
 			l_res: HAL_RESOURCE
 			l_link: HAL_LINK
 			l_attribute: HAL_LINK_ATTRIBUTE
 		do
-			create l_hal.make
-			json.add_converter (l_hal)
+			create conv.make
 			create l_attribute.make ("/orders?{id}")
 			l_attribute.set_name ("orders")
 
@@ -63,44 +55,92 @@ feature {NONE} -- Initialization
 
 			print ("%Nis_valid_resource:" + l_res.is_valid_resource.out )
 			io.put_new_line
-			if attached json.value (l_res) as ll_hal then
-				print (ll_hal.representation)
+			if attached conv.to_json (l_res) as j then
+				print (j.representation)
+
+				if attached conv.from_json (j) as hal then
+					print (hal)
+					print (friendly_output (hal))
+				end
 			end
+		end
+
+
+	test_embedded_hal_json
+		local
+			conv: JSON_HAL_RESOURCE_CONVERTER
+			l_res: HAL_RESOURCE
+			l_link: HAL_LINK
+			l_attribute: HAL_LINK_ATTRIBUTE
+			l_items: HAL_RESOURCE
+			l_list: LIST [HAL_RESOURCE]
+		do
+			create conv.make
+			create l_attribute.make ("/orders?{id}")
+			l_attribute.set_name ("orders")
 
+			create l_res.make
+			l_res.add_curie_link (l_attribute)
+
+			create l_attribute.make ("/")
+			create l_link.make_with_attribute ("self",l_attribute )
+			l_res.add_link (l_link)
+
+			create l_attribute.make ("/pages/?{page}")
+			l_attribute.set_name ("pages")
+			create l_link.make_with_attribute ("curies",l_attribute)
+			l_res.add_link (l_link)
+
+
+			create l_items.make
+			l_items.add_integer_field ("product_id", 1)
+			l_items.add_integer_field ("count", 1)
+			create {ARRAYED_LIST[HAL_RESOURCE]} l_list.make (1)
+			l_list.force (l_items)
+			l_res.add_embedded_resources_with_key ("items", l_list)
+
+			print ("%Nis_valid_resource:" + l_res.is_valid_resource.out )
+			io.put_new_line
+			if attached conv.to_json (l_res) as j then
+				print (j.representation)
+
+				if attached conv.from_json (j) as hal then
+					print (hal)
+					print (friendly_output (hal))
+				end
+			end
+		end
+
+
+	friendly_output (obj: detachable ANY): STRING
+		local
+			serial: JSON_REFLECTOR_SERIALIZER
+			ctx: JSON_SERIALIZER_CONTEXT
+		do
+			create ctx
+			ctx.set_pretty_printing
+			ctx.set_is_type_name_included (False)
+			ctx.register_serializer (create {TABLE_ITERABLE_JSON_SERIALIZER [detachable ANY, READABLE_STRING_GENERAL]}, {TABLE [detachable ANY, READABLE_STRING_GENERAL]})
+			ctx.register_serializer (create {ITERABLE_JSON_SERIALIZER [detachable ANY]}, {ITERABLE [detachable ANY]})
+			ctx.set_default_serializer (create {JSON_REFLECTOR_SERIALIZER})
+			create serial
+			Result := serial.to_json_string (obj, ctx)
 		end
 
 	example_from_hal_to_domain
 		local
-			js_ic : JSON_ITEM_CONVERTER
-			js_li : JSON_LINE_ITEM_CONVERTER
-			js_cc : JSON_CUSTOMER_CONVERTER
-			js_oc : JSON_ORDER_CONVERTER
 			js_hal:  JSON_HAL_RESOURCE_CONVERTER
-			l_item : ITEM
-			line:LINE_ITEM
-			l_cust : CUSTOMER
-			l_order : ORDER
 			l_res : HAL_RESOURCE
-			l_total : REAL
-			l_currency : STRING
-			l_status : STRING
-			l_placed : STRING
-
+			l_currency : READABLE_STRING_32
+			l_status : READABLE_STRING_32
+			l_placed : READABLE_STRING_32
 		do
-			create js_ic.make
-			create js_li.make
-			create js_oc.make
-			create js_cc.make
 			create js_hal.make
-			json.add_converter (js_ic)
-			json.add_converter (js_li)
-			json.add_converter (js_oc)
-			json.add_converter (js_cc)
-			json.add_converter (js_hal)
+
 			if attached json_file_from ("hal_example.json") as json_file then
 				if attached {JSON_OBJECT} json_value_from_file (json_file) as jo then
-					if attached {HAL_RESOURCE} json.object (jo, "HAL_RESOURCE") as r then
-					    if attached {ARRAYED_LIST[HAL_RESOURCE]} r.embedded_resources_by_key ("order") as l_r then
+					if attached js_hal.from_json (jo) as r then
+					    if attached r.embedded_resources_by_key ("order") as l_r then
 							from
 								l_r.start
 							until
@@ -108,98 +148,98 @@ feature {NONE} -- Initialization
 							loop
 								l_res:= l_r.item_for_iteration
 
-					            if attached {STRING} l_res.fields_by_key("currency") as l_ucs then
+					            if attached l_res.string_field ("currency") as l_ucs then
 					            	l_currency := l_ucs
-					            	print ("Currency:" + l_currency )
+					            	print ("Currency:" + l_currency)
+					            	io.put_new_line
 					            end
 
-					            if attached {STRING} l_res.fields_by_key ("status") as l_ucs then
+					            if attached l_res.string_field ("status") as l_ucs then
 					            	l_status := l_ucs
-									print ("Status:" + l_status )
+									print ("Status:" + l_status)
+									io.put_new_line
 								end
 
-								if attached {STRING} l_res.fields_by_key ("placed") as l_ucs then
+								if attached l_res.string_field ("placed") as l_ucs then
 					            	l_placed := l_ucs
-					            	print ("Placed:" + l_placed )
+					            	print ("Placed:" + l_placed)
+					            	io.put_new_line
 								end
 
-
-
 								l_r.forth
 							end
 					    end
-
 					end
 				end
 			end
-
-
 		end
 
 	test_order
 		local
-			js_ic: JSON_ITEM_CONVERTER
-			js_li: JSON_LINE_ITEM_CONVERTER
-			js_cc: JSON_CUSTOMER_CONVERTER
-			js_oc: JSON_ORDER_CONVERTER
 			l_item: ITEM
 			line: LINE_ITEM
 			l_cust: CUSTOMER
 			l_order: ORDER
+			serial: JSON_SERIALIZATION
+			ctx: JSON_SERIALIZATION_CONTEXT
 		do
-			create js_ic.make
-			create js_li.make
-			create js_oc.make
-			create js_cc.make
-			json.add_converter (js_ic)
-			json.add_converter (js_li)
-			json.add_converter (js_oc)
-			json.add_converter (js_cc)
+			create ctx
+			create serial.make_with_context (ctx)
+			ctx.register (create {JSON_ITEM_CONVERTER}, {ITEM})
+			ctx.register (create {JSON_LINE_ITEM_CONVERTER}, {LINE_ITEM})
+			ctx.register (create {JSON_ORDER_CONVERTER}, {ORDER})
+			ctx.register (create {JSON_CUSTOMER_CONVERTER}, {CUSTOMER})
+
 			create line.make ("basket")
 			create l_item.make ("ABCD123", 2, 9.5)
 			line.add_item (l_item)
 			create l_item.make ("GFZ111", 1, 11)
 			line.add_item (l_item)
+
 			create l_cust.make ("Javier", "test@hal.com")
 			create l_order.make ("test", "USD", "Placed", l_cust)
-			l_order.add_item (l_item)
-			if attached {JSON_VALUE} json.value (l_order) as jv then
+			across
+				line.items as ic
+			loop
+				l_order.add_item (ic.item)
+			end
+
+			if attached {JSON_VALUE} serial.to_json (l_order) as jv then
 				print (jv.representation)
 			end
 		end
 
 	test_item_line_item
 		local
-			js_ic: JSON_ITEM_CONVERTER
-			js_li: JSON_LINE_ITEM_CONVERTER
 			l_item: ITEM
 			line: LINE_ITEM
+			serial: JSON_SERIALIZATION
+			ctx: JSON_SERIALIZATION_CONTEXT
 		do
-			create js_ic.make
-			create js_li.make
-			json.add_converter (js_ic)
-			json.add_converter (js_li)
+			create ctx
+			create serial.make_with_context (ctx)
+			ctx.register (create {JSON_ITEM_CONVERTER}, {ITEM})
+			ctx.register (create {JSON_LINE_ITEM_CONVERTER}, {LINE_ITEM})
 			create line.make ("basket")
 			create l_item.make ("ABCD123", 2, 9.5)
 			line.add_item (l_item)
 			create l_item.make ("GFZ111", 1, 11)
 			line.add_item (l_item)
-			if attached {JSON_VALUE} json.value (line) as jv then
+			if attached serial.to_json (line) as jv then
 				print (jv.representation)
 			end
 		end
 
 	test_hal
 		local
-			hal: JSON_HAL_RESOURCE_CONVERTER
+			conv: JSON_HAL_RESOURCE_CONVERTER
 		do
-			create hal.make
-			json.add_converter (hal)
+			create conv.make
 			if attached json_file_from ("hal_example.json") as json_file then
 				if attached {JSON_OBJECT} json_value_from_file (json_file) as jo then
-					if attached {HAL_RESOURCE} json.object (jo, "HAL_RESOURCE") as r then
+					if attached conv.from_json (jo) as r then
 						print (r.out)
-						if attached json.value (r) as jv then
+						if attached conv.to_json (r) as jv then
 							print (jv.representation)
 						end
 						if attached r.self as l_link then
@@ -208,9 +248,70 @@ feature {NONE} -- Initialization
 						if attached r.links_keys as lk then
 							print (lk.out)
 						end
-						if attached r.links_by_key ("next") as ln then
+						if attached r.link_by_key ("next") as ln then
 							check
-								ln.rel ~ "next"
+								ln.rel.same_string ("next")
+							end
+						end
+					end
+				end
+			end
+		end
+
+	test_hal_types
+		local
+			conv: JSON_HAL_RESOURCE_CONVERTER
+		do
+			create conv.make
+			if attached json_file_from ("hal_example_type.json") as json_file then
+				if attached {JSON_OBJECT} json_value_from_file (json_file) as jo then
+					if attached conv.from_json (jo) as r then
+						print (r.out)
+						print ("%N")
+						if attached conv.to_json (r) as jv then
+							print (jv.representation)
+						end
+					end
+				end
+			end
+		end
+
+	test_example_with_nested_objects
+		local
+			conv: JSON_HAL_RESOURCE_CONVERTER
+		do
+			create conv.make
+			if attached json_file_from ("exampleWithNestedObjects.json") as json_file then
+				if attached {JSON_OBJECT} json_value_from_file (json_file) as jo then
+					if attached conv.from_json (jo) as r then
+						print (r.out)
+						print ("%N")
+						if attached conv.to_json (r) as jv then
+							print (jv.representation)
+						end
+							-- expired is BOOLEAN
+						if r.is_integer_field ("expired") then
+							print ("%N")
+							print (r.integer_field ("expired").out)
+						end
+						if r.is_boolean_field ("expired") then
+							print ("%N")
+							print (r.boolean_field ("expired").out)
+						end
+							-- Integer
+						if r.is_integer_field ("age") then
+							print ("%N")
+							print (r.integer_field ("age").out)
+						end
+							-- Array with String table
+						if r.is_array_field ("children") then
+							if attached r.array_field ("children") as l_array then
+								across l_array as ic loop
+									print ("%N")
+									if attached ic.item as l_item then
+										print (l_item.out)
+									end
+								end
 							end
 						end
 					end
@@ -253,6 +354,30 @@ feature {NONE} -- Initialization
 			end
 		end
 
+	test_hal_values
+		local
+			l_hal: HAL_RESOURCE
+			l_int: INTEGER_64
+			l_nat: NATURAL_64
+			l_real: REAL_64
+		do
+			create l_hal.make
+			l_hal.add_integer_field ("integer_8", {INTEGER_8} 8)
+			check is_integer_8: l_hal.is_integer_field ("integer_8") end
+			l_int := l_hal.integer_field ("integer_8")
+			print ("%Nint " + l_int.out)
+
+			l_hal.add_natural_field ("natural_8", {NATURAL} 255)
+			check is_natural_8: l_hal.is_natural_field ("natural_8") end
+			l_nat := l_hal.natural_field ("natural_8")
+			print ("%Nnat " + l_nat.out)
+
+			l_hal.add_real_field ("real_32", {REAL} 255.32)
+			check is_real_32: l_hal.is_real_field ("real_32") end
+			l_real := l_hal.real_field ("real_32")
+			print ("%Nreal " + l_real.out)
+		end
+
 feature -- Implementation
 
 	file_reader: JSON_FILE_READER
@@ -266,7 +391,7 @@ feature -- Implementation
 
 	new_json_parser (a_string: STRING): JSON_PARSER
 		do
-			create Result.make_parser (a_string)
+			create Result.make_with_string (a_string)
 		end
 
 	json_value_from_file (json_file: STRING): detachable JSON_VALUE
@@ -274,10 +399,12 @@ feature -- Implementation
 			p: like new_json_parser
 		do
 			p := new_json_parser (json_file)
-			Result := p.parse_json
+			p.parse_content
 			check
 				json_is_parsed: p.is_parsed
 			end
+
+			Result := p.parsed_json_value
 		end
 
 end
diff --git a/test/converter/json_customer_converter.e b/test/converter/json_customer_converter.e
index ae454c4..608b0b4 100644
--- a/test/converter/json_customer_converter.e
+++ b/test/converter/json_customer_converter.e
@@ -1,70 +1,61 @@
 note
 	description: "Summary description for {JSON_CUSTOMER_CONVERTER}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
 
 class
 	JSON_CUSTOMER_CONVERTER
-inherit
-    JSON_CONVERTER
-
-create
-    make
-
-feature {NONE} -- Initialization
 
-    make
-        local
-            l_name: STRING_32
-            l_email: STRING_32
-        do
-            create l_name.make_from_string ("")
-            create l_email.make_from_string ("")
-            create object.make (l_name,l_email)
-        end
-
-feature -- Access
-
-    object: CUSTOMER
+inherit
+	JSON_SERIALIZER
+	JSON_DESERIALIZER
 
 feature -- Conversion
 
-    from_json (j: like to_json): detachable like object
-        local
-            l_name: detachable STRING_32
-            l_email : detachable STRING_32
-        do
-            if attached {STRING_32} json.object (j.item (name_key), Void) as l_ucs then
-            	l_name := l_ucs
-            end
-
-            if attached {STRING_32} json.object (j.item (email_key), Void) as l_ucs then
-            	l_email := l_ucs
-            end
-
-            check l_email /= Void end
-            check l_name /= Void end
-            create Result.make (l_name, l_email)
-        end
-
-    to_json (o: like object): JSON_OBJECT
-        do
-            create Result.make
-            Result.put (json.value (o.name), name_key)
-            Result.put (json.value (o.email), email_key)
-        end
-
-feature    {NONE} -- Implementation
-
-    name_key: JSON_STRING
-        once
-            create Result.make_from_string ("name")
-        end
-
-    email_key: JSON_STRING
-        once
-            create Result.make_from_string ("email")
-        end
+	to_json (obj: detachable ANY; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			jo: JSON_OBJECT
+		do
+			if attached {CUSTOMER} obj as o then
+				create jo.make
+				jo.put_string (o.name, name_key)
+				jo.put_string (o.email, email_key)
+				Result := jo
+			else
+				create {JSON_NULL} Result
+			end
+		end
+
+	from_json (a_json: detachable JSON_VALUE; ctx: JSON_DESERIALIZER_CONTEXT; a_type: detachable TYPE [detachable ANY]): detachable CUSTOMER
+		do
+			if attached {JSON_OBJECT} a_json as jo then
+				if
+					attached {JSON_STRING} jo.item (name_key) as l_name and
+					attached {JSON_STRING} jo.item (email_key) as l_email
+				then
+					create Result.make (l_name.unescaped_string_32, l_email.unescaped_string_8)
+				else
+					check
+						has_name: False
+					end
+					check
+						has_email: False
+					end
+				end
+			end
+		end
+
+feature {NONE} -- Implementation
+
+	name_key: JSON_STRING
+		once
+			create Result.make_from_string ("name")
+		end
+
+	email_key: JSON_STRING
+		once
+			create Result.make_from_string ("email")
+		end
 
 end -- class JSON_CUSTOMER_CONVERTER
diff --git a/test/converter/json_item_converter.e b/test/converter/json_item_converter.e
index 842cda9..ab7d7ac 100644
--- a/test/converter/json_item_converter.e
+++ b/test/converter/json_item_converter.e
@@ -1,61 +1,52 @@
 note
 	description: "Summary description for {JSON_ITEM_CONVERTER}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
 
 class
 	JSON_ITEM_CONVERTER
-inherit
-    JSON_CONVERTER
-
-create
-    make
-
-feature {NONE} -- Initialization
-
-    make
-        local
-            l_id: STRING_32
-        do
-            create l_id.make_from_string ("")
-            create object.make (l_id,0,0.0)
-        end
-
-feature -- Access
 
-    object: ITEM
+inherit
+	JSON_SERIALIZER
+	JSON_DESERIALIZER
 
 feature -- Conversion
 
-    from_json (j: like to_json): detachable like object
+	from_json (a_json: detachable JSON_VALUE; ctx: JSON_DESERIALIZER_CONTEXT; a_type: detachable TYPE [detachable ANY]): detachable ITEM
         local
-            l_id: detachable STRING_32
             l_quantity : NATURAL
             l_price : REAL
         do
-            if attached {STRING_32} json.object (j.item (id_key), Void) as l_ucs then
-            	l_id := l_ucs
-            end
-
-            if attached {NATURAL} json.object (j.item (quantity_key), Void) as l_ucs then
-            	l_quantity := l_ucs
-            end
-
-            if attached {REAL} json.object (j.item (quantity_key), Void) as l_ucs then
-            	l_price := l_ucs
-			end
-
-            check l_id /= Void end
-            create Result.make (l_id, l_quantity, l_price)
+        	if attached {JSON_OBJECT} a_json as j then
+	            if attached {JSON_STRING} j.item (id_key) as l_id then
+
+		            if attached {JSON_NUMBER} j.item (quantity_key) as l_ucs then
+		            	l_quantity := l_ucs.natural_64_item.to_natural_32
+		            end
+		            if attached {JSON_NUMBER} j.item (price_key) as l_ucs then
+		            	l_price := l_ucs.real_64_item.truncated_to_real
+					end
+	            	create Result.make (l_id.unescaped_string_8, l_quantity, l_price)
+	            else
+	            	check has_id: False end
+	            end
+        	end
         end
 
-    to_json (o: like object): JSON_OBJECT
+	to_json (obj: detachable ANY; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			jo: JSON_OBJECT
         do
-            create Result.make
-            Result.put (json.value (o.id), id_key)
-            Result.put (json.value (o.quantity), quantity_key)
-            Result.put (json.value (o.price), price_key)
+        	if attached {ITEM} obj as o then
+	            create jo.make
+	            jo.put_string (o.id, id_key)
+	            jo.put_natural (o.quantity, quantity_key)
+	            jo.put_real (o.price, price_key)
+				Result := jo
+        	else
+        		create {JSON_NULL} Result
+        	end
         end
 
 feature    {NONE} -- Implementation
diff --git a/test/converter/json_line_item_converter.e b/test/converter/json_line_item_converter.e
index 5c9379c..19a3d54 100644
--- a/test/converter/json_line_item_converter.e
+++ b/test/converter/json_line_item_converter.e
@@ -1,80 +1,86 @@
-note
-	description: "Summary description for {JSON_LINE_ITEM_CONVERTER}."
-	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
-
-class
-	JSON_LINE_ITEM_CONVERTER
-
-inherit
-	JSON_CONVERTER
-
-create
-	make
-
-feature {NONE} -- Initialization
-
-	make
-		do
-			create object.make ("")
-		end
-
-feature -- Access
-
-	object: LINE_ITEM
-
-feature -- Conversion
-
-	from_json (j: like to_json): detachable like object
-		local
-			ll: LINKED_LIST [ITEM]
-			i: INTEGER
-		do
-			if attached {STRING_32} json.object (j.item (name_key), Void) as ucs then
-				if attached {JSON_ARRAY} j.item (items_key) as ja then
-					create Result.make (ucs)
-					from
-						i := 1
-						create ll.make
-					until
-						i > ja.count
-					loop
-						if attached {ITEM} json.object (ja [i], "ITEM") as b then
-							ll.force (b)
-						end
-						i := i + 1
-					end
-					Result.add_items (ll)
-				else
-					check
-						has_array_items: False
-					end
-				end
-			else
-				check
-					has_name_key: False
-				end
-			end
-		end
-
-	to_json (o: like object): JSON_OBJECT
-		do
-			create Result.make
-				--Result.put (json.value (o.name), name_key)
-			Result.put (json.value (o.items), items_key)
-		end
-
-feature {NONE} -- Implementation
-
-	name_key: JSON_STRING
-		once
-			create Result.make_from_string ("name")
-		end
-
-	items_key: JSON_STRING
-		once
-			create Result.make_from_string ("items")
-		end
-
-end -- class JSON_LINE_ITEM_CONVERTER
+note
+	description: "Summary description for {JSON_LINE_ITEM_CONVERTER}."
+	author: ""
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
+
+class
+	JSON_LINE_ITEM_CONVERTER
+
+inherit
+	JSON_SERIALIZER
+	JSON_DESERIALIZER
+
+feature -- Conversion
+
+	from_json (a_json: detachable JSON_VALUE; ctx: JSON_DESERIALIZER_CONTEXT; a_type: detachable TYPE [detachable ANY]): detachable LINE_ITEM
+		local
+			ll: LINKED_LIST [ITEM]
+			i: INTEGER
+		do
+			if
+				attached {JSON_OBJECT} a_json as j and then
+				attached {JSON_STRING} j.item (name_key) as ucs
+			then
+				if attached {JSON_ARRAY} j.item (items_key) as ja then
+					create Result.make (ucs.unescaped_string_32)
+					from
+						i := 1
+						create ll.make
+					until
+						i > ja.count
+					loop
+						if attached {ITEM} ctx.value_from_json (ja[i], {ITEM}) as b then
+							ll.force (b)
+						end
+						i := i + 1
+					end
+					Result.add_items (ll)
+				else
+					check
+						has_array_items: False
+					end
+				end
+			else
+				check
+					has_name_key: False
+				end
+			end
+		end
+
+	to_json (obj: detachable ANY; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			jo: JSON_OBJECT
+			ja: JSON_ARRAY
+		do
+			if attached {LINE_ITEM} obj as o then
+				create jo.make
+				jo.put_string (o.name, name_key)
+				create ja.make_empty
+				across
+					o.items as ic
+				loop
+					if attached ctx.to_json (ic.item, Void) as ji then
+						ja.add (ji)
+					end
+				end
+				jo.put (ja, items_key)
+				Result := jo
+			else
+				create {JSON_NULL} Result
+			end
+		end
+
+feature {NONE} -- Implementation
+
+	name_key: JSON_STRING
+		once
+			create Result.make_from_string ("name")
+		end
+
+	items_key: JSON_STRING
+		once
+			create Result.make_from_string ("items")
+		end
+
+end -- class JSON_LINE_ITEM_CONVERTER
diff --git a/test/converter/json_order_converter.e b/test/converter/json_order_converter.e
index 7ec85c9..c6423cc 100644
--- a/test/converter/json_order_converter.e
+++ b/test/converter/json_order_converter.e
@@ -1,118 +1,111 @@
-note
-	description: "Summary description for {JSON_ORDER_CONVERTER}."
-	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
-
-class
-	JSON_ORDER_CONVERTER
-
-inherit
-	JSON_CONVERTER
-
-create
-	make
-
-feature {NONE} -- Initialization
-
-	make
-		local
-			l_c: CUSTOMER
-		do
-			create l_c.make ("", "")
-			create object.make ("", "", "", l_c)
-		end
-
-feature -- Access
-
-	object: ORDER
-
-feature -- Conversion
-
-	from_json (j: like to_json): detachable like object
-		local
-			l_id: INTEGER
-			l_currency: detachable STRING
-			l_status: detachable STRING
-			l_placed: detachable STRING
-			l_customer: detachable CUSTOMER
-			l_line_items: detachable LINE_ITEM
-		do
-			if attached {INTEGER} json.object (j.item (id_key), Void) as l_ucs then
-				l_id := l_ucs
-			end
-			if attached {STRING_32} json.object (j.item (currency_key), Void) as l_ucs then
-				l_currency := l_ucs
-			end
-			if attached {STRING_32} json.object (j.item (status_key), Void) as l_ucs then
-				l_status := l_ucs
-			end
-			if attached {STRING_32} json.object (j.item (placed_key), Void) as l_ucs then
-				l_placed := l_ucs
-			end
-			if attached {CUSTOMER} json.object (j.item (customer_key), "CUSTOMER") as l_ucs then
-				l_customer := l_ucs
-			end
-			if attached {LINE_ITEM} json.object (j.item (line_items_key), "LINE_ITEM") as l_ucs then
-				l_line_items := l_ucs
-			end
-			check
-				l_id > 0
-			end
-			check
-				l_currency /= Void and l_status /= Void and	l_customer /= Void and l_line_items /= Void and	l_placed /= Void
-			then
-				create Result.make (l_line_items.name, l_currency, l_status, l_customer)
-				Result.set_placed (l_placed)
-			end
-		end
-
-	to_json (o: like object): JSON_OBJECT
-		do
-			create Result.make
-			Result.put (json.value (o.id), id_key)
-			Result.put (json.value (o.currency), currency_key)
-			Result.put (json.value (o.placed), placed_key)
-			Result.put (json.value (o.status), status_key)
-			Result.put (json.value (o.customer), customer_key)
-			Result.put (json.value (o.line_items), line_items_key)
-		end
-
-feature {NONE} -- Implementation
-
-	id_key: JSON_STRING
-		once
-			create Result.make_from_string ("id")
-		end
-
-	name_key: JSON_STRING
-		once
-			create Result.make_from_string ("name")
-		end
-
-	currency_key: JSON_STRING
-		once
-			create Result.make_from_string ("currency")
-		end
-
-	status_key: JSON_STRING
-		once
-			create Result.make_from_string ("status")
-		end
-
-	placed_key: JSON_STRING
-		once
-			create Result.make_from_string ("placed")
-		end
-
-	customer_key: JSON_STRING
-		once
-			create Result.make_json ("customer")
-		end
-
-	line_items_key: JSON_STRING
-		once
-			create Result.make_json ("line_items")
-		end
-
-end
+note
+	description: "Summary description for {JSON_ORDER_CONVERTER}."
+	author: ""
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
+
+class
+	JSON_ORDER_CONVERTER
+
+inherit
+	JSON_SERIALIZER
+	JSON_DESERIALIZER
+
+feature -- Conversion
+
+	from_json (a_json: detachable JSON_VALUE; ctx: JSON_DESERIALIZER_CONTEXT; a_type: detachable TYPE [detachable ANY]): detachable ORDER
+		local
+			l_id: INTEGER
+			l_currency: detachable STRING
+			l_status: detachable STRING
+			l_placed: detachable STRING
+			l_customer: detachable CUSTOMER
+			l_line_items: detachable LINE_ITEM
+		do
+			if attached {JSON_OBJECT} a_json as j then
+				if attached {JSON_NUMBER} j.item (id_key) as l_ucs then
+					l_id := l_ucs.integer_64_item.to_integer_32
+				end
+				if attached {JSON_STRING} j.item (currency_key) as l_ucs then
+					l_currency := l_ucs.unescaped_string_32
+				end
+				if attached {JSON_STRING} j.item (status_key) as l_ucs then
+					l_status := l_ucs.unescaped_string_32
+				end
+				if attached {JSON_STRING} j.item (placed_key) as l_ucs then
+					l_placed := l_ucs.unescaped_string_32
+				end
+				if attached {CUSTOMER} ctx.value_from_json (j.item (customer_key), {CUSTOMER}) as c then
+					l_customer := c
+				end
+				if attached {LINE_ITEM} ctx.value_from_json (j.item (line_items_key), {LINE_ITEM}) as li then
+					l_line_items := li
+				end
+				check
+					l_id > 0
+				end
+				check
+					l_currency /= Void and l_status /= Void and	l_customer /= Void and l_line_items /= Void and	l_placed /= Void
+				then
+					create Result.make (l_line_items.name, l_currency, l_status, l_customer)
+					Result.set_placed (l_placed)
+				end
+			end
+		end
+
+	to_json (obj: detachable ANY; ctx: JSON_SERIALIZER_CONTEXT): JSON_VALUE
+		local
+			jo: JSON_OBJECT
+		do
+			if attached {ORDER} obj as o then
+				create jo.make
+				jo.put_integer (o.id, id_key)
+				jo.put_string (o.currency, currency_key)
+				jo.put_string (o.status, status_key)
+				jo.put_string (o.placed, placed_key)
+				jo.put (ctx.to_json (o.customer, create {JSON_CUSTOMER_CONVERTER}), customer_key)
+				jo.put (ctx.to_json (o.line_items, create {JSON_LINE_ITEM_CONVERTER}), line_items_key)
+				Result := jo
+			else
+				create {JSON_NULL} Result
+			end
+		end
+
+feature {NONE} -- Implementation
+
+	id_key: JSON_STRING
+		once
+			create Result.make_from_string ("id")
+		end
+
+	name_key: JSON_STRING
+		once
+			create Result.make_from_string ("name")
+		end
+
+	currency_key: JSON_STRING
+		once
+			create Result.make_from_string ("currency")
+		end
+
+	status_key: JSON_STRING
+		once
+			create Result.make_from_string ("status")
+		end
+
+	placed_key: JSON_STRING
+		once
+			create Result.make_from_string ("placed")
+		end
+
+	customer_key: JSON_STRING
+		once
+			create Result.make_from_string ("customer")
+		end
+
+	line_items_key: JSON_STRING
+		once
+			create Result.make_from_string ("line_items")
+		end
+
+end
diff --git a/test/exampleWithNestedObjects.json b/test/exampleWithNestedObjects.json
new file mode 100644
index 0000000..8f911dc
--- /dev/null
+++ b/test/exampleWithNestedObjects.json
@@ -0,0 +1,35 @@
+{
+    "_links" : {
+        "curies" : [ {
+            "href" : "https://example.com/apidocs/ns/{rel}",
+            "name" : "ns",
+            "templated" : true
+        }, {
+            "href" : "https://example.com/apidocs/role/{rel}",
+            "name" : "role",
+            "templated" : true
+        } ],
+        "self" : {
+            "href" : "https://example.com/api/customer/123456"
+        },
+        "ns:parent" : {
+            "href" : "https://example.com/api/customer/1234",
+            "name" : "bob",
+            "title" : "The Parent",
+            "hreflang" : "en"
+        },
+        "ns:users" : {
+            "href" : "https://example.com/api/customer/123456?users"
+        }
+    },
+    "age" : 33,
+    "expired" : false,
+    "id" : 123456,
+    "name" : "Example Resource",
+    "optional" : true,
+    "child" : { "age" : 12, "expired" : false, "id" : 111111, "name" : "Example Resource 1","optional" : true  },
+    "children" : [
+        { "age" : 12, "expired" : false, "id" : 111111, "name" : "Example Resource 1","optional" : true  },
+        { "age" : 10, "expired" : false, "id" : 222222, "name" : "Example Resource 2","optional" : true  }
+    ]
+}
\ No newline at end of file
diff --git a/test/exampleWithSubResource.json b/test/exampleWithSubResource.json
new file mode 100644
index 0000000..5b48b8b
--- /dev/null
+++ b/test/exampleWithSubResource.json
@@ -0,0 +1,39 @@
+{
+  "_links" : {
+    "curies" : [ {
+      "href" : "https://example.com/apidocs/ns/{rel}",
+      "name" : "ns",
+      "templated" : true
+    }, {
+      "href" : "https://example.com/apidocs/role/{rel}",
+      "name" : "role",
+      "templated" : true
+    } ],
+    "self" : {
+      "href" : "https://example.com/api/customer/123456"
+    },
+    "ns:parent" : {
+      "href" : "https://example.com/api/customer/1234",
+      "name" : "bob",
+      "title" : "The Parent",
+      "hreflang" : "en"
+    },
+    "ns:users" : {
+      "href" : "https://example.com/api/customer/123456?users"
+    }
+  },
+  "_embedded" : {
+    "ns:user" : {
+      "_links" : {
+        "self" : {
+          "href" : "https://example.com/user/11"
+        }
+      },
+      "age" : 32,
+      "expired" : false,
+      "id" : 11,
+      "name" : "Example User",
+      "optional" : true
+    }
+  }
+}
diff --git a/test/hal_example_type.json b/test/hal_example_type.json
new file mode 100644
index 0000000..b8099b6
--- /dev/null
+++ b/test/hal_example_type.json
@@ -0,0 +1,11 @@
+ {
+     "_links": {
+       "self": { "href": "/test" },
+       "next": { "href": "/test?page=2" },
+       "find": { "href": "/tes{?id}", "templated": true }
+     },
+     "id": 1,
+     "price": 20,
+     "name": "T-Shit",
+     "new": true 
+   }
diff --git a/test/hal_test_suite.e b/test/hal_test_suite.e
index 4766762..ebb6fc4 100644
--- a/test/hal_test_suite.e
+++ b/test/hal_test_suite.e
@@ -3,22 +3,18 @@ note
 		Eiffel tests that can be executed by testing tool.
 	]"
 	author: "EiffelStudio test wizard"
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 18:10:43 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100533 $"
 	testing: "type/manual"
 
 class
 	HAL_TEST_SUITE
 
 inherit
-	SHARED_EJSON
-			rename default_create as default_create_ejson
-		end
+
 	EQA_TEST_SET
 		redefine
 			on_prepare
-		select
-			default_create
 		end
 
 feature {NONE} -- Events
@@ -31,237 +27,218 @@ feature {NONE} -- Events
 
 feature -- Test routines
 
-	test_invalid_hal_document
-    		--
-		local
-			l_res : detachable HAL_RESOURCE
-		do
-			l_res := json_to_hal ("min_hal_wrong_document.json")
-			if l_res = Void then
-				assert("Invalid Hal document", True)
-			end
-		end
-
 	test_valid_hal_document
-    		--
+			--
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("min_hal_document.json")
-			if attached l_res as l_r then
-				assert("Is Valid Hal document", True)
-			end
+			assert ("Is Valid Hal document", l_res /= Void)
 		end
 
-
 	test_valid_hal
-    		--
+			--
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("min_hal.json")
-			assert("Not Void", l_res /= Void)
-			if attached l_res as l_r then
-				assert("Is Valid Resource", l_r.is_valid_resource = True)
+			assert ("Not Void", l_res /= Void)
+			if attached l_res then
+				assert ("Is Valid Resource", l_res.is_valid_resource)
 			end
 		end
 
-
 	test_empty_json
-    		--
+			--
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("empty.json")
-			assert("Not Void", l_res /= Void)
-			if attached l_res as l_r then
-				assert("Is Valid Resource", l_r.is_valid_resource = True)
+			assert ("Not Void", l_res /= Void)
+			if attached l_res then
+				assert ("Is Valid Resource", l_res.is_valid_resource)
 			end
 		end
 
-
 	test_self
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("min_hal.json")
-			assert("Not Void", l_res /= Void)
-			if attached l_res as ll_res then
-				if attached{HAL_LINK} ll_res.self as l_link then
-					assert ("Rel attribute is self", l_link.rel ~ "self" )
-					assert ("Has 1 element", l_link.attributes.count = 1 )
-					assert ("Has href",l_link.attributes.at (1).href ~ "http://example.com/")
+			assert ("Not Void", l_res /= Void)
+			if attached l_res then
+				if attached l_res.self as l_link then
+					assert ("Rel attribute is self", l_link.rel ~ "self")
+					assert ("Has 1 element", l_link.attributes.count = 1)
+					assert ("Has href", l_link.attributes.at (1).href.same_string ("http://example.com/"))
 				end
 			end
 		end
 
-
 	test_curies
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("curie_example.json")
-			assert("Not Void", l_res /= Void)
-			if attached l_res as ll_res then
-				if attached{HAL_LINK} ll_res.curies as l_curie then
-					assert ("Rel attribute is curies", l_curie.rel.same_string ("curies") )
-					assert ("Has 2 elements", l_curie.attributes.count = 2 )
-					assert ("Has href",l_curie.attributes.at (1).href.same_string( "https://api.example.org/{?href}"))
-					assert ("Templated",l_curie.attributes.at (1).templated)
-					assert ("Has href",l_curie.attributes.at (2).href.same_string( "https://pool-2.static.example.org/file/{?href}"))
-					assert ("Templated",l_curie.attributes.at (2).templated)
-
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				if attached l_res.curies as l_curie then
+					assert ("Rel attribute is curies", l_curie.rel.same_string ("curies"))
+					assert ("Has 2 elements", l_curie.attributes.count = 2)
+					assert ("Has href", l_curie.attributes.at (1).href.same_string ("https://api.example.org/{?href}"))
+					assert ("Templated", l_curie.attributes.at (1).templated)
+					assert ("Has href", l_curie.attributes.at (2).href.same_string ("https://pool-2.static.example.org/file/{?href}"))
+					assert ("Templated", l_curie.attributes.at (2).templated)
 				end
 			end
 		end
 
-
-
 	test_links_key
 		local
-			l_res : detachable HAL_RESOURCE
-			l_arr : ARRAY[STRING]
+			l_res: detachable HAL_RESOURCE
+			l_arr: ARRAY [READABLE_STRING_GENERAL]
 		do
 			l_res := json_to_hal ("hal_example.json")
-			assert("Not Void", l_res /= Void)
-			if attached{HAL_RESOURCE} l_res as ll_res then
-				l_arr := ll_res.links_keys
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				l_arr := l_res.links_keys
 				l_arr.compare_objects
-				assert ("Has three elements", l_arr.count = 3 )
-				assert ("Has element self", l_arr.has ("self") = True)
-				assert ("Has element next", l_arr.has ("next") = True)
-				assert ("Has element searcg", l_arr.has ("search") = True)
+				assert ("Has three elements", l_arr.count = 3)
+				assert ("Has element self", l_arr.has ("self"))
+				assert ("Has element next", l_arr.has ("next"))
+				assert ("Has element searcg", l_arr.has ("search"))
 			end
 		end
 
-
 	test_links_by_key
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("hal_example.json")
-			assert("Not Void", l_res /= Void)
-			if attached{HAL_RESOURCE} l_res as ll_res then
-				assert ("Expected Void",ll_res.links_by_key ("keynotexist") = Void)
-				if attached {HAL_LINK} ll_res.links_by_key ("next") as ll_link then
-					assert ("Expected rel : next", ll_link.rel ~ "next")
-					assert ("Expected shared links 1", ll_link.attributes.count = 1)
-					assert ("Expected Href value", ll_link.attributes.at (1).href ~ "/orders?page=2" )
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				assert ("Expected Void", l_res.link_by_key ("keynotexist") = Void)
+				if attached l_res.link_by_key ("next") as l_link then
+					assert ("Expected rel : next", l_link.rel ~ "next")
+					assert ("Expected shared links 1", l_link.attributes.count = 1)
+					assert ("Expected Href value", l_link.attributes.first.href ~ "/orders?page=2")
 				end
 			end
 		end
 
-
-
-
 	test_embedded_resources_key
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("hal_example.json")
-			assert("Not Void", l_res /= Void)
-			if attached {HAL_RESOURCE} l_res as ll_res then
-				if attached {ARRAY[STRING]} ll_res.embedded_resources_keys as ll_arr then
-					ll_arr.compare_objects
-					assert ("Number of elements 1", ll_arr.count = 1)
-					assert ("Has element order",ll_arr.has ("order"))
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				if attached l_res.embedded_resources_keys as l_arr then
+					l_arr.compare_objects
+					assert ("Number of elements 1", l_arr.count = 1)
+					assert ("Has element order", l_arr.has ("order"))
 				end
 			end
 		end
 
-
 	test_embedded_resource_by_key
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("hal_example.json")
-			assert("Not Void", l_res /= Void)
-			if attached {HAL_RESOURCE} l_res as ll_res then
-				if attached {LIST[HAL_RESOURCE]} ll_res.embedded_resources_by_key ("order") as l_list then
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				if attached l_res.embedded_resources_by_key ("order") as l_list then
 					l_list.compare_objects
 					assert ("Number of elements 2", l_list.count = 2)
 				end
 			end
 		end
 
-
+	test_embedded_resource_by_key_array
+		local
+			l_res: detachable HAL_RESOURCE
+		do
+			l_res := json_to_hal ("exampleWithSubResource.json")
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				if attached l_res.embedded_resources_by_key ("ns:user") as l_list then
+					l_list.compare_objects
+					assert ("Number of elements 1", l_list.count = 1)
+				end
+			end
+		end
 
 	test_fields_keys
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("hal_multi_links.json")
-			assert("Not Void", l_res /= Void)
-			if attached {HAL_RESOURCE} l_res as ll_res then
-				if attached {ARRAY [STRING]} ll_res.fields_keys as l_arr then
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				if attached l_res.fields_keys as l_arr then
 					l_arr.compare_objects
 					assert ("Number of elements 2", l_arr.count = 2)
-					assert ("Expected name ", l_arr[1] ~ "name")
-					assert ("Expected weight ", l_arr[2] ~ "weight")
+					assert ("Expected name ", l_arr [1].same_string ("name"))
+					assert ("Expected weight ", l_arr [2].same_string ("weight"))
 				end
 			end
 		end
 
-
-
 	test_fields_by_key
 		local
-			l_res : detachable HAL_RESOURCE
+			l_res: detachable HAL_RESOURCE
 		do
 			l_res := json_to_hal ("hal_multi_links.json")
-			assert("Not Void", l_res /= Void)
-			if attached {HAL_RESOURCE} l_res as ll_res then
-				if attached {STRING_32} ll_res.fields_by_key ("name") as l_str then
-					assert ("Expected Value: A product", l_str.is_equal ("A product"))
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				if attached l_res.string_field ("name") as l_str then
+					assert ("Expected Value: A product", l_str.same_string ("A product"))
 				end
-				if attached {STRING_32} ll_res.fields_by_key ("weight") as l_str then
-					assert ("Expected Value: A product", l_str.is_equal ("400"))
+				if attached l_res.integer_field ("weight") as l_int then
+					assert ("Expected Value: A product", l_int = 400)
 				end
 			end
 		end
 
-
 	test_link_template
 		local
-				l_res : detachable HAL_RESOURCE
-			do
-				l_res := json_to_hal ("example_template.json")
-				assert("Not Void", l_res /= Void)
-				if attached{HAL_RESOURCE} l_res as ll_res then
-					assert ("Expected Void",ll_res.links_by_key ("keynotexist") = Void)
-					if attached {HAL_LINK} ll_res.links_by_key ("find") as ll_link then
-						assert ("Expected rel : next", ll_link.rel.same_string ("find"))
-						assert ("Expected shared links 1", ll_link.attributes.count = 1)
-						assert ("Expected templated : true", ll_link.attributes.at (1).templated = True)
-						assert ("Expected Href value", ll_link.attributes.at (1).href.same_string ( "/orders{?id}") )
-					end
+			l_res: detachable HAL_RESOURCE
+		do
+			l_res := json_to_hal ("example_template.json")
+			assert ("Not Void", l_res /= Void)
+			if l_res /= Void then
+				assert ("Expected Void", l_res.link_by_key ("keynotexist") = Void)
+				if attached l_res.link_by_key ("find") as l_link then
+					assert ("Expected rel : next", l_link.rel.same_string ("find"))
+					assert ("Expected shared links 1", l_link.attributes.count = 1)
+					assert ("Expected templated : true", l_link.attributes.at (1).templated = True)
+					assert ("Expected Href value", l_link.attributes.at (1).href.same_string ("/orders{?id}"))
+				end
 			end
 		end
 
-
-
-
 feature {NONE} -- Implementation
-	hal_to_json ( a_res : HAL_RESOURCE) : detachable JSON_VALUE
+
+	hal_to_json (a_res: HAL_RESOURCE): detachable JSON_VALUE
 		local
-				hal: JSON_HAL_RESOURCE_CONVERTER
+			conv: JSON_HAL_RESOURCE_CONVERTER
 		do
-				create hal.make
-				json.add_converter (hal)
-				Result := json.value (a_res)
+			create conv.make
+			Result := conv.to_json (a_res)
 		end
 
-	json_to_hal (fn : STRING) : detachable HAL_RESOURCE
+	json_to_hal (fn: STRING): detachable HAL_RESOURCE
 		local
-			parse_json: like new_json_parser
-			hal: JSON_HAL_RESOURCE_CONVERTER
+			jp: like new_json_parser
+			conv: JSON_HAL_RESOURCE_CONVERTER
 		do
-			create hal.make
-			json.add_converter (hal)
 			if attached json_file_from (fn) as json_file then
-				parse_json := new_json_parser (json_file)
-				if attached parse_json.parse_json as jv then
-					if attached {HAL_RESOURCE} json.object (jv, "HAL_RESOURCE") as l_hal then
+				jp := new_json_parser (json_file)
+				jp.parse_content
+				if attached jp.parsed_json_value as jv then
+					create conv.make
+					if attached {HAL_RESOURCE} conv.from_json (jv) as l_hal then
 						Result := l_hal
 					end
 				end
@@ -272,7 +249,7 @@ feature {NONE} -- Implementation
 
 	file_reader: JSON_FILE_READER
 
-   	json_file_from (fn: STRING): detachable STRING
+	json_file_from (fn: STRING): detachable STRING
 		do
 			Result := file_reader.read_json_from (fn)
 			assert ("File contains json data", Result /= Void)
@@ -282,7 +259,7 @@ feature {NONE} -- Implementation
 
 	new_json_parser (a_string: STRING): JSON_PARSER
 		do
-			create Result.make_parser (a_string)
+			create Result.make_with_string (a_string)
 		end
 
 	json_value_from_file (json_file: STRING): detachable JSON_VALUE
@@ -290,30 +267,11 @@ feature {NONE} -- Implementation
 			p: like new_json_parser
 		do
 			p := new_json_parser (json_file)
-			Result := p.parse_json
-			check json_is_parsed: p.is_parsed end
-		end
-
-	test_dir: STRING
-		local
-			i: INTEGER
-		do
-			Result := (create {EXECUTION_ENVIRONMENT}).current_working_directory
-			Result.append_character ((create {OPERATING_ENVIRONMENT}).directory_separator)
-				-- The should looks like
-				-- ..json\test\autotest\test_suite\EIFGENs\test_suite\Testing\execution\TEST_JSON_SUITE.test_json_fail1\..\..\..\..\..\fail1.json
-			from
-				i := 5
-			until
-				i = 0
-			loop
-				Result.append_character ('.')
-				Result.append_character ('.')
-				Result.append_character ((create {OPERATING_ENVIRONMENT}).directory_separator)
-				i := i - 1
+			p.parse_content
+			check
+				json_is_parsed: p.is_parsed
 			end
+			Result := p.parsed_json_value
 		end
 
 end
-
-
diff --git a/test/min_hal_document.json b/test/min_hal_document.json
new file mode 100644
index 0000000..9e26dfe
--- /dev/null
+++ b/test/min_hal_document.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/test/model/customer.e b/test/model/customer.e
index 2609b45..3781157 100644
--- a/test/model/customer.e
+++ b/test/model/customer.e
@@ -1,29 +1,31 @@
 note
 	description: "Summary description for {CUSTOMER}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
 
 class
 	CUSTOMER
 create
 	make
 feature {NONE} -- Initialization
-	make (a_name : STRING; an_email: STRING)
+
+	make (a_name : READABLE_STRING_GENERAL; an_email: STRING)
 		do
 			set_name (a_name)
 			set_email (an_email)
 		end
 
 feature -- Acceess
-	name : STRING
+
+	name : STRING_32
 	email : STRING
 
 feature -- Element change	
 
-	set_name ( a_name : STRING)
+	set_name ( a_name : READABLE_STRING_GENERAL)
 		do
-			name := a_name
+			name := a_name.as_string_32
 		end
 
 	set_email (an_email : STRING)
diff --git a/test/model/item.e b/test/model/item.e
index a90204e..d83140e 100644
--- a/test/model/item.e
+++ b/test/model/item.e
@@ -1,14 +1,20 @@
 note
 	description: "Summary description for {ITEM}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
 
 class
 	ITEM
+
+inherit
+	DEBUG_OUTPUT
+
 create
 	make
+
 feature {NONE} -- Initialization
+
 	make (an_id : STRING; a_quantity : NATURAL; a_price : REAL )
 		do
 			set_id (an_id)
@@ -16,12 +22,24 @@ feature {NONE} -- Initialization
 			set_price (a_price)
 		end
 
+feature -- Status report
+
+	debug_output: STRING_32
+		do
+			create Result.make_empty
+			Result.append_string_general (id)
+		end
+
 feature -- Access
+
 	id : STRING
+
 	quantity : NATURAL
+
 	price : REAL
 
 feature -- Element Change
+
 	set_id (an_id : STRING)
 		do
 			id := an_id
diff --git a/test/model/line_item.e b/test/model/line_item.e
index 21f663e..5c7710d 100644
--- a/test/model/line_item.e
+++ b/test/model/line_item.e
@@ -1,8 +1,8 @@
 note
 	description: "Summary description for {LINE_ITEM}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 16:23:13 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100528 $"
 
 class
 	LINE_ITEM
@@ -24,18 +24,14 @@ feature -- Access
 
    items: LIST [ITEM]
         do
-            from
-                create {LINKED_LIST [ITEM]} Result.make
-				item_index.start
-            until
-                item_index.after
+			create {ARRAYED_LIST [ITEM]} Result.make (item_index.count)
+			across
+				item_index as ic
             loop
-                Result.append (item_index.item_for_iteration)
-                item_index.forth
+                Result.append (ic.item)
             end
         end
 
-
 feature -- Status setting
 
     set_name (a_name: STRING_32)
@@ -45,35 +41,27 @@ feature -- Status setting
 
     add_item (an_item: ITEM)
         local
-            l: detachable LIST [ITEM]
+            lst: detachable LIST [ITEM]
         do
-            if item_index.has (an_item.id) then
-                l := item_index.at ( an_item.id )
-            else
-                create {LINKED_LIST [ITEM]} l.make
-                item_index.put (l, an_item.id)
-            end
-            if attached l as la then
-           	 	la.force (an_item)
+            lst := item_index.item (an_item.id)
+            if lst = Void then
+                create {ARRAYED_LIST [ITEM]} lst.make (1)
+                item_index.force (lst, an_item.id)
             end
-
+			lst.force (an_item)
         end
 
-	add_items (item_list: like items)
+	add_items (lst: like items)
         do
-            from
-                item_list.start
-            until
-                item_list.after
+            across
+                lst as ic
             loop
-                add_item (item_list.item)
-                item_list.forth
+                add_item (ic.item)
             end
         end
 
-
 feature {NONE} -- Implementation
 
-    item_index: HASH_TABLE [LIST [ITEM], STRING_32]
+    item_index: STRING_TABLE [LIST [ITEM]]
 
 end -- class LINE_ITEM
diff --git a/test/model/order.e b/test/model/order.e
index 419f12c..aa9ff69 100644
--- a/test/model/order.e
+++ b/test/model/order.e
@@ -1,8 +1,8 @@
 note
 	description: "Summary description for {ORDER}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2015-09-28 20:08:40 +0200 (lun., 28 sept. 2015) $"
+	revision: "$Revision: 97942 $"
 
 class
 	ORDER
diff --git a/test/model/order_repository.e b/test/model/order_repository.e
index 073b279..5e58315 100644
--- a/test/model/order_repository.e
+++ b/test/model/order_repository.e
@@ -1,31 +1,39 @@
 note
 	description: "Summary description for {ORDER_REPOSITORY}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2017-06-20 18:10:43 +0200 (mar., 20 juin 2017) $"
+	revision: "$Revision: 100533 $"
 
 class
 	ORDER_REPOSITORY
+
 create
 	make
-feature
-    make
-    	do
+
+feature {NONE} -- Initialization
+
+	make
+		do
 			create repo.make (10)
 			current_id := 0
 			next_id := 1
-    	end
- feature  -- Access
- 	current_id : INTEGER
- 	next_id : INTEGER
-
-    save ( a_order : ORDER)
-    	do
-    		repo.force (a_order, next_id)
-    		current_id := next_id
-    		next_id := next_id + 1
-    	end
+		end
+
+feature -- Access
+
+	current_id: INTEGER
+
+	next_id: INTEGER
+
+	save (a_order: ORDER)
+		do
+			repo.force (a_order, next_id)
+			current_id := next_id
+			next_id := next_id + 1
+		end
 
 feature {NONE} -- implementation
-	repo: HASH_TABLE[ORDER,INTEGER]
+
+	repo: HASH_TABLE [ORDER, INTEGER]
+
 end
diff --git a/test/model/shared_order_repository.e b/test/model/shared_order_repository.e
index 60b0baa..b229479 100644
--- a/test/model/shared_order_repository.e
+++ b/test/model/shared_order_repository.e
@@ -1,8 +1,8 @@
 note
 	description: "Summary description for {SHARED_ORDER_REPOSITORY}."
 	author: ""
-	date: "$Date$"
-	revision: "$Revision$"
+	date: "$Date: 2015-09-28 20:08:40 +0200 (lun., 28 sept. 2015) $"
+	revision: "$Revision: 97942 $"
 
 deferred class
 	SHARED_ORDER_REPOSITORY
diff --git a/test/test.rc b/test/test.rc
deleted file mode 100644
index b0ec159..0000000
--- a/test/test.rc
+++ /dev/null
@@ -1,6 +0,0 @@
-#include <windows.h>
-
-STRINGTABLE
-BEGIN
-	1 "This Program was made using EiffelStudio using Visual Studio C++"
-END
diff --git a/test/test_suite.ecf b/test/test_suite.ecf
index 77f9c0d..e5812fb 100644
--- a/test/test_suite.ecf
+++ b/test/test_suite.ecf
@@ -1,13 +1,13 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
-<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-9-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-9-0 http://www.eiffel.com/developers/xml/configuration-1-9-0.xsd" name="test" uuid="68E0C364-BA4A-4472-B21F-ADB370B0426F">
-	<target name="test_suite">
+<system xmlns="http://www.eiffel.com/developers/xml/configuration-1-15-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.eiffel.com/developers/xml/configuration-1-15-0 http://www.eiffel.com/developers/xml/configuration-1-15-0.xsd" name="test_hal" uuid="642149F5-681B-4A98-9811-64958371A3D3">
+	<target name="test_hal">
 		<root cluster="test" class="APPLICATION" feature="make"/>
 		<file_rule>
-			<exclude>/EIFGENs$</exclude>
-			<exclude>/CVS$</exclude>
 			<exclude>/.svn$</exclude>
+			<exclude>/CVS$</exclude>
+			<exclude>/EIFGENs$</exclude>
 		</file_rule>
-		<option warning="true" full_class_checking="true" is_attached_by_default="true" void_safety="all">
+		<option warning="true">
 			<assertions precondition="true" postcondition="true" check="true" invariant="true" loop="true" supplier_precondition="true"/>
 		</option>
 		<library name="base" location="$ISE_LIBRARY\library\base\base-safe.ecf"/>
