diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
index 89fece9af61cb05b54891232f4c95e0cf551d1a1..124cb192874c13855cca49c598d19ffc1e7f27fd 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
@@ -78,14 +78,20 @@ IPAACA_HEADER_EXPORT class BufferConfiguration//{{{
 		IPAACA_MEMBER_VAR_EXPORT std::string _channel;
 	public:
 		IPAACA_HEADER_EXPORT inline BufferConfiguration(const std::string basename) { _basename = basename; }
-		IPAACA_HEADER_EXPORT const std::string get_basename() const { return _basename; }
-		IPAACA_HEADER_EXPORT const std::vector<std::string> get_category_interests() const { return _category_interests; }
-		IPAACA_HEADER_EXPORT const std::string get_channel() const { return _channel; }
+		IPAACA_HEADER_EXPORT inline const std::string get_basename() const { return _basename; }
+		IPAACA_HEADER_EXPORT inline const std::vector<std::string> get_category_interests() const { return _category_interests; }
+		IPAACA_HEADER_EXPORT inline const std::string get_channel() const { return _channel; }
+	public:
+		// setters, initialization helpers
+		IPAACA_HEADER_EXPORT inline BufferConfiguration& set_basename(const std::string& basename) { _basename = basename; return *this; }
+		IPAACA_HEADER_EXPORT inline BufferConfiguration& add_category_interest(const std::string& category) { _category_interests.push_back(category); return *this; }
+		IPAACA_HEADER_EXPORT inline BufferConfiguration& set_channel(const std::string& channel) { _channel = channel; return *this; }
 };//}}}
 
 IPAACA_HEADER_EXPORT class BufferConfigurationBuilder: private BufferConfiguration//{{{
 {
 	public:
+		[[deprecated("Use setters in BufferConfiguration instead of the Builder")]]
 		IPAACA_HEADER_EXPORT inline BufferConfigurationBuilder(const std::string basename):BufferConfiguration(basename) {}
 		IPAACA_HEADER_EXPORT inline void set_basename(const std::string& basename)
 		{
@@ -125,184 +131,185 @@ IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
 	typedef boost::shared_ptr<IUEventHandler> ptr;
 };//}}}
 
-	IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{
-		friend class IU;
-		friend class RemotePushIU;
-		friend class CallbackIUPayloadUpdate;
-		friend class CallbackIULinkUpdate;
-		friend class CallbackIUCommission;
-		friend class CallbackIUResendRequest;
-		protected:
-			//Lock _handler_lock;
-			IPAACA_MEMBER_VAR_EXPORT std::string _uuid;
-			IPAACA_MEMBER_VAR_EXPORT std::string _basename;
-			IPAACA_MEMBER_VAR_EXPORT std::string _unique_name;
-			IPAACA_MEMBER_VAR_EXPORT std::string _id_prefix;
-			IPAACA_MEMBER_VAR_EXPORT std::string _channel;
-			IPAACA_MEMBER_VAR_EXPORT std::vector<IUEventHandler::ptr> _event_handlers;
-		protected:
-			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) = 0;
+IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Buffer> {//{{{
+	friend class IU;
+	friend class RemotePushIU;
+	friend class CallbackIUPayloadUpdate;
+	friend class CallbackIULinkUpdate;
+	friend class CallbackIUCommission;
+	friend class CallbackIUResendRequest;
+	protected:
+		//Lock _handler_lock;
+		IPAACA_MEMBER_VAR_EXPORT std::string _uuid;
+		IPAACA_MEMBER_VAR_EXPORT std::string _basename;
+		IPAACA_MEMBER_VAR_EXPORT std::string _unique_name;
+		IPAACA_MEMBER_VAR_EXPORT std::string _id_prefix;
+		IPAACA_MEMBER_VAR_EXPORT std::string _channel;
+		IPAACA_MEMBER_VAR_EXPORT std::vector<IUEventHandler::ptr> _event_handlers;
+	protected:
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) = 0;
 
 
-			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual 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") = 0;
-			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual 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") = 0;
-			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0;
-	//		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0;
-			IPAACA_HEADER_EXPORT void _allocate_unique_name(const std::string& basename, const std::string& function);
-			IPAACA_HEADER_EXPORT inline Buffer(const std::string& basename, const std::string& function) {
-				_allocate_unique_name(basename, function);
-				_channel = "default";
-			}
-			IPAACA_HEADER_EXPORT void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category);
-		public:
-			IPAACA_HEADER_EXPORT virtual inline ~Buffer() { }
-			IPAACA_HEADER_EXPORT inline const std::string& unique_name() { return _unique_name; }
-			IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories);
-			IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask = IU_ALL_EVENTS, const std::string& category="");
-			//_IPAACA_ABSTRACT_ virtual void add(boost::shared_ptr<IUInterface> iu) = 0;
-			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual boost::shared_ptr<IUInterface> get(const std::string& iu_uid) = 0;
-			IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual std::set<boost::shared_ptr<IUInterface> > get_ius() = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual 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") = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual 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") = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_commission(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0;
+//		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef") = 0;
+		IPAACA_HEADER_EXPORT void _allocate_unique_name(const std::string& basename, const std::string& function);
+		IPAACA_HEADER_EXPORT inline Buffer(const std::string& basename, const std::string& function) {
+			_allocate_unique_name(basename, function);
+			_channel = "default";
+		}
+		IPAACA_HEADER_EXPORT void call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category);
+	public:
+		IPAACA_HEADER_EXPORT virtual inline ~Buffer() { }
+		IPAACA_HEADER_EXPORT inline const std::string& unique_name() { return _unique_name; }
+		IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories);
+		IPAACA_HEADER_EXPORT void register_handler(IUEventHandlerFunction function, IUEventType event_mask = IU_ALL_EVENTS, const std::string& category="");
+		//_IPAACA_ABSTRACT_ virtual void add(boost::shared_ptr<IUInterface> iu) = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual boost::shared_ptr<IUInterface> get(const std::string& iu_uid) = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual std::set<boost::shared_ptr<IUInterface> > get_ius() = 0;
 
