Index: wrapper/opensync-format.i
===================================================================
--- wrapper/opensync-format.i	(revision 5509)
+++ wrapper/opensync-format.i	(working copy)
@@ -41,9 +41,9 @@
 		return ret;
 	}
 
-	void invoke(Data *data, const char *config) {
+	void invoke(Data *data, const char *config, Capabilities *caps, Data *archived_data) {
 		Error *err = NULL;
-		bool ret = osync_converter_invoke(self, data, config, &err);
+		bool ret = osync_converter_invoke(self, data, config, caps, archived_data, &err);
 		if (!raise_exception_on_error(err) && !ret)
 			wrapper_exception("osync_converter_invoke failed but did not set error code");
 	}
@@ -222,9 +222,9 @@
 		return ret;
 	}
 
-	void convert(FormatConverterPath *path, Data *data) {
+	void convert(FormatConverterPath *path, Data *data, Capabilities *caps, Data *archived_data) {
 		Error *err = NULL;
-		bool ret = osync_format_env_convert(self, path, data, &err);
+		bool ret = osync_format_env_convert(self, path, data, caps, archived_data, &err);
 		if (!raise_exception_on_error(err) && !ret)
 			wrapper_exception("osync_format_env_convert failed but did not set error code");
 	}
Index: opensync/format/opensync_objformat_private.h
===================================================================
--- opensync/format/opensync_objformat_private.h	(revision 5509)
+++ opensync/format/opensync_objformat_private.h	(working copy)
@@ -61,8 +61,6 @@
 	OSyncFormatMarshalFunc marshal_func;
 	OSyncFormatDemarshalFunc demarshal_func;
 	OSyncFormatValidateFunc validate_func;
-	OSyncFormatMergeFunc merge_func;
-	OSyncFormatDemergeFunc demerge_func;
 };
 
 /*@}*/
Index: opensync/format/opensync_objformat.c
===================================================================
--- opensync/format/opensync_objformat.c	(revision 5509)
+++ opensync/format/opensync_objformat.c	(working copy)
@@ -301,41 +301,3 @@
 	return format->validate_func ? TRUE : FALSE;
 }
 
-void osync_objformat_set_merge_func(OSyncObjFormat *format, OSyncFormatMergeFunc merge_func)
-{
-	osync_return_if_fail(format);
-	format->merge_func = merge_func;
-}
-
-osync_bool osync_objformat_merge(OSyncObjFormat *format,
-		char **data, unsigned int *size,
-		const char *entire, unsigned int entsize,
-		OSyncCapabilities *caps, OSyncError **error)
-{
-	osync_assert(format);
-	osync_return_val_if_fail(format->merge_func, TRUE);
-	return format->merge_func(data, size, entire, entsize, caps, format->user_data, error);
-}
-
-void osync_objformat_set_demerge_func(OSyncObjFormat *format, OSyncFormatDemergeFunc demerge_func)
-{
-	osync_return_if_fail(format);
-	format->demerge_func = demerge_func;
-}
-
-osync_bool osync_objformat_demerge(OSyncObjFormat *format,
-		char **data, unsigned int *size,
-		OSyncCapabilities *caps, OSyncError **error)
-{
-	osync_assert(format);
-	osync_return_val_if_fail(format->demerge_func, TRUE);
-	return format->demerge_func(data, size, caps, format->user_data, error);
-}
-
-
-osync_bool osync_objformat_has_merger(OSyncObjFormat *format)
-{
-	osync_return_val_if_fail(format, FALSE);
-	return (format->demerge_func && format->merge_func) ? TRUE : FALSE;
-}
-
Index: opensync/format/opensync_objformat.h
===================================================================
--- opensync/format/opensync_objformat.h	(revision 5509)
+++ opensync/format/opensync_objformat.h	(working copy)
@@ -44,9 +44,6 @@
 typedef osync_bool (* OSyncFormatDemarshalFunc) (OSyncMarshal *marshal, char **output, unsigned int *outpsize, void *user_data, OSyncError **error);
 typedef osync_bool (* OSyncFormatValidateFunc) (const char *data, unsigned int size, void *user_data, OSyncError **error);
 
-typedef osync_bool (* OSyncFormatMergeFunc) (char **data, unsigned int *size, const char *entire, unsigned int entsize, OSyncCapabilities *caps, void *user_data, OSyncError **error);
-typedef osync_bool (* OSyncFormatDemergeFunc) (char **data, unsigned int *size, OSyncCapabilities *caps, void *user_data, OSyncError **error);
-
 /**
  * @brief Creates a new object format
  * @param name the name of the object format
@@ -225,28 +222,6 @@
 OSYNC_EXPORT void osync_objformat_set_validate_func(OSyncObjFormat *format, OSyncFormatValidateFunc validate_func);
 
 /**
- * @brief Sets the optional merge function for an object format
- *
- * The merge function can be used to merge data for the specific
- * format. This is optional.
- *
- * @param format Pointer to the object format
- * @param merge_func The merge function to use
- */
-OSYNC_EXPORT void osync_objformat_set_merge_func(OSyncObjFormat *format, OSyncFormatMergeFunc merge_func);
-
-/**
- * @brief Sets the optional demerge function for an object format
- *
- * The demerge function can be used to demerge data for the specific
- * format. This is optional.
- *
- * @param format Pointer to the object format
- * @param demerge_func The demerge function to use
- */
-OSYNC_EXPORT void osync_objformat_set_demerge_func(OSyncObjFormat *format, OSyncFormatDemergeFunc demerge_func);
-
-/**
  * @brief Prints the specified object
  *
  * Uses the object format's print function if set, otherwise the object's
Index: opensync/format/opensync_format_env.c
===================================================================
--- opensync/format/opensync_format_env.c	(revision 5509)
+++ opensync/format/opensync_format_env.c	(working copy)
@@ -626,7 +626,7 @@
 			OSyncFormatConverter *edge = e->data;
 			osync_converter_path_add_edge(path_tmp, edge);
 		}
-		if (!(osync_format_env_convert(env, path_tmp, current->data, error))) {
+		if (!(osync_format_env_convert(env, path_tmp, current->data, NULL, NULL, error))) {
 			osync_trace(TRACE_INTERNAL, "osync format env convert on this path failed - skipping the conversion");
 			continue;
 		}
@@ -1012,7 +1012,7 @@
 			converter = d->data;
 			if (osync_converter_matches(converter, new_data) && osync_converter_get_type(converter) == OSYNC_CONVERTER_DECAP) {
 				/* Run the decap */
