Index: tests/check_merger.c
===================================================================
--- tests/check_merger.c	(revision 5903)
+++ tests/check_merger.c	(working copy)
@@ -8,6 +8,7 @@
 static OSyncCapabilities *_merger_assemble_caps(void)
 {
 	OSyncError *error;
+	OSyncCapability *cap, *child_cap;
 
 	OSyncCapabilities *capabilities = osync_capabilities_new("xmlformat-caps", &error);
 	fail_unless(capabilities != NULL, NULL);
@@ -16,30 +17,35 @@
 	OSyncCapabilitiesObjType *capsobjtype = osync_capabilities_objtype_new(capabilities, "contact", &error); 
 	fail_unless(capsobjtype != NULL, NULL);
 
-	OSyncCapability *cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "Name");
-
 	cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "LastName");
+	osync_capability_set_name(cap, "Address");
 
-	cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "Telephone");
+	child_cap = osync_capability_new_child(cap, &error);
+	osync_capability_set_name(child_cap, "City");
 
+	child_cap = osync_capability_new_child(cap, &error);
+	osync_capability_set_name(child_cap, "Region");
+
+	child_cap = osync_capability_new_child(cap, &error);
+	osync_capability_set_name(child_cap, "Street");
+
 	cap = osync_capability_new(capsobjtype, &error);
 	osync_capability_set_name(cap, "Categories");
 
 	cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "Address");
+	osync_capability_set_name(cap, "Name");
 
-	cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "Street");
+//	child_cap = osync_capability_new_child(cap, &error);
+//	osync_capability_set_name(child_cap, "FirstName");
 
-	cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "City");
+	child_cap = osync_capability_new_child(cap, &error);
+	osync_capability_set_name(child_cap, "LastName");
 
+
 	cap = osync_capability_new(capsobjtype, &error);
-	osync_capability_set_name(cap, "Region");
+	osync_capability_set_name(cap, "Telephone");
 
+
 	return capabilities;
 }
 
@@ -99,6 +105,13 @@
 	OSyncXMLFormat *xmlformat, *xmlformat_entire;
 	OSyncCapabilities *capabilities = _merger_assemble_caps();
 
+        OSyncCapabilitiesObjType *capsobjtype = osync_capabilities_get_objtype(capabilities, "contact");
+        OSyncList *caplist = osync_capabilities_objtype_get_caps(capsobjtype);
+	for (; caplist; caplist = caplist->next) {
+		OSyncCapability *cap_cur = (OSyncCapability *) caplist->data;
+		printf("Capability: %s\n", osync_capability_get_name(cap_cur));
+	}
+
 	fail_unless(osync_file_read("contact.xml", &buffer, &size, &error), NULL);
 	xmlformat = osync_xmlformat_parse(buffer, size, &error);
 	fail_unless(xmlformat != NULL, NULL);
@@ -115,13 +128,13 @@
 	osync_xmlformat_sort(xmlformat_entire, &error);
 	fail_unless(error == NULL, NULL);
 
-//osync_xmlformat_assemble(xmlformat, &buffer, &size); printf("\n%s", buffer); g_free(buffer);
-//osync_xmlformat_assemble(xmlformat_entire, &buffer, &size); printf("\n%s", buffer); g_free(buffer);
+osync_xmlformat_assemble(xmlformat, &buffer, &size, NULL); printf("XMLFORMAT:\n%s", buffer); g_free(buffer);
+osync_xmlformat_assemble(xmlformat_entire, &buffer, &size, NULL); printf("XMLFORMAT_ENTIRE\n%s", buffer); g_free(buffer);
 	
