diff --git a/cpp/build.properties b/cpp/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..f7adac0df20fd27713195a2b47d23654b2593260
--- /dev/null
+++ b/cpp/build.properties
@@ -0,0 +1,5 @@
+language=cpp
+resolve.status=beta
+resource.path=${shared.resources}/Shared3DModels/resource;${shared.resources}/DefaultShaders/resource;${shared.resources}/LogbackConfigs/resource;${shared.resources}/HmiHumanoidBodyControl/resource;${shared.resources}/HmiHumanoidEmbodiments/resource;
+rebuild.list=
+
diff --git a/cpp/build.xml b/cpp/build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e18401ea00b2e673134e9778f602fe9e04637b83
--- /dev/null
+++ b/cpp/build.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="IpaacaCpp"  default="run">
+   <import file="../../soashared/ant/build.xml" />
+   <target name="-pre-compilation">
+     <echo message="Compiling protobuf file" />
+     <exec executable="protoc">
+        <arg value="--proto_path=../proto" />
+        <arg value="../proto/ipaaca.proto" />
+        <arg value="--cpp_out=build/" />
+     </exec>
+   </target>
+</project>
+
diff --git a/cpp/src/Makefile b/cpp/src/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..cb0a88d55588a8af3e8ef2a773e4205107149679
--- /dev/null
+++ b/cpp/src/Makefile
@@ -0,0 +1,18 @@
+CONFIG = -DIPAACA_DEBUG_MESSAGES
+SOURCES = ipaaca.cc ipaaca.pb.cc ipaaca-test-main.cc
+CCFLAGS=-I. -I/usr/local/include -I/opt/local/include ${CONFIG}
+BOOSTLIBS = -L/opt/local/lib -lboost_regex-mt -lboost_date_time-mt -lboost_program_options-mt -lboost_thread-mt -lboost_filesystem-mt -lboost_signals-mt -lboost_system-mt
+PROTOLIBS = -L/opt/local/lib -lprotobuf
+LIBS = ${BOOSTLIBS} ${PROTOLIBS} -L/usr/local/lib -lrsc -lrsbcore
+all: protoc
+	#g++ ${CCFLAGS} -o ipaaca-test ${SOURCES} ${LIBS}
+	g++ ${CCFLAGS} -DMAKE_RECEIVER -o ipaaca-receiver ${SOURCES} ${LIBS}
+	g++ ${CCFLAGS} -DMAKE_SENDER -o ipaaca-sender ${SOURCES} ${LIBS}
+
+protoc:
+	protoc --proto_path=../../proto ../../proto/ipaaca.proto --cpp_out=.
+
+clean:
+	rm -f ipaaca-test ipaaca-sender ipaaca-receiver ipaaca.pb.h ipaaca.pb.cc
+
+
diff --git a/cpp/src/ipaaca-test-main.cc b/cpp/src/ipaaca-test-main.cc
new file mode 100644
index 0000000000000000000000000000000000000000..41ddd232ac3227f09ba1b687b47e2c9904bc4531
--- /dev/null
+++ b/cpp/src/ipaaca-test-main.cc
@@ -0,0 +1,111 @@
+#include <ipaaca.h>
+#include <typeinfo>
+
+//#include <rsc/logging/Logger.h>
+//#include <rsc/logging/LoggerFactory.h>
+// //rsc::logging::LoggerFactory::getInstance().reconfigure(rsc::logging::Logger::LEVEL_ALL);
+
+#ifdef MAKE_RECEIVER
+//boost::mutex mtx;
+using namespace ipaaca;
+
+class Testo {
+	protected:
+		std::string _name;
+	public:
+		inline Testo(const std::string& name="Testo"): _name(name) { }
+		inline void handleIUEvent(EventPtr event)
+		{
+			std::cout << _name << " received a ";
+			std::string type = event->getType();
+			if (type == "ipaaca::IUPayloadUpdate") {
+				std::cout << *boost::static_pointer_cast<IUPayloadUpdate>(event->getData()) << std::endl;
+			} else if (type == "ipaaca::IULinkUpdate") {
+				std::cout << *boost::static_pointer_cast<IULinkUpdate>(event->getData()) << std::endl;
+			} else {
+				std::cout << type << " (Unhandled type!)" << std::endl;
+			}
+		}
+};
+
+int main() {
+	initialize_ipaaca_rsb();
+	
+	ListenerPtr listener = Factory::getInstance().createListener( Scope("/tutorial/converter"));
+	
+	Testo t("TESTO");
+	HandlerPtr event_handler = HandlerPtr(new EventFunctionHandler(boost::bind(&Testo::handleIUEvent, boost::ref(t), _1)));
+	listener->addHandler( event_handler );
+	
+	while(true) {
+		boost::this_thread::sleep(boost::posix_time::milliseconds(100));
+	}
+	return EXIT_SUCCESS;
+}
+#else
+#ifdef MAKE_SENDER
+using namespace ipaaca;
+int main() {
+	initialize_ipaaca_rsb();
+	
+	//Informer<ipaaca::IUPayloadUpdate>::Ptr pinformer = Factory::getInstance().createInformer<ipaaca::IUPayloadUpdate> ( Scope("/tutorial/converter"));
+	//Informer<ipaaca::IULinkUpdate>::Ptr linformer = Factory::getInstance().createInformer<ipaaca::IULinkUpdate> ( Scope("/tutorial/converter"));
+	
+	Informer<AnyType>::Ptr informer = Factory::getInstance().createInformer<AnyType> ( Scope("/tutorial/converter"));
+
+	IUPayloadUpdate* pup = new ipaaca::IUPayloadUpdate();
+	Informer<ipaaca::IUPayloadUpdate>::DataPtr pdata(pup);
+	pup->uid = "2000";
+	pup->revision = 3;
+	pup->writer_name = "Comp1_OB";
+	pup->is_delta = true;
+	pup->new_items["new_key"] = "new_value";
+	pup->new_items["another_key"] = "some_info";
+	pup->keys_to_remove.push_back("old_key");
+	informer->publish(pdata);
+	
+	IULinkUpdate* lup = new ipaaca::IULinkUpdate();
+	Informer<ipaaca::IULinkUpdate>::DataPtr ldata(lup);
+	lup->uid = "2001";
+	lup->revision = 4;
+	lup->writer_name = "Comp2_IB";
+	lup->is_delta = true;
+	lup->new_links["SLL"].insert("2000");
+	lup->new_links["grin"].insert("1002");
+	lup->links_to_remove["grin"].insert("1001");
+	informer->publish(ldata);
+	
+	
+	std::cout << "Done." << std::endl;
+	return EXIT_SUCCESS;
+}
+#else
+
+//
+//   TESTS
+//
+
+using namespace ipaaca;
+
+int main() {
+	//try{
+		initialize_ipaaca_rsb();
+		IU::ref iu = IU::create();
+		std::cout << "payload.get(\"TEST\") = \"" << iu->payload.get("TEST") << "\"" << std::endl;
+		std::cout << "payload[\"TEST\"] = \"" << (std::string) iu->payload["TEST"] << "\"" << std::endl;
+		iu->payload["TEST"] = "123.5-WAS-SET";
+		std::cout << "payload[\"TEST\"] = \"" << (std::string) iu->payload["TEST"] << "\"" << std::endl;
+		
+		std::string s = "The string \"" + iu->payload["TEST"].to_str() + "\" is the new value.";
+		std::cout << "Concatenation test: " << s << std::endl;
+	
+		std::cout << "Interpreted as  long  value: " << iu->payload["TEST"].to_int() << std::endl;
+		std::cout << "Interpreted as double value: " << iu->payload["TEST"].to_float() << std::endl;
+	//} catch (std::exception& e) {
+	//	std::cout << e.what() << std::endl;
+	//}
+}
+
+#endif
+#endif
+
diff --git a/cpp/src/ipaaca.cc b/cpp/src/ipaaca.cc
new file mode 100644
index 0000000000000000000000000000000000000000..243e0faf83fc94bbb67ef4c09c3e755b322f0c64
--- /dev/null
+++ b/cpp/src/ipaaca.cc
@@ -0,0 +1,336 @@
+#include <ipaaca.h>
+#include <cstdlib>
+
+namespace ipaaca {
+/*
+*/
+
+void initialize_ipaaca_rsb()
+{
+	ParticipantConfig config = ParticipantConfig::fromConfiguration();
+	Factory::getInstance().setDefaultParticipantConfig(config);
+	
+	boost::shared_ptr<IUPayloadUpdateConverter> payload_update_converter(new IUPayloadUpdateConverter());
+	boost::shared_ptr<IULinkUpdateConverter> link_update_converter(new IULinkUpdateConverter());
+	stringConverterRepository()->registerConverter(payload_update_converter);
+	stringConverterRepository()->registerConverter(link_update_converter);
+	
+	//IPAACA_TODO("initialize all converters")
+}
+
+std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj)
+{
+	os << "PayloadUpdate(uid=" << obj.uid << ", revision=" << obj.revision;
+	os << ", writer_name=" << obj.writer_name << ", is_delta=" << (obj.is_delta?"True":"False");
+	os << ", new_items = {";
+	bool first = true;
+	for (std::map<std::string, std::string>::const_iterator it=obj.new_items.begin(); it!=obj.new_items.end(); ++it) {
+		if (first) { first=false; } else { os << ", "; }
+		os << "'" << it->first << "':'" << it->second << "'";
+	}
+	os << "}, keys_to_remove = [";
+	first = true;
+	for (std::vector<std::string>::const_iterator it=obj.keys_to_remove.begin(); it!=obj.keys_to_remove.end(); ++it) {
+		if (first) { first=false; } else { os << ", "; }
+		os << "'" << *it << "'";
+	}
+	os << "])";
+	return os;
+}
+
+std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj)
+{
+	os << "LinkUpdate(uid=" << obj.uid << ", revision=" << obj.revision;
+	os << ", writer_name=" << obj.writer_name << ", is_delta=" << (obj.is_delta?"True":"False");
+	os << ", new_links = {";
+	bool first = true;
+	for (std::map<std::string, std::set<std::string> >::const_iterator it=obj.new_links.begin(); it!=obj.new_links.end(); ++it) {
+		if (first) { first=false; } else { os << ", "; }
+		os << "'" << it->first << "': [";
+		bool ffirst = true;
+		for (std::set<std::string>::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
+			if (ffirst) { ffirst=false; } else { os << ", "; }
+			os << "'" << *it2 << "'";
+		}
+		os << "]";
+	}
+	os << "}, links_to_remove = {";
+	first = true;
+	for (std::map<std::string, std::set<std::string> >::const_iterator it=obj.links_to_remove.begin(); it!=obj.links_to_remove.end(); ++it) {
+		if (first) { first=false; } else { os << ", "; }
+		os << "'" << it->first << "': [";
+		bool ffirst = true;
+		for (std::set<std::string>::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
+			if (ffirst) { ffirst=false; } else { os << ", "; }
+			os << "'" << *it2 << "'";
+		}
+		os << "]";
+	}
+	os << "})";
+	return os;
+}
+
+
+/*
+void init_inprocess_too() {
+	//ParticipantConfig config = Factory::getInstance().getDefaultParticipantConfig();
+	ParticipantConfig config = ParticipantConfig::fromFile("rsb.cfg");
+	//ParticipantConfig::Transport inprocess = config.getTransport("inprocess");
+	//inprocess.setEnabled(true);
+	//config.addTransport(inprocess);
+	Factory::getInstance().setDefaultParticipantConfig(config);
+}
+*/
+
+IU::ref IU::create(/* params */)
+{
+	IU::ref iu = IU::ref(new IU(/* params */));
+	iu->payload.initialize(iu);
+	return iu;
+}
+
+// PayloadEntryProxy//{{{
+
+PayloadEntryProxy::PayloadEntryProxy(Payload* payload, const std::string& key)
+: _payload(payload), _key(key)
+{
+}
+PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value)
+{
+	_payload->set(_key, value);
+	return *this;
+}
+PayloadEntryProxy::operator std::string()
+{
+	return _payload->get(_key);
+}
+PayloadEntryProxy::operator long()
+{
+	return atol(operator std::string().c_str());
+}
+PayloadEntryProxy::operator double()
+{
+	return atof(operator std::string().c_str());
+}
+//}}}
+
+// Payload//{{{
+
+Payload::Payload()
+{
+}
+void Payload::initialize(boost::shared_ptr<IUInterface> iu)
+{
+	_iu = iu;
+}
+
+PayloadEntryProxy Payload::operator[](const std::string& key)
+{
+	//boost::shared_ptr<PayloadEntryProxy> p(new PayloadEntryProxy(this, key));
+	return PayloadEntryProxy(this, key);
+}
+
+inline void Payload::set(const std::string& k, const std::string& v) {
+	//self._iu._modify_payload(self, isdelta=true, newitm={k:v}, keystorm=[], writer_name=None );
+	_store[k] = v;
+}
+inline void Payload::remove(const std::string& k) {
+	//self._iu._modify_payload(self, isdelta=true, newitm={}, keystorm=[k], writer_name=None );
+	_store.erase(k);
+}
+inline std::string Payload::get(const std::string& k) {
+	if (_store.count(k)>0) return _store[k];
+	else return IPAACA_PAYLOAD_DEFAULT_STRING_VALUE;
+}
+//}}}
+
+/*
+
+// IUConverter//{{{
+
+IUConverter::IUConverter()
+: Converter<std::string> ("ipaaca::IU", "ipaaca-iu", true)
+{
+}
+
+std::string IUConverter::serialize(const AnnotatedData& data, std::string& wire)
+{
+	// Ensure that DATA actually holds a datum of the data-type we expect.
+	assert(data.first == getDataType()); // "ipaaca::IU"
+	// NOTE: a dynamic_pointer_cast cannot be used from void*
+	boost::shared_ptr<const IU> obj = boost::static_pointer_cast<const IU> (data.second);
+	boost::shared_ptr<protobuf::IU> pbo(new protobuf::IU());
+	// transfer obj data to pbo
+	pbo->set_uid(obj->uid);
+	pbo->set_revision(obj->revision);
+	pbo->set_writer_name(obj->writer_name);
+	pbo->set_is_delta(obj->is_delta);
+	for (std::map<std::string, std::string>::const_iterator it=obj->new_items.begin(); it!=obj->new_items.end(); ++it) {
+		protobuf::PayloadItem* item = pbo->add_new_items();
+		item->set_key(it->first);
+		item->set_value(it->second);
+	}
+	for (std::vector<std::string>::const_iterator it=obj->keys_to_remove.begin(); it!=obj->keys_to_remove.end(); ++it) {
+		pbo->add_keys_to_remove(*it);
+	}
+	pbo->SerializeToString(&wire);
+	return getWireSchema();
+
+}
+
+AnnotatedData IUConverter::deserialize(const std::string& wireSchema, const std::string& wire) {
+	assert(wireSchema == getWireSchema()); // "ipaaca-iu-payload-update"
+	boost::shared_ptr<protobuf::IU> pbo(new protobuf::IU());
+	pbo->ParseFromString(wire);
+	boost::shared_ptr<IU> obj(new IU());
+	// transfer pbo data to obj
+	obj->uid = pbo->uid();
+	obj->revision = pbo->revision();
+	obj->writer_name = pbo->writer_name();
+	obj->is_delta = pbo->is_delta();
+	for (int i=0; i<pbo->new_items_size(); i++) {
+		const protobuf::PayloadItem& it = pbo->new_items(i);
+		obj->new_items[it.key()] = it.value();
+	}
+	for (int i=0; i<pbo->keys_to_remove_size(); i++) {
+		obj->keys_to_remove.push_back(pbo->keys_to_remove(i));
+	}
+	return std::make_pair(getDataType(), obj);
+}
+
+//}}}
+
+*/
+
+
+// IUPayloadUpdateConverter//{{{
+
+IUPayloadUpdateConverter::IUPayloadUpdateConverter()
+: Converter<std::string> ("ipaaca::IUPayloadUpdate", "ipaaca-iu-payload-update", true)
+{
+}
+
+std::string IUPayloadUpdateConverter::serialize(const AnnotatedData& data, std::string& wire)
+{
+	assert(data.first == getDataType()); // "ipaaca::IUPayloadUpdate"
+	boost::shared_ptr<const IUPayloadUpdate> obj = boost::static_pointer_cast<const IUPayloadUpdate> (data.second);
+	boost::shared_ptr<protobuf::IUPayloadUpdate> pbo(new protobuf::IUPayloadUpdate());
+	// transfer obj data to pbo
+	pbo->set_uid(obj->uid);
+	pbo->set_revision(obj->revision);
+	pbo->set_writer_name(obj->writer_name);
+	pbo->set_is_delta(obj->is_delta);
+	for (std::map<std::string, std::string>::const_iterator it=obj->new_items.begin(); it!=obj->new_items.end(); ++it) {
+		protobuf::PayloadItem* item = pbo->add_new_items();
+		item->set_key(it->first);
+		item->set_value(it->second);
+		item->set_type("str"); // FIXME other types than str (later)
+	}
+	for (std::vector<std::string>::const_iterator it=obj->keys_to_remove.begin(); it!=obj->keys_to_remove.end(); ++it) {
+		pbo->add_keys_to_remove(*it);
+	}
+	pbo->SerializeToString(&wire);
+	return getWireSchema();
+
+}
+
+AnnotatedData IUPayloadUpdateConverter::deserialize(const std::string& wireSchema, const std::string& wire) {
+	assert(wireSchema == getWireSchema()); // "ipaaca-iu-payload-update"
+	boost::shared_ptr<protobuf::IUPayloadUpdate> pbo(new protobuf::IUPayloadUpdate());
+	pbo->ParseFromString(wire);
+	boost::shared_ptr<IUPayloadUpdate> obj(new IUPayloadUpdate());
+	// transfer pbo data to obj
+	obj->uid = pbo->uid();
+	obj->revision = pbo->revision();
+	obj->writer_name = pbo->writer_name();
+	obj->is_delta = pbo->is_delta();
+	for (int i=0; i<pbo->new_items_size(); i++) {
+		const protobuf::PayloadItem& it = pbo->new_items(i);
+		obj->new_items[it.key()] = it.value();
+	}
+	for (int i=0; i<pbo->keys_to_remove_size(); i++) {
+		obj->keys_to_remove.push_back(pbo->keys_to_remove(i));
+	}
+	return std::make_pair(getDataType(), obj);
+}
+
+//}}}
+
+// IULinkUpdateConverter//{{{
+
+IULinkUpdateConverter::IULinkUpdateConverter()
+: Converter<std::string> ("ipaaca::IULinkUpdate", "ipaaca-iu-link-update", true)
+{
+}
+
+std::string IULinkUpdateConverter::serialize(const AnnotatedData& data, std::string& wire)
+{
+	assert(data.first == getDataType()); // "ipaaca::IULinkUpdate"
+	boost::shared_ptr<const IULinkUpdate> obj = boost::static_pointer_cast<const IULinkUpdate> (data.second);
+	boost::shared_ptr<protobuf::IULinkUpdate> pbo(new protobuf::IULinkUpdate());
+	// transfer obj data to pbo
+	pbo->set_uid(obj->uid);
+	pbo->set_revision(obj->revision);
+	pbo->set_writer_name(obj->writer_name);
+	pbo->set_is_delta(obj->is_delta);
+	for (std::map<std::string, std::set<std::string> >::const_iterator it=obj->new_links.begin(); it!=obj->new_links.end(); ++it) {
+		protobuf::LinkSet* links = pbo->add_new_links();
+		links->set_type(it->first);
+		for (std::set<std::string>::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
+			links->add_targets(*it2);
+		}
+	}
+	for (std::map<std::string, std::set<std::string> >::const_iterator it=obj->links_to_remove.begin(); it!=obj->links_to_remove.end(); ++it) {
+		protobuf::LinkSet* links = pbo->add_links_to_remove();
+		links->set_type(it->first);
+		for (std::set<std::string>::const_iterator it2=it->second.begin(); it2!=it->second.end(); ++it2) {
+			links->add_targets(*it2);
+		}
+	}
+	pbo->SerializeToString(&wire);
+	return getWireSchema();
+
+}
+
+AnnotatedData IULinkUpdateConverter::deserialize(const std::string& wireSchema, const std::string& wire) {
+	assert(wireSchema == getWireSchema()); // "ipaaca-iu-link-update"
+	boost::shared_ptr<protobuf::IULinkUpdate> pbo(new protobuf::IULinkUpdate());
+	pbo->ParseFromString(wire);
+	boost::shared_ptr<IULinkUpdate> obj(new IULinkUpdate());
+	// transfer pbo data to obj
+	obj->uid = pbo->uid();
+	obj->revision = pbo->revision();
+	obj->writer_name = pbo->writer_name();
+	obj->is_delta = pbo->is_delta();
+	for (int i=0; i<pbo->new_links_size(); ++i) {
+		const protobuf::LinkSet& it = pbo->new_links(i);
+		for (int j=0; j<it.targets_size(); ++j) {
+			obj->new_links[it.type()].insert(it.targets(j)); // = vec;
+		}
+	}
+	for (int i=0; i<pbo->links_to_remove_size(); ++i) {
+		const protobuf::LinkSet& it = pbo->links_to_remove(i);
+		for (int j=0; j<it.targets_size(); ++j) {
+			obj->links_to_remove[it.type()].insert(it.targets(j));
+		}
+	}
+	return std::make_pair(getDataType(), obj);
+}
+
+//}}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+} // of namespace ipaaca
+
+
diff --git a/cpp/src/ipaaca.h b/cpp/src/ipaaca.h
new file mode 100644
index 0000000000000000000000000000000000000000..b585605eb45618e28bb7466ca8e424ded0b8a5c7
--- /dev/null
+++ b/cpp/src/ipaaca.h
@@ -0,0 +1,193 @@
+#ifndef __IPAACA_H__
+#define __IPAACA_H_
+
+#ifdef IPAACA_DEBUG_MESSAGES
+#define IPAACA_INFO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- " << i << std::endl;
+#define IPAACA_IMPLEMENT_ME(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- IMPLEMENT ME" << std::endl;
+#define IPAACA_TODO(i) std::cout << __FILE__ << ":" << __LINE__ << ": " << __func__ << "() -- TODO: " << i << std::endl;
+#else
+#define IPAACA_INFO(i) ;
+#define IPAACA_IMPLEMENT_ME(i) ;
+#define IPAACA_TODO(i) ;
+#endif
+
+#define IPAACA_PAYLOAD_DEFAULT_STRING_VALUE ""
+
+#include <iostream>
+
+#include <boost/thread.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/pointer_cast.hpp>
+
+#include <rsc/runtime/TypeStringTools.h>
+#include <rsb/Factory.h>
+#include <rsb/Handler.h>
+#include <rsb/Event.h>
+#include <rsb/converter/Repository.h>
+#include <rsb/converter/ProtocolBufferConverter.h>
+#include <rsb/converter/Converter.h>
+#include <rsb/rsbexports.h>
+
+#include <ipaaca.pb.h>
+
+//using namespace boost;
+using namespace rsb;
+using namespace rsb::converter;
+
+namespace ipaaca {
+
+enum IUEventType {
+	ADDED,
+	COMMITTED,
+	DELETED,
+	RETRACTED,
+	UPDATED,
+	LINKSUPDATED
+};
+
+enum IUAccessMode {
+	PUSH,
+	REMOTE,
+	MESSAGE
+};
+
+class Payload;
+class IUInterface;
+class IU;
+class RemotePushIU;
+// class IULinkUpdate
+// class IULinkUpdateConverter;
+class IUStore;
+class FrozenIUStore;
+class IUEventHandler;
+
+class Buffer {
+};
+
+class InputBuffer: public Buffer {
+};
+
+class OutputBuffer: public Buffer {
+};
+
+/*
+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) { }
+};
+*/
+
+class IUPayloadUpdate {
+	public:
+		std::string uid;
+		uint32_t revision;
+		std::string writer_name;
+		bool is_delta;
+		std::map<std::string, std::string> new_items;
+		std::vector<std::string> keys_to_remove;
+	friend std::ostream& operator<<(std::ostream& os, const IUPayloadUpdate& obj);
+};
+class IUPayloadUpdateConverter: public rsb::converter::Converter<std::string> {
+	public:
+		IUPayloadUpdateConverter();
+		std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};
+
+class IULinkUpdate {
+	public:
+		std::string uid;
+		uint32_t revision;
+		std::string writer_name;
+		bool is_delta;
+		std::map<std::string, std::set<std::string> > new_links;
+		std::map<std::string, std::set<std::string> > links_to_remove;
+	friend std::ostream& operator<<(std::ostream& os, const IULinkUpdate& obj);
+};
+class IULinkUpdateConverter: public rsb::converter::Converter<std::string> {
+	public:
+		IULinkUpdateConverter();
+		std::string serialize(const rsb::AnnotatedData& data, std::string& wire);
+		rsb::AnnotatedData deserialize(const std::string& wireSchema, const std::string& wire);
+};
+
+
+void initialize_ipaaca_rsb();
+
+class PayloadEntryProxy
+{
+	protected:
+		Payload* _payload;
+		std::string _key;
+	public:
+		PayloadEntryProxy(Payload* payload, const std::string& key);
+		PayloadEntryProxy& operator=(const std::string& value);
+		operator std::string();
+		operator long();
+		operator double();
+		inline std::string to_str() { return operator std::string(); }
+		inline long to_int() { return operator long(); }
+		inline double to_float() { return operator double(); }
+};
+
+class Payload
+{
+	protected:
+		std::map<std::string, std::string> _store;
+		boost::shared_ptr<IUInterface> _iu;
+	protected:
+		friend class IU;
+		friend class RemotePushIU;
+		Payload();
+		void initialize(boost::shared_ptr<IUInterface> iu);
+	public:
+		PayloadEntryProxy operator[](const std::string& key);
+		void set(const std::string& k, const std::string& v);
+		void remove(const std::string& k);
+		std::string get(const std::string& k);
+};
+
+class IUInterface {
+	public:
+		inline virtual ~IUInterface() { }
+};
+
+class IU: public IUInterface {
+	public:
+		Payload payload;
+	protected:
+		inline IU() { }
+	public:
+		inline ~IU() { }
+		static boost::shared_ptr<IU> create();
+	typedef boost::shared_ptr<IU> ref;
+};
+
+class RemotePushIU: public IUInterface {
+	public:
+		inline ~RemotePushIU() { }
+};
+
+class IUPublishedError: public std::exception
+{
+	protected:
+		std::string _description;
+	public:
+		inline ~IUPublishedError() throw() { }
+		inline IUPublishedError() { //boost::shared_ptr<IU> iu) {
+			_description = "IUPublishedError";
+		}
+		const char* what() const throw() {
+			return _description.c_str();
+		}
+};
+
+
+} // of namespace ipaaca
+
+#endif
+
+
diff --git a/cpp/src/rsb.conf b/cpp/src/rsb.conf
new file mode 100644
index 0000000000000000000000000000000000000000..3fb0a683fded31bf2f123d947dcc6ff6a7bfeea1
--- /dev/null
+++ b/cpp/src/rsb.conf
@@ -0,0 +1,5 @@
+[transport.spread]
+host = localhost
+port = 4803
+enabled = 1
+
diff --git a/proto/ipaaca.proto b/proto/ipaaca.proto
index ebfa5b7e6a6c42f1892ea9139bba867766094d8a..d66bb54df3878402afbe5284e4565041dac9c110 100755
--- a/proto/ipaaca.proto
+++ b/proto/ipaaca.proto
@@ -1,5 +1,5 @@
 
-package ipaaca;
+package ipaaca.protobuf;
 
 message IntMessage {
 	required sint32 value = 1;