-				if (!osync_converter_invoke(converter, new_data, NULL, error)) {
+				if (!osync_converter_invoke(converter, new_data, NULL, NULL, NULL, error)) {
 					osync_error_set(error, OSYNC_ERROR_GENERIC, "Unable to decap the change");
 					goto error_free_data;
 				}
@@ -1045,13 +1045,13 @@
 	return FALSE;
 }
 
-osync_bool osync_format_env_convert(OSyncFormatEnv *env, OSyncFormatConverterPath *path, OSyncData *data, OSyncError **error)
+osync_bool osync_format_env_convert(OSyncFormatEnv *env, OSyncFormatConverterPath *path, OSyncData *data, OSyncCapabilities *caps, OSyncData *archived_data, OSyncError **error)
 {
 	OSyncObjFormat *source = NULL;
 	int length = 0;
 	char *buffer = NULL;
 	
-	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p)", __func__, env, path, data, error);
+	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p, %p, %p)", __func__, env, path, data, caps, archived_data, error);
 	osync_assert(data);
 	osync_assert(env);
 	osync_assert(path);
@@ -1082,7 +1082,7 @@
 		for (i = 0; i < length; i++) {
 			OSyncFormatConverter *converter = osync_converter_path_nth_edge(path, i);
 			
-			if (!osync_converter_invoke(converter, data, osync_converter_path_get_config(path), error)) {
+			if (!osync_converter_invoke(converter, data, osync_converter_path_get_config(path), caps, archived_data, error)) {
 				osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(error));
 				return FALSE;
 			}
Index: opensync/format/opensync_format_env.h
===================================================================
--- opensync/format/opensync_format_env.h	(revision 5509)
+++ opensync/format/opensync_format_env.h	(working copy)
@@ -187,11 +187,13 @@
  * @param env The conversion environment to use
  * @param path The conversion path to follow
  * @param data The data object to convert
+ * @param caps The capabilities information. optional and can be NULL
+ * @param archived_data The data object which got archived and should be used for merging. optional and can be NULL
  * @param error The error-return location
  * @returns TRUE on success, FALSE otherwise
  * 
  */
-OSYNC_EXPORT osync_bool osync_format_env_convert(OSyncFormatEnv *env, OSyncFormatConverterPath *path, OSyncData *data, OSyncError **error);
+OSYNC_EXPORT osync_bool osync_format_env_convert(OSyncFormatEnv *env, OSyncFormatConverterPath *path, OSyncData *data,  OSyncCapabilities *caps, OSyncData *archived_data, OSyncError **error);
 
 /** @brief Find a conversion path between two formats
  * 
Index: opensync/format/opensync_objformat_internals.h
===================================================================
--- opensync/format/opensync_objformat_internals.h	(revision 5509)
+++ opensync/format/opensync_objformat_internals.h	(working copy)
@@ -178,50 +178,6 @@
  */
 osync_bool osync_objformat_must_validate(OSyncObjFormat *format);
 
-/**
- * @brief Merge supplied data in format specific way
- *
- * @param format Pointer to the object format
- * @param data Reference of buffer which stores data to merge
- * @param size Reference of size in bytes of the buffer specified by the data paramter
- * @param entire
- * @param entsize Size in bytes of the base data buffer specified by the entire parameter
- * @param caps The capabilities list which describes what must get merged: entire -> input
- * @param error Pointer to an error struct
- * @returns TRUE if data got merged successfully, otherwise FALSE
- */
-OSYNC_TEST_EXPORT osync_bool osync_objformat_merge(OSyncObjFormat *format,
-		char **data, unsigned int *size,
-		const char *entire, unsigned int entsize,
-		OSyncCapabilities *caps, OSyncError **error);
-
-/**
- * @brief Demerge supplied data in format specific way
- *
- * @param format Pointer to the object format
- * @param data Pointer to the buffer which should get demerged 
- * @param size Reference of size in bytes of the buffer specified by the data parameter
- * @param caps The capabilities list which describes what must get demerged
- * @param error Pointer to an error struct
- * @returns TRUE if data got demerged successfully, otherwise FALSE
- */
-OSYNC_TEST_EXPORT osync_bool osync_objformat_demerge(OSyncObjFormat *format,
-		char **data, unsigned int *size,
-		OSyncCapabilities *caps, OSyncError **error);
-
-/**
- * @brief Check if specific format is able to merge/demerge 
- *
- * If merge and demerge function are set for the specific format then merger
- * and demerger get invoked. Merger/Demerge still can be disabled in group
- * configuration, by disabling the merger, or not providing capabilities for
- * the member.
- *
- * @param format Pointer to the object format
- * @returns TRUE if merge and demerge is support for this format, otherwise FALSE
- */
-osync_bool osync_objformat_has_merger(OSyncObjFormat *format);
-
 /*@}*/
 
 #endif /* _OPENSYNC_OBJFORMAT_INTERNALS_H_ */
Index: opensync/format/opensync_converter.c
===================================================================
--- opensync/format/opensync_converter.c	(revision 5509)
+++ opensync/format/opensync_converter.c	(working copy)
@@ -169,18 +169,20 @@
 	return NULL;
 }
 