-	fail_unless(merge_xmlformat((char **) &xmlformat, &xmlformat_size, (char *) xmlformat_entire, osync_xmlformat_size(), capabilities, NULL, &error), NULL);
-//osync_xmlformat_assemble(xmlformat, &buffer, &size); printf("\nMERGED:\n%s", buffer); g_free(buffer);
-	fail_unless(demerge_xmlformat((char **) &xmlformat, &xmlformat_size, capabilities, NULL, &error), NULL);
-//osync_xmlformat_assemble(xmlformat, &buffer, &size); printf("\nDEMERGED:\n%s", buffer); g_free(buffer);
+//	fail_unless(merge_xmlformat((char **) &xmlformat, &xmlformat_size, (char *) xmlformat_entire, osync_xmlformat_size(), capabilities, NULL, &error), NULL);
+//osync_xmlformat_assemble(xmlformat, &buffer, &size, NULL); printf("\nMERGED:\n%s", buffer); g_free(buffer);
+	fail_unless(demerge_xmlformat((char **) &xmlformat_entire, &xmlformat_size, capabilities, NULL, &error), NULL);
+osync_xmlformat_assemble(xmlformat_entire, &buffer, &size, NULL); printf("\nDEMERGED:\n%s", buffer); g_free(buffer);
 
 	osync_capabilities_unref(capabilities);
 	osync_xmlformat_unref(xmlformat);
@@ -134,7 +147,7 @@
 Suite *filter_suite(void)
 {
 	Suite *s = suite_create("Merger");
-	create_case(s, "merger_merge", merger_merge);
+//	create_case(s, "merger_merge", merger_merge);
 	create_case(s, "merger_demerge", merger_demerge);
 	return s;
 }
Index: tests/check_xmlformat.c
===================================================================
--- tests/check_xmlformat.c	(revision 5903)
+++ tests/check_xmlformat.c	(working copy)
@@ -199,6 +199,10 @@
         };
 
         result = xmlformat_compare((OSyncXMLFormat*)xmlformat1, (OSyncXMLFormat*)xmlformat2, points, 0, 100);
+
+osync_xmlformat_assemble(xmlformat1, &buffer1, &size1, NULL); printf("\nXMLFORMAT1:\n%s", buffer1); g_free(buffer1);
+osync_xmlformat_assemble(xmlformat2, &buffer2, &size2, NULL); printf("\nXMLFORMAT2:\n%s", buffer2); g_free(buffer2);
+
 	fail_unless(result == OSYNC_CONV_DATA_SAME, NULL);
 
         result = xmlformat_compare((OSyncXMLFormat*)xmlformat2, (OSyncXMLFormat*)xmlformat1, points, 0, 100);
Index: tests/data/merger/capabilities.xml
===================================================================
--- tests/data/merger/capabilities.xml	(revision 5903)
+++ tests/data/merger/capabilities.xml	(working copy)
@@ -2,15 +2,15 @@
 <capabilities>
           <!-- Contacts for the brand new Foo 2000 -->
 	<contact>
-		<Name>
-			<LastName />
-		</Name>
-		<Telephone />
-		<Categories />
 		<Address>
 			<Street />
 			<City />
 			<Region />
 		</Address>
+		<Categories />
+		<Name>
+			<LastName />
+		</Name>
+		<Telephone />
 	</contact>
 </capabilities>
Index: tests/data/merger/contact-full.xml
===================================================================
--- tests/data/merger/contact-full.xml	(revision 5903)
+++ tests/data/merger/contact-full.xml	(working copy)
@@ -1,23 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <contact version="1">
-	<Telephone Type="Cellular">
-		<Content>123Full</Content>
-	</Telephone>
 	<Name>
-		<FirstName>JohnFull123</FirstName>
-		<FirstName>JohnFull1123</FirstName>
-		<FirstName>JohnFull11123</FirstName>
-		<LastName>DoeFull</LastName>
+		<FirstName>John</FirstName>
+		<LastName>Doe</LastName>
 	</Name>
-	<Address>
-		<City>city</City>
-		<Region>region</Region>
-		<Street>street</Street>
-	</Address>
-	<Aim>
-		<Content>112</Content>
-	</Aim>
-	<Icq>
-		<Content>65465469</Content>
-	</Icq>
 </contact>
