diff --git a/ipaacalib/cpp/CMakeLists.txt b/ipaacalib/cpp/CMakeLists.txt
index 326c3f9fb5137cbf6c25fcba42a7756089d86e8f..4a621513fd1cd8280dcea7423321fd9ea64209bb 100644
--- a/ipaacalib/cpp/CMakeLists.txt
+++ b/ipaacalib/cpp/CMakeLists.txt
@@ -164,6 +164,7 @@ set (SOURCE
 	)
 
 set (JSON_TEST_SOURCE
+	src/ipaaca-buffers.cc
 	src/ipaaca-fake.cc
 	src/ipaaca-iuinterface.cc
 	src/ipaaca-json.cc    # main
@@ -171,6 +172,8 @@ set (JSON_TEST_SOURCE
 	src/ipaaca-links.cc
 	src/ipaaca-payload.cc
 	src/ipaaca-string-utils.cc
+	# more stuff going beyond the fake test case
+	src/ipaaca-ius.cc
 	)
 
 
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
index 2ab904fa53e7c9f9374432b5ea7001102e0bdfec..89fece9af61cb05b54891232f4c95e0cf551d1a1 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
@@ -184,11 +184,11 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 #endif
 		protected:
 			// informing functions
-			IPAACA_HEADER_EXPORT void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef");
-			IPAACA_HEADER_EXPORT void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name);
+			IPAACA_HEADER_EXPORT void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_;
+			IPAACA_HEADER_EXPORT void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_;
 
-			IPAACA_HEADER_EXPORT void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, const rapidjson::Document&>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef");
-			IPAACA_HEADER_EXPORT void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name);
+			IPAACA_HEADER_EXPORT void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string,  PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_;
+			IPAACA_HEADER_EXPORT void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name) _IPAACA_OVERRIDE_;
 			//IPAACA_HEADER_EXPORT void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name);
 			// remote access functions
 			// _remote_update_links(IULinkUpdate)
@@ -208,8 +208,8 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 			IPAACA_HEADER_EXPORT void add(boost::shared_ptr<IU> iu);
 			IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(const std::string& iu_uid);
 			IPAACA_HEADER_EXPORT boost::shared_ptr<IU> remove(boost::shared_ptr<IU> iu);
-			IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid);
-			IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius();
+			IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid) _IPAACA_OVERRIDE_;
+			IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_;
 		typedef boost::shared_ptr<OutputBuffer> ptr;
 	};
 	//}}}
@@ -230,19 +230,19 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 			IPAACA_HEADER_EXPORT void _trigger_resend_request(rsb::EventPtr event);
 #endif
 		protected:
-			IPAACA_HEADER_EXPORT inline void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef")
+			IPAACA_HEADER_EXPORT inline void _send_iu_link_update(IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_
 			{
 				IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_link_update() should never be invoked")
 			}
-			IPAACA_HEADER_EXPORT inline void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name)
+			IPAACA_HEADER_EXPORT inline void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_
 			{
 				IPAACA_WARNING("(ERROR) InputBuffer::_publish_iu_resend() should never be invoked")
 			}
-			IPAACA_HEADER_EXPORT inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, const rapidjson::Document&>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef")
+			IPAACA_HEADER_EXPORT inline void _send_iu_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string,  PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef") _IPAACA_OVERRIDE_
 			{
 				IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_payload_update() should never be invoked")
 			}
-			IPAACA_HEADER_EXPORT inline void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef")
+			IPAACA_HEADER_EXPORT inline void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") _IPAACA_OVERRIDE_
 			{
 				IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_commission() should never be invoked")
 			}
@@ -274,8 +274,8 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 			IPAACA_HEADER_EXPORT ~InputBuffer() {
 				IPAACA_IMPLEMENT_ME
 			}