-			IPAACA_HEADER_EXPORT inline const std::string& channel() { return _channel; }
-	};
-	//}}}
+		IPAACA_HEADER_EXPORT inline const std::string& channel() { return _channel; }
+};
+//}}}
 
-	IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enable_shared_from_this<OutputBuffer>  {//{{{
-		friend class IU;
-		friend class RemotePushIU;
-		friend class OutputBufferRsbAdaptor;
-		protected:
-		protected:
-			//OutputBufferRsbAdaptor _rsb;
-			IPAACA_MEMBER_VAR_EXPORT IUStore _iu_store;
-			IPAACA_MEMBER_VAR_EXPORT Lock _iu_id_counter_lock;
+IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enable_shared_from_this<OutputBuffer>  {//{{{
+	friend class IU;
+	friend class RemotePushIU;
+	friend class OutputBufferRsbAdaptor;
+	protected:
+	protected:
+		//OutputBufferRsbAdaptor _rsb;
+		IPAACA_MEMBER_VAR_EXPORT IUStore _iu_store;
+		IPAACA_MEMBER_VAR_EXPORT Lock _iu_id_counter_lock;
 #ifdef IPAACA_EXPOSE_FULL_RSB_API
-		protected:
-			IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::Informer<rsb::AnyType>::Ptr> _informer_store;
-			IPAACA_MEMBER_VAR_EXPORT rsb::patterns::ServerPtr _server;
-			IPAACA_HEADER_EXPORT rsb::Informer<rsb::AnyType>::Ptr _get_informer(const std::string& category);
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::Informer<rsb::AnyType>::Ptr> _informer_store;
+		IPAACA_MEMBER_VAR_EXPORT rsb::patterns::ServerPtr _server;
+		IPAACA_HEADER_EXPORT rsb::Informer<rsb::AnyType>::Ptr _get_informer(const std::string& category);
 #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_OVERRIDE_;
-			IPAACA_HEADER_EXPORT void _publish_iu_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name) _IPAACA_OVERRIDE_;
+	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_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,  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)
-			// _remote_update_payload(IUPayloadUpdate)
-			// _remote_commit(protobuf::IUCommission)
-			IPAACA_HEADER_EXPORT void _publish_iu(boost::shared_ptr<IU> iu);
+		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)
+		// _remote_update_payload(IUPayloadUpdate)
+		// _remote_commit(protobuf::IUCommission)
+		IPAACA_HEADER_EXPORT void _publish_iu(boost::shared_ptr<IU> iu);
 
