From e73f52f2cec40e4a67f1cfb275249e578ce396f1 Mon Sep 17 00:00:00 2001
From: Ramin Yaghoubzadeh <ryaghoubzadeh@uni-bielefeld.de>
Date: Fri, 30 Jan 2015 13:50:48 +0100
Subject: [PATCH] Split up headers OK, sources are next.

---
 ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h | 310 ++++++
 .../cpp/include/ipaaca/ipaaca-definitions.h   | 260 +++++
 .../cpp/include/ipaaca/ipaaca-forwards.h      |  74 ++
 .../cpp/include/ipaaca/ipaaca-internal.h      | 116 +++
 ipaacalib/cpp/include/ipaaca/ipaaca-ius.h     | 226 +++++
 ipaacalib/cpp/include/ipaaca/ipaaca-locking.h | 126 +++
 ipaacalib/cpp/include/ipaaca/ipaaca-payload.h | 118 +++
 ipaacalib/cpp/include/ipaaca/ipaaca.h         | 956 +-----------------
 8 files changed, 1243 insertions(+), 943 deletions(-)
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-internal.h
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-locking.h
 create mode 100644 ipaacalib/cpp/include/ipaaca/ipaaca-payload.h

diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
new file mode 100644
index 0000000..35abab9
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-buffers.h
@@ -0,0 +1,310 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_buffers_h_INCLUDED__
+#define __ipaaca_buffers_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+
+/// store for (local) IUs. TODO Stores need to be unified more
+IPAACA_HEADER_EXPORT class IUStore: public std::map<std::string, boost::shared_ptr<IU> >
+{
+};
+/// store for RemotePushIUs. TODO Stores need to be unified more
+IPAACA_HEADER_EXPORT class RemotePushIUStore: public std::map<std::string, boost::shared_ptr<RemotePushIU> > // TODO genericize to all remote IU types
+{
+};
+
+typedef std::set<std::string> LinkSet;
+typedef std::map<std::string, LinkSet> LinkMap;
+
+IPAACA_HEADER_EXPORT class SmartLinkMap {
+	friend std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj);
+	friend class IUInterface;
+	friend class IU;
+	friend class IUConverter;
+	friend class MessageConverter;
+	public:
+		IPAACA_HEADER_EXPORT const LinkSet& get_links(const std::string& key);
+		IPAACA_HEADER_EXPORT const LinkMap& get_all_links();
+
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT LinkMap _links;
+		IPAACA_MEMBER_VAR_EXPORT static LinkSet empty_link_set;
+		IPAACA_HEADER_EXPORT void _add_and_remove_links(const LinkMap& add, const LinkMap& remove);
+		IPAACA_HEADER_EXPORT void _replace_links(const LinkMap& links);
+};
+
+IPAACA_MEMBER_VAR_EXPORT const LinkSet EMPTY_LINK_SET;
+
+// BufferConfiguration
+IPAACA_HEADER_EXPORT class BufferConfiguration
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::string _basename;
+		IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> _category_interests;
+		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; }
+};
+
+// BufferConfigurationBuilder
+IPAACA_HEADER_EXPORT class BufferConfigurationBuilder: private BufferConfiguration
+{
+	public:
+		IPAACA_HEADER_EXPORT inline BufferConfigurationBuilder(const std::string basename):BufferConfiguration(basename) {}
+		IPAACA_HEADER_EXPORT inline void set_basename(const std::string& basename)
+		{
+			_basename = basename;
+		}
+		IPAACA_HEADER_EXPORT inline void add_category_interest(const std::string& category)
+		{
+			_category_interests.push_back(category);
+		}
+		IPAACA_HEADER_EXPORT inline void set_channel(const std::string& channel)
+		{
+			_channel = channel;
+		}
+
+		IPAACA_HEADER_EXPORT const BufferConfiguration& get_buffer_configuration() { return *this; }
+
+};
+
+IPAACA_HEADER_EXPORT typedef boost::function<void (boost::shared_ptr<IUInterface>, IUEventType, bool)> IUEventHandlerFunction;
+
+IPAACA_HEADER_EXPORT class IUEventHandler {//{{{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT IUEventHandlerFunction _function;
+		IPAACA_MEMBER_VAR_EXPORT IUEventType _event_mask;
+		IPAACA_MEMBER_VAR_EXPORT bool _for_all_categories;
+		IPAACA_MEMBER_VAR_EXPORT std::set<std::string> _categories;
+	protected:
+		IPAACA_HEADER_EXPORT inline bool _condition_met(IUEventType event_type, const std::string& category)
+		{
+			return ((_event_mask&event_type)!=0) && (_for_all_categories || (_categories.count(category)>0));
+		}
+	public:
+		IPAACA_HEADER_EXPORT IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category);
+		IPAACA_HEADER_EXPORT IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories);
+		//void call(Buffer* buffer, const std::string& uid, bool local, IUEventType event_type, const std::string& category);
+		IPAACA_HEADER_EXPORT void call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category);
+	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 _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, std::string>& 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 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);
+#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_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& 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_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_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius();
+		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;
+#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);
+#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_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_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, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef")
+			{
+				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_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_HEADER_EXPORT void set_resend(bool resendActive);
+			IPAACA_HEADER_EXPORT bool get_resend();
+
+		public:
+			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_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius();
+		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, std::string> 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 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
new file mode 100644
index 0000000..64652d7
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-definitions.h
@@ -0,0 +1,260 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_definitions_h_INCLUDED__
+#define __ipaaca_definitions_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+
+typedef uint32_t revision_t;
+
+/// Type of the IU event. Realized as an integer to enable bit masks for filters.
+typedef uint32_t IUEventType;
+#define IU_ADDED         1
+#define IU_COMMITTED     2
+#define IU_DELETED       4
+#define IU_RETRACTED     8
+#define IU_UPDATED      16
+#define IU_LINKSUPDATED 32
+#define IU_MESSAGE      64
+/// Bit mask for receiving all events
+#define IU_ALL_EVENTS  127
+
+/// Convert an int event type to a human-readable string
+IPAACA_HEADER_EXPORT inline std::string iu_event_type_to_str(IUEventType type)
+{
+	switch(type) {
+		case IU_ADDED: return "ADDED";
+		case IU_COMMITTED: return "COMMITTED";
+		case IU_DELETED: return "DELETED";
+		case IU_RETRACTED: return "RETRACTED";
+		case IU_UPDATED: return "UPDATED";
+		case IU_LINKSUPDATED: return "LINKSUPDATED";
+		case IU_MESSAGE: return "MESSAGE";
+		default: return "(NOT A KNOWN SINGLE IU EVENT TYPE)";
+	}
+}
+
+/// IU access mode: PUSH means that updates are broadcast; REMOTE means that reads are RPC calls; MESSAGE means a fire-and-forget message
+IPAACA_HEADER_EXPORT enum IUAccessMode {
+	IU_ACCESS_PUSH,
+	IU_ACCESS_REMOTE,
+	IU_ACCESS_MESSAGE
+};
+
+/// generate a UUID as an ASCII string
+IPAACA_HEADER_EXPORT std::string generate_uuid_string();
+
+/*
+ *  Exceptions and errors
+ */
+IPAACA_HEADER_EXPORT class Exception: public std::exception//{{{
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::string _description;
+	public:
+		IPAACA_HEADER_EXPORT inline Exception(const std::string& description=""): _description(description) { }
+		IPAACA_HEADER_EXPORT inline ~Exception() throw() { }
+		IPAACA_HEADER_EXPORT const char* what() const throw() {
+			return _description.c_str();
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class Abort: public std::exception//{{{
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::string _description;
+	public:
+		IPAACA_HEADER_EXPORT inline Abort(const std::string& description=""): _description(description) { }
+		IPAACA_HEADER_EXPORT inline ~Abort() throw() { }
+		IPAACA_HEADER_EXPORT const char* what() const throw() {
+			return _description.c_str();
+		}
+};//}}}
+
+IPAACA_HEADER_EXPORT class IUNotFoundError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUNotFoundError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUNotFoundError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUNotFoundError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUPublishedError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUPublishedError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUPublishedError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUPublishedError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUCommittedError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUCommittedError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUCommittedError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUCommittedError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUUpdateFailedError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUUpdateFailedError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUUpdateFailedError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUUpdateFailedError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUResendRequestFailedError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUResendRequestFailedError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUResendRequestFailedError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUResendRequestFailedError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUReadOnlyError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUReadOnlyError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUReadOnlyError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUReadOnlyError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUAlreadyInABufferError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUAlreadyInABufferError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUAlreadyInABufferError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUAlreadyInABufferError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUUnpublishedError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUUnpublishedError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUUnpublishedError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUUnpublishedError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUAlreadyHasAnUIDError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUAlreadyHasAnUIDError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUAlreadyHasAnUIDError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUAlreadyHasAnUIDError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class IUAlreadyHasAnOwnerNameError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~IUAlreadyHasAnOwnerNameError() throw() { }
+		IPAACA_HEADER_EXPORT inline IUAlreadyHasAnOwnerNameError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUAlreadyHasAnOwnerNameError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class UUIDGenerationError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~UUIDGenerationError() throw() { }
+		IPAACA_HEADER_EXPORT inline UUIDGenerationError() { //boost::shared_ptr<IU> iu) {
+			_description = "UUIDGenerationError";
+		}
+};//}}}
+IPAACA_HEADER_EXPORT class NotImplementedError: public Exception//{{{
+{
+	public:
+		IPAACA_HEADER_EXPORT inline ~NotImplementedError() throw() { }
+		IPAACA_HEADER_EXPORT inline NotImplementedError() { //boost::shared_ptr<IU> iu) {
+			_description = "NotImplementedError";
+		}
+};//}}}
+
+
+/// Static library initialization
+IPAACA_HEADER_EXPORT class Initializer
+{
+	public:
+		IPAACA_HEADER_EXPORT static void initialize_ipaaca_rsb_if_needed();
+		IPAACA_HEADER_EXPORT static void initialize_updated_default_config();
+		IPAACA_HEADER_EXPORT static bool initialized();
+		IPAACA_HEADER_EXPORT static void dump_current_default_config();
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT static bool _initialized;
+};
+
+// additional misc classes ( Command line options )//{{{
+IPAACA_HEADER_EXPORT class CommandLineOptions {
+	public:
+		IPAACA_HEADER_EXPORT inline CommandLineOptions() { }
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> param_opts;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> param_set;
+	public:
+		IPAACA_HEADER_EXPORT void set_option(const std::string& name, bool expect, const char* optarg);
+		IPAACA_HEADER_EXPORT std::string get_param(const std::string& o);
+		IPAACA_HEADER_EXPORT bool is_set(const std::string& o);
+		IPAACA_HEADER_EXPORT void dump();
+	typedef boost::shared_ptr<CommandLineOptions> ptr;
+};
+
+class CommandLineParser {
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::map<char, std::string> longopt; // letter->name
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, char> shortopt; // letter->name
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> options; //  name / expect_param
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> defaults; // for opt params
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, int> set_flag; // for paramless opts
+	protected:
+		IPAACA_HEADER_EXPORT CommandLineParser();
+	public:
+		IPAACA_HEADER_EXPORT inline ~CommandLineParser() { }
+		IPAACA_HEADER_EXPORT static inline boost::shared_ptr<CommandLineParser> create() {
+			return boost::shared_ptr<CommandLineParser>(new CommandLineParser());
+		}
+		IPAACA_HEADER_EXPORT void initialize_parser_defaults();
+		IPAACA_HEADER_EXPORT void dump_options();
+		IPAACA_HEADER_EXPORT void add_option(const std::string& optname, char shortn, bool expect_param, const std::string& defaultv);
+		IPAACA_HEADER_EXPORT void ensure_defaults_in( CommandLineOptions::ptr clo );
+		IPAACA_HEADER_EXPORT CommandLineOptions::ptr parse(int argc, char* const* argv);
+	typedef boost::shared_ptr<CommandLineParser> ptr;
+};
+//}}}
+// additional misc functions ( String splitting / joining )//{{{
+IPAACA_HEADER_EXPORT std::string str_join(const std::set<std::string>& set,const std::string& sep);
+IPAACA_HEADER_EXPORT std::string str_join(const std::vector<std::string>& vec,const std::string& sep);
+IPAACA_HEADER_EXPORT void str_split_wipe(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters );
+IPAACA_HEADER_EXPORT void str_split_append(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters );
+//}}}
+
+#endif
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h b/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h
new file mode 100644
index 0000000..8f02152
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-forwards.h
@@ -0,0 +1,74 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_forwards_h_INCLUDED__
+#define __ipaaca_forwards_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+/*
+ *  forward declarations
+ */
+class PayloadEntryProxy;
+class Payload;
+class IUInterface;
+class IU;
+class Message;
+class RemotePushIU;
+class IULinkUpdate;
+class IUPayloadUpdate;
+class IUStore;
+class FrozenIUStore;
+class Buffer;
+class InputBuffer;
+class OutputBuffer;
+
+class CallbackIUPayloadUpdate;
+class CallbackIULinkUpdate;
+class CallbackIUCommission;
+class CallbackIUResendRequest;
+class CallbackIURetraction;
+
+class IUConverter;
+class MessageConverter;
+class IUPayloadUpdateConverter;
+class IULinkUpdateConverter;
+class IntConverter;
+
+class BufferConfiguration;
+class BufferConfigurationBuilder;
+
+#endif
+
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-internal.h b/ipaacalib/cpp/include/ipaaca/ipaaca-internal.h
new file mode 100644
index 0000000..ae2bdd0
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-internal.h
@@ -0,0 +1,116 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_internal_h_INCLUDED__
+#define __ipaaca_internal_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+
+#ifdef IPAACA_EXPOSE_FULL_RSB_API
+
+IPAACA_HEADER_EXPORT class CallbackIUPayloadUpdate: public rsb::patterns::Server::Callback<IUPayloadUpdate, int> {//{{{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
+	public:
+		IPAACA_HEADER_EXPORT CallbackIUPayloadUpdate(Buffer* buffer);
+		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update);
+};//}}}
+IPAACA_HEADER_EXPORT class CallbackIULinkUpdate: public rsb::patterns::Server::Callback<IULinkUpdate, int> {//{{{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
+	public:
+		IPAACA_HEADER_EXPORT CallbackIULinkUpdate(Buffer* buffer);
+	public:
+		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IULinkUpdate> update);
+};//}}}
+IPAACA_HEADER_EXPORT class CallbackIUCommission: public rsb::patterns::Server::Callback<protobuf::IUCommission, int> {//{{{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
+	public:
+		IPAACA_HEADER_EXPORT CallbackIUCommission(Buffer* buffer);
+	public:
+		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IUCommission> update);
+};//}}}
+IPAACA_HEADER_EXPORT class CallbackIUResendRequest: public rsb::patterns::Server::Callback<protobuf::IUResendRequest, int> {//{{{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
+	public:
+		IPAACA_HEADER_EXPORT CallbackIUResendRequest(Buffer* buffer);
+	public:
+		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IUResendRequest> update);
+};//}}}
+IPAACA_HEADER_EXPORT class CallbackIURetraction: public rsb::patterns::Server::Callback<protobuf::IURetraction, int> {//{{{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
+	public:
+		IPAACA_HEADER_EXPORT CallbackIURetraction(Buffer* buffer);
+	public:
+		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IURetraction> update);
+};//}}}
+
+IPAACA_HEADER_EXPORT class IUConverter: public rsb::converter::Converter<std::string> {//{{{
+	public:
+		IPAACA_HEADER_EXPORT IUConverter();
+		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};//}}}
+IPAACA_HEADER_EXPORT class MessageConverter: public rsb::converter::Converter<std::string> {//{{{
+	public:
+		IPAACA_HEADER_EXPORT MessageConverter();
+		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};//}}}
+IPAACA_HEADER_EXPORT class IUPayloadUpdateConverter: public rsb::converter::Converter<std::string> {//{{{
+	public:
+		IPAACA_HEADER_EXPORT IUPayloadUpdateConverter();
+		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};//}}}
+IPAACA_HEADER_EXPORT class IULinkUpdateConverter: public rsb::converter::Converter<std::string> {//{{{
+	public:
+		IPAACA_HEADER_EXPORT IULinkUpdateConverter();
+		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};//}}}
+IPAACA_HEADER_EXPORT class IntConverter: public rsb::converter::Converter<std::string> {//{{{
+	public:
+		IPAACA_HEADER_EXPORT IntConverter();
+		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};//}}}
+#endif
+
+#endif
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
new file mode 100644
index 0000000..6656d18
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-ius.h
@@ -0,0 +1,226 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_ius_h_INCLUDED__
+#define __ipaaca_ius_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+
+IPAACA_HEADER_EXPORT class IUInterface {//{{{
+	friend class IUConverter;
+	friend class MessageConverter;
+	friend std::ostream& operator<<(std::ostream& os, const IUInterface& obj);
+	protected:
+		IPAACA_HEADER_EXPORT IUInterface();
+	public:
+		IPAACA_HEADER_EXPORT inline virtual ~IUInterface() { }
+	protected:
+		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 _owner_name;
+		IPAACA_MEMBER_VAR_EXPORT bool _committed;
+		IPAACA_MEMBER_VAR_EXPORT bool _retracted;
+		IPAACA_MEMBER_VAR_EXPORT IUAccessMode _access_mode;
+		IPAACA_MEMBER_VAR_EXPORT bool _read_only;
+		//boost::shared_ptr<Buffer> _buffer;
+		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
+		IPAACA_MEMBER_VAR_EXPORT SmartLinkMap _links;
+	protected:
+		friend class Payload;
+		// Internal functions that perform the update logic,
+		//  e.g. sending a notification across the network
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ 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) = 0;
+		//void _set_buffer(boost::shared_ptr<Buffer> buffer);
+		IPAACA_HEADER_EXPORT void _associate_with_buffer(Buffer* buffer);
+		IPAACA_HEADER_EXPORT void _set_buffer(Buffer* buffer);
+		IPAACA_HEADER_EXPORT void _set_uid(const std::string& uid);
+		IPAACA_HEADER_EXPORT void _set_owner_name(const std::string& owner_name);
+	protected:
+		// internal functions that do not emit update events
+		IPAACA_HEADER_EXPORT inline void _add_and_remove_links(const LinkMap& add, const LinkMap& remove) { _links._add_and_remove_links(add, remove); }
+		IPAACA_HEADER_EXPORT inline void _replace_links(const LinkMap& links) { _links._replace_links(links); }
+	public:
+		IPAACA_HEADER_EXPORT inline bool is_published() { return (_buffer != 0); }
+		IPAACA_HEADER_EXPORT inline const std::string& uid() const { return _uid; }
+		IPAACA_HEADER_EXPORT inline revision_t revision() const { return _revision; }
+		IPAACA_HEADER_EXPORT inline const std::string& category() const { return _category; }
+		IPAACA_HEADER_EXPORT const std::string& channel();
+		IPAACA_HEADER_EXPORT inline const std::string& payload_type() const { return _payload_type; }
+		IPAACA_HEADER_EXPORT inline const std::string& owner_name() const { return _owner_name; }
+		IPAACA_HEADER_EXPORT inline bool committed() const { return _committed; }
+		IPAACA_HEADER_EXPORT inline IUAccessMode access_mode() const { return _access_mode; }
+		IPAACA_HEADER_EXPORT inline bool read_only() const { return _read_only; }
+		//inline boost::shared_ptr<Buffer> buffer() { return _buffer; }
+		IPAACA_HEADER_EXPORT inline Buffer* buffer() const { return _buffer; }
+		IPAACA_HEADER_EXPORT inline const LinkSet& get_links(std::string type) { return _links.get_links(type); }
+		IPAACA_HEADER_EXPORT inline const LinkMap& get_all_links() { return _links.get_all_links(); }
+		// Payload
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual Payload& payload() = 0;
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual const Payload& const_payload() const = 0;
+		// setters
+		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void commit() = 0;
+		// functions to modify and update links:
+		IPAACA_HEADER_EXPORT void _publish_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name);
+
+		IPAACA_HEADER_EXPORT void add_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void remove_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void modify_links(const LinkMap& add, const LinkMap& remove, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void set_links(const LinkMap& links, const std::string& writer_name = "");
+		//    (with cpp specific convenience functions:)
+		IPAACA_HEADER_EXPORT void add_link(const std::string& type, const std::string& target, const std::string& writer_name = "");
+		IPAACA_HEADER_EXPORT void remove_link(const std::string& type, const std::string& target, const std::string& writer_name = "");
+	typedef boost::shared_ptr<IUInterface> ptr;
+};//}}}
+
+IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
+	friend class Buffer;
+	friend class InputBuffer;
+	friend class OutputBuffer;
+	friend class CallbackIUPayloadUpdate;
+	friend class CallbackIULinkUpdate;
+	friend class CallbackIUCommission;
+	friend class CallbackIUResendRequest;
+	public:
+		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
+	protected:
+	   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" );
+	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 inline Payload& payload() { return _payload; }
+		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; }
+		IPAACA_HEADER_EXPORT void commit();
+	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 _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 = "");
+	protected:
+		IPAACA_HEADER_EXPORT virtual void _internal_commit(const std::string& writer_name = "");
+	public:
+	typedef boost::shared_ptr<IU> ptr;
+};//}}}
+IPAACA_HEADER_EXPORT class Message: public IU {//{{{
+	friend class Buffer;
+	friend class InputBuffer;
+	friend class OutputBuffer;
+	friend class CallbackIUPayloadUpdate;
+	friend class CallbackIULinkUpdate;
+	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" );
+	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" );
+	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 = "");
+	protected:
+		IPAACA_HEADER_EXPORT void _internal_commit(const std::string& writer_name = "");
+	public:
+	typedef boost::shared_ptr<Message> ptr;
+};//}}}
+
+IPAACA_HEADER_EXPORT class RemotePushIU: public IUInterface {//{{{
+	friend class Buffer;
+	friend class InputBuffer;
+	friend class OutputBuffer;
+	friend class IUConverter;
+	friend class MessageConverter;
+	public:
+		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
+	protected:
+		IPAACA_HEADER_EXPORT RemotePushIU();
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<RemotePushIU> create();
+	public:
+		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();
+	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 = "");
+	protected:
+		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
+		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
+		IPAACA_HEADER_EXPORT void _apply_commission();
+		IPAACA_HEADER_EXPORT void _apply_retraction();
+	typedef boost::shared_ptr<RemotePushIU> ptr;
+};//}}}
+IPAACA_HEADER_EXPORT class RemoteMessage: public IUInterface {//{{{
+	friend class Buffer;
+	friend class InputBuffer;
+	friend class OutputBuffer;
+	friend class IUConverter;
+	friend class MessageConverter;
+	public:
+		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
+	protected:
+		IPAACA_HEADER_EXPORT RemoteMessage();
+		IPAACA_HEADER_EXPORT static boost::shared_ptr<RemoteMessage> create();
+	public:
+		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();
+	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 = "");
+	protected:
+		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
+		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
+		IPAACA_HEADER_EXPORT void _apply_commission();
+		IPAACA_HEADER_EXPORT void _apply_retraction();
+	typedef boost::shared_ptr<RemoteMessage> ptr;
+};//}}}
+
+#endif
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-locking.h b/ipaacalib/cpp/include/ipaaca/ipaaca-locking.h
new file mode 100644
index 0000000..78b093b
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-locking.h
@@ -0,0 +1,126 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_locking_h_INCLUDED__
+#define __ipaaca_locking_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+
+/// a reentrant lock/mutex
+#ifdef WIN32
+#include <boost/thread/recursive_mutex.hpp>
+#include <boost/thread/thread.hpp>
+IPAACA_HEADER_EXPORT class Lock
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT boost::recursive_mutex _mutex;
+	public:
+		IPAACA_HEADER_EXPORT inline Lock() {
+		}
+		IPAACA_HEADER_EXPORT inline ~Lock() {
+		}
+		IPAACA_HEADER_EXPORT inline void lock() {
+			_mutex.lock();
+		}
+		IPAACA_HEADER_EXPORT inline void unlock() {
+			_mutex.unlock();
+		}
+};
+#else
+#include <pthread.h>
+IPAACA_HEADER_EXPORT class Lock
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT pthread_mutexattr_t _attrs;
+		IPAACA_MEMBER_VAR_EXPORT pthread_mutex_t _mutex;
+	public:
+		IPAACA_HEADER_EXPORT inline Lock() {
+			pthread_mutexattr_init(&_attrs);
+			pthread_mutexattr_settype(&_attrs, PTHREAD_MUTEX_RECURSIVE);
+			pthread_mutex_init(&_mutex, &_attrs);
+		}
+		IPAACA_HEADER_EXPORT inline ~Lock() {
+			pthread_mutex_destroy(&_mutex);
+			pthread_mutexattr_destroy(&_attrs);
+		}
+		IPAACA_HEADER_EXPORT inline void lock() {
+			pthread_mutex_lock(&_mutex);
+		}
+		IPAACA_HEADER_EXPORT inline void unlock() {
+			pthread_mutex_unlock(&_mutex);
+		}
+};
+#endif
+
+/// Stack-based lock holder. Create in a new stack frame
+///  (i.e.  {}-block) and it will obtain the lock and
+///  auto-release in on exiting the stack frame.
+IPAACA_HEADER_EXPORT class Locker
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Lock* _lock;
+	private:
+		IPAACA_HEADER_EXPORT inline Locker(): _lock(NULL) { } // not available
+	public:
+		IPAACA_HEADER_EXPORT inline Locker(Lock& lock): _lock(&lock) {
+			//std::cout << "-- Locker: lock" << std::endl;
+			_lock->lock();
+		}
+		IPAACA_HEADER_EXPORT inline ~Locker() {
+			//std::cout << "-- Locker: unlock" << std::endl;
+			_lock->unlock();
+		}
+};
+
+#ifndef WIN32
+IPAACA_HEADER_EXPORT class PthreadMutexLocker
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT pthread_mutex_t* _lock;
+	private:
+		IPAACA_HEADER_EXPORT inline PthreadMutexLocker(): _lock(NULL) { } // not available
+	public:
+		IPAACA_HEADER_EXPORT inline PthreadMutexLocker(pthread_mutex_t* lock): _lock(lock) {
+			if (!lock) throw Exception("PthreadMutexLocker got a NULL mutex!");
+			pthread_mutex_lock(_lock);
+		}
+		IPAACA_HEADER_EXPORT inline ~PthreadMutexLocker() {
+			pthread_mutex_unlock(_lock);
+		}
+};
+#endif
+
+#endif
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
new file mode 100644
index 0000000..6f67948
--- /dev/null
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -0,0 +1,118 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
+ *                         CITEC, Bielefeld University
+ *
+ * http://opensource.cit-ec.de/projects/ipaaca/
+ * http://purl.org/net/ipaaca
+ *
+ * This file may be licensed under the terms of of the
+ * GNU Lesser General Public License Version 3 (the ``LGPL''),
+ * or (at your option) any later version.
+ *
+ * Software distributed under the License is distributed
+ * on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
+ * express or implied. See the LGPL for the specific language
+ * governing rights and limitations.
+ *
+ * You should have received a copy of the LGPL along with this
+ * program. If not, go to http://www.gnu.org/licenses/lgpl.html
+ * or write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The development of this software was supported by the
+ * Excellence Cluster EXC 277 Cognitive Interaction Technology.
+ * The Excellence Cluster EXC 277 is a grant of the Deutsche
+ * Forschungsgemeinschaft (DFG) in the context of the German
+ * Excellence Initiative.
+ */
+
+#ifndef __ipaaca_payload_h_INCLUDED__
+#define __ipaaca_payload_h_INCLUDED__
+
+#ifndef __ipaaca_h_INCLUDED__
+#error "Please do not include this file directly, use ipaaca.h instead"
+#endif
+
+
+
+IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
+{
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT Payload* _payload;
+		IPAACA_MEMBER_VAR_EXPORT std::string _key;
+	public:
+		IPAACA_HEADER_EXPORT PayloadEntryProxy(Payload* payload, const std::string& key);
+		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const std::string& value);
+		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const char* value);
+		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(double value);
+		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(bool value);
+		IPAACA_HEADER_EXPORT operator std::string();
+		IPAACA_HEADER_EXPORT operator long();
+		IPAACA_HEADER_EXPORT operator double();
+		IPAACA_HEADER_EXPORT operator bool();
+		IPAACA_HEADER_EXPORT std::string to_str();
+		//long to_int() { return operator long(); ;
+		IPAACA_HEADER_EXPORT long to_long();
+		IPAACA_HEADER_EXPORT double to_float();
+		IPAACA_HEADER_EXPORT bool to_bool();
+		// getters
+		IPAACA_HEADER_EXPORT template<typename T> T get(); // specializations below
+		// setters
+};
+// Available interpretations of payload entries (or children thereof) below.
+//  Usage of standard complex data structures (vector etc.) currently entails
+//  casting all entries to a uniform type (a-priori choice: std::string).
+IPAACA_HEADER_EXPORT template<> long PayloadEntryProxy::get();
+IPAACA_HEADER_EXPORT template<> double PayloadEntryProxy::get();
+IPAACA_HEADER_EXPORT template<> bool PayloadEntryProxy::get();
+IPAACA_HEADER_EXPORT template<> std::string PayloadEntryProxy::get();
+IPAACA_HEADER_EXPORT template<> std::vector<std::string> PayloadEntryProxy::get();
+IPAACA_HEADER_EXPORT template<> std::list<std::string> PayloadEntryProxy::get();
+IPAACA_HEADER_EXPORT template<> std::map<std::string, std::string> PayloadEntryProxy::get();
+
+//}}}
+
+IPAACA_HEADER_EXPORT class Payload//{{{
+{
+	friend std::ostream& operator<<(std::ostream& os, const Payload& obj);
+	friend class IUInterface;
+	friend class IU;
+	friend class Message;
+	friend class RemotePushIU;
+	friend class RemoteMessage;
+	friend class IUConverter;
+	friend class MessageConverter;
+	friend class CallbackIUPayloadUpdate;
+	protected:
+		IPAACA_MEMBER_VAR_EXPORT std::string _owner_name;
+		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> _store;
+		IPAACA_MEMBER_VAR_EXPORT boost::weak_ptr<IUInterface> _iu;
+	protected:
+		IPAACA_HEADER_EXPORT void initialize(boost::shared_ptr<IUInterface> iu);
+		IPAACA_HEADER_EXPORT inline void _set_owner_name(const std::string& name) { _owner_name = name; }
+		IPAACA_HEADER_EXPORT void _remotely_enforced_wipe();
+		IPAACA_HEADER_EXPORT void _remotely_enforced_delitem(const std::string& k);
+		IPAACA_HEADER_EXPORT void _remotely_enforced_setitem(const std::string& k, const std::string& v);
+		IPAACA_HEADER_EXPORT void _internal_replace_all(const std::map<std::string, std::string>& new_contents, const std::string& writer_name="");
+		IPAACA_HEADER_EXPORT void _internal_merge(const std::map<std::string, std::string>& contents_to_merge, const std::string& writer_name="");
+		IPAACA_HEADER_EXPORT void _internal_set(const std::string& k, const std::string& v, const std::string& writer_name="");
+		IPAACA_HEADER_EXPORT void _internal_remove(const std::string& k, const std::string& writer_name="");
+	public:
+		IPAACA_HEADER_EXPORT inline const std::string& owner_name() { return _owner_name; }
+		// access
+		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key);
+		IPAACA_HEADER_EXPORT operator std::map<std::string, std::string>();
+		IPAACA_HEADER_EXPORT inline void set(const std::map<std::string, std::string>& all_elems) { _internal_replace_all(all_elems); }
+		IPAACA_HEADER_EXPORT inline void set(const std::string& k, const std::string& v) { _internal_set(k, v); }
+		IPAACA_HEADER_EXPORT inline void merge(const std::map<std::string, std::string>& elems_to_merge) { _internal_merge(elems_to_merge); }
+		IPAACA_HEADER_EXPORT inline void remove(const std::string& k) { _internal_remove(k); }
+		IPAACA_HEADER_EXPORT std::string get(const std::string& k);
+	typedef boost::shared_ptr<Payload> ptr;
+};//}}}
+
+#endif
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h
index 8630f16..f82a0d3 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h
@@ -3,7 +3,8 @@
  *  "Incremental Processing Architecture
  *   for Artificial Conversational Agents".
  *