-osync_bool osync_converter_invoke(OSyncFormatConverter *converter, OSyncData *data, const char *config, OSyncError **error)
+osync_bool osync_converter_invoke(OSyncFormatConverter *converter, OSyncData *data, const char *config, OSyncCapabilities *caps, OSyncData *archived, OSyncError **error)
 {
 	char *input_data = NULL;
 	unsigned int input_size = 0;
 	char *output_data = NULL;
 	unsigned int output_size = 0;
+	char *archived_data = NULL;
+	unsigned int archived_size = 0;
 	osync_bool free_input = FALSE;
 	
 	osync_assert(converter);
 	osync_assert(data);
 	
-	osync_trace(TRACE_ENTRY, "%s(%p, %p, %s, %p)", __func__, converter, data, __NULLSTR(config), error);
+	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p, %p, %s, %p)", __func__, converter, data, caps, archived, __NULLSTR(config), error);
 	osync_trace(TRACE_INTERNAL, "Converter of type %i, from %p(%s) to %p(%s)", converter->type, converter->source_format, osync_objformat_get_name(converter->source_format), converter->target_format, osync_objformat_get_name(converter->target_format));
 	
 	if (converter->type != OSYNC_CONVERTER_DETECTOR) {
@@ -188,9 +190,12 @@
 		osync_data_steal_data(data, &input_data, &input_size);
 		if (input_data) {
 			osync_assert(converter->convert_func);
+
+			if (archived)
+				osync_data_get_data(archived, &archived_data, &archived_size);
 		
 			/* Invoke the converter */
-			if (!converter->convert_func(input_data, input_size, &output_data, &output_size, &free_input, config, converter->userdata, error))
+			if (!converter->convert_func(input_data, input_size, &output_data, &output_size, &free_input, caps, archived_data, archived_size, config, converter->userdata, error))
 				goto error;
 
 			/* Validate if for this objformat are format-plugin validiation-function is provided */
Index: opensync/format/opensync_converter.h
===================================================================
--- opensync/format/opensync_converter.h	(revision 5509)
+++ opensync/format/opensync_converter.h	(working copy)
@@ -42,7 +42,7 @@
 } OSyncConverterType;
 
 typedef osync_bool (* OSyncFormatDetectFunc) (const char *data, int size, void *userdata);
-typedef osync_bool (* OSyncFormatConvertFunc) (char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error);
+typedef osync_bool (* OSyncFormatConvertFunc) (char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size,  const char *config, void *userdata, OSyncError **error);
 typedef void * (* OSyncFormatConverterInitializeFunc) (const char *config, OSyncError **error);
 typedef void (* OSyncFormatConverterFinalizeFunc) (void *userdata);
 
@@ -117,10 +117,12 @@
  * @param converter Pointer to the converter
  * @param data Pointer to OSyncData object which should be detected
  * @param config Format converter configuration
+ * @param caps Pointer to capabilities for merging. optional, can be NULL
+ * @param archived Pointer to archived data, which should get used for merging. optional, can be NULL
  * @param error Pointer to an error struct
  * @returns TRUE on successful conversion, FALSE on error
  */
-OSYNC_EXPORT osync_bool osync_converter_invoke(OSyncFormatConverter *converter, OSyncData *data, const char *config, OSyncError **error);
+OSYNC_EXPORT osync_bool osync_converter_invoke(OSyncFormatConverter *converter, OSyncData *data, const char *config, OSyncCapabilities *caps, OSyncData *archived, OSyncError **error);
 
 /**
  * @brief Checks if the Format Converter fits the Object Format of OSyncData object
Index: opensync/engine/opensync_mapping_entry_engine_internals.h
===================================================================
--- opensync/engine/opensync_mapping_entry_engine_internals.h	(revision 5509)
+++ opensync/engine/opensync_mapping_entry_engine_internals.h	(working copy)
@@ -108,18 +108,16 @@
  */
 void osync_entry_engine_set_dirty(OSyncMappingEntryEngine *engine, osync_bool dirty);
 
-/** @brief Demerge the entry in the OSyncMappingEntryEngine
+/** @brief Archive the entry in the OSyncMappingEntryEngine
  *
- * The demerge includes storing the "entire" entry in the Archive. The demerging is done
- * based on the supplied OSyncCapabilities.
+ * This stores the "entire" entry in the Archive.
  *
  * @param engine Pointer to an OSyncMappingEntryEngine
  * @param archive Pointer to the Archive to store the "entire" entry before demerging
- * @param caps Pointer to Capabilities to use for demerging
  * @param error Pointer to error struct, which get set on any error
  * @returns TRUE on successful demerge, FALSE otherwise
  */
-osync_bool osync_entry_engine_demerge(OSyncMappingEntryEngine *engine, OSyncArchive *archive, OSyncCapabilities *caps, OSyncError **error);
+osync_bool osync_entry_engine_archive(OSyncMappingEntryEngine *engine, OSyncArchive *archive, OSyncError **error);
 
 /** @brief convert the entry in the OSyncMappingEntryEngine 
  *
@@ -134,11 +132,12 @@
  * @param formatenv Pointer to format environment 
  * @param objtype_sink Pointer to Object Type Sink which stores format configurations 
  * @param path Reference to OSyncFormatConverterPath to supplied or store the cache conversion path
+ * @param caps Pointer to capabilities of the peer which will retrieve the conversion result. optional, can be NULL
  * @param error Pointer to error struct, which get set on any error
  * @returns TRUE on successful demerge, FALSE otherwise
  */
 
-osync_bool osync_entry_engine_convert(OSyncMappingEntryEngine *engine, OSyncFormatEnv *formatenv, OSyncObjTypeSink *objtype_sink, OSyncFormatConverterPath **path, OSyncError **error);
+osync_bool osync_entry_engine_convert(OSyncMappingEntryEngine *engine, OSyncFormatEnv *formatenv, OSyncObjTypeSink *objtype_sink, OSyncFormatConverterPath **path, OSyncCapabilities *caps, OSyncError **error);
 
 /*@}*/
 
Index: opensync/engine/opensync_sink_engine.c
===================================================================
--- opensync/engine/opensync_sink_engine.c	(revision 5509)
+++ opensync/engine/opensync_sink_engine.c	(working copy)
@@ -124,7 +124,7 @@
 	return osync_client_proxy_get_member(engine->proxy);
 }
 