-			IPAACA_HEADER_EXPORT void _retract_iu(boost::shared_ptr<IU> iu);
-		protected:
-			IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename, const std::string& channel="default");
-			IPAACA_HEADER_EXPORT void _initialize_server();
-		public:
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<OutputBuffer> create(const std::string& basename);
-			IPAACA_HEADER_EXPORT ~OutputBuffer() {
-				IPAACA_IMPLEMENT_ME
-			}
-			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_OVERRIDE_;
-			IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_;
-		typedef boost::shared_ptr<OutputBuffer> ptr;
-	};
-	//}}}
+		IPAACA_HEADER_EXPORT void _retract_iu(boost::shared_ptr<IU> iu);
+	protected:
+		IPAACA_HEADER_EXPORT OutputBuffer(const std::string& basename, const std::string& channel="default");
+		IPAACA_HEADER_EXPORT void _initialize_server();
+	public:
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<OutputBuffer> create(const std::string& basename);
+		IPAACA_HEADER_EXPORT ~OutputBuffer() {
+			IPAACA_IMPLEMENT_ME
+		}
+		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_OVERRIDE_;
+		IPAACA_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius() _IPAACA_OVERRIDE_;
+	typedef boost::shared_ptr<OutputBuffer> ptr;
+};
+//}}}
 
-	IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable_shared_from_this<InputBuffer>  {//{{{
-		friend class IU;
-		friend class RemotePushIU;
-		friend class InputBufferRsbAdaptor;
-			//InputBufferRsbAdaptor _rsb;
+IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable_shared_from_this<InputBuffer>  {//{{{
+	friend class IU;
+	friend class RemotePushIU;
+	friend class InputBufferRsbAdaptor;
+		//InputBufferRsbAdaptor _rsb;
 #ifdef IPAACA_EXPOSE_FULL_RSB_API
-		protected:
-			IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::ListenerPtr> _listener_store;
-			IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::patterns::RemoteServerPtr> _remote_server_store;
-			IPAACA_MEMBER_VAR_EXPORT RemotePushIUStore _iu_store;  // TODO genericize
-			IPAACA_HEADER_EXPORT rsb::patterns::RemoteServerPtr _get_remote_server(const std::string& unique_server_name);
-			IPAACA_HEADER_EXPORT rsb::ListenerPtr _create_category_listener_if_needed(const std::string& category);
-			IPAACA_HEADER_EXPORT void _handle_iu_events(rsb::EventPtr event);
-			IPAACA_HEADER_EXPORT void _trigger_resend_request(rsb::EventPtr event);
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::ListenerPtr> _listener_store;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, rsb::patterns::RemoteServerPtr> _remote_server_store;
+		IPAACA_MEMBER_VAR_EXPORT RemotePushIUStore _iu_store;  // TODO genericize
+		IPAACA_HEADER_EXPORT rsb::patterns::RemoteServerPtr _get_remote_server(const std::string& unique_server_name);
+		IPAACA_HEADER_EXPORT rsb::ListenerPtr _create_category_listener_if_needed(const std::string& category);
+		IPAACA_HEADER_EXPORT void _handle_iu_events(rsb::EventPtr event);
+		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_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_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,  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_OVERRIDE_
-			{
-				IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_commission() should never be invoked")
-			}
-			/*IPAACA_HEADER_EXPORT inline void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef")
-			{
-				IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_resendrequest() should never be invoked")
-			}*/
-		protected:
-			IPAACA_HEADER_EXPORT InputBuffer(const BufferConfiguration& bufferconfiguration);
-			IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::set<std::string>& category_interests);
-			IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests);
-			IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1);
-			IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2);
-			IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3);
-			IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4);
+	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_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_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,  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_OVERRIDE_
+		{
+			IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_commission() should never be invoked")
+		}
+		/*IPAACA_HEADER_EXPORT inline void _send_iu_resendrequest(IUInterface* iu, revision_t revision, const std::string& writer_name="undef")
+		{
+			IPAACA_WARNING("(ERROR) InputBuffer::_send_iu_resendrequest() should never be invoked")
+		}*/
+	protected:
+		IPAACA_HEADER_EXPORT InputBuffer(const BufferConfiguration& bufferconfiguration);
+		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::set<std::string>& category_interests);
+		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests);
+		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1);
+		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2);
+		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3);
+		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4);
 