-			IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid);
-			IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius();
+			IPAACA_HEADER_EXPORT boost::shared_ptr<IUInterface> get(const std::string& iu_uid) _IPAACA_OVERRIDE_;
+			IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_;
 		typedef boost::shared_ptr<InputBuffer> ptr;
 	};
 	//}}}
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
index 0fc9e80fa8f2475107cf07f637dc390d3bf5db5b..c22e9a1e1d61620e114ba00b49a58222adc9aaff 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
@@ -128,15 +128,15 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
 			//IPAACA_IMPLEMENT_ME
 		}
 		IPAACA_HEADER_EXPORT static boost::shared_ptr<IU> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" );
-		IPAACA_HEADER_EXPORT inline Payload& payload() { return _payload; }
-		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; }
-		IPAACA_HEADER_EXPORT void commit();
+		IPAACA_HEADER_EXPORT inline Payload& payload() _IPAACA_OVERRIDE_ { return _payload; }
+		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const _IPAACA_OVERRIDE_ { return _payload; }
+		IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_;
 	protected:
-		IPAACA_HEADER_EXPORT virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 
 		//IPAACA_HEADER_EXPORT virtual void _publish_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name);
 
-		IPAACA_HEADER_EXPORT virtual void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT virtual void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 	protected:
 		IPAACA_HEADER_EXPORT virtual void _internal_commit(const std::string& writer_name = "");
 	public:
@@ -158,8 +158,8 @@ IPAACA_HEADER_EXPORT class Message: public IU {//{{{
 		}
 		IPAACA_HEADER_EXPORT static boost::shared_ptr<Message> create(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" );
 	protected:
-		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
+		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 	protected:
 		IPAACA_HEADER_EXPORT void _internal_commit(const std::string& writer_name = "");
 	public:
@@ -181,12 +181,12 @@ IPAACA_HEADER_EXPORT class RemotePushIU: public IUInterface {//{{{
 		IPAACA_HEADER_EXPORT inline ~RemotePushIU() {
 			//IPAACA_IMPLEMENT_ME
 		}
-		IPAACA_HEADER_EXPORT inline Payload& payload() { return _payload; }
-		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; }
-		IPAACA_HEADER_EXPORT void commit();
+		IPAACA_HEADER_EXPORT inline Payload& payload() _IPAACA_OVERRIDE_ { return _payload; }
+		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const _IPAACA_OVERRIDE_ { return _payload; }
+		IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_;
 	protected:
-		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
+		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 	protected:
 		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
 		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
@@ -209,12 +209,12 @@ IPAACA_HEADER_EXPORT class RemoteMessage: public IUInterface {//{{{
 		IPAACA_HEADER_EXPORT inline ~RemoteMessage() {
 			//IPAACA_IMPLEMENT_ME
 		}
-		IPAACA_HEADER_EXPORT inline Payload& payload() { return _payload; }
-		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; }
-		IPAACA_HEADER_EXPORT void commit();
+		IPAACA_HEADER_EXPORT inline Payload& payload() _IPAACA_OVERRIDE_ { return _payload; }
+		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const _IPAACA_OVERRIDE_ { return _payload; }
+		IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_;
 	protected:
-		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
+		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 	protected:
 		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
 		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
@@ -235,13 +235,13 @@ IPAACA_HEADER_EXPORT class FakeIU: public IUInterface {//{{{
 	public:
 		IPAACA_HEADER_EXPORT static boost::shared_ptr<FakeIU> create();
 		IPAACA_HEADER_EXPORT ~FakeIU();
-		IPAACA_HEADER_EXPORT Payload& payload();
-		IPAACA_HEADER_EXPORT const Payload& const_payload() const;
-		IPAACA_HEADER_EXPORT void commit();
+		IPAACA_HEADER_EXPORT Payload& payload() _IPAACA_OVERRIDE_;
+		IPAACA_HEADER_EXPORT const Payload& const_payload() const _IPAACA_OVERRIDE_;
+		IPAACA_HEADER_EXPORT void commit() _IPAACA_OVERRIDE_;
 		IPAACA_HEADER_EXPORT void add_fake_payload_item(const std::string& key, PayloadDocumentEntry::ptr entry);
 	protected:
-		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
+		IPAACA_HEADER_EXPORT void _modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name = "") _IPAACA_OVERRIDE_;
 	protected:
 		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
 		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index 28f802417554a083d10531b1f107a5772e76769a..7199a365a777c6026e834e5dffb45bd99920a4bc 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -56,7 +56,8 @@ IPAACA_HEADER_EXPORT template<> void pack_into_json_value(rapidjson::Value&, rap
 IPAACA_HEADER_EXPORT template<> void pack_into_json_value(rapidjson::Value&, rapidjson::Document::AllocatorType&, bool);
 IPAACA_HEADER_EXPORT template<> void pack_into_json_value(rapidjson::Value&, rapidjson::Document::AllocatorType&, const std::string&);
 IPAACA_HEADER_EXPORT template<> void pack_into_json_value(rapidjson::Value&, rapidjson::Document::AllocatorType&, const char*);
-
+// helpers to set Value& from several standard containers containing the above standard types
+/// set Value& from vector<T>
 IPAACA_HEADER_EXPORT template<typename T> void pack_into_json_value(rapidjson::Value& valueobject, rapidjson::Document::AllocatorType& allocator, const std::vector<T>& ts)
 {
 	valueobject.SetArray();
@@ -66,6 +67,7 @@ IPAACA_HEADER_EXPORT template<typename T> void pack_into_json_value(rapidjson::V
 		valueobject.PushBack(newv, allocator);
 	}
 }
+/// set Value& from list<T>
 IPAACA_HEADER_EXPORT template<typename T> void pack_into_json_value(rapidjson::Value& valueobject, rapidjson::Document::AllocatorType& allocator, const std::list<T>& ts)
 {
 	valueobject.SetArray();
@@ -75,6 +77,7 @@ IPAACA_HEADER_EXPORT template<typename T> void pack_into_json_value(rapidjson::V
 		valueobject.PushBack(newv, allocator);
 	}
 }
+/// set Value& from map<string, T>
 IPAACA_HEADER_EXPORT template<typename T> void pack_into_json_value(rapidjson::Value& valueobject, rapidjson::Document::AllocatorType& allocator, const std::map<std::string, T>& ts)
 {
 	valueobject.SetObject();
@@ -94,6 +97,7 @@ IPAACA_HEADER_EXPORT template<> void pack_into_json_value(rapidjson::Value&, rap
 // FIXME TODO locking / invalidating proxy on first write of a payload entry
 IPAACA_HEADER_EXPORT class PayloadDocumentEntry//{{{
 {
+	friend std::ostream& operator<<(std::ostream& os, std::shared_ptr<PayloadDocumentEntry> entry);
 	public:
 		IPAACA_MEMBER_VAR_EXPORT ipaaca::Lock lock;
 		IPAACA_MEMBER_VAR_EXPORT bool modified;
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h
index f79e0921ef2a4f325186dc7519556d87444a12d7..6a01f8a62d5c3acb9ebaca8f199cc6a8977a7c46 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h
@@ -108,6 +108,8 @@
 /// marking pure virtual functions for extra readability
 #define _IPAACA_ABSTRACT_
 
+#define _IPAACA_OVERRIDE_ override
+
 /// value to return when reading nonexistant payload keys
 #define IPAACA_PAYLOAD_DEFAULT_STRING_VALUE ""
 
diff --git a/ipaacalib/cpp/src/ipaaca-buffers.cc b/ipaacalib/cpp/src/ipaaca-buffers.cc
index 3600772c96e40800918a8a45aa8b81e793174c8f..b6398a0ae43d11ce296c56750e272841596f0773 100644
--- a/ipaacalib/cpp/src/ipaaca-buffers.cc
+++ b/ipaacalib/cpp/src/ipaaca-buffers.cc
@@ -48,10 +48,10 @@ IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate&
 	os << ", writer_name=" << obj.writer_name << ", is_delta=" << (obj.is_delta?"True":"False");
 	os << ", new_items = {";
 	bool first = true;
-	for (auto& : obj.new_items) {
+	for (auto& newit: obj.new_items) {
 		if (first) { first=false; } else { os << ", "; }
 		//os << "'" << it->first << "':'" << it->second << "'";
-		os << "'" << it->first << "': ???";  // FIXME JSONIZE
+		os << "'" << newit.first << "': " << newit.second;
 	}
 	os << "}, keys_to_remove = [";
 	first = true;
@@ -287,8 +287,8 @@ IPAACA_EXPORT OutputBuffer::OutputBuffer(const std::string& basename, const std:
 IPAACA_EXPORT void OutputBuffer::_initialize_server()
 {
 	//IPAACA_INFO("Entering ...")
-	//IPAACA_INFO("Calling createServer(\"" << _unique_name << "\")")
-	_server = getFactory().createServer( Scope( _unique_name ) );
+	//IPAACA_INFO("Calling createLocalServer(\"" << _unique_name << "\")")
+	_server = getFactory().createLocalServer( Scope( _unique_name ) );
 	//IPAACA_INFO("Registering methods")
 	_server->registerMethod("updatePayload", Server::CallbackPtr(new CallbackIUPayloadUpdate(this)));
 	_server->registerMethod("updateLinks", Server::CallbackPtr(new CallbackIULinkUpdate(this)));
diff --git a/ipaacalib/cpp/src/ipaaca-ius.cc b/ipaacalib/cpp/src/ipaaca-ius.cc
index 0d5c920684a131737f3f0cae5000ca70ef75a590..8a9aad15314c78a79f1b236549dbfdc566414b63 100644
--- a/ipaacalib/cpp/src/ipaaca-ius.cc
+++ b/ipaacalib/cpp/src/ipaaca-ius.cc
@@ -95,7 +95,7 @@ IPAACA_EXPORT void IU::_modify_links(bool is_delta, const LinkMap& new_links, co
 
 
 
-IPAACA_EXPORT void IU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
+IPAACA_EXPORT void IU::_modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
 {
 	_revision_lock.lock();
 	if (_committed) {
@@ -149,7 +149,7 @@ void Message::_modify_links(bool is_delta, const LinkMap& new_links, const LinkM
 		IPAACA_INFO("Info: modifying a Message after sending has no global effects")
 	}
 }
-void Message::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
+void Message::_modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
 {
 	if (is_published()) {
 		IPAACA_INFO("Info: modifying a Message after sending has no global effects")
@@ -200,7 +200,7 @@ IPAACA_EXPORT void RemotePushIU::_modify_links(bool is_delta, const LinkMap& new
 		_revision = *result;
 	}
 }
-IPAACA_EXPORT void RemotePushIU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
+IPAACA_EXPORT void RemotePushIU::_modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
 {
 	//std::cout << "-- Sending a modify_payload with " << new_items.size() << " keys to merge." << std::endl;
 	if (_committed) {
@@ -263,12 +263,12 @@ IPAACA_EXPORT void RemotePushIU::_apply_update(IUPayloadUpdate::ptr update)
 		for (std::vector<std::string>::const_iterator it=update->keys_to_remove.begin(); it!=update->keys_to_remove.end(); ++it) {
 			_payload._remotely_enforced_delitem(*it);
 		}
-		for (std::map<std::string, std::string>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
+		for (std::map<std::string, PayloadDocumentEntry::ptr>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
 			_payload._remotely_enforced_setitem(it->first, it->second);
 		}
 	} else {
 		_payload._remotely_enforced_wipe();
-		for (std::map<std::string, std::string>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
+		for (std::map<std::string, PayloadDocumentEntry::ptr>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
 			_payload._remotely_enforced_setitem(it->first, it->second);
 		}
 	}
@@ -299,7 +299,7 @@ IPAACA_EXPORT void RemoteMessage::_modify_links(bool is_delta, const LinkMap& ne
 {
 	IPAACA_INFO("Info: modifying a RemoteMessage only has local effects")
 }
-IPAACA_EXPORT void RemoteMessage::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
+IPAACA_EXPORT void RemoteMessage::_modify_payload(bool is_delta, const std::map<std::string, PayloadDocumentEntry::ptr>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
 {
 	IPAACA_INFO("Info: modifying a RemoteMessage only has local effects")
 }
@@ -326,12 +326,12 @@ IPAACA_EXPORT void RemoteMessage::_apply_update(IUPayloadUpdate::ptr update)
 		for (std::vector<std::string>::const_iterator it=update->keys_to_remove.begin(); it!=update->keys_to_remove.end(); ++it) {
 			_payload._remotely_enforced_delitem(*it);
 		}
-		for (std::map<std::string, std::string>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
+		for (std::map<std::string, PayloadDocumentEntry::ptr>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
 			_payload._remotely_enforced_setitem(it->first, it->second);
 		}
 	} else {
 		_payload._remotely_enforced_wipe();
-		for (std::map<std::string, std::string>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
+		for (std::map<std::string, PayloadDocumentEntry::ptr>::const_iterator it=update->new_items.begin(); it!=update->new_items.end(); ++it) {
 			_payload._remotely_enforced_setitem(it->first, it->second);
 		}
 	}
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index fc41425b56d93cb95a83961d7919842c243382ea..fde7d209b2bbc77de753db22b3adca016a7db96e 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -39,8 +39,8 @@
 using namespace rapidjson;
 using namespace std;
 
-int main(int argc, char** argv) {
-
+int fakeiu_main(int argc, char** argv)
+{
 	if (argc<2) {
 		std::cout << "Please provide json content as the first argument." << std::endl;
 		return 0;
@@ -130,11 +130,6 @@ int main(int argc, char** argv) {
 		std::cout << "(n/a)" << std::endl;
 	}
 	
-	//iu->payload()["b"] = "newEntry";
-	
-	//std::vector<long> vs = { 10, 20, 30, 40 };
-	//std::map<std::string, double> vs = { {"A", 10}, {"B", 20}, {"C", 30}, {"D", 40} };
-	//ipaaca::pack_into_json_value(entry->document, entry->document.GetAllocator(), vs);
 	std::cout << "Setting a value deep in the object:" << std::endl;
 	iu->payload()["a"][0] = "set by pep::op=";
 	//iu->payload()["a"]["A"] = "set by pep::op=";
@@ -155,3 +150,18 @@ int main(int argc, char** argv) {
 	// Done
 	return 0;
 }
+
+int iu_main(int argc, char** argv)
+{
+	ipaaca::IU::ptr iu = ipaaca::IU::create("testcategory");
+	std::map<std::string, long> newmap = { {"fifty", 50}, {"ninety-nine", 99} };
+	iu->payload()["map"] = newmap;
+	iu->payload()["map"]["str_array"] = std::vector<std::string>{"str1", "str2"};
+	return 0;
+}
+
+int main(int argc, char** argv)
+{
+	//return fakeiu_main(argc, argv);
+	return iu_main(argc, argv);
+}
diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc
index f7b5e7957b9cd28f4408db72489d73c41d2dc748..0026dc7c8d3a954c3e872fbdcd2b3d292ea81da5 100644
--- a/ipaacalib/cpp/src/ipaaca-payload.cc
+++ b/ipaacalib/cpp/src/ipaaca-payload.cc
@@ -42,6 +42,19 @@ using namespace rsb::filter;
 using namespace rsb::converter;
 using namespace rsb::patterns;
 
+IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const rapidjson::Value& val)//{{{
+{
+	os << json_value_cast<std::string>(val);
+	return os;
+}
+//}}}
+IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, PayloadDocumentEntry::ptr entry)//{{{
+{
+	os << json_value_cast<std::string>(entry->document);
+	return os;
+}
+//}}}
+
 IPAACA_EXPORT std::ostream& operator<<(std::ostream& os, const Payload& obj)//{{{
 {
 	os << "{";