-osync_bool osync_sink_engine_demerge(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error)
+osync_bool osync_sink_engine_archive(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error)
 {
 	OSyncList *o;
 	OSyncMember *member;
@@ -150,10 +150,7 @@
 		if (osync_change_get_changetype(entry_engine->change) == OSYNC_CHANGE_TYPE_DELETED)
 			continue;
 
-		if (!osync_objformat_has_merger(osync_change_get_objformat(entry_engine->change)))
-			continue;
-
-		if (!osync_entry_engine_demerge(entry_engine, archive, caps, error))
+		if (!osync_entry_engine_archive(entry_engine, archive, error))
 			goto error;
 
 	}
@@ -170,6 +167,7 @@
 	OSyncObjTypeSink *objtype_sink;
 	const char *objtype;
 	OSyncFormatConverterPath *path = NULL;
+	OSyncCapabilities *caps;
 
 	osync_assert(engine);
 	osync_assert(formatenv);
@@ -177,6 +175,8 @@
 	member = osync_client_proxy_get_member(engine->proxy);
 	osync_assert(member);
 
+	caps = osync_member_get_capabilities(member); 
+
 	objtype = osync_obj_engine_get_objtype(engine->engine);
 	objtype_sink = osync_member_find_objtype_sink(member, objtype);
 	osync_assert(objtype_sink);
@@ -191,7 +191,7 @@
 		if (osync_change_get_changetype(entry_engine->change) == OSYNC_CHANGE_TYPE_DELETED)
 			continue;
 
-		if (!osync_entry_engine_convert(entry_engine, formatenv, objtype_sink, &path, error))
+		if (!osync_entry_engine_convert(entry_engine, formatenv, objtype_sink, &path, caps, error))
 			goto error;
 	}
 
Index: opensync/engine/opensync_obj_engine.c
===================================================================
--- opensync/engine/opensync_obj_engine.c	(revision 5509)
+++ opensync/engine/opensync_obj_engine.c	(working copy)
@@ -1337,7 +1337,7 @@
 		OSyncSinkEngine *sinkengine = p->data;
 
 		if (merger_enabled
-			&& !osync_sink_engine_demerge(sinkengine, engine->archive, error))
+			&& !osync_sink_engine_archive(sinkengine, engine->archive, error))
 			goto error;
 
 		if (converter_enabled
Index: opensync/engine/opensync_mapping_entry_engine.c
===================================================================
--- opensync/engine/opensync_mapping_entry_engine.c	(revision 5509)
+++ opensync/engine/opensync_mapping_entry_engine.c	(working copy)
@@ -158,7 +158,7 @@
 	engine->dirty = dirty;
 }
 
-osync_bool osync_entry_engine_demerge(OSyncMappingEntryEngine *entry_engine, OSyncArchive *archive, OSyncCapabilities *caps, OSyncError **error)
+osync_bool osync_entry_engine_archive(OSyncMappingEntryEngine *entry_engine, OSyncArchive *archive, OSyncError **error)
 {
 
 	char *buffer = NULL, *marshalbuf;
@@ -190,12 +190,6 @@
 		goto error_free_marshal;
 	}
 
-	if (!osync_objformat_demerge(objformat, &buffer, &size, caps, error))
-		goto error_free_marshal;
-
-	osync_trace(TRACE_SENSITIVE, "Post Demerge:\n%s\n",
-			osync_objformat_print(objformat, buffer, size));
-
 	osync_marshal_unref(marshal);
 
 	return TRUE;
@@ -206,7 +200,7 @@
 	return FALSE;
 }
 
-osync_bool osync_entry_engine_convert(OSyncMappingEntryEngine *entry_engine, OSyncFormatEnv *formatenv, OSyncObjTypeSink *objtype_sink, OSyncFormatConverterPath **cachedpath, OSyncError **error)
+osync_bool osync_entry_engine_convert(OSyncMappingEntryEngine *entry_engine, OSyncFormatEnv *formatenv, OSyncObjTypeSink *objtype_sink, OSyncFormatConverterPath **cachedpath, OSyncCapabilities *caps, OSyncError **error)
 {
 	char *objtype = NULL;
 	OSyncList *format_sinks = NULL;
@@ -245,7 +239,7 @@
 		osync_converter_path_set_config(path, osync_objformat_sink_get_config(formatsink));
 	}
 	
-	if (!osync_format_env_convert(formatenv, path, osync_change_get_data(entry_engine->change), error)) {
+	if (!osync_format_env_convert(formatenv, path, osync_change_get_data(entry_engine->change), caps, NULL, error)) {
 		goto error_free_path;
 	}
 	osync_trace(TRACE_INTERNAL, "converted to format %s", osync_objformat_get_name(osync_change_get_objformat(entry_engine->change)));
Index: opensync/engine/opensync_engine.c
===================================================================
--- opensync/engine/opensync_engine.c	(revision 5509)
+++ opensync/engine/opensync_engine.c	(working copy)
@@ -170,36 +170,141 @@
 	osync_converter_path_unref(converter_path);
 }
 