-			IPAACA_MEMBER_VAR_EXPORT bool triggerResend;
+		IPAACA_MEMBER_VAR_EXPORT bool triggerResend;
 
-		public:
-			IPAACA_HEADER_EXPORT void set_resend(bool resendActive);
-			IPAACA_HEADER_EXPORT bool get_resend();
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const BufferConfiguration& bufferconfiguration);
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests);
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests);
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1);
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2);
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3);
-			IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4);
-			IPAACA_HEADER_EXPORT ~InputBuffer() {
-				IPAACA_IMPLEMENT_ME
-			}
-			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;
-	};
-	//}}}
+	public:
+		IPAACA_HEADER_EXPORT void set_resend(bool resendActive);
+		IPAACA_HEADER_EXPORT bool get_resend();
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const BufferConfiguration& bufferconfiguration);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3);
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3, const std::string& category_interest4);
+		IPAACA_HEADER_EXPORT ~InputBuffer() {
+			IPAACA_IMPLEMENT_ME
+		}
+		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;
+};
+//}}}
 
-	IPAACA_HEADER_EXPORT class IUPayloadUpdate {//{{{
-		public:
-			IPAACA_MEMBER_VAR_EXPORT std::string uid;
-			IPAACA_MEMBER_VAR_EXPORT revision_t revision;
-			IPAACA_MEMBER_VAR_EXPORT std::string writer_name;
-			IPAACA_MEMBER_VAR_EXPORT bool is_delta;
-			IPAACA_MEMBER_VAR_EXPORT std::map<std::string, PayloadDocumentEntry::ptr> new_items;
-			IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> keys_to_remove;
-		friend std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj);
-		typedef boost::shared_ptr<IUPayloadUpdate> ptr;
-	};//}}}
+IPAACA_HEADER_EXPORT class IUPayloadUpdate {//{{{
+	public:
+		IPAACA_MEMBER_VAR_EXPORT std::string uid;
+		IPAACA_MEMBER_VAR_EXPORT revision_t revision;
+		IPAACA_MEMBER_VAR_EXPORT std::string writer_name;
+		IPAACA_MEMBER_VAR_EXPORT bool is_delta;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, PayloadDocumentEntry::ptr> new_items;
+		IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> keys_to_remove;
+		IPAACA_MEMBER_VAR_EXPORT std::string payload_type; // to handle legacy mode
+	friend std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj);
+	typedef boost::shared_ptr<IUPayloadUpdate> ptr;
+};//}}}
 
-	IPAACA_HEADER_EXPORT class IULinkUpdate {//{{{
-		public:
-			IPAACA_MEMBER_VAR_EXPORT std::string uid;
-			IPAACA_MEMBER_VAR_EXPORT revision_t revision;
-			IPAACA_MEMBER_VAR_EXPORT std::string writer_name;
-			IPAACA_MEMBER_VAR_EXPORT bool is_delta;
-			IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > new_links;
-			IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > links_to_remove;
-		friend std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj);
-		typedef boost::shared_ptr<IULinkUpdate> ptr;
-	};//}}}
+IPAACA_HEADER_EXPORT class IULinkUpdate {//{{{
+	public:
+		IPAACA_MEMBER_VAR_EXPORT std::string uid;
+		IPAACA_MEMBER_VAR_EXPORT revision_t revision;
+		IPAACA_MEMBER_VAR_EXPORT std::string writer_name;
+		IPAACA_MEMBER_VAR_EXPORT bool is_delta;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > new_links;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::set<std::string> > links_to_remove;
+	friend std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj);
+	typedef boost::shared_ptr<IULinkUpdate> ptr;
+};//}}}
 
 
 #endif
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
index cf0ebe2dac5d19447800af4711a7e3d16fbb2411..d5b8b248bff02e022adc21cd9399ccb3f18e9882 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
@@ -226,6 +226,14 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxyInvalidatedError: public Exception//
 			_description = "PayloadEntryProxyInvalidatedError";
 		}
 };//}}}