- * Copyright (c) 2009-2013 Sociable Agents Group
+ * Copyright (c) 2009-2015 Social Cognitive Systems Group
+ *                         (formerly the Sociable Agents Group)
  *                         CITEC, Bielefeld University
  *
  * http://opensource.cit-ec.de/projects/ipaaca/
@@ -30,8 +31,8 @@
  * Excellence Initiative.
  */
 
-#ifndef __IPAACA_H__
-#define __IPAACA_H__
+#ifndef __ipaaca_h_INCLUDED__
+#define __ipaaca_h_INCLUDED__
 
 /// ipaaca/IU/RSB protocol major version number
 #define IPAACA_PROTOCOL_VERSION_MAJOR         2
@@ -137,952 +138,21 @@
 
 namespace ipaaca {
 
-typedef uint32_t revision_t;
+#include <ipaaca/ipaaca-definitions.h>
+#include <ipaaca/ipaaca-forwards.h>
 
-/// Type of the IU event. Realized as an integer to enable bit masks for filters.
-typedef uint32_t IUEventType;
-#define IU_ADDED         1
-#define IU_COMMITTED     2
-#define IU_DELETED       4
-#define IU_RETRACTED     8
-#define IU_UPDATED      16
-#define IU_LINKSUPDATED 32
-#define IU_MESSAGE      64
-/// Bit mask for receiving all events
-#define IU_ALL_EVENTS  127
-
-/// Convert an int event type to a human-readable string
-IPAACA_HEADER_EXPORT inline std::string iu_event_type_to_str(IUEventType type)
-{
-	switch(type) {
-		case IU_ADDED: return "ADDED";
-		case IU_COMMITTED: return "COMMITTED";
-		case IU_DELETED: return "DELETED";
-		case IU_RETRACTED: return "RETRACTED";
-		case IU_UPDATED: return "UPDATED";
-		case IU_LINKSUPDATED: return "LINKSUPDATED";
-		case IU_MESSAGE: return "MESSAGE";
-		default: return "(NOT A KNOWN SINGLE IU EVENT TYPE)";
-	}
-}
-
-/// IU access mode: PUSH means that updates are broadcast; REMOTE means that reads are RPC calls; MESSAGE means a fire-and-forget message
-IPAACA_HEADER_EXPORT enum IUAccessMode {
-	IU_ACCESS_PUSH,
-	IU_ACCESS_REMOTE,
-	IU_ACCESS_MESSAGE
-};
-
-class PayloadEntryProxy;
-class Payload;
-class IUInterface;
-class IU;
-class Message;
-class RemotePushIU;
-class IULinkUpdate;
-class IUPayloadUpdate;
-class IUStore;
-class FrozenIUStore;
-class Buffer;
-class InputBuffer;
-class OutputBuffer;
-
-//class InputBufferRsbAdaptor;
-//class OutputBufferRsbAdaptor;
-
-class CallbackIUPayloadUpdate;
-class CallbackIULinkUpdate;
-class CallbackIUCommission;
-class CallbackIUResendRequest;
-class CallbackIURetraction;
-
-class IUConverter;
-class MessageConverter;
-class IUPayloadUpdateConverter;
-class IULinkUpdateConverter;
-class IntConverter;
-
-
-// BufferConfiguration
-IPAACA_HEADER_EXPORT class BufferConfiguration
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT std::string _basename;
-		IPAACA_MEMBER_VAR_EXPORT std::vector<std::string> _category_interests;
-		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; }
-};
-
-// BufferConfigurationBuilder
-IPAACA_HEADER_EXPORT class BufferConfigurationBuilder: private BufferConfiguration
-{
-	public:
-		IPAACA_HEADER_EXPORT inline BufferConfigurationBuilder(const std::string basename):BufferConfiguration(basename) {}
-		IPAACA_HEADER_EXPORT inline void set_basename(const std::string& basename)
-		{
-			_basename = basename;
-		}
-		IPAACA_HEADER_EXPORT inline void add_category_interest(const std::string& category)
-		{
-			_category_interests.push_back(category);
-		}
-		IPAACA_HEADER_EXPORT inline void set_channel(const std::string& channel)
-		{
-			_channel = channel;
-		}
-
-		IPAACA_HEADER_EXPORT const BufferConfiguration& get_buffer_configuration() { return *this; }
-
-};
-
-
-
-
-/// generate a UUID as an ASCII string
-IPAACA_HEADER_EXPORT std::string generate_uuid_string();
-
-/// store for (local) IUs. TODO Stores need to be unified more
-IPAACA_HEADER_EXPORT class IUStore: public std::map<std::string, boost::shared_ptr<IU> >
-{
-};
-/// store for RemotePushIUs. TODO Stores need to be unified more
-IPAACA_HEADER_EXPORT class RemotePushIUStore: public std::map<std::string, boost::shared_ptr<RemotePushIU> > // TODO genericize to all remote IU types
-{
-};
-
-IPAACA_HEADER_EXPORT class Exception: public std::exception//{{{
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT std::string _description;
-	public:
-		IPAACA_HEADER_EXPORT inline Exception(const std::string& description=""): _description(description) { }
-		IPAACA_HEADER_EXPORT inline ~Exception() throw() { }
-		IPAACA_HEADER_EXPORT const char* what() const throw() {
-			return _description.c_str();
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class Abort: public std::exception//{{{
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT std::string _description;
-	public:
-		IPAACA_HEADER_EXPORT inline Abort(const std::string& description=""): _description(description) { }
-		IPAACA_HEADER_EXPORT inline ~Abort() throw() { }
-		IPAACA_HEADER_EXPORT const char* what() const throw() {
-			return _description.c_str();
-		}
-};//}}}
-
-/// a reentrant lock/mutex
-#ifdef WIN32
-#include <boost/thread/recursive_mutex.hpp>
-#include <boost/thread/thread.hpp>
-IPAACA_HEADER_EXPORT class Lock
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT boost::recursive_mutex _mutex;
-	public:
-		IPAACA_HEADER_EXPORT inline Lock() {
-		}
-		IPAACA_HEADER_EXPORT inline ~Lock() {
-		}
-		IPAACA_HEADER_EXPORT inline void lock() {
-			_mutex.lock();
-		}
-		IPAACA_HEADER_EXPORT inline void unlock() {
-			_mutex.unlock();
-		}
-};
-#else
-#include <pthread.h>
-IPAACA_HEADER_EXPORT class Lock
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT pthread_mutexattr_t _attrs;
-		IPAACA_MEMBER_VAR_EXPORT pthread_mutex_t _mutex;
-	public:
-		IPAACA_HEADER_EXPORT inline Lock() {
-			pthread_mutexattr_init(&_attrs);
-			pthread_mutexattr_settype(&_attrs, PTHREAD_MUTEX_RECURSIVE);
-			pthread_mutex_init(&_mutex, &_attrs);
-		}
-		IPAACA_HEADER_EXPORT inline ~Lock() {
-			pthread_mutex_destroy(&_mutex);
-			pthread_mutexattr_destroy(&_attrs);
-		}
-		IPAACA_HEADER_EXPORT inline void lock() {
-			pthread_mutex_lock(&_mutex);
-		}
-		IPAACA_HEADER_EXPORT inline void unlock() {
-			pthread_mutex_unlock(&_mutex);
-		}
-};
-#endif
-
-/// Stack-based lock holder. Create in a new stack frame
-///  (i.e.  {}-block) and it will obtain the lock and
-///  auto-release in on exiting the stack frame.
-IPAACA_HEADER_EXPORT class Locker
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Lock* _lock;
-	private:
-		IPAACA_HEADER_EXPORT inline Locker(): _lock(NULL) { } // not available
-	public:
-		IPAACA_HEADER_EXPORT inline Locker(Lock& lock): _lock(&lock) {
-			//std::cout << "-- Locker: lock" << std::endl;
-			_lock->lock();
-		}
-		IPAACA_HEADER_EXPORT inline ~Locker() {
-			//std::cout << "-- Locker: unlock" << std::endl;
-			_lock->unlock();
-		}
-};
-
-#ifndef WIN32
-IPAACA_HEADER_EXPORT class PthreadMutexLocker
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT pthread_mutex_t* _lock;
-	private:
-		IPAACA_HEADER_EXPORT inline PthreadMutexLocker(): _lock(NULL) { } // not available
-	public:
-		IPAACA_HEADER_EXPORT inline PthreadMutexLocker(pthread_mutex_t* lock): _lock(lock) {
-			if (!lock) throw Exception("PthreadMutexLocker got a NULL mutex!");
-			pthread_mutex_lock(_lock);
-		}
-		IPAACA_HEADER_EXPORT inline ~PthreadMutexLocker() {
-			pthread_mutex_unlock(_lock);
-		}
-};
-#endif
-
-typedef std::set<std::string> LinkSet;
-typedef std::map<std::string, LinkSet> LinkMap;
-IPAACA_HEADER_EXPORT class SmartLinkMap {
-	friend std::ostream& operator<<(std::ostream& os, const SmartLinkMap& obj);
-	friend class IUInterface;
-	friend class IU;
-	friend class IUConverter;
-	friend class MessageConverter;
-	public:
-		IPAACA_HEADER_EXPORT const LinkSet& get_links(const std::string& key);
-		IPAACA_HEADER_EXPORT const LinkMap& get_all_links();
-
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT LinkMap _links;
-		IPAACA_MEMBER_VAR_EXPORT static LinkSet empty_link_set;
-		IPAACA_HEADER_EXPORT void _add_and_remove_links(const LinkMap& add, const LinkMap& remove);
-		IPAACA_HEADER_EXPORT void _replace_links(const LinkMap& links);
-};
-
-IPAACA_MEMBER_VAR_EXPORT const LinkSet EMPTY_LINK_SET;
-//const std::set<std::string> EMPTY_LINK_SET;
-
-//typedef boost::function<void (const std::string&, bool, IUEventType, const std::string&)> IUEventHandlerFunction;
-IPAACA_HEADER_EXPORT typedef boost::function<void (boost::shared_ptr<IUInterface>, IUEventType, bool)> IUEventHandlerFunction;
-
-IPAACA_HEADER_EXPORT class IUEventHandler {
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT IUEventHandlerFunction _function;
-		IPAACA_MEMBER_VAR_EXPORT IUEventType _event_mask;
-		IPAACA_MEMBER_VAR_EXPORT bool _for_all_categories;
-		IPAACA_MEMBER_VAR_EXPORT std::set<std::string> _categories;
-	protected:
-		IPAACA_HEADER_EXPORT inline bool _condition_met(IUEventType event_type, const std::string& category)
-		{
-			return ((_event_mask&event_type)!=0) && (_for_all_categories || (_categories.count(category)>0));
-		}
-	public:
-		IPAACA_HEADER_EXPORT IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category);
-		IPAACA_HEADER_EXPORT IUEventHandler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories);
-		//void call(Buffer* buffer, const std::string& uid, bool local, IUEventType event_type, const std::string& category);
-		IPAACA_HEADER_EXPORT void call(Buffer* buffer, boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category);
-	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 _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, std::string>& 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 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);
-#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_payload_update(IUInterface* iu, bool is_delta, revision_t revision, const std::map<std::string, std::string>& 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_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_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius();
-	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;
-#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);
-#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_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_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, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name="undef")
-		{
-			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_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_HEADER_EXPORT void set_resend(bool resendActive);
-		IPAACA_HEADER_EXPORT bool get_resend();
-
-	public:
-		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_HEADER_EXPORT std::set<boost::shared_ptr<IUInterface> > get_ius();
-	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, std::string> 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 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 Initializer
-{
-	public:
-		IPAACA_HEADER_EXPORT static void initialize_ipaaca_rsb_if_needed();
-		IPAACA_HEADER_EXPORT static void initialize_updated_default_config();
-		IPAACA_HEADER_EXPORT static bool initialized();
-		IPAACA_HEADER_EXPORT static void dump_current_default_config();
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT static bool _initialized;
-};
-
-IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
-{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Payload* _payload;
-		IPAACA_MEMBER_VAR_EXPORT std::string _key;
-	public:
-		IPAACA_HEADER_EXPORT PayloadEntryProxy(Payload* payload, const std::string& key);
-		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const std::string& value);
-		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(const char* value);
-		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(double value);
-		IPAACA_HEADER_EXPORT PayloadEntryProxy& operator=(bool value);
-		IPAACA_HEADER_EXPORT operator std::string();
-		IPAACA_HEADER_EXPORT operator long();
-		IPAACA_HEADER_EXPORT operator double();
-		IPAACA_HEADER_EXPORT operator bool();
-		IPAACA_HEADER_EXPORT std::string to_str();
-		//long to_int() { return operator long(); ;
-		IPAACA_HEADER_EXPORT long to_long();
-		IPAACA_HEADER_EXPORT double to_float();
-		IPAACA_HEADER_EXPORT bool to_bool();
-		// getters
-		IPAACA_HEADER_EXPORT template<typename T> T get(); // specializations below
-		// setters
-};
-// Available interpretations of payload entries (or children thereof) below.
-//  Usage of standard complex data structures (vector etc.) currently entails
-//  casting all entries to a uniform type (a-priori choice: std::string).
-IPAACA_HEADER_EXPORT template<> long PayloadEntryProxy::get();
-IPAACA_HEADER_EXPORT template<> double PayloadEntryProxy::get();
-IPAACA_HEADER_EXPORT template<> bool PayloadEntryProxy::get();
-IPAACA_HEADER_EXPORT template<> std::string PayloadEntryProxy::get();
-IPAACA_HEADER_EXPORT template<> std::vector<std::string> PayloadEntryProxy::get();
-IPAACA_HEADER_EXPORT template<> std::list<std::string> PayloadEntryProxy::get();
-IPAACA_HEADER_EXPORT template<> std::map<std::string, std::string> PayloadEntryProxy::get();
-
-//}}}
-
-IPAACA_HEADER_EXPORT class Payload//{{{
-{
-	friend std::ostream& operator<<(std::ostream& os, const Payload& obj);
-	friend class IUInterface;
-	friend class IU;
-	friend class Message;
-	friend class RemotePushIU;
-	friend class RemoteMessage;
-	friend class IUConverter;
-	friend class MessageConverter;
-	friend class CallbackIUPayloadUpdate;
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT std::string _owner_name;
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> _store;
-		IPAACA_MEMBER_VAR_EXPORT boost::weak_ptr<IUInterface> _iu;
-	protected:
-		IPAACA_HEADER_EXPORT void initialize(boost::shared_ptr<IUInterface> iu);
-		IPAACA_HEADER_EXPORT inline void _set_owner_name(const std::string& name) { _owner_name = name; }
-		IPAACA_HEADER_EXPORT void _remotely_enforced_wipe();
-		IPAACA_HEADER_EXPORT void _remotely_enforced_delitem(const std::string& k);
-		IPAACA_HEADER_EXPORT void _remotely_enforced_setitem(const std::string& k, const std::string& v);
-		IPAACA_HEADER_EXPORT void _internal_replace_all(const std::map<std::string, std::string>& new_contents, const std::string& writer_name="");
-		IPAACA_HEADER_EXPORT void _internal_merge(const std::map<std::string, std::string>& contents_to_merge, const std::string& writer_name="");
-		IPAACA_HEADER_EXPORT void _internal_set(const std::string& k, const std::string& v, const std::string& writer_name="");
-		IPAACA_HEADER_EXPORT void _internal_remove(const std::string& k, const std::string& writer_name="");
-	public:
-		IPAACA_HEADER_EXPORT inline const std::string& owner_name() { return _owner_name; }
-		// access
-		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key);
-		IPAACA_HEADER_EXPORT operator std::map<std::string, std::string>();
-		IPAACA_HEADER_EXPORT inline void set(const std::map<std::string, std::string>& all_elems) { _internal_replace_all(all_elems); }
-		IPAACA_HEADER_EXPORT inline void set(const std::string& k, const std::string& v) { _internal_set(k, v); }
-		IPAACA_HEADER_EXPORT inline void merge(const std::map<std::string, std::string>& elems_to_merge) { _internal_merge(elems_to_merge); }
-		IPAACA_HEADER_EXPORT inline void remove(const std::string& k) { _internal_remove(k); }
-		IPAACA_HEADER_EXPORT std::string get(const std::string& k);
-	typedef boost::shared_ptr<Payload> ptr;
-};//}}}
-
-IPAACA_HEADER_EXPORT class IUInterface {//{{{
-	friend class IUConverter;
-	friend class MessageConverter;
-	friend std::ostream& operator<<(std::ostream& os, const IUInterface& obj);
-	protected:
-		IPAACA_HEADER_EXPORT IUInterface();
-	public:
-		IPAACA_HEADER_EXPORT inline virtual ~IUInterface() { }
-	protected:
-		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 _owner_name;
-		IPAACA_MEMBER_VAR_EXPORT bool _committed;
-		IPAACA_MEMBER_VAR_EXPORT bool _retracted;
-		IPAACA_MEMBER_VAR_EXPORT IUAccessMode _access_mode;
-		IPAACA_MEMBER_VAR_EXPORT bool _read_only;
-		//boost::shared_ptr<Buffer> _buffer;
-		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
-		IPAACA_MEMBER_VAR_EXPORT SmartLinkMap _links;
-	protected:
-		friend class Payload;
-		// Internal functions that perform the update logic,
-		//  e.g. sending a notification across the network
-		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void _modify_links(bool is_delta, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name) = 0;
-		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ 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) = 0;
-		//void _set_buffer(boost::shared_ptr<Buffer> buffer);
-		IPAACA_HEADER_EXPORT void _associate_with_buffer(Buffer* buffer);
-		IPAACA_HEADER_EXPORT void _set_buffer(Buffer* buffer);
-		IPAACA_HEADER_EXPORT void _set_uid(const std::string& uid);
-		IPAACA_HEADER_EXPORT void _set_owner_name(const std::string& owner_name);
-	protected:
-		// internal functions that do not emit update events
-		IPAACA_HEADER_EXPORT inline void _add_and_remove_links(const LinkMap& add, const LinkMap& remove) { _links._add_and_remove_links(add, remove); }
-		IPAACA_HEADER_EXPORT inline void _replace_links(const LinkMap& links) { _links._replace_links(links); }
-	public:
-		IPAACA_HEADER_EXPORT inline bool is_published() { return (_buffer != 0); }
-		IPAACA_HEADER_EXPORT inline const std::string& uid() const { return _uid; }
-		IPAACA_HEADER_EXPORT inline revision_t revision() const { return _revision; }
-		IPAACA_HEADER_EXPORT inline const std::string& category() const { return _category; }
-		IPAACA_HEADER_EXPORT const std::string& channel();
-		IPAACA_HEADER_EXPORT inline const std::string& payload_type() const { return _payload_type; }
-		IPAACA_HEADER_EXPORT inline const std::string& owner_name() const { return _owner_name; }
-		IPAACA_HEADER_EXPORT inline bool committed() const { return _committed; }
-		IPAACA_HEADER_EXPORT inline IUAccessMode access_mode() const { return _access_mode; }
-		IPAACA_HEADER_EXPORT inline bool read_only() const { return _read_only; }
-		//inline boost::shared_ptr<Buffer> buffer() { return _buffer; }
-		IPAACA_HEADER_EXPORT inline Buffer* buffer() const { return _buffer; }
-		IPAACA_HEADER_EXPORT inline const LinkSet& get_links(std::string type) { return _links.get_links(type); }
-		IPAACA_HEADER_EXPORT inline const LinkMap& get_all_links() { return _links.get_all_links(); }
-		// Payload
-		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual Payload& payload() = 0;
-		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual const Payload& const_payload() const = 0;
-		// setters
-		IPAACA_HEADER_EXPORT _IPAACA_ABSTRACT_ virtual void commit() = 0;
-		// functions to modify and update links:
-		IPAACA_HEADER_EXPORT void _publish_resend(boost::shared_ptr<IU> iu, const std::string& hidden_scope_name);
-
-		IPAACA_HEADER_EXPORT void add_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void remove_links(const std::string& type, const LinkSet& targets, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void modify_links(const LinkMap& add, const LinkMap& remove, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void set_links(const LinkMap& links, const std::string& writer_name = "");
-		//    (with cpp specific convenience functions:)
-		IPAACA_HEADER_EXPORT void add_link(const std::string& type, const std::string& target, const std::string& writer_name = "");
-		IPAACA_HEADER_EXPORT void remove_link(const std::string& type, const std::string& target, const std::string& writer_name = "");
-	typedef boost::shared_ptr<IUInterface> ptr;
-};//}}}
-
-IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
-	friend class Buffer;
-	friend class InputBuffer;
-	friend class OutputBuffer;
-	friend class CallbackIUPayloadUpdate;
-	friend class CallbackIULinkUpdate;
-	friend class CallbackIUCommission;
-	friend class CallbackIUResendRequest;
-	public:
-		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
-	protected:
-	   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" );
-	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 inline Payload& payload() { return _payload; }
-		IPAACA_HEADER_EXPORT inline const Payload& const_payload() const { return _payload; }
-		IPAACA_HEADER_EXPORT void commit();
-	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 _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 = "");
-	protected:
-		IPAACA_HEADER_EXPORT virtual void _internal_commit(const std::string& writer_name = "");
-	public:
-	typedef boost::shared_ptr<IU> ptr;
-};//}}}
-IPAACA_HEADER_EXPORT class Message: public IU {//{{{
-	friend class Buffer;
-	friend class InputBuffer;
-	friend class OutputBuffer;
-	friend class CallbackIUPayloadUpdate;
-	friend class CallbackIULinkUpdate;
-	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" );
-	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" );
-	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 = "");
-	protected:
-		IPAACA_HEADER_EXPORT void _internal_commit(const std::string& writer_name = "");
-	public:
-	typedef boost::shared_ptr<Message> ptr;
-};//}}}
-
-IPAACA_HEADER_EXPORT class RemotePushIU: public IUInterface {//{{{
-	friend class Buffer;
-	friend class InputBuffer;
-	friend class OutputBuffer;
-	friend class IUConverter;
-	friend class MessageConverter;
-	public:
-		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
-	protected:
-		IPAACA_HEADER_EXPORT RemotePushIU();
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<RemotePushIU> create();
-	public:
-		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();
-	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 = "");
-	protected:
-		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
-		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
-		IPAACA_HEADER_EXPORT void _apply_commission();
-		IPAACA_HEADER_EXPORT void _apply_retraction();
-	typedef boost::shared_ptr<RemotePushIU> ptr;
-};//}}}
-IPAACA_HEADER_EXPORT class RemoteMessage: public IUInterface {//{{{
-	friend class Buffer;
-	friend class InputBuffer;
-	friend class OutputBuffer;
-	friend class IUConverter;
-	friend class MessageConverter;
-	public:
-		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
-	protected:
-		IPAACA_HEADER_EXPORT RemoteMessage();
-		IPAACA_HEADER_EXPORT static boost::shared_ptr<RemoteMessage> create();
-	public:
-		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();
-	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 = "");
-	protected:
-		IPAACA_HEADER_EXPORT void _apply_update(IUPayloadUpdate::ptr update);
-		IPAACA_HEADER_EXPORT void _apply_link_update(IULinkUpdate::ptr update);
-		IPAACA_HEADER_EXPORT void _apply_commission();
-		IPAACA_HEADER_EXPORT void _apply_retraction();
-	typedef boost::shared_ptr<RemoteMessage> ptr;
-};//}}}
-
-IPAACA_HEADER_EXPORT class IUNotFoundError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUNotFoundError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUNotFoundError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUNotFoundError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUPublishedError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUPublishedError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUPublishedError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUPublishedError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUCommittedError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUCommittedError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUCommittedError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUCommittedError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUUpdateFailedError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUUpdateFailedError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUUpdateFailedError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUUpdateFailedError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUResendRequestFailedError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUResendRequestFailedError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUResendRequestFailedError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUResendRequestFailedError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUReadOnlyError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUReadOnlyError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUReadOnlyError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUReadOnlyError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUAlreadyInABufferError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUAlreadyInABufferError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUAlreadyInABufferError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUAlreadyInABufferError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUUnpublishedError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUUnpublishedError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUUnpublishedError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUUnpublishedError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUAlreadyHasAnUIDError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUAlreadyHasAnUIDError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUAlreadyHasAnUIDError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUAlreadyHasAnUIDError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class IUAlreadyHasAnOwnerNameError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~IUAlreadyHasAnOwnerNameError() throw() { }
-		IPAACA_HEADER_EXPORT inline IUAlreadyHasAnOwnerNameError() { //boost::shared_ptr<IU> iu) {
-			_description = "IUAlreadyHasAnOwnerNameError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class UUIDGenerationError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~UUIDGenerationError() throw() { }
-		IPAACA_HEADER_EXPORT inline UUIDGenerationError() { //boost::shared_ptr<IU> iu) {
-			_description = "UUIDGenerationError";
-		}
-};//}}}
-IPAACA_HEADER_EXPORT class NotImplementedError: public Exception//{{{
-{
-	public:
-		IPAACA_HEADER_EXPORT inline ~NotImplementedError() throw() { }
-		IPAACA_HEADER_EXPORT inline NotImplementedError() { //boost::shared_ptr<IU> iu) {
-			_description = "NotImplementedError";
-		}
-};//}}}
+#include <ipaaca/ipaaca-locking.h>
+#include <ipaaca/ipaaca-buffers.h>
+#include <ipaaca/ipaaca-payload.h>
+#include <ipaaca/ipaaca-ius.h>
 