+osync_bool osync_engine_load_archived_entry(OSyncEngine *engine, OSyncChange *change, OSyncData **archived_entry, OSyncError **error)
+{
+	int ret;
+	char *entirebuf;
+	unsigned int entsize;
+	OSyncMarshal *marshal;
+
+	osync_assert(engine);
+	osync_assert(change);
+	osync_assert(archived_entry);
+
+	*archived_entry = NULL;
+
+	/* TODO: Merger save the archive data with the member so we have to load it only for one time*/
+	ret = osync_archive_load_data(engine->archive, osync_change_get_uid(change), osync_change_get_objtype(change), &entirebuf, &entsize, error);
+
+	if (ret < 0)
+		goto error; 
+	else if (ret == 0)
+		goto done;
+
+	marshal = osync_marshal_new(error);
+	if (!marshal)
+		goto error;
+
+	/* Create a dummy marshal object - to later demarshal changes which got
+	 * stored in a marshaled/serialized format.
+	 */
+	osync_marshal_write_data(marshal, entirebuf, entsize);
+
+	if (!osync_objformat_demarshal(osync_change_get_objformat(change), marshal, &entirebuf, &entsize, error)) {
+		osync_marshal_unref(marshal);
+		goto error;
+	}
+
+	osync_marshal_unref(marshal);
+		
+done:
+	return TRUE;
+error:
+	return FALSE;
+}
+
+static osync_bool osync_engine_merge_and_convert(OSyncEngine *engine, OSyncClientProxy *proxy,
+		OSyncChange *change, OSyncObjFormat *destformat, OSyncError **error)
+{
+	OSyncCapabilities *caps;
+	OSyncFormatConverterPath *path = NULL;
+	OSyncObjFormatSink *formatsink = NULL;
+	OSyncData *archived_data = NULL;
+	OSyncMember *member;
+	char *member_objtype = NULL;
+	long long int memberid;
+	OSyncObjTypeSink *objtype_sink = NULL;
+
+	osync_assert(engine);
+	osync_assert(proxy);
+	osync_assert(change);
+
+	if (!destformat)
+		goto done;
+
+	/* Do not convert anything if the chagetype is DELETED. */
+	if (osync_change_get_changetype(change) == OSYNC_CHANGE_TYPE_DELETED)
+		goto done;
+
+	member = osync_client_proxy_get_member(proxy);
+	memberid = osync_member_get_id(member);
+	member_objtype = osync_strdup_printf("%lli_%s", memberid, osync_change_get_objtype(change)); 
+	caps = osync_member_get_capabilities(member);
+	objtype_sink = osync_member_find_objtype_sink(member, osync_change_get_objtype(change));
+
+
+	osync_trace(TRACE_INTERNAL, "converting to format %s", osync_objformat_get_name(destformat));
+
+	path = _osync_engine_get_converter_path(engine, member_objtype);
+	if (!path) {
+		path = osync_format_env_find_path_with_detectors(engine->formatenv, osync_change_get_data(change), destformat, NULL, error);
+		_osync_engine_set_converter_path(engine, member_objtype, path);
+	}
+
+	osync_free(member_objtype);
+
+	if (!path)
+		goto error;
+
+	/* Load archived entry if available */
+	if (!osync_engine_load_archived_entry(engine, change, &archived_data, error))
+		goto error;
+	
+	/* Get the current configured format to honor the plugin configuration! */
+	formatsink = osync_objtype_sink_find_objformat_sink(objtype_sink, osync_change_get_objformat(change));
+	if (formatsink) {
+		const char *config = osync_objformat_sink_get_config(formatsink); 
+		osync_converter_path_set_config(path, config);
+	}
+
+	if (!osync_format_env_convert(engine->formatenv, path, osync_change_get_data(change), caps, archived_data, error))
+		goto error;
+
+	osync_data_unref(archived_data);
+
+done:
+	return TRUE;
+error:
+	return FALSE;
+}
+
+
 static void _osync_engine_receive_change(OSyncClientProxy *proxy, void *userdata, OSyncChange *change)
 {
 	OSyncEngine *engine = userdata;
 	OSyncError *error = NULL;
 	osync_bool found = FALSE;
 	OSyncMember *member = NULL;
-	long long int memberid = 0;
 	const char *uid = NULL;
 	OSyncChangeType changetype = 0;
 	const char *format = NULL;
 	const char *objtype = NULL;
-	OSyncObjTypeSink *objtype_sink = NULL;
-	char *member_objtype = NULL;
 	OSyncData *data = NULL;
 	OSyncObjFormat *internalFormat = NULL;
 	OSyncObjFormat *detected_format = NULL;
+	OSyncObjFormat *destformat = NULL;
 	
 	osync_trace(TRACE_ENTRY, "%s(%p, %p, %p)", __func__, proxy, userdata, change);
 
 	member = osync_client_proxy_get_member(proxy);
-	memberid = osync_member_get_id(member);
+
 	uid = osync_change_get_uid(change);		
 	changetype = osync_change_get_changetype(change);
 	format = osync_objformat_get_name(osync_change_get_objformat(change));
 	objtype = osync_change_get_objtype(change);
 
-	objtype_sink = osync_member_find_objtype_sink(member, objtype);
+	osync_trace(TRACE_INTERNAL, "Received change %s, changetype %i, format %s, objtype %s from member %lli", uid, changetype, format, objtype, osync_member_get_id(member));
 
-	osync_trace(TRACE_INTERNAL, "Received change %s, changetype %i, format %s, objtype %s from member %lli", uid, changetype, format, objtype, memberid);
-
 	data = osync_change_get_data(change);
 
 	/* try to detect encapsulated formats */
@@ -214,103 +319,21 @@
 		objtype = osync_objformat_get_objtype(detected_format);
 	}
 	