+IPAACA_HEADER_EXPORT class PayloadIteratorInvalidError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~PayloadIteratorInvalidError() throw() { }
+		IPAACA_HEADER_EXPORT inline PayloadIteratorInvalidError() { //boost::shared_ptr<IU> iu) {
+			_description = "PayloadIteratorInvalidError";
+		}
+};//}}}
 
 /// Static library initialization
 IPAACA_HEADER_EXPORT class Initializer
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h b/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h
index 3eab6221174fadabf0a1af0924ed3df8f99ccf7f..ef2a4fabafdfda79b2a8f6c967bb7084c6e7b793 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h
@@ -46,6 +46,7 @@ class PayloadDocumentEntry;
 
 class PayloadEntryProxy;
 class Payload;
+class PayloadIterator;
 class IUInterface;
 class IU;
 class Message;
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
index 03bd9a3531f5f49f4383f8ed5175933fc12b082f..eecdcfe2d2a1268168249e488e03c740e7a2ff29 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
@@ -51,7 +51,7 @@ IPAACA_HEADER_EXPORT class IUInterface {//{{{
 		IPAACA_MEMBER_VAR_EXPORT std::string _uid;
 		IPAACA_MEMBER_VAR_EXPORT revision_t _revision;
 		IPAACA_MEMBER_VAR_EXPORT std::string _category;
-		IPAACA_MEMBER_VAR_EXPORT std::string _payload_type; // default is "MAP"
+		IPAACA_MEMBER_VAR_EXPORT std::string _payload_type; // default is "JSON" (legacy said "MAP")
 		IPAACA_MEMBER_VAR_EXPORT std::string _owner_name;
 		IPAACA_MEMBER_VAR_EXPORT bool _committed;
 		IPAACA_MEMBER_VAR_EXPORT bool _retracted;
@@ -122,12 +122,12 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
 	   IPAACA_MEMBER_VAR_EXPORT  Lock _revision_lock;
 	protected:
 		IPAACA_HEADER_EXPORT inline void _increase_revision_number() { _revision++; }
-		IPAACA_HEADER_EXPORT IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="MAP" );
+		IPAACA_HEADER_EXPORT IU(const std::string& category, IUAccessMode access_mode=IU_ACCESS_PUSH, bool read_only=false, const std::string& payload_type="JSON" );
 	public:
 		IPAACA_HEADER_EXPORT inline ~IU() {
 			//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 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="JSON" );
 		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_;
@@ -151,12 +151,12 @@ IPAACA_HEADER_EXPORT class Message: public IU {//{{{
 	friend class CallbackIUCommission;
 	friend class CallbackIUResendRequest;
 	protected:
-		IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="MAP" );
+		IPAACA_HEADER_EXPORT Message(const std::string& category, IUAccessMode access_mode=IU_ACCESS_MESSAGE, bool read_only=true, const std::string& payload_type="JSON" );
 	public:
 		IPAACA_HEADER_EXPORT inline ~Message() {
 			//IPAACA_IMPLEMENT_ME
 		}
-		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" );
+		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="JSON" );
 	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_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_;
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index 415cc782eea4be472b50188c88d57be4ba2472e2..ee88c267e4cd7389926ef1ba6c921dc1e660ba77 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -168,6 +168,7 @@ IPAACA_HEADER_EXPORT class PayloadDocumentStore//{{{
 };
 //}}}
 */
+
 IPAACA_HEADER_EXPORT class Payload//{{{
 {
 	friend std::ostream& operator<<(std::ostream& os, const Payload& obj);
@@ -180,6 +181,7 @@ IPAACA_HEADER_EXPORT class Payload//{{{
 	friend class MessageConverter;
 	friend class CallbackIUPayloadUpdate;
 	friend class PayloadEntryProxy;
+	friend class PayloadIterator;
 	friend class FakeIU;
 	protected:
 		IPAACA_MEMBER_VAR_EXPORT std::string _owner_name;
@@ -212,10 +214,40 @@ IPAACA_HEADER_EXPORT class Payload//{{{
 	protected:
 		IPAACA_HEADER_EXPORT PayloadDocumentEntry::ptr get_entry(const std::string& k); // json, changed str to proxy here, too
 	public:
+		[[deprecated("Use operator[] and operator std::string() instead")]]
 		IPAACA_HEADER_EXPORT std::string get(const std::string& k); // DEPRECATED
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT unsigned long internal_revision;
+		IPAACA_MEMBER_VAR_EXPORT inline void mark_revision_change() { internal_revision++; }
+	public:
+		IPAACA_HEADER_EXPORT inline bool revision_changed(unsigned long reference_revision) { return internal_revision != reference_revision; }
+	public:
+		IPAACA_HEADER_EXPORT PayloadIterator begin();
+		IPAACA_HEADER_EXPORT PayloadIterator end();
 	typedef boost::shared_ptr<Payload> ptr;
 };//}}}
 