+/// Full API (including RSB transport) is only exposed during
+///  ipaaca compilation, user programs should use abstract API.
 #ifdef IPAACA_EXPOSE_FULL_RSB_API
-IPAACA_HEADER_EXPORT class CallbackIUPayloadUpdate: public rsb::patterns::Server::Callback<IUPayloadUpdate, int> {//{{{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
-	public:
-		IPAACA_HEADER_EXPORT CallbackIUPayloadUpdate(Buffer* buffer);
-		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update);
-};//}}}
-IPAACA_HEADER_EXPORT class CallbackIULinkUpdate: public rsb::patterns::Server::Callback<IULinkUpdate, int> {//{{{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
-	public:
-		IPAACA_HEADER_EXPORT CallbackIULinkUpdate(Buffer* buffer);
-	public:
-		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<IULinkUpdate> update);
-};//}}}
-IPAACA_HEADER_EXPORT class CallbackIUCommission: public rsb::patterns::Server::Callback<protobuf::IUCommission, int> {//{{{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
-	public:
-		IPAACA_HEADER_EXPORT CallbackIUCommission(Buffer* buffer);
-	public:
-		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IUCommission> update);
-};//}}}
-IPAACA_HEADER_EXPORT class CallbackIUResendRequest: public rsb::patterns::Server::Callback<protobuf::IUResendRequest, int> {//{{{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
-	public:
-		IPAACA_HEADER_EXPORT CallbackIUResendRequest(Buffer* buffer);
-	public:
-		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IUResendRequest> update);
-};//}}}
-IPAACA_HEADER_EXPORT class CallbackIURetraction: public rsb::patterns::Server::Callback<protobuf::IURetraction, int> {//{{{
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT Buffer* _buffer;
-	public:
-		IPAACA_HEADER_EXPORT CallbackIURetraction(Buffer* buffer);
-	public:
-		IPAACA_HEADER_EXPORT boost::shared_ptr<int> call(const std::string& methodName, boost::shared_ptr<protobuf::IURetraction> update);
-};//}}}
-
-IPAACA_HEADER_EXPORT class IUConverter: public rsb::converter::Converter<std::string> {//{{{
-	public:
-		IPAACA_HEADER_EXPORT IUConverter();
-		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
-		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
-};//}}}
-IPAACA_HEADER_EXPORT class MessageConverter: public rsb::converter::Converter<std::string> {//{{{
-	public:
-		IPAACA_HEADER_EXPORT MessageConverter();
-		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
-		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
-};//}}}
-IPAACA_HEADER_EXPORT class IUPayloadUpdateConverter: public rsb::converter::Converter<std::string> {//{{{
-	public:
-		IPAACA_HEADER_EXPORT IUPayloadUpdateConverter();
-		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
-		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
-};//}}}
-IPAACA_HEADER_EXPORT class IULinkUpdateConverter: public rsb::converter::Converter<std::string> {//{{{
-	public:
-		IPAACA_HEADER_EXPORT IULinkUpdateConverter();
-		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
-		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
-};//}}}
-IPAACA_HEADER_EXPORT class IntConverter: public rsb::converter::Converter<std::string> {//{{{
-	public:
-		IPAACA_HEADER_EXPORT IntConverter();
-		IPAACA_HEADER_EXPORT std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
-		IPAACA_HEADER_EXPORT rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
-};//}}}
+#include <ipaaca/ipaaca-internal.h>
 #endif
 
 