-	member_objtype = osync_strdup_printf("%lli_%s", memberid, objtype); 
+	/* Convert the format to the internal format */
+	if ((internalFormat = _osync_engine_get_internal_format(engine, objtype)))
+		destformat = internalFormat;
+	else
+		destformat = detected_format;
+	
 
-	/* Convert the format to the internal format */
-	internalFormat = _osync_engine_get_internal_format(engine, objtype);
 	osync_trace(TRACE_INTERNAL, "common format %p for objtype %s", internalFormat, objtype);
 
 	/* Only convert if the engine is allowed to convert and if an "internal" or detected format is available. 
-		 The reason that the engine isn't allowed to convert could be backup. dumping the changes. 
-		 Do not convert anything if the chagetype is DELETED. */
-
-	/* TODO: Move common format conversion into objengine. Use this conversion only for
-	 * encapsulating formats, if required.
-	 */
-	if ((internalFormat || detected_format) && osync_group_get_converter_enabled(engine->group) && (osync_change_get_changetype(change) != OSYNC_CHANGE_TYPE_DELETED)) {
-		OSyncFormatConverterPath *path = NULL;
-		OSyncObjFormatSink *formatsink = NULL;
-		OSyncObjFormat *common_format = internalFormat ? internalFormat : detected_format;
-		osync_trace(TRACE_INTERNAL, "converting to format %s", osync_objformat_get_name(common_format));
-
-		path = _osync_engine_get_converter_path(engine, member_objtype);
-		if(!path) {
-			path = osync_format_env_find_path_with_detectors(engine->formatenv, osync_change_get_data(change), common_format, NULL, &error);
-			_osync_engine_set_converter_path(engine, member_objtype, path);
-		}
-
-		if (!path)
+		 The reason that the engine isn't allowed to convert could be backup. dumping the changes. */
+	if (osync_group_get_converter_enabled(engine->group))
+		if (!osync_engine_merge_and_convert(engine, proxy, change, destformat, &error))
 			goto error;
 	
-		/* Get the current configured format to honor the plugin configuration! */
-		formatsink = osync_objtype_sink_find_objformat_sink(objtype_sink, osync_change_get_objformat(change));
-		if (formatsink) {
-			const char *config = osync_objformat_sink_get_config(formatsink); 
-			osync_converter_path_set_config(path, config);
-		}
-
-		if (!osync_format_env_convert(engine->formatenv, path, data, &error)) {
-			goto error;
-		}
-	}
-	
-	/* TODO: Move this into the objengine. */
-	/* Merger - Merge lost information to the change (don't merger anything when changetype is DELETED.) */
-	if( osync_group_get_merger_enabled(engine->group) &&
-			osync_group_get_converter_enabled(engine->group) &&	
-			(osync_change_get_changetype(change) != OSYNC_CHANGE_TYPE_DELETED) &&
-			/* only use the merger if the objformat has merger registered. */
-			osync_objformat_has_merger(osync_change_get_objformat(change)) )
-
-		{
-			OSyncCapabilities *caps;
-			OSyncObjFormat *objformat = osync_change_get_objformat(change);
-			char *entirebuf, *buffer;
-			unsigned int entsize, size = 0;
-			osync_trace(TRACE_INTERNAL, "Merge.");
-
-			member = osync_client_proxy_get_member(proxy);
-			caps = osync_member_get_capabilities(member);
-
-			if(caps) {
-
-				/* TODO: Merger save the archive data with the member so we have to load it only for one time*/
-				// osync_archive_load_data() is fetching the mappingid by uid in the db
-				int ret = osync_archive_load_data(engine->archive, uid, osync_change_get_objtype(change), &entirebuf, &entsize, &error);
-				if (ret < 0) {
-					goto error; 
-				} 
-			
-				if (ret > 0) {
-					OSyncMarshal *marshal;
-
-					marshal = osync_marshal_new(&error);
-					if (!marshal)
-						goto error;
-
-					osync_marshal_write_data(marshal, entirebuf, entsize);
-
-					if (!osync_objformat_demarshal(objformat, marshal, &entirebuf, &entsize, &error)) {
-						osync_marshal_unref(marshal);
-						goto error;
-					}
-
-					osync_marshal_unref(marshal);
-					
-					osync_data_get_data(osync_change_get_data(change), &buffer, &size);
-
-					ret = osync_objformat_merge(objformat, &buffer, &size, entirebuf, entsize, caps, &error);
-					osync_free(entirebuf);
-
-					if (ret != TRUE)
-						goto error;
-
-					osync_trace(TRACE_SENSITIVE, "Merge result:\n%s\n",
-						osync_objformat_print(objformat, buffer, size));
-				}
-			}
-		}
-	
 	/* Search for the correct objengine */
 	{OSyncList * o = NULL;
 		for (o = engine->object_engines; o; o = o->next) {
@@ -328,14 +351,10 @@
 		goto error;
 	}
 
-	osync_free(member_objtype);
-	
 	osync_trace(TRACE_EXIT, "%s", __func__);
 	return;
 
  error:
-	osync_free(member_objtype);
-	
 	osync_engine_set_error(engine, error);
 	osync_status_update_member(engine, osync_client_proxy_get_member(proxy), OSYNC_ENGINE_MEMBER_EVENT_ERROR, NULL, error);
 	osync_trace(TRACE_EXIT_ERROR, "%s: %s", __func__, osync_error_print(&error));
Index: opensync/engine/opensync_sink_engine_internals.h
===================================================================
--- opensync/engine/opensync_sink_engine_internals.h	(revision 5509)
+++ opensync/engine/opensync_sink_engine_internals.h	(working copy)
@@ -44,19 +44,19 @@
 void osync_sink_engine_unref(OSyncSinkEngine *engine);
 osync_bool osync_sink_engine_is_connected(OSyncSinkEngine *engine);
 
-/** @brief Demerge all entries of OSyncSinkEngine
+/** @brief Archive all entries of OSyncSinkEngine
  *
  * If the Member/Client of the OSyncSinkEngine doesn't have capabilities
  * this functions is NOOP and just returns with TRUE, without error.
  *
- * Changes with a current OSyncObjFormat, without merge/demerge get skipped.
+ * Changes with a current OSyncObjFormat
  *
- * @param engine Pointer to an OSyncSinkEngine which should demerge
- * @param archive Pointer to an OSyncArchive to store the dermerged information
+ * @param engine Pointer to an OSyncSinkEngine which should archive all entries
+ * @param archive Pointer to an OSyncArchive which is used for storing the entries
  * @param error Pointer to error struct, which get set on any error
  * @returns TRUE on success, FALSE otherwise
  */
-osync_bool osync_sink_engine_demerge(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error);
+osync_bool osync_sink_engine_archive(OSyncSinkEngine *engine, OSyncArchive *archive, OSyncError **error);
 
 /** @brief Convert all entries of OSyncSinkEngine to destitination format
  *
Index: tests/mock-plugin/mock_format.c
===================================================================
--- tests/mock-plugin/mock_format.c	(revision 5509)
+++ tests/mock-plugin/mock_format.c	(working copy)
@@ -76,7 +76,7 @@
 	return OSYNC_CONV_DATA_MISMATCH;
 }
 
-static osync_bool conv_mockformat1_to_mockformat2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool conv_mockformat1_to_mockformat2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_trace(TRACE_INTERNAL, "Converting file to plain");
 	
@@ -93,7 +93,7 @@
 	return TRUE;
 }
 
-static osync_bool conv_mockformat2_to_mockformat1(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool conv_mockformat2_to_mockformat1(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_trace(TRACE_INTERNAL, "Converting plain to file");
 	
Index: tests/format-tests/check_conv.c
===================================================================
--- tests/format-tests/check_conv.c	(revision 5509)
+++ tests/format-tests/check_conv.c	(working copy)
@@ -118,7 +118,7 @@
 }
 END_TEST
 
-osync_bool convert_func(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void* user_data, OSyncError **error)
+osync_bool convert_func(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void* user_data, OSyncError **error)
 {
 	*free_input = TRUE;
 	*output = g_strdup("test");
@@ -1270,7 +1270,7 @@
 }
 END_TEST
 
-static osync_bool convert_addtest(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool convert_addtest(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	*free_input = TRUE;
 	*output = g_strdup_printf("%stest", input);
@@ -1278,7 +1278,7 @@
 	return TRUE;
 }
 
-static osync_bool convert_remtest(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool convert_remtest(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	*free_input = TRUE;
 	*output = strdup(input);
@@ -1294,7 +1294,7 @@
 	}
 }
 
-static osync_bool convert_addtest2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool convert_addtest2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	*output = g_strdup_printf("%stest2", input);
 	*outpsize = inpsize + 5;
@@ -1302,7 +1302,7 @@
 	return TRUE;
 }
 
-static osync_bool convert_remtest2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool convert_remtest2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	*free_input = TRUE;
 	*output = strdup(input);
@@ -1365,7 +1365,7 @@
 
 	OSyncFormatConverterPath *path = NULL;
 	path = osync_format_env_find_path_with_detectors(env, data, format3, NULL, &error);
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 
 	char *buf;
@@ -1438,7 +1438,7 @@
 
 	OSyncFormatConverterPath *path = NULL;
 	path = osync_format_env_find_path_with_detectors(env, data, format3, NULL, &error);
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 
 	char *buf;
@@ -1455,7 +1455,7 @@
 
 	path = NULL;
 	path = osync_format_env_find_path_with_detectors(env, data, format1, NULL, &error);
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 	fail_unless(path != NULL, NULL);
 
@@ -1528,7 +1528,7 @@
 
 	OSyncFormatConverterPath *path = NULL;
 	path = osync_format_env_find_path_with_detectors(env, data, format3, NULL, &error);
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 
 	char *buf;
@@ -1545,7 +1545,7 @@
 
 	path = NULL;
 	path = osync_format_env_find_path_with_detectors(env, data, format1, NULL, &error);
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 	fail_unless(path != NULL, NULL);
 
@@ -1676,7 +1676,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format6, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 
 	char *buf;
@@ -1693,7 +1693,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format1, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error); 
+	osync_format_env_convert(env, path, data, NULL, NULL, &error); 
 	fail_unless(error == NULL, NULL);
 
 	osync_data_get_data(data, &buf, &size);
@@ -1801,7 +1801,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format4, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	char *buf;
@@ -1818,7 +1818,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format1, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	osync_data_get_data(data, &buf, &size);
@@ -1923,7 +1923,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format5, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	mark_point();
@@ -2030,7 +2030,7 @@
 	path = osync_format_env_find_path_formats_with_detectors(env, data, fmtlist, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	mark_point();
@@ -2139,7 +2139,7 @@
 	path = osync_format_env_find_path_formats_with_detectors(env, data, fmtlist, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	mark_point();
@@ -2221,7 +2221,7 @@
 	/* FIXME: clarify - this is really intended to fail?! If so deref error. */
 	osync_error_unref(&error);
 
-	//fail_unless(!osync_format_env_convert(env, path, data, &error), NULL); // path is supposed to be null and this function has an assert on path
+	//fail_unless(!osync_format_env_convert(env, path, data, NULL, NULL, &error), NULL); // path is supposed to be null and this function has an assert on path
 }
 END_TEST
 