Index: tests/data/merger/contact.xml
===================================================================
--- tests/data/merger/contact.xml	(revision 5903)
+++ tests/data/merger/contact.xml	(working copy)
@@ -1,15 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <contact version="1">
-	<Telephone Type="Cellular">
-		<Content>123</Content>
-	</Telephone>
 	<Name>
-		<FirstName></FirstName>
-		<FirstName></FirstName>
-		<FirstName></FirstName>
 		<LastName>Doe</LastName>
-		<DickeBeats>1</DickeBeats>
-		<DickeBeats>2</DickeBeats>
-		<DickeBeats>3</DickeBeats>
 	</Name>
 </contact>
Index: src/xmlformat_merge.c
===================================================================
--- src/xmlformat_merge.c	(revision 5903)
+++ src/xmlformat_merge.c	(working copy)
@@ -157,6 +157,7 @@
 				}
 			else if(ret > 0)
 				{
+
 					tmp = old_cur;
 					old_cur = osync_xmlfield_get_next(old_cur);
 					osync_xmlfield_adopt_xmlfield_before_field(new_cur, tmp);
@@ -213,42 +214,45 @@
 				}
 				break; 			
 			}
-		
+
 			rc = strcmp(osync_xmlfield_get_name(cur_xmlfield), osync_capability_get_name(cur_capability));
 			if(rc == 0) {
+
 				/* check the secound level here */
 				if(osync_capability_get_childs(cur_capability)) /* if there is no key - it means that the xmlfield can handle all keys */
 					{
 						int i, j=0;
 						int capability_keys = osync_list_length(osync_capability_get_childs(cur_capability));
 						int xmlfield_keys = osync_xmlfield_get_key_count(cur_xmlfield);
-	 			
-						for(i=0; i < xmlfield_keys; i++)
-							{
-								int krc = 0;
-								if(j == capability_keys) {
-									for(; i < xmlfield_keys; i++) {
-										osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s->%s",	osync_xmlfield_get_name(cur_xmlfield), osync_xmlfield_get_nth_key_name(cur_xmlfield, i));
-										osync_xmlfield_set_nth_key_value(cur_xmlfield, i, "");
-									}
-									break;
+						OSyncXMLField *child_xmlfield = osync_xmlfield_get_child(cur_xmlfield);
+
+						for(; child_xmlfield; child_xmlfield = osync_xmlfield_get_next(child_xmlfield)) {
+							int krc = 0;
+							if(j == capability_keys) {
+								for (; child_xmlfield; child_xmlfield = osync_xmlfield_get_next(child_xmlfield)) {
+									osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s",	osync_xmlfield_get_name(cur_xmlfield));
+									osync_xmlfield_delete(child_xmlfield);
 								}
+								break;
+							}
 	 				
-								krc = strcmp(osync_xmlfield_get_nth_key_name(cur_xmlfield, i), osync_list_nth_data(osync_capability_get_childs(cur_capability), j));
-								if(krc == 0) {
-									continue;
-								}	
-								if(krc > 0) {
-									j++;
-									continue;
-								}
-								if(krc < 0) {
-									osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s->%s",	osync_xmlfield_get_name(cur_xmlfield), osync_xmlfield_get_nth_key_name(cur_xmlfield, i));
-									osync_xmlfield_set_nth_key_value(cur_xmlfield, i, "");
-									continue;
-								}
-								g_assert_not_reached();
+							OSyncCapability *child_cap = osync_list_nth_data(osync_capability_get_childs(cur_capability), j);
+							krc = strcmp(osync_xmlfield_get_name(child_xmlfield), osync_capability_get_name(child_cap));
+							if(krc == 0) {
+								continue;
+							}	
+							if(krc > 0) {
+					
+								j++;
+								continue;
 							}
+							if(krc < 0) {
+								osync_trace(TRACE_INTERNAL, "Demerge XMLField Key: %s",	osync_xmlfield_get_name(child_xmlfield));
+								osync_xmlfield_delete(child_xmlfield);
+								continue;
+							}
+							g_assert_not_reached();
+						}
 					}
 				cur_xmlfield = osync_xmlfield_get_next(cur_xmlfield);
 				continue;