-// additional misc classes ( Command line options )//{{{
-IPAACA_HEADER_EXPORT class CommandLineOptions {
-	public:
-		IPAACA_HEADER_EXPORT inline CommandLineOptions() { }
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> param_opts;
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> param_set;
-	public:
-		IPAACA_HEADER_EXPORT void set_option(const std::string& name, bool expect, const char* optarg);
-		IPAACA_HEADER_EXPORT std::string get_param(const std::string& o);
-		IPAACA_HEADER_EXPORT bool is_set(const std::string& o);
-		IPAACA_HEADER_EXPORT void dump();
-	typedef boost::shared_ptr<CommandLineOptions> ptr;
-};
-
-class CommandLineParser {
-	protected:
-		IPAACA_MEMBER_VAR_EXPORT std::map<char, std::string> longopt; // letter->name
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, char> shortopt; // letter->name
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, bool> options; //  name / expect_param
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, std::string> defaults; // for opt params
-		IPAACA_MEMBER_VAR_EXPORT std::map<std::string, int> set_flag; // for paramless opts
-	protected:
-		IPAACA_HEADER_EXPORT CommandLineParser();
-	public:
-		IPAACA_HEADER_EXPORT inline ~CommandLineParser() { }
-		IPAACA_HEADER_EXPORT static inline boost::shared_ptr<CommandLineParser> create() {
-			return boost::shared_ptr<CommandLineParser>(new CommandLineParser());
-		}
-		IPAACA_HEADER_EXPORT void initialize_parser_defaults();
-		IPAACA_HEADER_EXPORT void dump_options();
-		IPAACA_HEADER_EXPORT void add_option(const std::string& optname, char shortn, bool expect_param, const std::string& defaultv);
-		IPAACA_HEADER_EXPORT void ensure_defaults_in( CommandLineOptions::ptr clo );
-		IPAACA_HEADER_EXPORT CommandLineOptions::ptr parse(int argc, char* const* argv);
-	typedef boost::shared_ptr<CommandLineParser> ptr;
-};
-//}}}
-
-// additional misc functions ( String splitting / joining )//{{{
-IPAACA_HEADER_EXPORT std::string str_join(const std::set<std::string>& set,const std::string& sep);
-IPAACA_HEADER_EXPORT std::string str_join(const std::vector<std::string>& vec,const std::string& sep);
-IPAACA_HEADER_EXPORT void str_split_wipe(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters );
-IPAACA_HEADER_EXPORT void str_split_append(const std::string& str, std::vector<std::string>& tokens, const std::string& delimiters );
-//}}}
-
-// (snippets) //{{{
-/*
-class IUEventFunctionHandler: public rsb::EventFunctionHandler {
-	protected:
-		Buffer* _buffer;
-	public:
-		inline IUEventFunctionHandler(Buffer* buffer, const EventFunction& function, const std::string& method="")
-			: EventFunctionHandler(function, method), _buffer(buffer) { }
-};
-*/
-//}}}
-
 IPAACA_MEMBER_VAR_EXPORT Lock& logger_lock();
 
 #ifdef WIN32
-- 
GitLab