+IPAACA_HEADER_EXPORT class PayloadIterator//{{{
+{
+	friend class Payload;
+	friend std::ostream& operator<<(std::ostream& os, const PayloadIterator& iter);
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Payload* _payload;
+		IPAACA_MEMBER_VAR_EXPORT unsigned long reference_payload_revision;
+		IPAACA_MEMBER_VAR_EXPORT PayloadDocumentStore::iterator raw_iterator;
+		//IPAACA_MEMBER_VAR_EXPORT bool is_end;
+	protected:
+		IPAACA_HEADER_EXPORT PayloadIterator(Payload* payload, PayloadDocumentStore::iterator&& pl_iter ); //, bool is_end);
+	public:
+		IPAACA_HEADER_EXPORT PayloadIterator(const PayloadIterator& iter);
+		IPAACA_HEADER_EXPORT PayloadIterator& operator++();
+		IPAACA_HEADER_EXPORT std::pair<std::string, PayloadEntryProxy> operator*();
+		IPAACA_HEADER_EXPORT bool operator==(const PayloadIterator& ref);
+		IPAACA_HEADER_EXPORT bool operator!=(const PayloadIterator& ref);
+		// constructor to create a new top-most parent proxy (from a payload key)
+};
+//}}}
+
 IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
 {
 	friend std::ostream& operator<<(std::ostream& os, const PayloadEntryProxy& proxy);
diff --git a/ipaacalib/cpp/src/ipaaca-internal.cc b/ipaacalib/cpp/src/ipaaca-internal.cc
index 140b82deba449d3d51fbf4673ac0b4943e3e5f92..d317850d9d02ef85de3b3fcafc3949da20aef17a 100644
--- a/ipaacalib/cpp/src/ipaaca-internal.cc
+++ b/ipaacalib/cpp/src/ipaaca-internal.cc
@@ -171,8 +171,16 @@ IPAACA_EXPORT std::string IUConverter::serialize(const AnnotatedData& data, std:
 	for (auto& kv: obj->_payload._document_store) {
 		protobuf::PayloadItem* item = pbo->add_payload();
 		item->set_key(kv.first);
-		item->set_value( kv.second->to_json_string_representation() );
-		item->set_type("JSON");
+		//item->set_value( kv.second->to_json_string_representation() );
+		//item->set_type("JSON");
+		if (obj->_payload_type=="JSON") {
+			item->set_value( kv.second->to_json_string_representation() );
+			item->set_type("JSON");
+		} else if ((obj->_payload_type=="MAP") || (obj->_payload_type=="STR")) {
+			// legacy mode
+			item->set_value( json_value_cast<std::string>(kv.second->document));
+			item->set_type("STR");
+		}
 	}
 	for (LinkMap::const_iterator it=obj->_links._links.begin(); it!=obj->_links._links.end(); ++it) {
 		protobuf::LinkSet* links = pbo->add_links();
@@ -323,8 +331,16 @@ IPAACA_EXPORT std::string MessageConverter::serialize(const AnnotatedData& data,
 	for (auto& kv: obj->_payload._document_store) {
 		protobuf::PayloadItem* item = pbo->add_payload();
 		item->set_key(kv.first);
-		item->set_value( kv.second->to_json_string_representation() );
-		item->set_type("JSON");
+		//item->set_value( kv.second->to_json_string_representation() );
+		//item->set_type("JSON");
+		if (obj->_payload_type=="JSON") {
+			item->set_value( kv.second->to_json_string_representation() );
+			item->set_type("JSON");
+		} else if ((obj->_payload_type=="MAP") || (obj->_payload_type=="STR")) {
+			// legacy mode
+			item->set_value( json_value_cast<std::string>(kv.second->document));
+			item->set_type("STR");
+		}
 	}
 	for (LinkMap::const_iterator it=obj->_links._links.begin(); it!=obj->_links._links.end(); ++it) {
 		protobuf::LinkSet* links = pbo->add_links();
@@ -453,8 +469,14 @@ IPAACA_EXPORT std::string IUPayloadUpdateConverter::serialize(const AnnotatedDat
 	for (auto& kv: obj->new_items) {
 		protobuf::PayloadItem* item = pbo->add_new_items();
 		item->set_key(kv.first);
-		item->set_value( kv.second->to_json_string_representation() );
-		item->set_type("JSON");
+		if (obj->payload_type=="JSON") {
+			item->set_value( kv.second->to_json_string_representation() );
+			item->set_type("JSON");
+		} else if ((obj->payload_type=="MAP") || (obj->payload_type=="STR")) {
+			// legacy mode
+			item->set_value( json_value_cast<std::string>(kv.second->document));
+			item->set_type("STR");
+		}
 	}
 	for (auto& key: obj->keys_to_remove) {
 		pbo->add_keys_to_remove(key);
diff --git a/ipaacalib/cpp/src/ipaaca-ius.cc b/ipaacalib/cpp/src/ipaaca-ius.cc
index 2c4b0643d2728c65dc780153c264742c4eb2f4a1..fa28b852962fb319018ab6ef85a89271bec0cd9c 100644
--- a/ipaacalib/cpp/src/ipaaca-ius.cc
+++ b/ipaacalib/cpp/src/ipaaca-ius.cc
@@ -218,6 +218,7 @@ IPAACA_EXPORT void RemotePushIU::_modify_payload(bool is_delta, const std::map<s
 	update->writer_name = _buffer->unique_name();
 	update->new_items = new_items;
 	update->keys_to_remove = keys_to_remove;
+	update->payload_type = _payload_type;
 	boost::shared_ptr<int> result = server->call<int>("updatePayload", update, IPAACA_REMOTE_SERVER_TIMEOUT); // TODO
 	if (*result == 0) {
 		throw IUUpdateFailedError();
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index b15ed3fa4c4cb6ee9207e723ca4b57d3c0f7d2c4..199299670d1200071ceb87e8be01d5076c3be766 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -50,6 +50,8 @@ int fakeiu_main(int argc, char** argv)
 	
 	ipaaca::FakeIU::ptr iu = ipaaca::FakeIU::create();
 	iu->add_fake_payload_item("a", entry);
+	iu->payload()["b"] = "anotherValue";
+	iu->payload()["c"] = "yetAnotherValue";
 
 	auto a = iu->payload()["a"];
 	//auto a0 = a[0];
@@ -130,11 +132,20 @@ int fakeiu_main(int argc, char** argv)
 		std::cout << "(n/a)" << std::endl;
 	}
 	
-	std::cout << "Setting a value deep in the object:" << std::endl;
-	iu->payload()["a"][0] = "set by pep::op=";
+	std::cout << "Setting value [0] in the object:" << std::endl;
+	try {
+		iu->payload()["a"][0] = "set by pep::op=";
+	} catch (ipaaca::PayloadAddressingError& e) {
+		std::cout << "  Error - the provided object was not a suitable array" << std::endl;
+	}
 	//iu->payload()["a"]["A"] = "set by pep::op=";
 	
-	std::cout << "Final payload (printed as strings):" << std::endl;
+	std::cout << "Printing final payload using PayloadIterator:" << std::endl;
+	for (auto it = iu->payload().begin(); it != iu->payload().end(); ++it) {
+		std::cout << "  " << std::left << std::setw(15) << ((*it).first+": ") << (*it).second << std::endl;
+	}
+	
+	std::cout << "Final payload (cast to map, printed as strings):" << std::endl;
 	std::map<std::string, std::string> pl_flat = iu->payload();
 	for (auto& kv: pl_flat) {
 		std::cout << "  " << std::left << std::setw(15) << (kv.first+": ") << kv.second << std::endl;
diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc
index 3f3a190549e87e554c327889a4c6b6053fe0cee1..c82ab7943ac01c7bed8655c776f395992e6d0f61 100644
--- a/ipaacalib/cpp/src/ipaaca-payload.cc
+++ b/ipaacalib/cpp/src/ipaaca-payload.cc
@@ -626,6 +626,7 @@ IPAACA_EXPORT void Payload::_internal_set(const std::string& k, PayloadDocumentE
 	_iu.lock()->_modify_payload(true, _new, _remove, writer_name );
 	IPAACA_INFO(" Setting local payload item \"" << k << "\" to " << v)
 	_document_store[k] = v;
+	mark_revision_change();
 }
 IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::string& writer_name) {
 	IPAACA_INFO("")
@@ -634,6 +635,7 @@ IPAACA_EXPORT void Payload::_internal_remove(const std::string& k, const std::st
 	_remove.push_back(k);
 	_iu.lock()->_modify_payload(true, _new, _remove, writer_name );
 	_document_store.erase(k);
+	mark_revision_change();
 }
 IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, PayloadDocumentEntry::ptr>& new_contents, const std::string& writer_name)
 {
@@ -641,6 +643,7 @@ IPAACA_EXPORT void Payload::_internal_replace_all(const std::map<std::string, Pa
 	std::vector<std::string> _remove;
 	_iu.lock()->_modify_payload(false, new_contents, _remove, writer_name );
 	_document_store = new_contents;
+	mark_revision_change();
 }
 IPAACA_EXPORT void Payload::_internal_merge(const std::map<std::string, PayloadDocumentEntry::ptr>& contents_to_merge, const std::string& writer_name)
 {
@@ -650,6 +653,7 @@ IPAACA_EXPORT void Payload::_internal_merge(const std::map<std::string, PayloadD
 	for (auto& kv: contents_to_merge) {
 		_document_store[kv.first] = kv.second;
 	}
+	mark_revision_change();
 	//_document_store.insert(contents_to_merge.begin(), contents_to_merge.end());
 	//for (std::map<std::string, std::string>::iterator it = contents_to_merge.begin(); it!=contents_to_merge.end(); i++) {
 	//	_store[it->first] = it->second;
@@ -666,17 +670,62 @@ IPAACA_EXPORT std::string Payload::get(const std::string& k) { // DEPRECATED
 IPAACA_EXPORT void Payload::_remotely_enforced_wipe()
 {
 	_document_store.clear();
+	mark_revision_change();
 }
 IPAACA_EXPORT void Payload::_remotely_enforced_delitem(const std::string& k)
 {
 	_document_store.erase(k);
+	mark_revision_change();
 }
 IPAACA_EXPORT void Payload::_remotely_enforced_setitem(const std::string& k, PayloadDocumentEntry::ptr entry)
 {
-	IPAACA_INFO("Setting payload entry for \"" << k <<"\" to " << entry)
+	//IPAACA_INFO("Setting payload entry for \"" << k <<"\" to " << entry)
 	_document_store[k] = entry;
+	mark_revision_change();
+}
+IPAACA_EXPORT PayloadIterator Payload::begin()
+{
+	return PayloadIterator(this, _document_store.begin());
+}
+IPAACA_EXPORT PayloadIterator Payload::end()
+{
+	return PayloadIterator(this, _document_store.end());
 }
 
 //}}}
 
+IPAACA_EXPORT PayloadIterator::PayloadIterator(Payload* payload, PayloadDocumentStore::iterator&& ref_it)
+: _payload(payload), reference_payload_revision(payload->internal_revision), raw_iterator(std::move(ref_it))
+{
+}
+IPAACA_EXPORT PayloadIterator::PayloadIterator(const PayloadIterator& iter)
+: _payload(iter._payload), reference_payload_revision(iter.reference_payload_revision), raw_iterator(iter.raw_iterator)
+{
+}
+
+IPAACA_EXPORT PayloadIterator& PayloadIterator::operator++()
+{
+	if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError();
+	++raw_iterator;
+	return *this;
+}
+
+IPAACA_EXPORT std::pair<std::string, PayloadEntryProxy> PayloadIterator::operator*()
+{
+	if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError();
+	if (raw_iterator == _payload->_document_store.end()) throw PayloadIteratorInvalidError();
+	return std::pair<std::string, PayloadEntryProxy>(raw_iterator->first, PayloadEntryProxy(_payload, raw_iterator->first));
+}
+
+IPAACA_EXPORT bool PayloadIterator::operator==(const PayloadIterator& ref)
+{
+	if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError();
+	return (raw_iterator==ref.raw_iterator);
+}
+IPAACA_EXPORT bool PayloadIterator::operator!=(const PayloadIterator& ref)
+{
+	if (_payload->revision_changed(reference_payload_revision)) throw PayloadIteratorInvalidError();
+	return (raw_iterator!=ref.raw_iterator);
+}
+
 } // of namespace ipaaca