@@ -2296,7 +2296,7 @@
 
 	mark_point();
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	osync_data_get_data(data, &buf, &size);
@@ -2311,7 +2311,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format1, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	mark_point();
@@ -2332,7 +2332,7 @@
 	return FALSE;
 }
 
-static osync_bool convert_f1_to_f2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool convert_f1_to_f2(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	fail_unless(!strcmp(input, "F1"), NULL);
 	
@@ -2342,7 +2342,7 @@
 	return TRUE;
 }
 
-static osync_bool convert_f2_to_f1(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+static osync_bool convert_f2_to_f1(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	fail_unless(!strcmp(input, "F2"), NULL);
 	
@@ -2421,7 +2421,7 @@
 
 	mark_point();
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	osync_data_get_data(data, &buf, &size);
@@ -2436,7 +2436,7 @@
 	path = osync_format_env_find_path_with_detectors(env, data, format1, NULL, &error);
 	fail_unless(path != NULL, NULL);
 
-	osync_format_env_convert(env, path, data, &error);
+	osync_format_env_convert(env, path, data, NULL, NULL, &error);
 	fail_unless(error == NULL, NULL);
 
 	mark_point();
Index: tests/format-tests/check_converter.c
===================================================================
--- tests/format-tests/check_converter.c	(revision 5509)
+++ tests/format-tests/check_converter.c	(working copy)
@@ -5,7 +5,7 @@
 
 #include "opensync/format/opensync_converter_internals.h"
 
-osync_bool converter_conv(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool converter_conv(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	return TRUE;
 }
@@ -27,7 +27,7 @@
 	g_free(data);
 }
 
-osync_bool conv_format1_to_format2_const(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool conv_format1_to_format2_const(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_assert(!strcmp(input, "format1"));
 	osync_assert(inpsize == 8);
@@ -42,7 +42,7 @@
 	return TRUE;
 }
 
-osync_bool decap_format1_to_format2_const(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool decap_format1_to_format2_const(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	testdata *data = (testdata *)input;
 	*output = data->string1;
@@ -53,7 +53,7 @@
 	return TRUE;
 }
 
-osync_bool encap_format1_to_format2_const(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool encap_format1_to_format2_const(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_assert(!strcmp(input, "format1"));
 	osync_assert(inpsize == 8);
@@ -68,7 +68,7 @@
 	return TRUE;
 }
 
-osync_bool conv_format1_to_format2_dup(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool conv_format1_to_format2_dup(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_assert(!strcmp(input, "format1"));
 	osync_assert(inpsize == 8);
@@ -81,7 +81,7 @@
 	return TRUE;
 }
 
-osync_bool decap_format1_to_format2_dup(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool decap_format1_to_format2_dup(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_assert(!strncmp(input, "SHELL", 5));
 	
@@ -93,7 +93,7 @@
 	return TRUE;
 }
 
-osync_bool encap_format1_to_format2_dup(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool encap_format1_to_format2_dup(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	osync_assert(!strcmp(input, "format1"));
 	osync_assert(inpsize == 8);
@@ -319,7 +319,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, NULL, &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, NULL, NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
@@ -391,7 +391,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, "test", &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, "test", NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
@@ -434,7 +434,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, "test", &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, "test", NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
@@ -477,7 +477,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, "test", &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, "test", NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
@@ -519,7 +519,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, "test", &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, "test", NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
@@ -564,7 +564,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, "test", &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, "test", NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
@@ -607,7 +607,7 @@
 	fail_unless(data != NULL, NULL);
 	fail_unless(error == NULL, NULL);
 	
-	fail_unless(osync_converter_invoke(converter, data, "test", &error) == TRUE, NULL);
+	fail_unless(osync_converter_invoke(converter, data, "test", NULL, NULL, &error) == TRUE, NULL);
 	fail_unless(error == NULL, NULL);
 	
 	fail_unless(osync_data_get_objformat(data) == format2, NULL);
Index: tests/format-tests/check_format_env.c
===================================================================
--- tests/format-tests/check_format_env.c	(revision 5509)
+++ tests/format-tests/check_format_env.c	(working copy)
@@ -119,7 +119,7 @@
 }
 END_TEST
 
-osync_bool convert_func(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, const char *config, void *userdata, OSyncError **error)
+osync_bool convert_func(char *input, unsigned int inpsize, char **output, unsigned int *outpsize, osync_bool *free_input, OSyncCapabilities *caps, const char *archived_data, unsigned int archived_size, const char *config, void *userdata, OSyncError **error)
 {
 	return TRUE;
 }
Index: opensync.sym
===================================================================
--- opensync.sym	(revision 5509)
+++ opensync.sym	(working copy)
@@ -345,13 +345,11 @@
 osync_objformat_set_copy_func
 osync_objformat_set_create_func
 osync_objformat_set_demarshal_func
-osync_objformat_set_demerge_func
 osync_objformat_set_destroy_func
 osync_objformat_set_duplicate_func
 osync_objformat_set_finalize_func
 osync_objformat_set_initialize_func
 osync_objformat_set_marshal_func
-osync_objformat_set_merge_func
 osync_objformat_set_print_func
 osync_objformat_set_revision_func
 osync_objformat_set_validate_func

