diff --git a/ipaacalib/cpp/CMakeLists.txt b/ipaacalib/cpp/CMakeLists.txt
index 85915b90493c3a54a2655955523801bccc917b9e..e19d222982e91efd3ea7a5ed1932706cccba89c9 100644
--- a/ipaacalib/cpp/CMakeLists.txt
+++ b/ipaacalib/cpp/CMakeLists.txt
@@ -151,11 +151,17 @@ set (SOURCE
 	build/ipaaca/ipaaca.pb.cc
 	)
 
+
+
+
 # compile all files to "ipaaca" shared library
 add_library(ipaaca SHARED ${SOURCE})
 # and link all the required external libs (found above using find_package etc.)
 target_link_libraries(ipaaca ${LIBS})
 
+#add_executable (ipaaca-test-main src/ipaaca-test-main.cc)
+#target_link_libraries (ipaaca-test-main ${LIBS})
+
 set(DEFAULT_BIN_SUBDIR bin)
 set(DEFAULT_LIB_SUBDIR lib)
 set(DEFAULT_DATA_SUBDIR share/data)
diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca.h b/ipaacalib/cpp/include/ipaaca/ipaaca.h
index b9bd56b2b51d59974a02486bc9c8b01b4a735e02..805074f7d7ede835362e31c821d3d1178a6bc62c 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h
@@ -192,6 +192,7 @@ class OutputBuffer;
 class CallbackIUPayloadUpdate;
 class CallbackIULinkUpdate;
 class CallbackIUCommission;
+class CallbackIUResendRequest;
 class CallbackIURetraction;
 
 class IUConverter;
@@ -369,6 +370,7 @@ IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Bu
 	friend class CallbackIUPayloadUpdate;
 	friend class CallbackIULinkUpdate;
 	friend class CallbackIUCommission;
+	friend class CallbackIUResendRequest;
 	protected:
 		//Lock _handler_lock;
 		IPAACA_MEMBER_VAR_EXPORT std::string _uuid;
@@ -377,9 +379,13 @@ IPAACA_HEADER_EXPORT class Buffer { //: public boost::enable_shared_from_this<Bu
 		IPAACA_MEMBER_VAR_EXPORT std::string _id_prefix;
 		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);
@@ -415,13 +421,17 @@ IPAACA_HEADER_EXPORT class OutputBuffer: public Buffer { //, public boost::enabl
 	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");
@@ -454,12 +464,17 @@ IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable
 		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")
@@ -468,6 +483,10 @@ IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable
 		{
 			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 std::string& basename, const std::set<std::string>& category_interests, const std::string& channel="default");
 		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests, const std::string& channel="default");
@@ -475,6 +494,11 @@ IPAACA_HEADER_EXPORT class InputBuffer: public Buffer { //, public boost::enable
 		// 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 SetResend(bool resendActive);
+		IPAACA_HEADER_EXPORT bool GetResend();
+
 	public:
 		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::set<std::string>& category_interests, const std::string& channel="default");
 		IPAACA_HEADER_EXPORT static boost::shared_ptr<InputBuffer> create(const std::string& basename, const std::vector<std::string>& category_interests, const std::string& channel="default");
@@ -644,6 +668,8 @@ IPAACA_HEADER_EXPORT class IUInterface {//{{{
 		// 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 = "");
@@ -661,6 +687,7 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
 	friend class CallbackIUPayloadUpdate;
 	friend class CallbackIULinkUpdate;
 	friend class CallbackIUCommission;
+	friend class CallbackIUResendRequest;
 	public:
 		IPAACA_MEMBER_VAR_EXPORT Payload _payload;
 	protected:
@@ -678,6 +705,9 @@ IPAACA_HEADER_EXPORT class IU: public IUInterface {//{{{
 		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 = "");
@@ -691,6 +721,7 @@ IPAACA_HEADER_EXPORT class Message: public IU {//{{{
 	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:
@@ -796,6 +827,14 @@ IPAACA_HEADER_EXPORT class IUUpdateFailedError: public Exception//{{{
 			_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:
@@ -869,6 +908,14 @@ IPAACA_HEADER_EXPORT class CallbackIUCommission: public rsb::patterns::Server::C
 	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;
diff --git a/ipaacalib/cpp/ipaaca.pb.cc b/ipaacalib/cpp/ipaaca.pb.cc
new file mode 100644
index 0000000000000000000000000000000000000000..d40df61b71290c4595a34b89606078a7fb678085
--- /dev/null
+++ b/ipaacalib/cpp/ipaaca.pb.cc
@@ -0,0 +1,3600 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+
+#define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION
+#include "ipaaca.pb.h"
+
+#include <algorithm>
+
+#include <google/protobuf/stubs/once.h>
+#include <google/protobuf/io/coded_stream.h>
+#include <google/protobuf/wire_format_lite_inl.h>
+#include <google/protobuf/descriptor.h>
+#include <google/protobuf/reflection_ops.h>
+#include <google/protobuf/wire_format.h>
+// @@protoc_insertion_point(includes)
+
+namespace ipaaca {
+namespace protobuf {
+
+namespace {
+
+const ::google::protobuf::Descriptor* IntMessage_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IntMessage_reflection_ = NULL;
+const ::google::protobuf::Descriptor* LinkSet_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  LinkSet_reflection_ = NULL;
+const ::google::protobuf::Descriptor* PayloadItem_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  PayloadItem_reflection_ = NULL;
+const ::google::protobuf::Descriptor* IU_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IU_reflection_ = NULL;
+const ::google::protobuf::EnumDescriptor* IU_AccessMode_descriptor_ = NULL;
+const ::google::protobuf::Descriptor* IUPayloadUpdate_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IUPayloadUpdate_reflection_ = NULL;
+const ::google::protobuf::Descriptor* IURetraction_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IURetraction_reflection_ = NULL;
+const ::google::protobuf::Descriptor* IUCommission_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IUCommission_reflection_ = NULL;
+const ::google::protobuf::Descriptor* IUResendRequest_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IUResendRequest_reflection_ = NULL;
+const ::google::protobuf::Descriptor* IULinkUpdate_descriptor_ = NULL;
+const ::google::protobuf::internal::GeneratedMessageReflection*
+  IULinkUpdate_reflection_ = NULL;
+
+}  // namespace
+
+
+void protobuf_AssignDesc_ipaaca_2eproto() {
+  protobuf_AddDesc_ipaaca_2eproto();
+  const ::google::protobuf::FileDescriptor* file =
+    ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName(
+      "ipaaca.proto");
+  GOOGLE_CHECK(file != NULL);
+  IntMessage_descriptor_ = file->message_type(0);
+  static const int IntMessage_offsets_[1] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IntMessage, value_),
+  };
+  IntMessage_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IntMessage_descriptor_,
+      IntMessage::default_instance_,
+      IntMessage_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IntMessage, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IntMessage, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IntMessage));
+  LinkSet_descriptor_ = file->message_type(1);
+  static const int LinkSet_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LinkSet, type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LinkSet, targets_),
+  };
+  LinkSet_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      LinkSet_descriptor_,
+      LinkSet::default_instance_,
+      LinkSet_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LinkSet, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(LinkSet, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(LinkSet));
+  PayloadItem_descriptor_ = file->message_type(2);
+  static const int PayloadItem_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PayloadItem, key_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PayloadItem, value_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PayloadItem, type_),
+  };
+  PayloadItem_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      PayloadItem_descriptor_,
+      PayloadItem::default_instance_,
+      PayloadItem_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PayloadItem, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(PayloadItem, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(PayloadItem));
+  IU_descriptor_ = file->message_type(3);
+  static const int IU_offsets_[10] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, uid_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, revision_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, category_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, payload_type_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, owner_name_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, committed_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, access_mode_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, read_only_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, payload_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, links_),
+  };
+  IU_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IU_descriptor_,
+      IU::default_instance_,
+      IU_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IU, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IU));
+  IU_AccessMode_descriptor_ = IU_descriptor_->enum_type(0);
+  IUPayloadUpdate_descriptor_ = file->message_type(4);
+  static const int IUPayloadUpdate_offsets_[6] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, uid_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, revision_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, new_items_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, keys_to_remove_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, is_delta_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, writer_name_),
+  };
+  IUPayloadUpdate_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IUPayloadUpdate_descriptor_,
+      IUPayloadUpdate::default_instance_,
+      IUPayloadUpdate_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUPayloadUpdate, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IUPayloadUpdate));
+  IURetraction_descriptor_ = file->message_type(5);
+  static const int IURetraction_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IURetraction, uid_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IURetraction, revision_),
+  };
+  IURetraction_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IURetraction_descriptor_,
+      IURetraction::default_instance_,
+      IURetraction_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IURetraction, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IURetraction, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IURetraction));
+  IUCommission_descriptor_ = file->message_type(6);
+  static const int IUCommission_offsets_[3] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUCommission, uid_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUCommission, revision_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUCommission, writer_name_),
+  };
+  IUCommission_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IUCommission_descriptor_,
+      IUCommission::default_instance_,
+      IUCommission_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUCommission, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUCommission, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IUCommission));
+  IUResendRequest_descriptor_ = file->message_type(7);
+  static const int IUResendRequest_offsets_[2] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUResendRequest, uid_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUResendRequest, hidden_scope_name_),
+  };
+  IUResendRequest_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IUResendRequest_descriptor_,
+      IUResendRequest::default_instance_,
+      IUResendRequest_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUResendRequest, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IUResendRequest, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IUResendRequest));
+  IULinkUpdate_descriptor_ = file->message_type(8);
+  static const int IULinkUpdate_offsets_[6] = {
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, uid_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, revision_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, new_links_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, links_to_remove_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, is_delta_),
+    GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, writer_name_),
+  };
+  IULinkUpdate_reflection_ =
+    new ::google::protobuf::internal::GeneratedMessageReflection(
+      IULinkUpdate_descriptor_,
+      IULinkUpdate::default_instance_,
+      IULinkUpdate_offsets_,
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, _has_bits_[0]),
+      GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(IULinkUpdate, _unknown_fields_),
+      -1,
+      ::google::protobuf::DescriptorPool::generated_pool(),
+      ::google::protobuf::MessageFactory::generated_factory(),
+      sizeof(IULinkUpdate));
+}
+
+namespace {
+
+GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_);
+inline void protobuf_AssignDescriptorsOnce() {
+  ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_,
+                 &protobuf_AssignDesc_ipaaca_2eproto);
+}
+
+void protobuf_RegisterTypes(const ::std::string&) {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IntMessage_descriptor_, &IntMessage::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    LinkSet_descriptor_, &LinkSet::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    PayloadItem_descriptor_, &PayloadItem::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IU_descriptor_, &IU::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IUPayloadUpdate_descriptor_, &IUPayloadUpdate::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IURetraction_descriptor_, &IURetraction::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IUCommission_descriptor_, &IUCommission::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IUResendRequest_descriptor_, &IUResendRequest::default_instance());
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage(
+    IULinkUpdate_descriptor_, &IULinkUpdate::default_instance());
+}
+
+}  // namespace
+
+void protobuf_ShutdownFile_ipaaca_2eproto() {
+  delete IntMessage::default_instance_;
+  delete IntMessage_reflection_;
+  delete LinkSet::default_instance_;
+  delete LinkSet_reflection_;
+  delete PayloadItem::default_instance_;
+  delete PayloadItem_reflection_;
+  delete IU::default_instance_;
+  delete IU_reflection_;
+  delete IUPayloadUpdate::default_instance_;
+  delete IUPayloadUpdate_reflection_;
+  delete IURetraction::default_instance_;
+  delete IURetraction_reflection_;
+  delete IUCommission::default_instance_;
+  delete IUCommission_reflection_;
+  delete IUResendRequest::default_instance_;
+  delete IUResendRequest_reflection_;
+  delete IULinkUpdate::default_instance_;
+  delete IULinkUpdate_reflection_;
+}
+
+void protobuf_AddDesc_ipaaca_2eproto() {
+  static bool already_here = false;
+  if (already_here) return;
+  already_here = true;
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  ::google::protobuf::DescriptorPool::InternalAddGeneratedFile(
+    "\n\014ipaaca.proto\022\017ipaaca.protobuf\"\033\n\nIntMe"
+    "ssage\022\r\n\005value\030\001 \002(\021\"(\n\007LinkSet\022\014\n\004type\030"
+    "\001 \002(\t\022\017\n\007targets\030\002 \003(\t\"<\n\013PayloadItem\022\013\n"
+    "\003key\030\001 \002(\t\022\r\n\005value\030\002 \002(\t\022\021\n\004type\030\003 \002(\t:"
+    "\003str\"\343\002\n\002IU\022\013\n\003uid\030\001 \002(\t\022\020\n\010revision\030\002 \002"
+    "(\r\022\027\n\010category\030\003 \002(\t:\005undef\022\031\n\014payload_t"
+    "ype\030\004 \002(\t:\003MAP\022\022\n\nowner_name\030\005 \002(\t\022\030\n\tco"
+    "mmitted\030\006 \002(\010:\005false\0229\n\013access_mode\030\007 \002("
+    "\0162\036.ipaaca.protobuf.IU.AccessMode:\004PUSH\022"
+    "\030\n\tread_only\030\010 \002(\010:\005false\022-\n\007payload\030\t \003"
+    "(\0132\034.ipaaca.protobuf.PayloadItem\022\'\n\005link"
+    "s\030\n \003(\0132\030.ipaaca.protobuf.LinkSet\"/\n\nAcc"
+    "essMode\022\010\n\004PUSH\020\000\022\n\n\006REMOTE\020\001\022\013\n\007MESSAGE"
+    "\020\002\"\247\001\n\017IUPayloadUpdate\022\013\n\003uid\030\001 \002(\t\022\020\n\010r"
+    "evision\030\002 \002(\r\022/\n\tnew_items\030\003 \003(\0132\034.ipaac"
+    "a.protobuf.PayloadItem\022\026\n\016keys_to_remove"
+    "\030\004 \003(\t\022\027\n\010is_delta\030\005 \002(\010:\005false\022\023\n\013write"
+    "r_name\030\006 \002(\t\"-\n\014IURetraction\022\013\n\003uid\030\001 \002("
+    "\t\022\020\n\010revision\030\002 \002(\r\"B\n\014IUCommission\022\013\n\003u"
+    "id\030\001 \002(\t\022\020\n\010revision\030\002 \002(\r\022\023\n\013writer_nam"
+    "e\030\003 \002(\t\"9\n\017IUResendRequest\022\013\n\003uid\030\001 \002(\t\022"
+    "\031\n\021hidden_scope_name\030\002 \002(\t\"\273\001\n\014IULinkUpd"
+    "ate\022\013\n\003uid\030\001 \002(\t\022\020\n\010revision\030\002 \002(\r\022+\n\tne"
+    "w_links\030\003 \003(\0132\030.ipaaca.protobuf.LinkSet\022"
+    "1\n\017links_to_remove\030\004 \003(\0132\030.ipaaca.protob"
+    "uf.LinkSet\022\027\n\010is_delta\030\005 \002(\010:\005false\022\023\n\013w"
+    "riter_name\030\006 \002(\t", 1056);
+  ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile(
+    "ipaaca.proto", &protobuf_RegisterTypes);
+  IntMessage::default_instance_ = new IntMessage();
+  LinkSet::default_instance_ = new LinkSet();
+  PayloadItem::default_instance_ = new PayloadItem();
+  IU::default_instance_ = new IU();
+  IUPayloadUpdate::default_instance_ = new IUPayloadUpdate();
+  IURetraction::default_instance_ = new IURetraction();
+  IUCommission::default_instance_ = new IUCommission();
+  IUResendRequest::default_instance_ = new IUResendRequest();
+  IULinkUpdate::default_instance_ = new IULinkUpdate();
+  IntMessage::default_instance_->InitAsDefaultInstance();
+  LinkSet::default_instance_->InitAsDefaultInstance();
+  PayloadItem::default_instance_->InitAsDefaultInstance();
+  IU::default_instance_->InitAsDefaultInstance();
+  IUPayloadUpdate::default_instance_->InitAsDefaultInstance();
+  IURetraction::default_instance_->InitAsDefaultInstance();
+  IUCommission::default_instance_->InitAsDefaultInstance();
+  IUResendRequest::default_instance_->InitAsDefaultInstance();
+  IULinkUpdate::default_instance_->InitAsDefaultInstance();
+  ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_ipaaca_2eproto);
+}
+
+// Force AddDescriptors() to be called at static initialization time.
+struct StaticDescriptorInitializer_ipaaca_2eproto {
+  StaticDescriptorInitializer_ipaaca_2eproto() {
+    protobuf_AddDesc_ipaaca_2eproto();
+  }
+} static_descriptor_initializer_ipaaca_2eproto_;
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int IntMessage::kValueFieldNumber;
+#endif  // !_MSC_VER
+
+IntMessage::IntMessage()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IntMessage::InitAsDefaultInstance() {
+}
+
+IntMessage::IntMessage(const IntMessage& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IntMessage::SharedCtor() {
+  _cached_size_ = 0;
+  value_ = 0;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IntMessage::~IntMessage() {
+  SharedDtor();
+}
+
+void IntMessage::SharedDtor() {
+  if (this != default_instance_) {
+  }
+}
+
+void IntMessage::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IntMessage::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IntMessage_descriptor_;
+}
+
+const IntMessage& IntMessage::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IntMessage* IntMessage::default_instance_ = NULL;
+
+IntMessage* IntMessage::New() const {
+  return new IntMessage;
+}
+
+void IntMessage::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    value_ = 0;
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IntMessage::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required sint32 value = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::int32, ::google::protobuf::internal::WireFormatLite::TYPE_SINT32>(
+                 input, &value_)));
+          set_has_value();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IntMessage::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required sint32 value = 1;
+  if (has_value()) {
+    ::google::protobuf::internal::WireFormatLite::WriteSInt32(1, this->value(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IntMessage::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required sint32 value = 1;
+  if (has_value()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteSInt32ToArray(1, this->value(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IntMessage::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required sint32 value = 1;
+    if (has_value()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::SInt32Size(
+          this->value());
+    }
+    
+  }
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IntMessage::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IntMessage* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IntMessage*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IntMessage::MergeFrom(const IntMessage& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_value()) {
+      set_value(from.value());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IntMessage::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IntMessage::CopyFrom(const IntMessage& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IntMessage::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false;
+  
+  return true;
+}
+
+void IntMessage::Swap(IntMessage* other) {
+  if (other != this) {
+    std::swap(value_, other->value_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IntMessage::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IntMessage_descriptor_;
+  metadata.reflection = IntMessage_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int LinkSet::kTypeFieldNumber;
+const int LinkSet::kTargetsFieldNumber;
+#endif  // !_MSC_VER
+
+LinkSet::LinkSet()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void LinkSet::InitAsDefaultInstance() {
+}
+
+LinkSet::LinkSet(const LinkSet& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void LinkSet::SharedCtor() {
+  _cached_size_ = 0;
+  type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+LinkSet::~LinkSet() {
+  SharedDtor();
+}
+
+void LinkSet::SharedDtor() {
+  if (type_ != &::google::protobuf::internal::kEmptyString) {
+    delete type_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void LinkSet::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* LinkSet::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return LinkSet_descriptor_;
+}
+
+const LinkSet& LinkSet::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+LinkSet* LinkSet::default_instance_ = NULL;
+
+LinkSet* LinkSet::New() const {
+  return new LinkSet;
+}
+
+void LinkSet::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_type()) {
+      if (type_ != &::google::protobuf::internal::kEmptyString) {
+        type_->clear();
+      }
+    }
+  }
+  targets_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool LinkSet::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string type = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_type()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->type().data(), this->type().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(18)) goto parse_targets;
+        break;
+      }
+      
+      // repeated string targets = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_targets:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->add_targets()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->targets(0).data(), this->targets(0).length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(18)) goto parse_targets;
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void LinkSet::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string type = 1;
+  if (has_type()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->type().data(), this->type().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->type(), output);
+  }
+  
+  // repeated string targets = 2;
+  for (int i = 0; i < this->targets_size(); i++) {
+  ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+    this->targets(i).data(), this->targets(i).length(),
+    ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      2, this->targets(i), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* LinkSet::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string type = 1;
+  if (has_type()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->type().data(), this->type().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->type(), target);
+  }
+  
+  // repeated string targets = 2;
+  for (int i = 0; i < this->targets_size(); i++) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->targets(i).data(), this->targets(i).length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteStringToArray(2, this->targets(i), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int LinkSet::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string type = 1;
+    if (has_type()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->type());
+    }
+    
+  }
+  // repeated string targets = 2;
+  total_size += 1 * this->targets_size();
+  for (int i = 0; i < this->targets_size(); i++) {
+    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
+      this->targets(i));
+  }
+  
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void LinkSet::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const LinkSet* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const LinkSet*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void LinkSet::MergeFrom(const LinkSet& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  targets_.MergeFrom(from.targets_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_type()) {
+      set_type(from.type());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void LinkSet::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void LinkSet::CopyFrom(const LinkSet& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool LinkSet::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false;
+  
+  return true;
+}
+
+void LinkSet::Swap(LinkSet* other) {
+  if (other != this) {
+    std::swap(type_, other->type_);
+    targets_.Swap(&other->targets_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata LinkSet::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = LinkSet_descriptor_;
+  metadata.reflection = LinkSet_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+const ::std::string PayloadItem::_default_type_("str");
+#ifndef _MSC_VER
+const int PayloadItem::kKeyFieldNumber;
+const int PayloadItem::kValueFieldNumber;
+const int PayloadItem::kTypeFieldNumber;
+#endif  // !_MSC_VER
+
+PayloadItem::PayloadItem()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void PayloadItem::InitAsDefaultInstance() {
+}
+
+PayloadItem::PayloadItem(const PayloadItem& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void PayloadItem::SharedCtor() {
+  _cached_size_ = 0;
+  key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  type_ = const_cast< ::std::string*>(&_default_type_);
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+PayloadItem::~PayloadItem() {
+  SharedDtor();
+}
+
+void PayloadItem::SharedDtor() {
+  if (key_ != &::google::protobuf::internal::kEmptyString) {
+    delete key_;
+  }
+  if (value_ != &::google::protobuf::internal::kEmptyString) {
+    delete value_;
+  }
+  if (type_ != &_default_type_) {
+    delete type_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void PayloadItem::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* PayloadItem::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return PayloadItem_descriptor_;
+}
+
+const PayloadItem& PayloadItem::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+PayloadItem* PayloadItem::default_instance_ = NULL;
+
+PayloadItem* PayloadItem::New() const {
+  return new PayloadItem;
+}
+
+void PayloadItem::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_key()) {
+      if (key_ != &::google::protobuf::internal::kEmptyString) {
+        key_->clear();
+      }
+    }
+    if (has_value()) {
+      if (value_ != &::google::protobuf::internal::kEmptyString) {
+        value_->clear();
+      }
+    }
+    if (has_type()) {
+      if (type_ != &_default_type_) {
+        type_->assign(_default_type_);
+      }
+    }
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool PayloadItem::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string key = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_key()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->key().data(), this->key().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(18)) goto parse_value;
+        break;
+      }
+      
+      // required string value = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_value:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_value()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->value().data(), this->value().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_type;
+        break;
+      }
+      
+      // required string type = 3 [default = "str"];
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_type:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_type()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->type().data(), this->type().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void PayloadItem::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string key = 1;
+  if (has_key()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->key().data(), this->key().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->key(), output);
+  }
+  
+  // required string value = 2;
+  if (has_value()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->value().data(), this->value().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      2, this->value(), output);
+  }
+  
+  // required string type = 3 [default = "str"];
+  if (has_type()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->type().data(), this->type().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      3, this->type(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* PayloadItem::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string key = 1;
+  if (has_key()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->key().data(), this->key().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->key(), target);
+  }
+  
+  // required string value = 2;
+  if (has_value()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->value().data(), this->value().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        2, this->value(), target);
+  }
+  
+  // required string type = 3 [default = "str"];
+  if (has_type()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->type().data(), this->type().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->type(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int PayloadItem::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string key = 1;
+    if (has_key()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->key());
+    }
+    
+    // required string value = 2;
+    if (has_value()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->value());
+    }
+    
+    // required string type = 3 [default = "str"];
+    if (has_type()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->type());
+    }
+    
+  }
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void PayloadItem::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const PayloadItem* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const PayloadItem*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void PayloadItem::MergeFrom(const PayloadItem& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_key()) {
+      set_key(from.key());
+    }
+    if (from.has_value()) {
+      set_value(from.value());
+    }
+    if (from.has_type()) {
+      set_type(from.type());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void PayloadItem::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void PayloadItem::CopyFrom(const PayloadItem& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool PayloadItem::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000007) != 0x00000007) return false;
+  
+  return true;
+}
+
+void PayloadItem::Swap(PayloadItem* other) {
+  if (other != this) {
+    std::swap(key_, other->key_);
+    std::swap(value_, other->value_);
+    std::swap(type_, other->type_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata PayloadItem::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = PayloadItem_descriptor_;
+  metadata.reflection = PayloadItem_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+const ::google::protobuf::EnumDescriptor* IU_AccessMode_descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IU_AccessMode_descriptor_;
+}
+bool IU_AccessMode_IsValid(int value) {
+  switch(value) {
+    case 0:
+    case 1:
+    case 2:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#ifndef _MSC_VER
+const IU_AccessMode IU::PUSH;
+const IU_AccessMode IU::REMOTE;
+const IU_AccessMode IU::MESSAGE;
+const IU_AccessMode IU::AccessMode_MIN;
+const IU_AccessMode IU::AccessMode_MAX;
+const int IU::AccessMode_ARRAYSIZE;
+#endif  // _MSC_VER
+const ::std::string IU::_default_category_("undef");
+const ::std::string IU::_default_payload_type_("MAP");
+#ifndef _MSC_VER
+const int IU::kUidFieldNumber;
+const int IU::kRevisionFieldNumber;
+const int IU::kCategoryFieldNumber;
+const int IU::kPayloadTypeFieldNumber;
+const int IU::kOwnerNameFieldNumber;
+const int IU::kCommittedFieldNumber;
+const int IU::kAccessModeFieldNumber;
+const int IU::kReadOnlyFieldNumber;
+const int IU::kPayloadFieldNumber;
+const int IU::kLinksFieldNumber;
+#endif  // !_MSC_VER
+
+IU::IU()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IU::InitAsDefaultInstance() {
+}
+
+IU::IU(const IU& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IU::SharedCtor() {
+  _cached_size_ = 0;
+  uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  revision_ = 0u;
+  category_ = const_cast< ::std::string*>(&_default_category_);
+  payload_type_ = const_cast< ::std::string*>(&_default_payload_type_);
+  owner_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  committed_ = false;
+  access_mode_ = 0;
+  read_only_ = false;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IU::~IU() {
+  SharedDtor();
+}
+
+void IU::SharedDtor() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    delete uid_;
+  }
+  if (category_ != &_default_category_) {
+    delete category_;
+  }
+  if (payload_type_ != &_default_payload_type_) {
+    delete payload_type_;
+  }
+  if (owner_name_ != &::google::protobuf::internal::kEmptyString) {
+    delete owner_name_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void IU::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IU::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IU_descriptor_;
+}
+
+const IU& IU::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IU* IU::default_instance_ = NULL;
+
+IU* IU::New() const {
+  return new IU;
+}
+
+void IU::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_uid()) {
+      if (uid_ != &::google::protobuf::internal::kEmptyString) {
+        uid_->clear();
+      }
+    }
+    revision_ = 0u;
+    if (has_category()) {
+      if (category_ != &_default_category_) {
+        category_->assign(_default_category_);
+      }
+    }
+    if (has_payload_type()) {
+      if (payload_type_ != &_default_payload_type_) {
+        payload_type_->assign(_default_payload_type_);
+      }
+    }
+    if (has_owner_name()) {
+      if (owner_name_ != &::google::protobuf::internal::kEmptyString) {
+        owner_name_->clear();
+      }
+    }
+    committed_ = false;
+    access_mode_ = 0;
+    read_only_ = false;
+  }
+  payload_.Clear();
+  links_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IU::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string uid = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_uid()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->uid().data(), this->uid().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(16)) goto parse_revision;
+        break;
+      }
+      
+      // required uint32 revision = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_revision:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
+                 input, &revision_)));
+          set_has_revision();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_category;
+        break;
+      }
+      
+      // required string category = 3 [default = "undef"];
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_category:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_category()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->category().data(), this->category().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(34)) goto parse_payload_type;
+        break;
+      }
+      
+      // required string payload_type = 4 [default = "MAP"];
+      case 4: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_payload_type:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_payload_type()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->payload_type().data(), this->payload_type().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(42)) goto parse_owner_name;
+        break;
+      }
+      
+      // required string owner_name = 5;
+      case 5: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_owner_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_owner_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->owner_name().data(), this->owner_name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(48)) goto parse_committed;
+        break;
+      }
+      
+      // required bool committed = 6 [default = false];
+      case 6: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_committed:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
+                 input, &committed_)));
+          set_has_committed();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(56)) goto parse_access_mode;
+        break;
+      }
+      
+      // required .ipaaca.protobuf.IU.AccessMode access_mode = 7 [default = PUSH];
+      case 7: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_access_mode:
+          int value;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          if (::ipaaca::protobuf::IU_AccessMode_IsValid(value)) {
+            set_access_mode(static_cast< ::ipaaca::protobuf::IU_AccessMode >(value));
+          } else {
+            mutable_unknown_fields()->AddVarint(7, value);
+          }
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(64)) goto parse_read_only;
+        break;
+      }
+      
+      // required bool read_only = 8 [default = false];
+      case 8: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_read_only:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
+                 input, &read_only_)));
+          set_has_read_only();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(74)) goto parse_payload;
+        break;
+      }
+      
+      // repeated .ipaaca.protobuf.PayloadItem payload = 9;
+      case 9: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_payload:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+                input, add_payload()));
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(74)) goto parse_payload;
+        if (input->ExpectTag(82)) goto parse_links;
+        break;
+      }
+      
+      // repeated .ipaaca.protobuf.LinkSet links = 10;
+      case 10: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_links:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+                input, add_links()));
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(82)) goto parse_links;
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IU::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->uid(), output);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->revision(), output);
+  }
+  
+  // required string category = 3 [default = "undef"];
+  if (has_category()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->category().data(), this->category().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      3, this->category(), output);
+  }
+  
+  // required string payload_type = 4 [default = "MAP"];
+  if (has_payload_type()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->payload_type().data(), this->payload_type().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      4, this->payload_type(), output);
+  }
+  
+  // required string owner_name = 5;
+  if (has_owner_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->owner_name().data(), this->owner_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      5, this->owner_name(), output);
+  }
+  
+  // required bool committed = 6 [default = false];
+  if (has_committed()) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(6, this->committed(), output);
+  }
+  
+  // required .ipaaca.protobuf.IU.AccessMode access_mode = 7 [default = PUSH];
+  if (has_access_mode()) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      7, this->access_mode(), output);
+  }
+  
+  // required bool read_only = 8 [default = false];
+  if (has_read_only()) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(8, this->read_only(), output);
+  }
+  
+  // repeated .ipaaca.protobuf.PayloadItem payload = 9;
+  for (int i = 0; i < this->payload_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      9, this->payload(i), output);
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet links = 10;
+  for (int i = 0; i < this->links_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      10, this->links(i), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IU::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->uid(), target);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->revision(), target);
+  }
+  
+  // required string category = 3 [default = "undef"];
+  if (has_category()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->category().data(), this->category().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->category(), target);
+  }
+  
+  // required string payload_type = 4 [default = "MAP"];
+  if (has_payload_type()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->payload_type().data(), this->payload_type().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        4, this->payload_type(), target);
+  }
+  
+  // required string owner_name = 5;
+  if (has_owner_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->owner_name().data(), this->owner_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        5, this->owner_name(), target);
+  }
+  
+  // required bool committed = 6 [default = false];
+  if (has_committed()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(6, this->committed(), target);
+  }
+  
+  // required .ipaaca.protobuf.IU.AccessMode access_mode = 7 [default = PUSH];
+  if (has_access_mode()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      7, this->access_mode(), target);
+  }
+  
+  // required bool read_only = 8 [default = false];
+  if (has_read_only()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(8, this->read_only(), target);
+  }
+  
+  // repeated .ipaaca.protobuf.PayloadItem payload = 9;
+  for (int i = 0; i < this->payload_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        9, this->payload(i), target);
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet links = 10;
+  for (int i = 0; i < this->links_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        10, this->links(i), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IU::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string uid = 1;
+    if (has_uid()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->uid());
+    }
+    
+    // required uint32 revision = 2;
+    if (has_revision()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt32Size(
+          this->revision());
+    }
+    
+    // required string category = 3 [default = "undef"];
+    if (has_category()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->category());
+    }
+    
+    // required string payload_type = 4 [default = "MAP"];
+    if (has_payload_type()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->payload_type());
+    }
+    
+    // required string owner_name = 5;
+    if (has_owner_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->owner_name());
+    }
+    
+    // required bool committed = 6 [default = false];
+    if (has_committed()) {
+      total_size += 1 + 1;
+    }
+    
+    // required .ipaaca.protobuf.IU.AccessMode access_mode = 7 [default = PUSH];
+    if (has_access_mode()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::EnumSize(this->access_mode());
+    }
+    
+    // required bool read_only = 8 [default = false];
+    if (has_read_only()) {
+      total_size += 1 + 1;
+    }
+    
+  }
+  // repeated .ipaaca.protobuf.PayloadItem payload = 9;
+  total_size += 1 * this->payload_size();
+  for (int i = 0; i < this->payload_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->payload(i));
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet links = 10;
+  total_size += 1 * this->links_size();
+  for (int i = 0; i < this->links_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->links(i));
+  }
+  
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IU::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IU* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IU*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IU::MergeFrom(const IU& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  payload_.MergeFrom(from.payload_);
+  links_.MergeFrom(from.links_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_uid()) {
+      set_uid(from.uid());
+    }
+    if (from.has_revision()) {
+      set_revision(from.revision());
+    }
+    if (from.has_category()) {
+      set_category(from.category());
+    }
+    if (from.has_payload_type()) {
+      set_payload_type(from.payload_type());
+    }
+    if (from.has_owner_name()) {
+      set_owner_name(from.owner_name());
+    }
+    if (from.has_committed()) {
+      set_committed(from.committed());
+    }
+    if (from.has_access_mode()) {
+      set_access_mode(from.access_mode());
+    }
+    if (from.has_read_only()) {
+      set_read_only(from.read_only());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IU::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IU::CopyFrom(const IU& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IU::IsInitialized() const {
+  if ((_has_bits_[0] & 0x000000ff) != 0x000000ff) return false;
+  
+  for (int i = 0; i < payload_size(); i++) {
+    if (!this->payload(i).IsInitialized()) return false;
+  }
+  for (int i = 0; i < links_size(); i++) {
+    if (!this->links(i).IsInitialized()) return false;
+  }
+  return true;
+}
+
+void IU::Swap(IU* other) {
+  if (other != this) {
+    std::swap(uid_, other->uid_);
+    std::swap(revision_, other->revision_);
+    std::swap(category_, other->category_);
+    std::swap(payload_type_, other->payload_type_);
+    std::swap(owner_name_, other->owner_name_);
+    std::swap(committed_, other->committed_);
+    std::swap(access_mode_, other->access_mode_);
+    std::swap(read_only_, other->read_only_);
+    payload_.Swap(&other->payload_);
+    links_.Swap(&other->links_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IU::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IU_descriptor_;
+  metadata.reflection = IU_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int IUPayloadUpdate::kUidFieldNumber;
+const int IUPayloadUpdate::kRevisionFieldNumber;
+const int IUPayloadUpdate::kNewItemsFieldNumber;
+const int IUPayloadUpdate::kKeysToRemoveFieldNumber;
+const int IUPayloadUpdate::kIsDeltaFieldNumber;
+const int IUPayloadUpdate::kWriterNameFieldNumber;
+#endif  // !_MSC_VER
+
+IUPayloadUpdate::IUPayloadUpdate()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IUPayloadUpdate::InitAsDefaultInstance() {
+}
+
+IUPayloadUpdate::IUPayloadUpdate(const IUPayloadUpdate& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IUPayloadUpdate::SharedCtor() {
+  _cached_size_ = 0;
+  uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  revision_ = 0u;
+  is_delta_ = false;
+  writer_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IUPayloadUpdate::~IUPayloadUpdate() {
+  SharedDtor();
+}
+
+void IUPayloadUpdate::SharedDtor() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    delete uid_;
+  }
+  if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+    delete writer_name_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void IUPayloadUpdate::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IUPayloadUpdate::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IUPayloadUpdate_descriptor_;
+}
+
+const IUPayloadUpdate& IUPayloadUpdate::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IUPayloadUpdate* IUPayloadUpdate::default_instance_ = NULL;
+
+IUPayloadUpdate* IUPayloadUpdate::New() const {
+  return new IUPayloadUpdate;
+}
+
+void IUPayloadUpdate::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_uid()) {
+      if (uid_ != &::google::protobuf::internal::kEmptyString) {
+        uid_->clear();
+      }
+    }
+    revision_ = 0u;
+    is_delta_ = false;
+    if (has_writer_name()) {
+      if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+        writer_name_->clear();
+      }
+    }
+  }
+  new_items_.Clear();
+  keys_to_remove_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IUPayloadUpdate::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string uid = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_uid()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->uid().data(), this->uid().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(16)) goto parse_revision;
+        break;
+      }
+      
+      // required uint32 revision = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_revision:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
+                 input, &revision_)));
+          set_has_revision();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_new_items;
+        break;
+      }
+      
+      // repeated .ipaaca.protobuf.PayloadItem new_items = 3;
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_new_items:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+                input, add_new_items()));
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_new_items;
+        if (input->ExpectTag(34)) goto parse_keys_to_remove;
+        break;
+      }
+      
+      // repeated string keys_to_remove = 4;
+      case 4: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_keys_to_remove:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->add_keys_to_remove()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->keys_to_remove(0).data(), this->keys_to_remove(0).length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(34)) goto parse_keys_to_remove;
+        if (input->ExpectTag(40)) goto parse_is_delta;
+        break;
+      }
+      
+      // required bool is_delta = 5 [default = false];
+      case 5: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_is_delta:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
+                 input, &is_delta_)));
+          set_has_is_delta();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(50)) goto parse_writer_name;
+        break;
+      }
+      
+      // required string writer_name = 6;
+      case 6: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_writer_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_writer_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->writer_name().data(), this->writer_name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IUPayloadUpdate::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->uid(), output);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->revision(), output);
+  }
+  
+  // repeated .ipaaca.protobuf.PayloadItem new_items = 3;
+  for (int i = 0; i < this->new_items_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      3, this->new_items(i), output);
+  }
+  
+  // repeated string keys_to_remove = 4;
+  for (int i = 0; i < this->keys_to_remove_size(); i++) {
+  ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+    this->keys_to_remove(i).data(), this->keys_to_remove(i).length(),
+    ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      4, this->keys_to_remove(i), output);
+  }
+  
+  // required bool is_delta = 5 [default = false];
+  if (has_is_delta()) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->is_delta(), output);
+  }
+  
+  // required string writer_name = 6;
+  if (has_writer_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->writer_name().data(), this->writer_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      6, this->writer_name(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IUPayloadUpdate::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->uid(), target);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->revision(), target);
+  }
+  
+  // repeated .ipaaca.protobuf.PayloadItem new_items = 3;
+  for (int i = 0; i < this->new_items_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        3, this->new_items(i), target);
+  }
+  
+  // repeated string keys_to_remove = 4;
+  for (int i = 0; i < this->keys_to_remove_size(); i++) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->keys_to_remove(i).data(), this->keys_to_remove(i).length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteStringToArray(4, this->keys_to_remove(i), target);
+  }
+  
+  // required bool is_delta = 5 [default = false];
+  if (has_is_delta()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->is_delta(), target);
+  }
+  
+  // required string writer_name = 6;
+  if (has_writer_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->writer_name().data(), this->writer_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        6, this->writer_name(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IUPayloadUpdate::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string uid = 1;
+    if (has_uid()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->uid());
+    }
+    
+    // required uint32 revision = 2;
+    if (has_revision()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt32Size(
+          this->revision());
+    }
+    
+    // required bool is_delta = 5 [default = false];
+    if (has_is_delta()) {
+      total_size += 1 + 1;
+    }
+    
+    // required string writer_name = 6;
+    if (has_writer_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->writer_name());
+    }
+    
+  }
+  // repeated .ipaaca.protobuf.PayloadItem new_items = 3;
+  total_size += 1 * this->new_items_size();
+  for (int i = 0; i < this->new_items_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->new_items(i));
+  }
+  
+  // repeated string keys_to_remove = 4;
+  total_size += 1 * this->keys_to_remove_size();
+  for (int i = 0; i < this->keys_to_remove_size(); i++) {
+    total_size += ::google::protobuf::internal::WireFormatLite::StringSize(
+      this->keys_to_remove(i));
+  }
+  
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IUPayloadUpdate::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IUPayloadUpdate* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IUPayloadUpdate*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IUPayloadUpdate::MergeFrom(const IUPayloadUpdate& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  new_items_.MergeFrom(from.new_items_);
+  keys_to_remove_.MergeFrom(from.keys_to_remove_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_uid()) {
+      set_uid(from.uid());
+    }
+    if (from.has_revision()) {
+      set_revision(from.revision());
+    }
+    if (from.has_is_delta()) {
+      set_is_delta(from.is_delta());
+    }
+    if (from.has_writer_name()) {
+      set_writer_name(from.writer_name());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IUPayloadUpdate::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IUPayloadUpdate::CopyFrom(const IUPayloadUpdate& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IUPayloadUpdate::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000033) != 0x00000033) return false;
+  
+  for (int i = 0; i < new_items_size(); i++) {
+    if (!this->new_items(i).IsInitialized()) return false;
+  }
+  return true;
+}
+
+void IUPayloadUpdate::Swap(IUPayloadUpdate* other) {
+  if (other != this) {
+    std::swap(uid_, other->uid_);
+    std::swap(revision_, other->revision_);
+    new_items_.Swap(&other->new_items_);
+    keys_to_remove_.Swap(&other->keys_to_remove_);
+    std::swap(is_delta_, other->is_delta_);
+    std::swap(writer_name_, other->writer_name_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IUPayloadUpdate::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IUPayloadUpdate_descriptor_;
+  metadata.reflection = IUPayloadUpdate_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int IURetraction::kUidFieldNumber;
+const int IURetraction::kRevisionFieldNumber;
+#endif  // !_MSC_VER
+
+IURetraction::IURetraction()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IURetraction::InitAsDefaultInstance() {
+}
+
+IURetraction::IURetraction(const IURetraction& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IURetraction::SharedCtor() {
+  _cached_size_ = 0;
+  uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  revision_ = 0u;
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IURetraction::~IURetraction() {
+  SharedDtor();
+}
+
+void IURetraction::SharedDtor() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    delete uid_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void IURetraction::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IURetraction::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IURetraction_descriptor_;
+}
+
+const IURetraction& IURetraction::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IURetraction* IURetraction::default_instance_ = NULL;
+
+IURetraction* IURetraction::New() const {
+  return new IURetraction;
+}
+
+void IURetraction::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_uid()) {
+      if (uid_ != &::google::protobuf::internal::kEmptyString) {
+        uid_->clear();
+      }
+    }
+    revision_ = 0u;
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IURetraction::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string uid = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_uid()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->uid().data(), this->uid().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(16)) goto parse_revision;
+        break;
+      }
+      
+      // required uint32 revision = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_revision:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
+                 input, &revision_)));
+          set_has_revision();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IURetraction::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->uid(), output);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->revision(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IURetraction::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->uid(), target);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->revision(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IURetraction::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string uid = 1;
+    if (has_uid()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->uid());
+    }
+    
+    // required uint32 revision = 2;
+    if (has_revision()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt32Size(
+          this->revision());
+    }
+    
+  }
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IURetraction::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IURetraction* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IURetraction*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IURetraction::MergeFrom(const IURetraction& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_uid()) {
+      set_uid(from.uid());
+    }
+    if (from.has_revision()) {
+      set_revision(from.revision());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IURetraction::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IURetraction::CopyFrom(const IURetraction& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IURetraction::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false;
+  
+  return true;
+}
+
+void IURetraction::Swap(IURetraction* other) {
+  if (other != this) {
+    std::swap(uid_, other->uid_);
+    std::swap(revision_, other->revision_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IURetraction::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IURetraction_descriptor_;
+  metadata.reflection = IURetraction_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int IUCommission::kUidFieldNumber;
+const int IUCommission::kRevisionFieldNumber;
+const int IUCommission::kWriterNameFieldNumber;
+#endif  // !_MSC_VER
+
+IUCommission::IUCommission()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IUCommission::InitAsDefaultInstance() {
+}
+
+IUCommission::IUCommission(const IUCommission& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IUCommission::SharedCtor() {
+  _cached_size_ = 0;
+  uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  revision_ = 0u;
+  writer_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IUCommission::~IUCommission() {
+  SharedDtor();
+}
+
+void IUCommission::SharedDtor() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    delete uid_;
+  }
+  if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+    delete writer_name_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void IUCommission::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IUCommission::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IUCommission_descriptor_;
+}
+
+const IUCommission& IUCommission::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IUCommission* IUCommission::default_instance_ = NULL;
+
+IUCommission* IUCommission::New() const {
+  return new IUCommission;
+}
+
+void IUCommission::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_uid()) {
+      if (uid_ != &::google::protobuf::internal::kEmptyString) {
+        uid_->clear();
+      }
+    }
+    revision_ = 0u;
+    if (has_writer_name()) {
+      if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+        writer_name_->clear();
+      }
+    }
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IUCommission::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string uid = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_uid()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->uid().data(), this->uid().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(16)) goto parse_revision;
+        break;
+      }
+      
+      // required uint32 revision = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_revision:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
+                 input, &revision_)));
+          set_has_revision();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_writer_name;
+        break;
+      }
+      
+      // required string writer_name = 3;
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_writer_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_writer_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->writer_name().data(), this->writer_name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IUCommission::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->uid(), output);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->revision(), output);
+  }
+  
+  // required string writer_name = 3;
+  if (has_writer_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->writer_name().data(), this->writer_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      3, this->writer_name(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IUCommission::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->uid(), target);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->revision(), target);
+  }
+  
+  // required string writer_name = 3;
+  if (has_writer_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->writer_name().data(), this->writer_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->writer_name(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IUCommission::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string uid = 1;
+    if (has_uid()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->uid());
+    }
+    
+    // required uint32 revision = 2;
+    if (has_revision()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt32Size(
+          this->revision());
+    }
+    
+    // required string writer_name = 3;
+    if (has_writer_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->writer_name());
+    }
+    
+  }
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IUCommission::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IUCommission* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IUCommission*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IUCommission::MergeFrom(const IUCommission& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_uid()) {
+      set_uid(from.uid());
+    }
+    if (from.has_revision()) {
+      set_revision(from.revision());
+    }
+    if (from.has_writer_name()) {
+      set_writer_name(from.writer_name());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IUCommission::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IUCommission::CopyFrom(const IUCommission& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IUCommission::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000007) != 0x00000007) return false;
+  
+  return true;
+}
+
+void IUCommission::Swap(IUCommission* other) {
+  if (other != this) {
+    std::swap(uid_, other->uid_);
+    std::swap(revision_, other->revision_);
+    std::swap(writer_name_, other->writer_name_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IUCommission::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IUCommission_descriptor_;
+  metadata.reflection = IUCommission_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int IUResendRequest::kUidFieldNumber;
+const int IUResendRequest::kHiddenScopeNameFieldNumber;
+#endif  // !_MSC_VER
+
+IUResendRequest::IUResendRequest()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IUResendRequest::InitAsDefaultInstance() {
+}
+
+IUResendRequest::IUResendRequest(const IUResendRequest& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IUResendRequest::SharedCtor() {
+  _cached_size_ = 0;
+  uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  hidden_scope_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IUResendRequest::~IUResendRequest() {
+  SharedDtor();
+}
+
+void IUResendRequest::SharedDtor() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    delete uid_;
+  }
+  if (hidden_scope_name_ != &::google::protobuf::internal::kEmptyString) {
+    delete hidden_scope_name_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void IUResendRequest::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IUResendRequest::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IUResendRequest_descriptor_;
+}
+
+const IUResendRequest& IUResendRequest::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IUResendRequest* IUResendRequest::default_instance_ = NULL;
+
+IUResendRequest* IUResendRequest::New() const {
+  return new IUResendRequest;
+}
+
+void IUResendRequest::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_uid()) {
+      if (uid_ != &::google::protobuf::internal::kEmptyString) {
+        uid_->clear();
+      }
+    }
+    if (has_hidden_scope_name()) {
+      if (hidden_scope_name_ != &::google::protobuf::internal::kEmptyString) {
+        hidden_scope_name_->clear();
+      }
+    }
+  }
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IUResendRequest::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string uid = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_uid()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->uid().data(), this->uid().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(18)) goto parse_hidden_scope_name;
+        break;
+      }
+      
+      // required string hidden_scope_name = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_hidden_scope_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_hidden_scope_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->hidden_scope_name().data(), this->hidden_scope_name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IUResendRequest::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->uid(), output);
+  }
+  
+  // required string hidden_scope_name = 2;
+  if (has_hidden_scope_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->hidden_scope_name().data(), this->hidden_scope_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      2, this->hidden_scope_name(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IUResendRequest::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->uid(), target);
+  }
+  
+  // required string hidden_scope_name = 2;
+  if (has_hidden_scope_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->hidden_scope_name().data(), this->hidden_scope_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        2, this->hidden_scope_name(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IUResendRequest::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string uid = 1;
+    if (has_uid()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->uid());
+    }
+    
+    // required string hidden_scope_name = 2;
+    if (has_hidden_scope_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->hidden_scope_name());
+    }
+    
+  }
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IUResendRequest::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IUResendRequest* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IUResendRequest*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IUResendRequest::MergeFrom(const IUResendRequest& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_uid()) {
+      set_uid(from.uid());
+    }
+    if (from.has_hidden_scope_name()) {
+      set_hidden_scope_name(from.hidden_scope_name());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IUResendRequest::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IUResendRequest::CopyFrom(const IUResendRequest& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IUResendRequest::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000003) != 0x00000003) return false;
+  
+  return true;
+}
+
+void IUResendRequest::Swap(IUResendRequest* other) {
+  if (other != this) {
+    std::swap(uid_, other->uid_);
+    std::swap(hidden_scope_name_, other->hidden_scope_name_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IUResendRequest::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IUResendRequest_descriptor_;
+  metadata.reflection = IUResendRequest_reflection_;
+  return metadata;
+}
+
+
+// ===================================================================
+
+#ifndef _MSC_VER
+const int IULinkUpdate::kUidFieldNumber;
+const int IULinkUpdate::kRevisionFieldNumber;
+const int IULinkUpdate::kNewLinksFieldNumber;
+const int IULinkUpdate::kLinksToRemoveFieldNumber;
+const int IULinkUpdate::kIsDeltaFieldNumber;
+const int IULinkUpdate::kWriterNameFieldNumber;
+#endif  // !_MSC_VER
+
+IULinkUpdate::IULinkUpdate()
+  : ::google::protobuf::Message() {
+  SharedCtor();
+}
+
+void IULinkUpdate::InitAsDefaultInstance() {
+}
+
+IULinkUpdate::IULinkUpdate(const IULinkUpdate& from)
+  : ::google::protobuf::Message() {
+  SharedCtor();
+  MergeFrom(from);
+}
+
+void IULinkUpdate::SharedCtor() {
+  _cached_size_ = 0;
+  uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  revision_ = 0u;
+  is_delta_ = false;
+  writer_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+}
+
+IULinkUpdate::~IULinkUpdate() {
+  SharedDtor();
+}
+
+void IULinkUpdate::SharedDtor() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    delete uid_;
+  }
+  if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+    delete writer_name_;
+  }
+  if (this != default_instance_) {
+  }
+}
+
+void IULinkUpdate::SetCachedSize(int size) const {
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+}
+const ::google::protobuf::Descriptor* IULinkUpdate::descriptor() {
+  protobuf_AssignDescriptorsOnce();
+  return IULinkUpdate_descriptor_;
+}
+
+const IULinkUpdate& IULinkUpdate::default_instance() {
+  if (default_instance_ == NULL) protobuf_AddDesc_ipaaca_2eproto();  return *default_instance_;
+}
+
+IULinkUpdate* IULinkUpdate::default_instance_ = NULL;
+
+IULinkUpdate* IULinkUpdate::New() const {
+  return new IULinkUpdate;
+}
+
+void IULinkUpdate::Clear() {
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (has_uid()) {
+      if (uid_ != &::google::protobuf::internal::kEmptyString) {
+        uid_->clear();
+      }
+    }
+    revision_ = 0u;
+    is_delta_ = false;
+    if (has_writer_name()) {
+      if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+        writer_name_->clear();
+      }
+    }
+  }
+  new_links_.Clear();
+  links_to_remove_.Clear();
+  ::memset(_has_bits_, 0, sizeof(_has_bits_));
+  mutable_unknown_fields()->Clear();
+}
+
+bool IULinkUpdate::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!(EXPRESSION)) return false
+  ::google::protobuf::uint32 tag;
+  while ((tag = input->ReadTag()) != 0) {
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // required string uid = 1;
+      case 1: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_uid()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->uid().data(), this->uid().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(16)) goto parse_revision;
+        break;
+      }
+      
+      // required uint32 revision = 2;
+      case 2: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_revision:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   ::google::protobuf::uint32, ::google::protobuf::internal::WireFormatLite::TYPE_UINT32>(
+                 input, &revision_)));
+          set_has_revision();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_new_links;
+        break;
+      }
+      
+      // repeated .ipaaca.protobuf.LinkSet new_links = 3;
+      case 3: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_new_links:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+                input, add_new_links()));
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(26)) goto parse_new_links;
+        if (input->ExpectTag(34)) goto parse_links_to_remove;
+        break;
+      }
+      
+      // repeated .ipaaca.protobuf.LinkSet links_to_remove = 4;
+      case 4: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_links_to_remove:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessageNoVirtual(
+                input, add_links_to_remove()));
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(34)) goto parse_links_to_remove;
+        if (input->ExpectTag(40)) goto parse_is_delta;
+        break;
+      }
+      
+      // required bool is_delta = 5 [default = false];
+      case 5: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_VARINT) {
+         parse_is_delta:
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   bool, ::google::protobuf::internal::WireFormatLite::TYPE_BOOL>(
+                 input, &is_delta_)));
+          set_has_is_delta();
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectTag(50)) goto parse_writer_name;
+        break;
+      }
+      
+      // required string writer_name = 6;
+      case 6: {
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
+         parse_writer_name:
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_writer_name()));
+          ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+            this->writer_name().data(), this->writer_name().length(),
+            ::google::protobuf::internal::WireFormat::PARSE);
+        } else {
+          goto handle_uninterpreted;
+        }
+        if (input->ExpectAtEnd()) return true;
+        break;
+      }
+      
+      default: {
+      handle_uninterpreted:
+        if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) ==
+            ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) {
+          return true;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+  return true;
+#undef DO_
+}
+
+void IULinkUpdate::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      1, this->uid(), output);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    ::google::protobuf::internal::WireFormatLite::WriteUInt32(2, this->revision(), output);
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet new_links = 3;
+  for (int i = 0; i < this->new_links_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      3, this->new_links(i), output);
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet links_to_remove = 4;
+  for (int i = 0; i < this->links_to_remove_size(); i++) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      4, this->links_to_remove(i), output);
+  }
+  
+  // required bool is_delta = 5 [default = false];
+  if (has_is_delta()) {
+    ::google::protobuf::internal::WireFormatLite::WriteBool(5, this->is_delta(), output);
+  }
+  
+  // required string writer_name = 6;
+  if (has_writer_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->writer_name().data(), this->writer_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    ::google::protobuf::internal::WireFormatLite::WriteString(
+      6, this->writer_name(), output);
+  }
+  
+  if (!unknown_fields().empty()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        unknown_fields(), output);
+  }
+}
+
+::google::protobuf::uint8* IULinkUpdate::SerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // required string uid = 1;
+  if (has_uid()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->uid().data(), this->uid().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        1, this->uid(), target);
+  }
+  
+  // required uint32 revision = 2;
+  if (has_revision()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteUInt32ToArray(2, this->revision(), target);
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet new_links = 3;
+  for (int i = 0; i < this->new_links_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        3, this->new_links(i), target);
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet links_to_remove = 4;
+  for (int i = 0; i < this->links_to_remove_size(); i++) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      WriteMessageNoVirtualToArray(
+        4, this->links_to_remove(i), target);
+  }
+  
+  // required bool is_delta = 5 [default = false];
+  if (has_is_delta()) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteBoolToArray(5, this->is_delta(), target);
+  }
+  
+  // required string writer_name = 6;
+  if (has_writer_name()) {
+    ::google::protobuf::internal::WireFormat::VerifyUTF8String(
+      this->writer_name().data(), this->writer_name().length(),
+      ::google::protobuf::internal::WireFormat::SERIALIZE);
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        6, this->writer_name(), target);
+  }
+  
+  if (!unknown_fields().empty()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        unknown_fields(), target);
+  }
+  return target;
+}
+
+int IULinkUpdate::ByteSize() const {
+  int total_size = 0;
+  
+  if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    // required string uid = 1;
+    if (has_uid()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->uid());
+    }
+    
+    // required uint32 revision = 2;
+    if (has_revision()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::UInt32Size(
+          this->revision());
+    }
+    
+    // required bool is_delta = 5 [default = false];
+    if (has_is_delta()) {
+      total_size += 1 + 1;
+    }
+    
+    // required string writer_name = 6;
+    if (has_writer_name()) {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::StringSize(
+          this->writer_name());
+    }
+    
+  }
+  // repeated .ipaaca.protobuf.LinkSet new_links = 3;
+  total_size += 1 * this->new_links_size();
+  for (int i = 0; i < this->new_links_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->new_links(i));
+  }
+  
+  // repeated .ipaaca.protobuf.LinkSet links_to_remove = 4;
+  total_size += 1 * this->links_to_remove_size();
+  for (int i = 0; i < this->links_to_remove_size(); i++) {
+    total_size +=
+      ::google::protobuf::internal::WireFormatLite::MessageSizeNoVirtual(
+        this->links_to_remove(i));
+  }
+  
+  if (!unknown_fields().empty()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        unknown_fields());
+  }
+  GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN();
+  _cached_size_ = total_size;
+  GOOGLE_SAFE_CONCURRENT_WRITES_END();
+  return total_size;
+}
+
+void IULinkUpdate::MergeFrom(const ::google::protobuf::Message& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  const IULinkUpdate* source =
+    ::google::protobuf::internal::dynamic_cast_if_available<const IULinkUpdate*>(
+      &from);
+  if (source == NULL) {
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+    MergeFrom(*source);
+  }
+}
+
+void IULinkUpdate::MergeFrom(const IULinkUpdate& from) {
+  GOOGLE_CHECK_NE(&from, this);
+  new_links_.MergeFrom(from.new_links_);
+  links_to_remove_.MergeFrom(from.links_to_remove_);
+  if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) {
+    if (from.has_uid()) {
+      set_uid(from.uid());
+    }
+    if (from.has_revision()) {
+      set_revision(from.revision());
+    }
+    if (from.has_is_delta()) {
+      set_is_delta(from.is_delta());
+    }
+    if (from.has_writer_name()) {
+      set_writer_name(from.writer_name());
+    }
+  }
+  mutable_unknown_fields()->MergeFrom(from.unknown_fields());
+}
+
+void IULinkUpdate::CopyFrom(const ::google::protobuf::Message& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void IULinkUpdate::CopyFrom(const IULinkUpdate& from) {
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool IULinkUpdate::IsInitialized() const {
+  if ((_has_bits_[0] & 0x00000033) != 0x00000033) return false;
+  
+  for (int i = 0; i < new_links_size(); i++) {
+    if (!this->new_links(i).IsInitialized()) return false;
+  }
+  for (int i = 0; i < links_to_remove_size(); i++) {
+    if (!this->links_to_remove(i).IsInitialized()) return false;
+  }
+  return true;
+}
+
+void IULinkUpdate::Swap(IULinkUpdate* other) {
+  if (other != this) {
+    std::swap(uid_, other->uid_);
+    std::swap(revision_, other->revision_);
+    new_links_.Swap(&other->new_links_);
+    links_to_remove_.Swap(&other->links_to_remove_);
+    std::swap(is_delta_, other->is_delta_);
+    std::swap(writer_name_, other->writer_name_);
+    std::swap(_has_bits_[0], other->_has_bits_[0]);
+    _unknown_fields_.Swap(&other->_unknown_fields_);
+    std::swap(_cached_size_, other->_cached_size_);
+  }
+}
+
+::google::protobuf::Metadata IULinkUpdate::GetMetadata() const {
+  protobuf_AssignDescriptorsOnce();
+  ::google::protobuf::Metadata metadata;
+  metadata.descriptor = IULinkUpdate_descriptor_;
+  metadata.reflection = IULinkUpdate_reflection_;
+  return metadata;
+}
+
+
+// @@protoc_insertion_point(namespace_scope)
+
+}  // namespace protobuf
+}  // namespace ipaaca
+
+// @@protoc_insertion_point(global_scope)
diff --git a/ipaacalib/cpp/ipaaca.pb.h b/ipaacalib/cpp/ipaaca.pb.h
new file mode 100644
index 0000000000000000000000000000000000000000..2947a1fd5f80a33337e74e1dfe0b069256322679
--- /dev/null
+++ b/ipaacalib/cpp/ipaaca.pb.h
@@ -0,0 +1,2691 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: ipaaca.proto
+
+#ifndef PROTOBUF_ipaaca_2eproto__INCLUDED
+#define PROTOBUF_ipaaca_2eproto__INCLUDED
+
+#include <string>
+
+#include <google/protobuf/stubs/common.h>
+
+#if GOOGLE_PROTOBUF_VERSION < 2004000
+#error This file was generated by a newer version of protoc which is
+#error incompatible with your Protocol Buffer headers.  Please update
+#error your headers.
+#endif
+#if 2004001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION
+#error This file was generated by an older version of protoc which is
+#error incompatible with your Protocol Buffer headers.  Please
+#error regenerate this file with a newer version of protoc.
+#endif
+
+#include <google/protobuf/generated_message_util.h>
+#include <google/protobuf/repeated_field.h>
+#include <google/protobuf/extension_set.h>
+#include <google/protobuf/generated_message_reflection.h>
+// @@protoc_insertion_point(includes)
+
+namespace ipaaca {
+namespace protobuf {
+
+// Internal implementation detail -- do not call these.
+void  protobuf_AddDesc_ipaaca_2eproto();
+void protobuf_AssignDesc_ipaaca_2eproto();
+void protobuf_ShutdownFile_ipaaca_2eproto();
+
+class IntMessage;
+class LinkSet;
+class PayloadItem;
+class IU;
+class IUPayloadUpdate;
+class IURetraction;
+class IUCommission;
+class IUResendRequest;
+class IULinkUpdate;
+
+enum IU_AccessMode {
+  IU_AccessMode_PUSH = 0,
+  IU_AccessMode_REMOTE = 1,
+  IU_AccessMode_MESSAGE = 2
+};
+bool IU_AccessMode_IsValid(int value);
+const IU_AccessMode IU_AccessMode_AccessMode_MIN = IU_AccessMode_PUSH;
+const IU_AccessMode IU_AccessMode_AccessMode_MAX = IU_AccessMode_MESSAGE;
+const int IU_AccessMode_AccessMode_ARRAYSIZE = IU_AccessMode_AccessMode_MAX + 1;
+
+const ::google::protobuf::EnumDescriptor* IU_AccessMode_descriptor();
+inline const ::std::string& IU_AccessMode_Name(IU_AccessMode value) {
+  return ::google::protobuf::internal::NameOfEnum(
+    IU_AccessMode_descriptor(), value);
+}
+inline bool IU_AccessMode_Parse(
+    const ::std::string& name, IU_AccessMode* value) {
+  return ::google::protobuf::internal::ParseNamedEnum<IU_AccessMode>(
+    IU_AccessMode_descriptor(), name, value);
+}
+// ===================================================================
+
+class IntMessage : public ::google::protobuf::Message {
+ public:
+  IntMessage();
+  virtual ~IntMessage();
+  
+  IntMessage(const IntMessage& from);
+  
+  inline IntMessage& operator=(const IntMessage& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IntMessage& default_instance();
+  
+  void Swap(IntMessage* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IntMessage* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IntMessage& from);
+  void MergeFrom(const IntMessage& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required sint32 value = 1;
+  inline bool has_value() const;
+  inline void clear_value();
+  static const int kValueFieldNumber = 1;
+  inline ::google::protobuf::int32 value() const;
+  inline void set_value(::google::protobuf::int32 value);
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IntMessage)
+ private:
+  inline void set_has_value();
+  inline void clear_has_value();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::google::protobuf::int32 value_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IntMessage* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class LinkSet : public ::google::protobuf::Message {
+ public:
+  LinkSet();
+  virtual ~LinkSet();
+  
+  LinkSet(const LinkSet& from);
+  
+  inline LinkSet& operator=(const LinkSet& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const LinkSet& default_instance();
+  
+  void Swap(LinkSet* other);
+  
+  // implements Message ----------------------------------------------
+  
+  LinkSet* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const LinkSet& from);
+  void MergeFrom(const LinkSet& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string type = 1;
+  inline bool has_type() const;
+  inline void clear_type();
+  static const int kTypeFieldNumber = 1;
+  inline const ::std::string& type() const;
+  inline void set_type(const ::std::string& value);
+  inline void set_type(const char* value);
+  inline void set_type(const char* value, size_t size);
+  inline ::std::string* mutable_type();
+  inline ::std::string* release_type();
+  
+  // repeated string targets = 2;
+  inline int targets_size() const;
+  inline void clear_targets();
+  static const int kTargetsFieldNumber = 2;
+  inline const ::std::string& targets(int index) const;
+  inline ::std::string* mutable_targets(int index);
+  inline void set_targets(int index, const ::std::string& value);
+  inline void set_targets(int index, const char* value);
+  inline void set_targets(int index, const char* value, size_t size);
+  inline ::std::string* add_targets();
+  inline void add_targets(const ::std::string& value);
+  inline void add_targets(const char* value);
+  inline void add_targets(const char* value, size_t size);
+  inline const ::google::protobuf::RepeatedPtrField< ::std::string>& targets() const;
+  inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_targets();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.LinkSet)
+ private:
+  inline void set_has_type();
+  inline void clear_has_type();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* type_;
+  ::google::protobuf::RepeatedPtrField< ::std::string> targets_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static LinkSet* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class PayloadItem : public ::google::protobuf::Message {
+ public:
+  PayloadItem();
+  virtual ~PayloadItem();
+  
+  PayloadItem(const PayloadItem& from);
+  
+  inline PayloadItem& operator=(const PayloadItem& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const PayloadItem& default_instance();
+  
+  void Swap(PayloadItem* other);
+  
+  // implements Message ----------------------------------------------
+  
+  PayloadItem* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const PayloadItem& from);
+  void MergeFrom(const PayloadItem& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string key = 1;
+  inline bool has_key() const;
+  inline void clear_key();
+  static const int kKeyFieldNumber = 1;
+  inline const ::std::string& key() const;
+  inline void set_key(const ::std::string& value);
+  inline void set_key(const char* value);
+  inline void set_key(const char* value, size_t size);
+  inline ::std::string* mutable_key();
+  inline ::std::string* release_key();
+  
+  // required string value = 2;
+  inline bool has_value() const;
+  inline void clear_value();
+  static const int kValueFieldNumber = 2;
+  inline const ::std::string& value() const;
+  inline void set_value(const ::std::string& value);
+  inline void set_value(const char* value);
+  inline void set_value(const char* value, size_t size);
+  inline ::std::string* mutable_value();
+  inline ::std::string* release_value();
+  
+  // required string type = 3 [default = "str"];
+  inline bool has_type() const;
+  inline void clear_type();
+  static const int kTypeFieldNumber = 3;
+  inline const ::std::string& type() const;
+  inline void set_type(const ::std::string& value);
+  inline void set_type(const char* value);
+  inline void set_type(const char* value, size_t size);
+  inline ::std::string* mutable_type();
+  inline ::std::string* release_type();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.PayloadItem)
+ private:
+  inline void set_has_key();
+  inline void clear_has_key();
+  inline void set_has_value();
+  inline void clear_has_value();
+  inline void set_has_type();
+  inline void clear_has_type();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* key_;
+  ::std::string* value_;
+  ::std::string* type_;
+  static const ::std::string _default_type_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static PayloadItem* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class IU : public ::google::protobuf::Message {
+ public:
+  IU();
+  virtual ~IU();
+  
+  IU(const IU& from);
+  
+  inline IU& operator=(const IU& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IU& default_instance();
+  
+  void Swap(IU* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IU* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IU& from);
+  void MergeFrom(const IU& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  typedef IU_AccessMode AccessMode;
+  static const AccessMode PUSH = IU_AccessMode_PUSH;
+  static const AccessMode REMOTE = IU_AccessMode_REMOTE;
+  static const AccessMode MESSAGE = IU_AccessMode_MESSAGE;
+  static inline bool AccessMode_IsValid(int value) {
+    return IU_AccessMode_IsValid(value);
+  }
+  static const AccessMode AccessMode_MIN =
+    IU_AccessMode_AccessMode_MIN;
+  static const AccessMode AccessMode_MAX =
+    IU_AccessMode_AccessMode_MAX;
+  static const int AccessMode_ARRAYSIZE =
+    IU_AccessMode_AccessMode_ARRAYSIZE;
+  static inline const ::google::protobuf::EnumDescriptor*
+  AccessMode_descriptor() {
+    return IU_AccessMode_descriptor();
+  }
+  static inline const ::std::string& AccessMode_Name(AccessMode value) {
+    return IU_AccessMode_Name(value);
+  }
+  static inline bool AccessMode_Parse(const ::std::string& name,
+      AccessMode* value) {
+    return IU_AccessMode_Parse(name, value);
+  }
+  
+  // accessors -------------------------------------------------------
+  
+  // required string uid = 1;
+  inline bool has_uid() const;
+  inline void clear_uid();
+  static const int kUidFieldNumber = 1;
+  inline const ::std::string& uid() const;
+  inline void set_uid(const ::std::string& value);
+  inline void set_uid(const char* value);
+  inline void set_uid(const char* value, size_t size);
+  inline ::std::string* mutable_uid();
+  inline ::std::string* release_uid();
+  
+  // required uint32 revision = 2;
+  inline bool has_revision() const;
+  inline void clear_revision();
+  static const int kRevisionFieldNumber = 2;
+  inline ::google::protobuf::uint32 revision() const;
+  inline void set_revision(::google::protobuf::uint32 value);
+  
+  // required string category = 3 [default = "undef"];
+  inline bool has_category() const;
+  inline void clear_category();
+  static const int kCategoryFieldNumber = 3;
+  inline const ::std::string& category() const;
+  inline void set_category(const ::std::string& value);
+  inline void set_category(const char* value);
+  inline void set_category(const char* value, size_t size);
+  inline ::std::string* mutable_category();
+  inline ::std::string* release_category();
+  
+  // required string payload_type = 4 [default = "MAP"];
+  inline bool has_payload_type() const;
+  inline void clear_payload_type();
+  static const int kPayloadTypeFieldNumber = 4;
+  inline const ::std::string& payload_type() const;
+  inline void set_payload_type(const ::std::string& value);
+  inline void set_payload_type(const char* value);
+  inline void set_payload_type(const char* value, size_t size);
+  inline ::std::string* mutable_payload_type();
+  inline ::std::string* release_payload_type();
+  
+  // required string owner_name = 5;
+  inline bool has_owner_name() const;
+  inline void clear_owner_name();
+  static const int kOwnerNameFieldNumber = 5;
+  inline const ::std::string& owner_name() const;
+  inline void set_owner_name(const ::std::string& value);
+  inline void set_owner_name(const char* value);
+  inline void set_owner_name(const char* value, size_t size);
+  inline ::std::string* mutable_owner_name();
+  inline ::std::string* release_owner_name();
+  
+  // required bool committed = 6 [default = false];
+  inline bool has_committed() const;
+  inline void clear_committed();
+  static const int kCommittedFieldNumber = 6;
+  inline bool committed() const;
+  inline void set_committed(bool value);
+  
+  // required .ipaaca.protobuf.IU.AccessMode access_mode = 7 [default = PUSH];
+  inline bool has_access_mode() const;
+  inline void clear_access_mode();
+  static const int kAccessModeFieldNumber = 7;
+  inline ::ipaaca::protobuf::IU_AccessMode access_mode() const;
+  inline void set_access_mode(::ipaaca::protobuf::IU_AccessMode value);
+  
+  // required bool read_only = 8 [default = false];
+  inline bool has_read_only() const;
+  inline void clear_read_only();
+  static const int kReadOnlyFieldNumber = 8;
+  inline bool read_only() const;
+  inline void set_read_only(bool value);
+  
+  // repeated .ipaaca.protobuf.PayloadItem payload = 9;
+  inline int payload_size() const;
+  inline void clear_payload();
+  static const int kPayloadFieldNumber = 9;
+  inline const ::ipaaca::protobuf::PayloadItem& payload(int index) const;
+  inline ::ipaaca::protobuf::PayloadItem* mutable_payload(int index);
+  inline ::ipaaca::protobuf::PayloadItem* add_payload();
+  inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >&
+      payload() const;
+  inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >*
+      mutable_payload();
+  
+  // repeated .ipaaca.protobuf.LinkSet links = 10;
+  inline int links_size() const;
+  inline void clear_links();
+  static const int kLinksFieldNumber = 10;
+  inline const ::ipaaca::protobuf::LinkSet& links(int index) const;
+  inline ::ipaaca::protobuf::LinkSet* mutable_links(int index);
+  inline ::ipaaca::protobuf::LinkSet* add_links();
+  inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >&
+      links() const;
+  inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >*
+      mutable_links();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IU)
+ private:
+  inline void set_has_uid();
+  inline void clear_has_uid();
+  inline void set_has_revision();
+  inline void clear_has_revision();
+  inline void set_has_category();
+  inline void clear_has_category();
+  inline void set_has_payload_type();
+  inline void clear_has_payload_type();
+  inline void set_has_owner_name();
+  inline void clear_has_owner_name();
+  inline void set_has_committed();
+  inline void clear_has_committed();
+  inline void set_has_access_mode();
+  inline void clear_has_access_mode();
+  inline void set_has_read_only();
+  inline void clear_has_read_only();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* uid_;
+  ::std::string* category_;
+  static const ::std::string _default_category_;
+  ::std::string* payload_type_;
+  static const ::std::string _default_payload_type_;
+  ::google::protobuf::uint32 revision_;
+  int access_mode_;
+  ::std::string* owner_name_;
+  ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem > payload_;
+  ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet > links_;
+  bool committed_;
+  bool read_only_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(10 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IU* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class IUPayloadUpdate : public ::google::protobuf::Message {
+ public:
+  IUPayloadUpdate();
+  virtual ~IUPayloadUpdate();
+  
+  IUPayloadUpdate(const IUPayloadUpdate& from);
+  
+  inline IUPayloadUpdate& operator=(const IUPayloadUpdate& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IUPayloadUpdate& default_instance();
+  
+  void Swap(IUPayloadUpdate* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IUPayloadUpdate* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IUPayloadUpdate& from);
+  void MergeFrom(const IUPayloadUpdate& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string uid = 1;
+  inline bool has_uid() const;
+  inline void clear_uid();
+  static const int kUidFieldNumber = 1;
+  inline const ::std::string& uid() const;
+  inline void set_uid(const ::std::string& value);
+  inline void set_uid(const char* value);
+  inline void set_uid(const char* value, size_t size);
+  inline ::std::string* mutable_uid();
+  inline ::std::string* release_uid();
+  
+  // required uint32 revision = 2;
+  inline bool has_revision() const;
+  inline void clear_revision();
+  static const int kRevisionFieldNumber = 2;
+  inline ::google::protobuf::uint32 revision() const;
+  inline void set_revision(::google::protobuf::uint32 value);
+  
+  // repeated .ipaaca.protobuf.PayloadItem new_items = 3;
+  inline int new_items_size() const;
+  inline void clear_new_items();
+  static const int kNewItemsFieldNumber = 3;
+  inline const ::ipaaca::protobuf::PayloadItem& new_items(int index) const;
+  inline ::ipaaca::protobuf::PayloadItem* mutable_new_items(int index);
+  inline ::ipaaca::protobuf::PayloadItem* add_new_items();
+  inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >&
+      new_items() const;
+  inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >*
+      mutable_new_items();
+  
+  // repeated string keys_to_remove = 4;
+  inline int keys_to_remove_size() const;
+  inline void clear_keys_to_remove();
+  static const int kKeysToRemoveFieldNumber = 4;
+  inline const ::std::string& keys_to_remove(int index) const;
+  inline ::std::string* mutable_keys_to_remove(int index);
+  inline void set_keys_to_remove(int index, const ::std::string& value);
+  inline void set_keys_to_remove(int index, const char* value);
+  inline void set_keys_to_remove(int index, const char* value, size_t size);
+  inline ::std::string* add_keys_to_remove();
+  inline void add_keys_to_remove(const ::std::string& value);
+  inline void add_keys_to_remove(const char* value);
+  inline void add_keys_to_remove(const char* value, size_t size);
+  inline const ::google::protobuf::RepeatedPtrField< ::std::string>& keys_to_remove() const;
+  inline ::google::protobuf::RepeatedPtrField< ::std::string>* mutable_keys_to_remove();
+  
+  // required bool is_delta = 5 [default = false];
+  inline bool has_is_delta() const;
+  inline void clear_is_delta();
+  static const int kIsDeltaFieldNumber = 5;
+  inline bool is_delta() const;
+  inline void set_is_delta(bool value);
+  
+  // required string writer_name = 6;
+  inline bool has_writer_name() const;
+  inline void clear_writer_name();
+  static const int kWriterNameFieldNumber = 6;
+  inline const ::std::string& writer_name() const;
+  inline void set_writer_name(const ::std::string& value);
+  inline void set_writer_name(const char* value);
+  inline void set_writer_name(const char* value, size_t size);
+  inline ::std::string* mutable_writer_name();
+  inline ::std::string* release_writer_name();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IUPayloadUpdate)
+ private:
+  inline void set_has_uid();
+  inline void clear_has_uid();
+  inline void set_has_revision();
+  inline void clear_has_revision();
+  inline void set_has_is_delta();
+  inline void clear_has_is_delta();
+  inline void set_has_writer_name();
+  inline void clear_has_writer_name();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* uid_;
+  ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem > new_items_;
+  ::google::protobuf::uint32 revision_;
+  bool is_delta_;
+  ::google::protobuf::RepeatedPtrField< ::std::string> keys_to_remove_;
+  ::std::string* writer_name_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IUPayloadUpdate* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class IURetraction : public ::google::protobuf::Message {
+ public:
+  IURetraction();
+  virtual ~IURetraction();
+  
+  IURetraction(const IURetraction& from);
+  
+  inline IURetraction& operator=(const IURetraction& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IURetraction& default_instance();
+  
+  void Swap(IURetraction* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IURetraction* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IURetraction& from);
+  void MergeFrom(const IURetraction& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string uid = 1;
+  inline bool has_uid() const;
+  inline void clear_uid();
+  static const int kUidFieldNumber = 1;
+  inline const ::std::string& uid() const;
+  inline void set_uid(const ::std::string& value);
+  inline void set_uid(const char* value);
+  inline void set_uid(const char* value, size_t size);
+  inline ::std::string* mutable_uid();
+  inline ::std::string* release_uid();
+  
+  // required uint32 revision = 2;
+  inline bool has_revision() const;
+  inline void clear_revision();
+  static const int kRevisionFieldNumber = 2;
+  inline ::google::protobuf::uint32 revision() const;
+  inline void set_revision(::google::protobuf::uint32 value);
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IURetraction)
+ private:
+  inline void set_has_uid();
+  inline void clear_has_uid();
+  inline void set_has_revision();
+  inline void clear_has_revision();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* uid_;
+  ::google::protobuf::uint32 revision_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IURetraction* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class IUCommission : public ::google::protobuf::Message {
+ public:
+  IUCommission();
+  virtual ~IUCommission();
+  
+  IUCommission(const IUCommission& from);
+  
+  inline IUCommission& operator=(const IUCommission& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IUCommission& default_instance();
+  
+  void Swap(IUCommission* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IUCommission* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IUCommission& from);
+  void MergeFrom(const IUCommission& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string uid = 1;
+  inline bool has_uid() const;
+  inline void clear_uid();
+  static const int kUidFieldNumber = 1;
+  inline const ::std::string& uid() const;
+  inline void set_uid(const ::std::string& value);
+  inline void set_uid(const char* value);
+  inline void set_uid(const char* value, size_t size);
+  inline ::std::string* mutable_uid();
+  inline ::std::string* release_uid();
+  
+  // required uint32 revision = 2;
+  inline bool has_revision() const;
+  inline void clear_revision();
+  static const int kRevisionFieldNumber = 2;
+  inline ::google::protobuf::uint32 revision() const;
+  inline void set_revision(::google::protobuf::uint32 value);
+  
+  // required string writer_name = 3;
+  inline bool has_writer_name() const;
+  inline void clear_writer_name();
+  static const int kWriterNameFieldNumber = 3;
+  inline const ::std::string& writer_name() const;
+  inline void set_writer_name(const ::std::string& value);
+  inline void set_writer_name(const char* value);
+  inline void set_writer_name(const char* value, size_t size);
+  inline ::std::string* mutable_writer_name();
+  inline ::std::string* release_writer_name();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IUCommission)
+ private:
+  inline void set_has_uid();
+  inline void clear_has_uid();
+  inline void set_has_revision();
+  inline void clear_has_revision();
+  inline void set_has_writer_name();
+  inline void clear_has_writer_name();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* uid_;
+  ::std::string* writer_name_;
+  ::google::protobuf::uint32 revision_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(3 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IUCommission* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class IUResendRequest : public ::google::protobuf::Message {
+ public:
+  IUResendRequest();
+  virtual ~IUResendRequest();
+  
+  IUResendRequest(const IUResendRequest& from);
+  
+  inline IUResendRequest& operator=(const IUResendRequest& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IUResendRequest& default_instance();
+  
+  void Swap(IUResendRequest* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IUResendRequest* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IUResendRequest& from);
+  void MergeFrom(const IUResendRequest& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string uid = 1;
+  inline bool has_uid() const;
+  inline void clear_uid();
+  static const int kUidFieldNumber = 1;
+  inline const ::std::string& uid() const;
+  inline void set_uid(const ::std::string& value);
+  inline void set_uid(const char* value);
+  inline void set_uid(const char* value, size_t size);
+  inline ::std::string* mutable_uid();
+  inline ::std::string* release_uid();
+  
+  // required string hidden_scope_name = 2;
+  inline bool has_hidden_scope_name() const;
+  inline void clear_hidden_scope_name();
+  static const int kHiddenScopeNameFieldNumber = 2;
+  inline const ::std::string& hidden_scope_name() const;
+  inline void set_hidden_scope_name(const ::std::string& value);
+  inline void set_hidden_scope_name(const char* value);
+  inline void set_hidden_scope_name(const char* value, size_t size);
+  inline ::std::string* mutable_hidden_scope_name();
+  inline ::std::string* release_hidden_scope_name();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IUResendRequest)
+ private:
+  inline void set_has_uid();
+  inline void clear_has_uid();
+  inline void set_has_hidden_scope_name();
+  inline void clear_has_hidden_scope_name();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* uid_;
+  ::std::string* hidden_scope_name_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(2 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IUResendRequest* default_instance_;
+};
+// -------------------------------------------------------------------
+
+class IULinkUpdate : public ::google::protobuf::Message {
+ public:
+  IULinkUpdate();
+  virtual ~IULinkUpdate();
+  
+  IULinkUpdate(const IULinkUpdate& from);
+  
+  inline IULinkUpdate& operator=(const IULinkUpdate& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  
+  inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const {
+    return _unknown_fields_;
+  }
+  
+  inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() {
+    return &_unknown_fields_;
+  }
+  
+  static const ::google::protobuf::Descriptor* descriptor();
+  static const IULinkUpdate& default_instance();
+  
+  void Swap(IULinkUpdate* other);
+  
+  // implements Message ----------------------------------------------
+  
+  IULinkUpdate* New() const;
+  void CopyFrom(const ::google::protobuf::Message& from);
+  void MergeFrom(const ::google::protobuf::Message& from);
+  void CopyFrom(const IULinkUpdate& from);
+  void MergeFrom(const IULinkUpdate& from);
+  void Clear();
+  bool IsInitialized() const;
+  
+  int ByteSize() const;
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input);
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const;
+  ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const;
+  int GetCachedSize() const { return _cached_size_; }
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const;
+  public:
+  
+  ::google::protobuf::Metadata GetMetadata() const;
+  
+  // nested types ----------------------------------------------------
+  
+  // accessors -------------------------------------------------------
+  
+  // required string uid = 1;
+  inline bool has_uid() const;
+  inline void clear_uid();
+  static const int kUidFieldNumber = 1;
+  inline const ::std::string& uid() const;
+  inline void set_uid(const ::std::string& value);
+  inline void set_uid(const char* value);
+  inline void set_uid(const char* value, size_t size);
+  inline ::std::string* mutable_uid();
+  inline ::std::string* release_uid();
+  
+  // required uint32 revision = 2;
+  inline bool has_revision() const;
+  inline void clear_revision();
+  static const int kRevisionFieldNumber = 2;
+  inline ::google::protobuf::uint32 revision() const;
+  inline void set_revision(::google::protobuf::uint32 value);
+  
+  // repeated .ipaaca.protobuf.LinkSet new_links = 3;
+  inline int new_links_size() const;
+  inline void clear_new_links();
+  static const int kNewLinksFieldNumber = 3;
+  inline const ::ipaaca::protobuf::LinkSet& new_links(int index) const;
+  inline ::ipaaca::protobuf::LinkSet* mutable_new_links(int index);
+  inline ::ipaaca::protobuf::LinkSet* add_new_links();
+  inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >&
+      new_links() const;
+  inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >*
+      mutable_new_links();
+  
+  // repeated .ipaaca.protobuf.LinkSet links_to_remove = 4;
+  inline int links_to_remove_size() const;
+  inline void clear_links_to_remove();
+  static const int kLinksToRemoveFieldNumber = 4;
+  inline const ::ipaaca::protobuf::LinkSet& links_to_remove(int index) const;
+  inline ::ipaaca::protobuf::LinkSet* mutable_links_to_remove(int index);
+  inline ::ipaaca::protobuf::LinkSet* add_links_to_remove();
+  inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >&
+      links_to_remove() const;
+  inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >*
+      mutable_links_to_remove();
+  
+  // required bool is_delta = 5 [default = false];
+  inline bool has_is_delta() const;
+  inline void clear_is_delta();
+  static const int kIsDeltaFieldNumber = 5;
+  inline bool is_delta() const;
+  inline void set_is_delta(bool value);
+  
+  // required string writer_name = 6;
+  inline bool has_writer_name() const;
+  inline void clear_writer_name();
+  static const int kWriterNameFieldNumber = 6;
+  inline const ::std::string& writer_name() const;
+  inline void set_writer_name(const ::std::string& value);
+  inline void set_writer_name(const char* value);
+  inline void set_writer_name(const char* value, size_t size);
+  inline ::std::string* mutable_writer_name();
+  inline ::std::string* release_writer_name();
+  
+  // @@protoc_insertion_point(class_scope:ipaaca.protobuf.IULinkUpdate)
+ private:
+  inline void set_has_uid();
+  inline void clear_has_uid();
+  inline void set_has_revision();
+  inline void clear_has_revision();
+  inline void set_has_is_delta();
+  inline void clear_has_is_delta();
+  inline void set_has_writer_name();
+  inline void clear_has_writer_name();
+  
+  ::google::protobuf::UnknownFieldSet _unknown_fields_;
+  
+  ::std::string* uid_;
+  ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet > new_links_;
+  ::google::protobuf::uint32 revision_;
+  bool is_delta_;
+  ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet > links_to_remove_;
+  ::std::string* writer_name_;
+  
+  mutable int _cached_size_;
+  ::google::protobuf::uint32 _has_bits_[(6 + 31) / 32];
+  
+  friend void  protobuf_AddDesc_ipaaca_2eproto();
+  friend void protobuf_AssignDesc_ipaaca_2eproto();
+  friend void protobuf_ShutdownFile_ipaaca_2eproto();
+  
+  void InitAsDefaultInstance();
+  static IULinkUpdate* default_instance_;
+};
+// ===================================================================
+
+
+// ===================================================================
+
+// IntMessage
+
+// required sint32 value = 1;
+inline bool IntMessage::has_value() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IntMessage::set_has_value() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IntMessage::clear_has_value() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IntMessage::clear_value() {
+  value_ = 0;
+  clear_has_value();
+}
+inline ::google::protobuf::int32 IntMessage::value() const {
+  return value_;
+}
+inline void IntMessage::set_value(::google::protobuf::int32 value) {
+  set_has_value();
+  value_ = value;
+}
+
+// -------------------------------------------------------------------
+
+// LinkSet
+
+// required string type = 1;
+inline bool LinkSet::has_type() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void LinkSet::set_has_type() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void LinkSet::clear_has_type() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void LinkSet::clear_type() {
+  if (type_ != &::google::protobuf::internal::kEmptyString) {
+    type_->clear();
+  }
+  clear_has_type();
+}
+inline const ::std::string& LinkSet::type() const {
+  return *type_;
+}
+inline void LinkSet::set_type(const ::std::string& value) {
+  set_has_type();
+  if (type_ == &::google::protobuf::internal::kEmptyString) {
+    type_ = new ::std::string;
+  }
+  type_->assign(value);
+}
+inline void LinkSet::set_type(const char* value) {
+  set_has_type();
+  if (type_ == &::google::protobuf::internal::kEmptyString) {
+    type_ = new ::std::string;
+  }
+  type_->assign(value);
+}
+inline void LinkSet::set_type(const char* value, size_t size) {
+  set_has_type();
+  if (type_ == &::google::protobuf::internal::kEmptyString) {
+    type_ = new ::std::string;
+  }
+  type_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* LinkSet::mutable_type() {
+  set_has_type();
+  if (type_ == &::google::protobuf::internal::kEmptyString) {
+    type_ = new ::std::string;
+  }
+  return type_;
+}
+inline ::std::string* LinkSet::release_type() {
+  clear_has_type();
+  if (type_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = type_;
+    type_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// repeated string targets = 2;
+inline int LinkSet::targets_size() const {
+  return targets_.size();
+}
+inline void LinkSet::clear_targets() {
+  targets_.Clear();
+}
+inline const ::std::string& LinkSet::targets(int index) const {
+  return targets_.Get(index);
+}
+inline ::std::string* LinkSet::mutable_targets(int index) {
+  return targets_.Mutable(index);
+}
+inline void LinkSet::set_targets(int index, const ::std::string& value) {
+  targets_.Mutable(index)->assign(value);
+}
+inline void LinkSet::set_targets(int index, const char* value) {
+  targets_.Mutable(index)->assign(value);
+}
+inline void LinkSet::set_targets(int index, const char* value, size_t size) {
+  targets_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* LinkSet::add_targets() {
+  return targets_.Add();
+}
+inline void LinkSet::add_targets(const ::std::string& value) {
+  targets_.Add()->assign(value);
+}
+inline void LinkSet::add_targets(const char* value) {
+  targets_.Add()->assign(value);
+}
+inline void LinkSet::add_targets(const char* value, size_t size) {
+  targets_.Add()->assign(reinterpret_cast<const char*>(value), size);
+}
+inline const ::google::protobuf::RepeatedPtrField< ::std::string>&
+LinkSet::targets() const {
+  return targets_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::std::string>*
+LinkSet::mutable_targets() {
+  return &targets_;
+}
+
+// -------------------------------------------------------------------
+
+// PayloadItem
+
+// required string key = 1;
+inline bool PayloadItem::has_key() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void PayloadItem::set_has_key() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void PayloadItem::clear_has_key() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void PayloadItem::clear_key() {
+  if (key_ != &::google::protobuf::internal::kEmptyString) {
+    key_->clear();
+  }
+  clear_has_key();
+}
+inline const ::std::string& PayloadItem::key() const {
+  return *key_;
+}
+inline void PayloadItem::set_key(const ::std::string& value) {
+  set_has_key();
+  if (key_ == &::google::protobuf::internal::kEmptyString) {
+    key_ = new ::std::string;
+  }
+  key_->assign(value);
+}
+inline void PayloadItem::set_key(const char* value) {
+  set_has_key();
+  if (key_ == &::google::protobuf::internal::kEmptyString) {
+    key_ = new ::std::string;
+  }
+  key_->assign(value);
+}
+inline void PayloadItem::set_key(const char* value, size_t size) {
+  set_has_key();
+  if (key_ == &::google::protobuf::internal::kEmptyString) {
+    key_ = new ::std::string;
+  }
+  key_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* PayloadItem::mutable_key() {
+  set_has_key();
+  if (key_ == &::google::protobuf::internal::kEmptyString) {
+    key_ = new ::std::string;
+  }
+  return key_;
+}
+inline ::std::string* PayloadItem::release_key() {
+  clear_has_key();
+  if (key_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = key_;
+    key_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required string value = 2;
+inline bool PayloadItem::has_value() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void PayloadItem::set_has_value() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void PayloadItem::clear_has_value() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void PayloadItem::clear_value() {
+  if (value_ != &::google::protobuf::internal::kEmptyString) {
+    value_->clear();
+  }
+  clear_has_value();
+}
+inline const ::std::string& PayloadItem::value() const {
+  return *value_;
+}
+inline void PayloadItem::set_value(const ::std::string& value) {
+  set_has_value();
+  if (value_ == &::google::protobuf::internal::kEmptyString) {
+    value_ = new ::std::string;
+  }
+  value_->assign(value);
+}
+inline void PayloadItem::set_value(const char* value) {
+  set_has_value();
+  if (value_ == &::google::protobuf::internal::kEmptyString) {
+    value_ = new ::std::string;
+  }
+  value_->assign(value);
+}
+inline void PayloadItem::set_value(const char* value, size_t size) {
+  set_has_value();
+  if (value_ == &::google::protobuf::internal::kEmptyString) {
+    value_ = new ::std::string;
+  }
+  value_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* PayloadItem::mutable_value() {
+  set_has_value();
+  if (value_ == &::google::protobuf::internal::kEmptyString) {
+    value_ = new ::std::string;
+  }
+  return value_;
+}
+inline ::std::string* PayloadItem::release_value() {
+  clear_has_value();
+  if (value_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = value_;
+    value_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required string type = 3 [default = "str"];
+inline bool PayloadItem::has_type() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+inline void PayloadItem::set_has_type() {
+  _has_bits_[0] |= 0x00000004u;
+}
+inline void PayloadItem::clear_has_type() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+inline void PayloadItem::clear_type() {
+  if (type_ != &_default_type_) {
+    type_->assign(_default_type_);
+  }
+  clear_has_type();
+}
+inline const ::std::string& PayloadItem::type() const {
+  return *type_;
+}
+inline void PayloadItem::set_type(const ::std::string& value) {
+  set_has_type();
+  if (type_ == &_default_type_) {
+    type_ = new ::std::string;
+  }
+  type_->assign(value);
+}
+inline void PayloadItem::set_type(const char* value) {
+  set_has_type();
+  if (type_ == &_default_type_) {
+    type_ = new ::std::string;
+  }
+  type_->assign(value);
+}
+inline void PayloadItem::set_type(const char* value, size_t size) {
+  set_has_type();
+  if (type_ == &_default_type_) {
+    type_ = new ::std::string;
+  }
+  type_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* PayloadItem::mutable_type() {
+  set_has_type();
+  if (type_ == &_default_type_) {
+    type_ = new ::std::string(_default_type_);
+  }
+  return type_;
+}
+inline ::std::string* PayloadItem::release_type() {
+  clear_has_type();
+  if (type_ == &_default_type_) {
+    return NULL;
+  } else {
+    ::std::string* temp = type_;
+    type_ = const_cast< ::std::string*>(&_default_type_);
+    return temp;
+  }
+}
+
+// -------------------------------------------------------------------
+
+// IU
+
+// required string uid = 1;
+inline bool IU::has_uid() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IU::set_has_uid() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IU::clear_has_uid() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IU::clear_uid() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    uid_->clear();
+  }
+  clear_has_uid();
+}
+inline const ::std::string& IU::uid() const {
+  return *uid_;
+}
+inline void IU::set_uid(const ::std::string& value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IU::set_uid(const char* value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IU::set_uid(const char* value, size_t size) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IU::mutable_uid() {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  return uid_;
+}
+inline ::std::string* IU::release_uid() {
+  clear_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = uid_;
+    uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required uint32 revision = 2;
+inline bool IU::has_revision() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void IU::set_has_revision() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void IU::clear_has_revision() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void IU::clear_revision() {
+  revision_ = 0u;
+  clear_has_revision();
+}
+inline ::google::protobuf::uint32 IU::revision() const {
+  return revision_;
+}
+inline void IU::set_revision(::google::protobuf::uint32 value) {
+  set_has_revision();
+  revision_ = value;
+}
+
+// required string category = 3 [default = "undef"];
+inline bool IU::has_category() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+inline void IU::set_has_category() {
+  _has_bits_[0] |= 0x00000004u;
+}
+inline void IU::clear_has_category() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+inline void IU::clear_category() {
+  if (category_ != &_default_category_) {
+    category_->assign(_default_category_);
+  }
+  clear_has_category();
+}
+inline const ::std::string& IU::category() const {
+  return *category_;
+}
+inline void IU::set_category(const ::std::string& value) {
+  set_has_category();
+  if (category_ == &_default_category_) {
+    category_ = new ::std::string;
+  }
+  category_->assign(value);
+}
+inline void IU::set_category(const char* value) {
+  set_has_category();
+  if (category_ == &_default_category_) {
+    category_ = new ::std::string;
+  }
+  category_->assign(value);
+}
+inline void IU::set_category(const char* value, size_t size) {
+  set_has_category();
+  if (category_ == &_default_category_) {
+    category_ = new ::std::string;
+  }
+  category_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IU::mutable_category() {
+  set_has_category();
+  if (category_ == &_default_category_) {
+    category_ = new ::std::string(_default_category_);
+  }
+  return category_;
+}
+inline ::std::string* IU::release_category() {
+  clear_has_category();
+  if (category_ == &_default_category_) {
+    return NULL;
+  } else {
+    ::std::string* temp = category_;
+    category_ = const_cast< ::std::string*>(&_default_category_);
+    return temp;
+  }
+}
+
+// required string payload_type = 4 [default = "MAP"];
+inline bool IU::has_payload_type() const {
+  return (_has_bits_[0] & 0x00000008u) != 0;
+}
+inline void IU::set_has_payload_type() {
+  _has_bits_[0] |= 0x00000008u;
+}
+inline void IU::clear_has_payload_type() {
+  _has_bits_[0] &= ~0x00000008u;
+}
+inline void IU::clear_payload_type() {
+  if (payload_type_ != &_default_payload_type_) {
+    payload_type_->assign(_default_payload_type_);
+  }
+  clear_has_payload_type();
+}
+inline const ::std::string& IU::payload_type() const {
+  return *payload_type_;
+}
+inline void IU::set_payload_type(const ::std::string& value) {
+  set_has_payload_type();
+  if (payload_type_ == &_default_payload_type_) {
+    payload_type_ = new ::std::string;
+  }
+  payload_type_->assign(value);
+}
+inline void IU::set_payload_type(const char* value) {
+  set_has_payload_type();
+  if (payload_type_ == &_default_payload_type_) {
+    payload_type_ = new ::std::string;
+  }
+  payload_type_->assign(value);
+}
+inline void IU::set_payload_type(const char* value, size_t size) {
+  set_has_payload_type();
+  if (payload_type_ == &_default_payload_type_) {
+    payload_type_ = new ::std::string;
+  }
+  payload_type_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IU::mutable_payload_type() {
+  set_has_payload_type();
+  if (payload_type_ == &_default_payload_type_) {
+    payload_type_ = new ::std::string(_default_payload_type_);
+  }
+  return payload_type_;
+}
+inline ::std::string* IU::release_payload_type() {
+  clear_has_payload_type();
+  if (payload_type_ == &_default_payload_type_) {
+    return NULL;
+  } else {
+    ::std::string* temp = payload_type_;
+    payload_type_ = const_cast< ::std::string*>(&_default_payload_type_);
+    return temp;
+  }
+}
+
+// required string owner_name = 5;
+inline bool IU::has_owner_name() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+inline void IU::set_has_owner_name() {
+  _has_bits_[0] |= 0x00000010u;
+}
+inline void IU::clear_has_owner_name() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+inline void IU::clear_owner_name() {
+  if (owner_name_ != &::google::protobuf::internal::kEmptyString) {
+    owner_name_->clear();
+  }
+  clear_has_owner_name();
+}
+inline const ::std::string& IU::owner_name() const {
+  return *owner_name_;
+}
+inline void IU::set_owner_name(const ::std::string& value) {
+  set_has_owner_name();
+  if (owner_name_ == &::google::protobuf::internal::kEmptyString) {
+    owner_name_ = new ::std::string;
+  }
+  owner_name_->assign(value);
+}
+inline void IU::set_owner_name(const char* value) {
+  set_has_owner_name();
+  if (owner_name_ == &::google::protobuf::internal::kEmptyString) {
+    owner_name_ = new ::std::string;
+  }
+  owner_name_->assign(value);
+}
+inline void IU::set_owner_name(const char* value, size_t size) {
+  set_has_owner_name();
+  if (owner_name_ == &::google::protobuf::internal::kEmptyString) {
+    owner_name_ = new ::std::string;
+  }
+  owner_name_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IU::mutable_owner_name() {
+  set_has_owner_name();
+  if (owner_name_ == &::google::protobuf::internal::kEmptyString) {
+    owner_name_ = new ::std::string;
+  }
+  return owner_name_;
+}
+inline ::std::string* IU::release_owner_name() {
+  clear_has_owner_name();
+  if (owner_name_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = owner_name_;
+    owner_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required bool committed = 6 [default = false];
+inline bool IU::has_committed() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+inline void IU::set_has_committed() {
+  _has_bits_[0] |= 0x00000020u;
+}
+inline void IU::clear_has_committed() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+inline void IU::clear_committed() {
+  committed_ = false;
+  clear_has_committed();
+}
+inline bool IU::committed() const {
+  return committed_;
+}
+inline void IU::set_committed(bool value) {
+  set_has_committed();
+  committed_ = value;
+}
+
+// required .ipaaca.protobuf.IU.AccessMode access_mode = 7 [default = PUSH];
+inline bool IU::has_access_mode() const {
+  return (_has_bits_[0] & 0x00000040u) != 0;
+}
+inline void IU::set_has_access_mode() {
+  _has_bits_[0] |= 0x00000040u;
+}
+inline void IU::clear_has_access_mode() {
+  _has_bits_[0] &= ~0x00000040u;
+}
+inline void IU::clear_access_mode() {
+  access_mode_ = 0;
+  clear_has_access_mode();
+}
+inline ::ipaaca::protobuf::IU_AccessMode IU::access_mode() const {
+  return static_cast< ::ipaaca::protobuf::IU_AccessMode >(access_mode_);
+}
+inline void IU::set_access_mode(::ipaaca::protobuf::IU_AccessMode value) {
+  GOOGLE_DCHECK(::ipaaca::protobuf::IU_AccessMode_IsValid(value));
+  set_has_access_mode();
+  access_mode_ = value;
+}
+
+// required bool read_only = 8 [default = false];
+inline bool IU::has_read_only() const {
+  return (_has_bits_[0] & 0x00000080u) != 0;
+}
+inline void IU::set_has_read_only() {
+  _has_bits_[0] |= 0x00000080u;
+}
+inline void IU::clear_has_read_only() {
+  _has_bits_[0] &= ~0x00000080u;
+}
+inline void IU::clear_read_only() {
+  read_only_ = false;
+  clear_has_read_only();
+}
+inline bool IU::read_only() const {
+  return read_only_;
+}
+inline void IU::set_read_only(bool value) {
+  set_has_read_only();
+  read_only_ = value;
+}
+
+// repeated .ipaaca.protobuf.PayloadItem payload = 9;
+inline int IU::payload_size() const {
+  return payload_.size();
+}
+inline void IU::clear_payload() {
+  payload_.Clear();
+}
+inline const ::ipaaca::protobuf::PayloadItem& IU::payload(int index) const {
+  return payload_.Get(index);
+}
+inline ::ipaaca::protobuf::PayloadItem* IU::mutable_payload(int index) {
+  return payload_.Mutable(index);
+}
+inline ::ipaaca::protobuf::PayloadItem* IU::add_payload() {
+  return payload_.Add();
+}
+inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >&
+IU::payload() const {
+  return payload_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >*
+IU::mutable_payload() {
+  return &payload_;
+}
+
+// repeated .ipaaca.protobuf.LinkSet links = 10;
+inline int IU::links_size() const {
+  return links_.size();
+}
+inline void IU::clear_links() {
+  links_.Clear();
+}
+inline const ::ipaaca::protobuf::LinkSet& IU::links(int index) const {
+  return links_.Get(index);
+}
+inline ::ipaaca::protobuf::LinkSet* IU::mutable_links(int index) {
+  return links_.Mutable(index);
+}
+inline ::ipaaca::protobuf::LinkSet* IU::add_links() {
+  return links_.Add();
+}
+inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >&
+IU::links() const {
+  return links_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >*
+IU::mutable_links() {
+  return &links_;
+}
+
+// -------------------------------------------------------------------
+
+// IUPayloadUpdate
+
+// required string uid = 1;
+inline bool IUPayloadUpdate::has_uid() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IUPayloadUpdate::set_has_uid() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IUPayloadUpdate::clear_has_uid() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IUPayloadUpdate::clear_uid() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    uid_->clear();
+  }
+  clear_has_uid();
+}
+inline const ::std::string& IUPayloadUpdate::uid() const {
+  return *uid_;
+}
+inline void IUPayloadUpdate::set_uid(const ::std::string& value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IUPayloadUpdate::set_uid(const char* value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IUPayloadUpdate::set_uid(const char* value, size_t size) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUPayloadUpdate::mutable_uid() {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  return uid_;
+}
+inline ::std::string* IUPayloadUpdate::release_uid() {
+  clear_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = uid_;
+    uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required uint32 revision = 2;
+inline bool IUPayloadUpdate::has_revision() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void IUPayloadUpdate::set_has_revision() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void IUPayloadUpdate::clear_has_revision() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void IUPayloadUpdate::clear_revision() {
+  revision_ = 0u;
+  clear_has_revision();
+}
+inline ::google::protobuf::uint32 IUPayloadUpdate::revision() const {
+  return revision_;
+}
+inline void IUPayloadUpdate::set_revision(::google::protobuf::uint32 value) {
+  set_has_revision();
+  revision_ = value;
+}
+
+// repeated .ipaaca.protobuf.PayloadItem new_items = 3;
+inline int IUPayloadUpdate::new_items_size() const {
+  return new_items_.size();
+}
+inline void IUPayloadUpdate::clear_new_items() {
+  new_items_.Clear();
+}
+inline const ::ipaaca::protobuf::PayloadItem& IUPayloadUpdate::new_items(int index) const {
+  return new_items_.Get(index);
+}
+inline ::ipaaca::protobuf::PayloadItem* IUPayloadUpdate::mutable_new_items(int index) {
+  return new_items_.Mutable(index);
+}
+inline ::ipaaca::protobuf::PayloadItem* IUPayloadUpdate::add_new_items() {
+  return new_items_.Add();
+}
+inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >&
+IUPayloadUpdate::new_items() const {
+  return new_items_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::PayloadItem >*
+IUPayloadUpdate::mutable_new_items() {
+  return &new_items_;
+}
+
+// repeated string keys_to_remove = 4;
+inline int IUPayloadUpdate::keys_to_remove_size() const {
+  return keys_to_remove_.size();
+}
+inline void IUPayloadUpdate::clear_keys_to_remove() {
+  keys_to_remove_.Clear();
+}
+inline const ::std::string& IUPayloadUpdate::keys_to_remove(int index) const {
+  return keys_to_remove_.Get(index);
+}
+inline ::std::string* IUPayloadUpdate::mutable_keys_to_remove(int index) {
+  return keys_to_remove_.Mutable(index);
+}
+inline void IUPayloadUpdate::set_keys_to_remove(int index, const ::std::string& value) {
+  keys_to_remove_.Mutable(index)->assign(value);
+}
+inline void IUPayloadUpdate::set_keys_to_remove(int index, const char* value) {
+  keys_to_remove_.Mutable(index)->assign(value);
+}
+inline void IUPayloadUpdate::set_keys_to_remove(int index, const char* value, size_t size) {
+  keys_to_remove_.Mutable(index)->assign(
+    reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUPayloadUpdate::add_keys_to_remove() {
+  return keys_to_remove_.Add();
+}
+inline void IUPayloadUpdate::add_keys_to_remove(const ::std::string& value) {
+  keys_to_remove_.Add()->assign(value);
+}
+inline void IUPayloadUpdate::add_keys_to_remove(const char* value) {
+  keys_to_remove_.Add()->assign(value);
+}
+inline void IUPayloadUpdate::add_keys_to_remove(const char* value, size_t size) {
+  keys_to_remove_.Add()->assign(reinterpret_cast<const char*>(value), size);
+}
+inline const ::google::protobuf::RepeatedPtrField< ::std::string>&
+IUPayloadUpdate::keys_to_remove() const {
+  return keys_to_remove_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::std::string>*
+IUPayloadUpdate::mutable_keys_to_remove() {
+  return &keys_to_remove_;
+}
+
+// required bool is_delta = 5 [default = false];
+inline bool IUPayloadUpdate::has_is_delta() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+inline void IUPayloadUpdate::set_has_is_delta() {
+  _has_bits_[0] |= 0x00000010u;
+}
+inline void IUPayloadUpdate::clear_has_is_delta() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+inline void IUPayloadUpdate::clear_is_delta() {
+  is_delta_ = false;
+  clear_has_is_delta();
+}
+inline bool IUPayloadUpdate::is_delta() const {
+  return is_delta_;
+}
+inline void IUPayloadUpdate::set_is_delta(bool value) {
+  set_has_is_delta();
+  is_delta_ = value;
+}
+
+// required string writer_name = 6;
+inline bool IUPayloadUpdate::has_writer_name() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+inline void IUPayloadUpdate::set_has_writer_name() {
+  _has_bits_[0] |= 0x00000020u;
+}
+inline void IUPayloadUpdate::clear_has_writer_name() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+inline void IUPayloadUpdate::clear_writer_name() {
+  if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+    writer_name_->clear();
+  }
+  clear_has_writer_name();
+}
+inline const ::std::string& IUPayloadUpdate::writer_name() const {
+  return *writer_name_;
+}
+inline void IUPayloadUpdate::set_writer_name(const ::std::string& value) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(value);
+}
+inline void IUPayloadUpdate::set_writer_name(const char* value) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(value);
+}
+inline void IUPayloadUpdate::set_writer_name(const char* value, size_t size) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUPayloadUpdate::mutable_writer_name() {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  return writer_name_;
+}
+inline ::std::string* IUPayloadUpdate::release_writer_name() {
+  clear_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = writer_name_;
+    writer_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// -------------------------------------------------------------------
+
+// IURetraction
+
+// required string uid = 1;
+inline bool IURetraction::has_uid() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IURetraction::set_has_uid() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IURetraction::clear_has_uid() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IURetraction::clear_uid() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    uid_->clear();
+  }
+  clear_has_uid();
+}
+inline const ::std::string& IURetraction::uid() const {
+  return *uid_;
+}
+inline void IURetraction::set_uid(const ::std::string& value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IURetraction::set_uid(const char* value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IURetraction::set_uid(const char* value, size_t size) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IURetraction::mutable_uid() {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  return uid_;
+}
+inline ::std::string* IURetraction::release_uid() {
+  clear_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = uid_;
+    uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required uint32 revision = 2;
+inline bool IURetraction::has_revision() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void IURetraction::set_has_revision() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void IURetraction::clear_has_revision() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void IURetraction::clear_revision() {
+  revision_ = 0u;
+  clear_has_revision();
+}
+inline ::google::protobuf::uint32 IURetraction::revision() const {
+  return revision_;
+}
+inline void IURetraction::set_revision(::google::protobuf::uint32 value) {
+  set_has_revision();
+  revision_ = value;
+}
+
+// -------------------------------------------------------------------
+
+// IUCommission
+
+// required string uid = 1;
+inline bool IUCommission::has_uid() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IUCommission::set_has_uid() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IUCommission::clear_has_uid() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IUCommission::clear_uid() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    uid_->clear();
+  }
+  clear_has_uid();
+}
+inline const ::std::string& IUCommission::uid() const {
+  return *uid_;
+}
+inline void IUCommission::set_uid(const ::std::string& value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IUCommission::set_uid(const char* value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IUCommission::set_uid(const char* value, size_t size) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUCommission::mutable_uid() {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  return uid_;
+}
+inline ::std::string* IUCommission::release_uid() {
+  clear_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = uid_;
+    uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required uint32 revision = 2;
+inline bool IUCommission::has_revision() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void IUCommission::set_has_revision() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void IUCommission::clear_has_revision() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void IUCommission::clear_revision() {
+  revision_ = 0u;
+  clear_has_revision();
+}
+inline ::google::protobuf::uint32 IUCommission::revision() const {
+  return revision_;
+}
+inline void IUCommission::set_revision(::google::protobuf::uint32 value) {
+  set_has_revision();
+  revision_ = value;
+}
+
+// required string writer_name = 3;
+inline bool IUCommission::has_writer_name() const {
+  return (_has_bits_[0] & 0x00000004u) != 0;
+}
+inline void IUCommission::set_has_writer_name() {
+  _has_bits_[0] |= 0x00000004u;
+}
+inline void IUCommission::clear_has_writer_name() {
+  _has_bits_[0] &= ~0x00000004u;
+}
+inline void IUCommission::clear_writer_name() {
+  if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+    writer_name_->clear();
+  }
+  clear_has_writer_name();
+}
+inline const ::std::string& IUCommission::writer_name() const {
+  return *writer_name_;
+}
+inline void IUCommission::set_writer_name(const ::std::string& value) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(value);
+}
+inline void IUCommission::set_writer_name(const char* value) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(value);
+}
+inline void IUCommission::set_writer_name(const char* value, size_t size) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUCommission::mutable_writer_name() {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  return writer_name_;
+}
+inline ::std::string* IUCommission::release_writer_name() {
+  clear_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = writer_name_;
+    writer_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// -------------------------------------------------------------------
+
+// IUResendRequest
+
+// required string uid = 1;
+inline bool IUResendRequest::has_uid() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IUResendRequest::set_has_uid() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IUResendRequest::clear_has_uid() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IUResendRequest::clear_uid() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    uid_->clear();
+  }
+  clear_has_uid();
+}
+inline const ::std::string& IUResendRequest::uid() const {
+  return *uid_;
+}
+inline void IUResendRequest::set_uid(const ::std::string& value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IUResendRequest::set_uid(const char* value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IUResendRequest::set_uid(const char* value, size_t size) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUResendRequest::mutable_uid() {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  return uid_;
+}
+inline ::std::string* IUResendRequest::release_uid() {
+  clear_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = uid_;
+    uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required string hidden_scope_name = 2;
+inline bool IUResendRequest::has_hidden_scope_name() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void IUResendRequest::set_has_hidden_scope_name() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void IUResendRequest::clear_has_hidden_scope_name() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void IUResendRequest::clear_hidden_scope_name() {
+  if (hidden_scope_name_ != &::google::protobuf::internal::kEmptyString) {
+    hidden_scope_name_->clear();
+  }
+  clear_has_hidden_scope_name();
+}
+inline const ::std::string& IUResendRequest::hidden_scope_name() const {
+  return *hidden_scope_name_;
+}
+inline void IUResendRequest::set_hidden_scope_name(const ::std::string& value) {
+  set_has_hidden_scope_name();
+  if (hidden_scope_name_ == &::google::protobuf::internal::kEmptyString) {
+    hidden_scope_name_ = new ::std::string;
+  }
+  hidden_scope_name_->assign(value);
+}
+inline void IUResendRequest::set_hidden_scope_name(const char* value) {
+  set_has_hidden_scope_name();
+  if (hidden_scope_name_ == &::google::protobuf::internal::kEmptyString) {
+    hidden_scope_name_ = new ::std::string;
+  }
+  hidden_scope_name_->assign(value);
+}
+inline void IUResendRequest::set_hidden_scope_name(const char* value, size_t size) {
+  set_has_hidden_scope_name();
+  if (hidden_scope_name_ == &::google::protobuf::internal::kEmptyString) {
+    hidden_scope_name_ = new ::std::string;
+  }
+  hidden_scope_name_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IUResendRequest::mutable_hidden_scope_name() {
+  set_has_hidden_scope_name();
+  if (hidden_scope_name_ == &::google::protobuf::internal::kEmptyString) {
+    hidden_scope_name_ = new ::std::string;
+  }
+  return hidden_scope_name_;
+}
+inline ::std::string* IUResendRequest::release_hidden_scope_name() {
+  clear_has_hidden_scope_name();
+  if (hidden_scope_name_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = hidden_scope_name_;
+    hidden_scope_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// -------------------------------------------------------------------
+
+// IULinkUpdate
+
+// required string uid = 1;
+inline bool IULinkUpdate::has_uid() const {
+  return (_has_bits_[0] & 0x00000001u) != 0;
+}
+inline void IULinkUpdate::set_has_uid() {
+  _has_bits_[0] |= 0x00000001u;
+}
+inline void IULinkUpdate::clear_has_uid() {
+  _has_bits_[0] &= ~0x00000001u;
+}
+inline void IULinkUpdate::clear_uid() {
+  if (uid_ != &::google::protobuf::internal::kEmptyString) {
+    uid_->clear();
+  }
+  clear_has_uid();
+}
+inline const ::std::string& IULinkUpdate::uid() const {
+  return *uid_;
+}
+inline void IULinkUpdate::set_uid(const ::std::string& value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IULinkUpdate::set_uid(const char* value) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(value);
+}
+inline void IULinkUpdate::set_uid(const char* value, size_t size) {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  uid_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IULinkUpdate::mutable_uid() {
+  set_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    uid_ = new ::std::string;
+  }
+  return uid_;
+}
+inline ::std::string* IULinkUpdate::release_uid() {
+  clear_has_uid();
+  if (uid_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = uid_;
+    uid_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+// required uint32 revision = 2;
+inline bool IULinkUpdate::has_revision() const {
+  return (_has_bits_[0] & 0x00000002u) != 0;
+}
+inline void IULinkUpdate::set_has_revision() {
+  _has_bits_[0] |= 0x00000002u;
+}
+inline void IULinkUpdate::clear_has_revision() {
+  _has_bits_[0] &= ~0x00000002u;
+}
+inline void IULinkUpdate::clear_revision() {
+  revision_ = 0u;
+  clear_has_revision();
+}
+inline ::google::protobuf::uint32 IULinkUpdate::revision() const {
+  return revision_;
+}
+inline void IULinkUpdate::set_revision(::google::protobuf::uint32 value) {
+  set_has_revision();
+  revision_ = value;
+}
+
+// repeated .ipaaca.protobuf.LinkSet new_links = 3;
+inline int IULinkUpdate::new_links_size() const {
+  return new_links_.size();
+}
+inline void IULinkUpdate::clear_new_links() {
+  new_links_.Clear();
+}
+inline const ::ipaaca::protobuf::LinkSet& IULinkUpdate::new_links(int index) const {
+  return new_links_.Get(index);
+}
+inline ::ipaaca::protobuf::LinkSet* IULinkUpdate::mutable_new_links(int index) {
+  return new_links_.Mutable(index);
+}
+inline ::ipaaca::protobuf::LinkSet* IULinkUpdate::add_new_links() {
+  return new_links_.Add();
+}
+inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >&
+IULinkUpdate::new_links() const {
+  return new_links_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >*
+IULinkUpdate::mutable_new_links() {
+  return &new_links_;
+}
+
+// repeated .ipaaca.protobuf.LinkSet links_to_remove = 4;
+inline int IULinkUpdate::links_to_remove_size() const {
+  return links_to_remove_.size();
+}
+inline void IULinkUpdate::clear_links_to_remove() {
+  links_to_remove_.Clear();
+}
+inline const ::ipaaca::protobuf::LinkSet& IULinkUpdate::links_to_remove(int index) const {
+  return links_to_remove_.Get(index);
+}
+inline ::ipaaca::protobuf::LinkSet* IULinkUpdate::mutable_links_to_remove(int index) {
+  return links_to_remove_.Mutable(index);
+}
+inline ::ipaaca::protobuf::LinkSet* IULinkUpdate::add_links_to_remove() {
+  return links_to_remove_.Add();
+}
+inline const ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >&
+IULinkUpdate::links_to_remove() const {
+  return links_to_remove_;
+}
+inline ::google::protobuf::RepeatedPtrField< ::ipaaca::protobuf::LinkSet >*
+IULinkUpdate::mutable_links_to_remove() {
+  return &links_to_remove_;
+}
+
+// required bool is_delta = 5 [default = false];
+inline bool IULinkUpdate::has_is_delta() const {
+  return (_has_bits_[0] & 0x00000010u) != 0;
+}
+inline void IULinkUpdate::set_has_is_delta() {
+  _has_bits_[0] |= 0x00000010u;
+}
+inline void IULinkUpdate::clear_has_is_delta() {
+  _has_bits_[0] &= ~0x00000010u;
+}
+inline void IULinkUpdate::clear_is_delta() {
+  is_delta_ = false;
+  clear_has_is_delta();
+}
+inline bool IULinkUpdate::is_delta() const {
+  return is_delta_;
+}
+inline void IULinkUpdate::set_is_delta(bool value) {
+  set_has_is_delta();
+  is_delta_ = value;
+}
+
+// required string writer_name = 6;
+inline bool IULinkUpdate::has_writer_name() const {
+  return (_has_bits_[0] & 0x00000020u) != 0;
+}
+inline void IULinkUpdate::set_has_writer_name() {
+  _has_bits_[0] |= 0x00000020u;
+}
+inline void IULinkUpdate::clear_has_writer_name() {
+  _has_bits_[0] &= ~0x00000020u;
+}
+inline void IULinkUpdate::clear_writer_name() {
+  if (writer_name_ != &::google::protobuf::internal::kEmptyString) {
+    writer_name_->clear();
+  }
+  clear_has_writer_name();
+}
+inline const ::std::string& IULinkUpdate::writer_name() const {
+  return *writer_name_;
+}
+inline void IULinkUpdate::set_writer_name(const ::std::string& value) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(value);
+}
+inline void IULinkUpdate::set_writer_name(const char* value) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(value);
+}
+inline void IULinkUpdate::set_writer_name(const char* value, size_t size) {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  writer_name_->assign(reinterpret_cast<const char*>(value), size);
+}
+inline ::std::string* IULinkUpdate::mutable_writer_name() {
+  set_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    writer_name_ = new ::std::string;
+  }
+  return writer_name_;
+}
+inline ::std::string* IULinkUpdate::release_writer_name() {
+  clear_has_writer_name();
+  if (writer_name_ == &::google::protobuf::internal::kEmptyString) {
+    return NULL;
+  } else {
+    ::std::string* temp = writer_name_;
+    writer_name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString);
+    return temp;
+  }
+}
+
+
+// @@protoc_insertion_point(namespace_scope)
+
+}  // namespace protobuf
+}  // namespace ipaaca
+
+#ifndef SWIG
+namespace google {
+namespace protobuf {
+
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::ipaaca::protobuf::IU_AccessMode>() {
+  return ::ipaaca::protobuf::IU_AccessMode_descriptor();
+}
+
+}  // namespace google
+}  // namespace protobuf
+#endif  // SWIG
+
+// @@protoc_insertion_point(global_scope)
+
+#endif  // PROTOBUF_ipaaca_2eproto__INCLUDED
diff --git a/ipaacalib/cpp/src/Makefile b/ipaacalib/cpp/src/Makefile
index 45ba15946eff401b5ad8cbfae12a09f78153baa0..3c600c2d1c74bae792c20009636c5df381e95094 100644
--- a/ipaacalib/cpp/src/Makefile
+++ b/ipaacalib/cpp/src/Makefile
@@ -5,22 +5,24 @@ else
 endif
 
 CONFIG = -DIPAACA_DEBUG_MESSAGES
-IPAACASOURCES = ipaaca.cc ipaaca.pb.cc
+#IPAACASOURCES = ipaaca.cc ../build/ipaaca/ipaaca.pb.cc
+IPAACASOURCES = ../build/ipaaca/ipaaca.pb.cc
 SOURCES = ${IPAACASOURCES} ipaaca-test-main.cc
 TEXTSOURCES = ${IPAACASOURCES} textsender.cc
-CCFLAGS=-I. -I/usr/local/include -I/opt/local/include ${CONFIG}
+CCFLAGS=-I../include -I../build -I/usr/local/include -I/opt/local/include ${CONFIG}
 LIBFLAGS=-fPIC -shared
 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
+#LIBS = ${BOOSTLIBS} ${PROTOLIBS} -L/usr/local/lib -lrsc -lrsbcore
+LIBS = ${BOOSTLIBS} ${PROTOLIBS} -L/usr/local/lib -L../build -lipaaca
 
-COMPILER = gfilt
+COMPILER = gcc#gfilt
 
 all: lib
 	
 
-lib:
-	${COMPILER} ${CCFLAGS} ${IPAACASOURCES} ${LIBS} ${LIBFLAGS} -o libipaaca${LIB_SUFFIX}
+#lib:
+#	${COMPILER} ${CCFLAGS} ${IPAACASOURCES} ${LIBS} ${LIBFLAGS} -o libipaaca${LIB_SUFFIX}
 
 receiver:
 	${COMPILER} ${CCFLAGS} -DMAKE_RECEIVER -o ipaaca-receiver ${SOURCES} ${LIBS}
@@ -28,13 +30,13 @@ receiver:
 sender:
 	${COMPILER} ${CCFLAGS} -DMAKE_SENDER -o ipaaca-sender ${SOURCES} ${LIBS}
 
-main:
-	${COMPILER} ${CCFLAGS} -o ipaaca-main ${SOURCES} ${LIBS}
+#main:
+#	${COMPILER} ${CCFLAGS} -o ipaaca-main ${SOURCES} ${LIBS}
 
-protoc:
-	protoc --proto_path=../../proto ../../proto/ipaaca.proto --cpp_out=.
+#protoc:
+#	protoc --proto_path=../../proto ../../proto/ipaaca.proto --cpp_out=.
 
-clean:
-	rm -f libipaaca${LIB_SUFFIX} ipaaca-main ipaaca-sender ipaaca-receiver ipaaca.pb.h ipaaca.pb.cc
+#clean:
+#	rm -f libipaaca${LIB_SUFFIX} ipaaca-main ipaaca-sender ipaaca-receiver ipaaca.pb.h ipaaca.pb.cc
 
 
diff --git a/ipaacalib/cpp/src/Makefile~ b/ipaacalib/cpp/src/Makefile~
new file mode 100644
index 0000000000000000000000000000000000000000..2397a214dbbc64326f6a22337322edc6fa4176dd
--- /dev/null
+++ b/ipaacalib/cpp/src/Makefile~
@@ -0,0 +1,41 @@
+ifeq ($(WBS_ARCH),mac)
+	LIB_SUFFIX=.dylib
+else
+	LIB_SUFFIX=.so
+endif
+
+CONFIG = -DIPAACA_DEBUG_MESSAGES
+#IPAACASOURCES = ipaaca.cc ../build/ipaaca/ipaaca.pb.cc
+IPAACASOURCES = ../build/ipaaca/ipaaca.pb.cc
+SOURCES = ${IPAACASOURCES} ipaaca-test-main.cc
+TEXTSOURCES = ${IPAACASOURCES} textsender.cc
+CCFLAGS=-I../include -I../build -I/usr/local/include -I/opt/local/include ${CONFIG}
+LIBFLAGS=-fPIC -shared
+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 -L../build -lrsc -lrsbcore -lipaaca
+
+COMPILER = gcc#gfilt
+
+all: lib
+	
+
+#lib:
+#	${COMPILER} ${CCFLAGS} ${IPAACASOURCES} ${LIBS} ${LIBFLAGS} -o libipaaca${LIB_SUFFIX}
+
+receiver:
+	${COMPILER} ${CCFLAGS} -DMAKE_RECEIVER -o ipaaca-receiver ${SOURCES} ${LIBS}
+
+sender:
+	${COMPILER} ${CCFLAGS} -DMAKE_SENDER -o ipaaca-sender ${SOURCES} ${LIBS}
+
+#main:
+#	${COMPILER} ${CCFLAGS} -o ipaaca-main ${SOURCES} ${LIBS}
+
+#protoc:
+#	protoc --proto_path=../../proto ../../proto/ipaaca.proto --cpp_out=.
+
+#clean:
+#	rm -f libipaaca${LIB_SUFFIX} ipaaca-main ipaaca-sender ipaaca-receiver ipaaca.pb.h ipaaca.pb.cc
+
+
diff --git a/ipaacalib/cpp/src/ipaaca-receiver b/ipaacalib/cpp/src/ipaaca-receiver
new file mode 100755
index 0000000000000000000000000000000000000000..c1e75327b14a2892996d2b2baf8b7c395fda1e87
Binary files /dev/null and b/ipaacalib/cpp/src/ipaaca-receiver differ
diff --git a/ipaacalib/cpp/src/ipaaca-sender b/ipaacalib/cpp/src/ipaaca-sender
new file mode 100755
index 0000000000000000000000000000000000000000..264a94e3eeba896dd39f4a52f0fb1bf24f6a815b
Binary files /dev/null and b/ipaacalib/cpp/src/ipaaca-sender differ
diff --git a/ipaacalib/cpp/src/ipaaca-test-main.cc b/ipaacalib/cpp/src/ipaaca-test-main.cc
index b6ce132704a81a95ccbe1aba63293ef31bde00f7..46946dbd8698df57e565cd8dec654e0de8e7cb36 100644
--- a/ipaacalib/cpp/src/ipaaca-test-main.cc
+++ b/ipaacalib/cpp/src/ipaaca-test-main.cc
@@ -30,7 +30,7 @@
  * Excellence Initiative.
  */
 
-#include <ipaaca.h>
+#include <../include/ipaaca/ipaaca.h>
 #include <typeinfo>
 
 //#include <rsc/logging/Logger.h>
@@ -56,7 +56,7 @@ int main() {
 	try{
 		//initialize_ipaaca_rsb();
 		
-		InputBuffer::ptr ib = InputBuffer::create("Tester", "testcategory");
+		InputBuffer::ptr ib = InputBuffer::create("Tester", "spam");
 		ib->register_handler(my_first_iu_handler);
 		
 		while (true) {
@@ -82,7 +82,7 @@ int main() {
 		ob->register_handler(iu_handler_for_remote_changes);
 		//std::cout << "Buffer: " << ob->unique_name() << std::endl;
 		
-		IU::ptr iu = IU::create("testcategory");
+		IU::ptr iu = IU::create("spam");
 		ob->add(iu);
 		
 		std::cout << "Updating in 1 sec" << std::endl;
@@ -98,11 +98,20 @@ int main() {
 		
 		iu->add_link("grin", "DUMMY_IU_UID_1234efef1234");
 		
-		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;
+		//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;
 		
 		std::cout << "Committing and quitting in 1 sec" << std::endl;
 		sleep(1);
+		int c = 0;
+		while(true) {
+			std::stringstream ss;
+			ss << c;
+                        iu->_payload["data"] = ss.str();
+			std::cout << "iu->_payload[\"data\"]=" << ss.str() << std::endl;
+			c++;
+			sleep(1);
+		}
 		iu->commit();
 	} catch (ipaaca::Exception& e) {
 		std::cout << "== IPAACA EXCEPTION == " << e.what() << std::endl;
diff --git a/ipaacalib/cpp/src/ipaaca.cc b/ipaacalib/cpp/src/ipaaca.cc
index c25e9259266a2f7a80d9751e6d09cde256487131..58809891ed24fffcc4718e42ef57a06392f7800a 100644
--- a/ipaacalib/cpp/src/ipaaca.cc
+++ b/ipaacalib/cpp/src/ipaaca.cc
@@ -50,8 +50,8 @@ using namespace rsb::patterns;
 #define VERBOSE_HANDLERS 0
 
 Lock& logger_lock() {
-    static Lock lock;
-    return lock;
+	static Lock lock;
+	return lock;
 }
 
 // util and init//{{{
@@ -88,6 +88,10 @@ IPAACA_EXPORT void Initializer::initialize_ipaaca_rsb_if_needed()
 	boost::shared_ptr<ProtocolBufferConverter<protobuf::IUCommission> > iu_commission_converter(new ProtocolBufferConverter<protobuf::IUCommission> ());
 	converterRepository<std::string>()->registerConverter(iu_commission_converter);
 
+	// dlw
+	boost::shared_ptr<ProtocolBufferConverter<protobuf::IUResendRequest> > iu_resendrequest_converter(new ProtocolBufferConverter<protobuf::IUResendRequest> ());
+	converterRepository<std::string>()->registerConverter(iu_resendrequest_converter);
+
 	boost::shared_ptr<ProtocolBufferConverter<protobuf::IURetraction> > iu_retraction_converter(new ProtocolBufferConverter<protobuf::IURetraction> ());
 	converterRepository<std::string>()->registerConverter(iu_retraction_converter);
 
@@ -381,17 +385,20 @@ IPAACA_EXPORT void Buffer::_allocate_unique_name(const std::string& basename, co
 }
 IPAACA_EXPORT void Buffer::register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::set<std::string>& categories)
 {
+	std::cout << "register_handler " << function << " " << event_mask << " " << categories << std::endl;
 	IUEventHandler::ptr handler = IUEventHandler::ptr(new IUEventHandler(function, event_mask, categories));
 	_event_handlers.push_back(handler);
 }
 IPAACA_EXPORT void Buffer::register_handler(IUEventHandlerFunction function, IUEventType event_mask, const std::string& category)
 {
+	std::cout << "register_handler " << function << " " << event_mask << " " << category << std::endl;
 	IUEventHandler::ptr handler = IUEventHandler::ptr(new IUEventHandler(function, event_mask, category));
 	_event_handlers.push_back(handler);
 }
 IPAACA_EXPORT void Buffer::call_iu_event_handlers(boost::shared_ptr<IUInterface> iu, bool local, IUEventType event_type, const std::string& category)
 {
-	//IPAACA_INFO("handling an event " << ipaaca::iu_event_type_to_str(event_type) << " for IU " << iu->uid())
+	IPAACA_INFO("handling an event " << ipaaca::iu_event_type_to_str(event_type) << " for IU " << iu->uid())
+	std::cout << "handling an event " << ipaaca::iu_event_type_to_str(event_type) << " for IU " << iu->uid() << std::endl;
 	for (std::vector<IUEventHandler::ptr>::iterator it = _event_handlers.begin(); it != _event_handlers.end(); ++it) {
 		(*it)->call(this, iu, local, event_type, category);
 	}
@@ -402,6 +409,8 @@ IPAACA_EXPORT void Buffer::call_iu_event_handlers(boost::shared_ptr<IUInterface>
 IPAACA_EXPORT CallbackIUPayloadUpdate::CallbackIUPayloadUpdate(Buffer* buffer): _buffer(buffer) { }
 IPAACA_EXPORT CallbackIULinkUpdate::CallbackIULinkUpdate(Buffer* buffer): _buffer(buffer) { }
 IPAACA_EXPORT CallbackIUCommission::CallbackIUCommission(Buffer* buffer): _buffer(buffer) { }
+// dlw
+IPAACA_EXPORT CallbackIUResendRequest::CallbackIUResendRequest(Buffer* buffer): _buffer(buffer) { }
 
 IPAACA_EXPORT boost::shared_ptr<int> CallbackIUPayloadUpdate::call(const std::string& methodName, boost::shared_ptr<IUPayloadUpdate> update)
 {
@@ -484,7 +493,27 @@ IPAACA_EXPORT boost::shared_ptr<int> CallbackIUCommission::call(const std::strin
 	iu->_revision_lock.unlock();
 	return boost::shared_ptr<int>(new int(revision));
 }
+/** dlw */
+IPAACA_EXPORT boost::shared_ptr<int> CallbackIUResendRequest::call(const std::string& methodName, boost::shared_ptr<protobuf::IUResendRequest> update)
+{
+	IUInterface::ptr iui = _buffer->get(update->uid());
+	if (! iui) {
+		IPAACA_WARNING("Remote InBuffer tried to spuriously write non-existent IU " << update->uid())
+		return boost::shared_ptr<int>(new int(0));
+	}
+	IU::ptr iu = boost::static_pointer_cast<IU>(iui);
+	if ((update->has_hidden_scope_name() == true)&&(update->hidden_scope_name().compare("") != 0)){
+		//_buffer->call_iu_event_handlers(iu, true, IU_UPDATED, update->hidden_scope_name());
+		revision_t revision = iu->revision();
+
+		iu->_publish_resend(iu, update->hidden_scope_name());
 
+		return boost::shared_ptr<int>(new int(revision));
+	} else {
+		revision_t revision = 0;
+		return boost::shared_ptr<int>(new int(revision));
+	}
+}
 //}}}
 
 // OutputBuffer//{{{
@@ -507,6 +536,9 @@ IPAACA_EXPORT void OutputBuffer::_initialize_server()
 	_server->registerMethod("updatePayload", Server::CallbackPtr(new CallbackIUPayloadUpdate(this)));
 	_server->registerMethod("updateLinks", Server::CallbackPtr(new CallbackIULinkUpdate(this)));
 	_server->registerMethod("commit", Server::CallbackPtr(new CallbackIUCommission(this)));
+	// dlw
+	_server->registerMethod("resendRequest", Server::CallbackPtr(new CallbackIUResendRequest(this)));
+
 	//IPAACA_INFO("... exiting.")
 }
 IPAACA_EXPORT OutputBuffer::ptr OutputBuffer::create(const std::string& basename)
@@ -570,6 +602,11 @@ IPAACA_EXPORT void OutputBuffer::_send_iu_commission(IUInterface* iu, revision_t
 	informer->publish(data);
 }
 
+
+
+
+
+
 IPAACA_EXPORT void OutputBuffer::add(IU::ptr iu)
 {
 	if (_iu_store.count(iu->uid()) > 0) {
@@ -593,6 +630,16 @@ IPAACA_EXPORT void OutputBuffer::_publish_iu(IU::ptr iu)
 	informer->publish(iu_data);
 }
 
+IPAACA_EXPORT void OutputBuffer::_publish_iu_resend(IU::ptr iu, const std::string& hidden_scope_name)
+{
+	Informer<AnyType>::Ptr informer = _get_informer(hidden_scope_name);
+	Informer<ipaaca::IU>::DataPtr iu_data(iu);
+	informer->publish(iu_data);
+}
+
+
+
+
 IPAACA_EXPORT Informer<AnyType>::Ptr OutputBuffer::_get_informer(const std::string& category)
 {
 	if (_informer_store.count(category) > 0) {
@@ -600,6 +647,7 @@ IPAACA_EXPORT Informer<AnyType>::Ptr OutputBuffer::_get_informer(const std::stri
 	} else {
 		//IPAACA_INFO("Making new informer for category " << category)
 		std::string scope_string = "/ipaaca/channel/" + _channel + "/category/" + category;
+
 		Informer<AnyType>::Ptr informer = getFactory().createInformer<AnyType> ( Scope(scope_string));
 		_informer_store[category] = informer;
 		return informer;
@@ -643,6 +691,8 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 	for (std::set<std::string>::const_iterator it=category_interests.begin(); it!=category_interests.end(); ++it) {
 		_create_category_listener_if_needed(*it);
 	}
+	_create_category_listener_if_needed(_uuid);
+	triggerResend = false;
 }
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests, const std::string& channel)
 :Buffer(basename, "IB")
@@ -652,6 +702,8 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::v
 	for (std::vector<std::string>::const_iterator it=category_interests.begin(); it!=category_interests.end(); ++it) {
 		_create_category_listener_if_needed(*it);
 	}
+	_create_category_listener_if_needed(_uuid);
+	triggerResend = false;
 }
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& channel)
 :Buffer(basename, "IB")
@@ -720,6 +772,18 @@ IPAACA_EXPORT InputBuffer::ptr InputBuffer::create(const std::string& basename,
 // 	return InputBuffer::ptr(new InputBuffer(basename, category_interest1, category_interest2, category_interest3, category_interest4, channel));
 // }
 
+
+IPAACA_EXPORT void InputBuffer::SetResend(bool resendActive)
+{
+	triggerResend = resendActive;
+}
+
+IPAACA_EXPORT bool InputBuffer::GetResend()
+{
+	return triggerResend;
+}
+
+
 IPAACA_EXPORT IUInterface::ptr InputBuffer::get(const std::string& iu_uid)
 {
 	RemotePushIUStore::iterator it = _iu_store.find(iu_uid); // TODO genericize
@@ -745,16 +809,17 @@ IPAACA_EXPORT RemoteServerPtr InputBuffer::_get_remote_server(const std::string&
 
 IPAACA_EXPORT ListenerPtr InputBuffer::_create_category_listener_if_needed(const std::string& category)
 {
-	//IPAACA_INFO("Entering ...")
+	IPAACA_INFO("Entering ...")
 	std::map<std::string, ListenerPtr>::iterator it = _listener_store.find(category);
 	if (it!=_listener_store.end()) {
-		//IPAACA_INFO("... exiting.")
+		IPAACA_INFO("... exiting.")
 		return it->second;
 	}
 	//IPAACA_INFO("Creating a new listener for category " << category)
 	std::string scope_string = "/ipaaca/channel/" + _channel + "/category/" + category;
+
 	ListenerPtr listener = getFactory().createListener( Scope(scope_string) );
-	//IPAACA_INFO("Adding handler")
+	IPAACA_INFO("Adding handler")
 	HandlerPtr event_handler = HandlerPtr(
 			new EventFunctionHandler(
 				boost::bind(&InputBuffer::_handle_iu_events, this, _1)
@@ -762,11 +827,49 @@ IPAACA_EXPORT ListenerPtr InputBuffer::_create_category_listener_if_needed(const
 		);
 	listener->addHandler(event_handler);
 	_listener_store[category] = listener;
-	//IPAACA_INFO("... exiting.")
+	IPAACA_INFO("... exiting.")
 	return listener;
 }
+IPAACA_EXPORT void InputBuffer::_trigger_resend_request(EventPtr event) {
+        if (!triggerResend)
+		return;
+	std::string type = event->getType();
+	std::string uid = "";
+	std::string writerName = "";
+	if (type == "ipaaca::IUPayloadUpdate") {
+		boost::shared_ptr<IUPayloadUpdate> update = boost::static_pointer_cast<IUPayloadUpdate>(event->getData());
+		uid = update->uid;
+		writerName = update->writer_name;
+	} else if (type == "ipaaca::IULinkUpdate") {
+		boost::shared_ptr<IULinkUpdate> update = boost::static_pointer_cast<IULinkUpdate>(event->getData());
+		uid = update->uid;
+		writerName = update->writer_name;
+	} else if (type == "ipaaca::protobuf::IUCommission") {
+		boost::shared_ptr<protobuf::IUCommission> update = boost::static_pointer_cast<protobuf::IUCommission>(event->getData());
+		uid = update->uid();
+		writerName = update->writer_name();
+	} else {
+		std::cout << "trigger ??? else" << std::endl;
+	}
+
+	if (!writerName.empty()) {
+		RemoteServerPtr server = _get_remote_server(writerName);
+		if (!uid.empty()) {
+			boost::shared_ptr<protobuf::IUResendRequest> update = boost::shared_ptr<protobuf::IUResendRequest>(new protobuf::IUResendRequest());
+			update->set_uid(uid);
+			update->set_hidden_scope_name(_uuid);
+			boost::shared_ptr<int> result = server->call<int>("resendRequest", update, IPAACA_REMOTE_SERVER_TIMEOUT);
+			if (*result == 0) {
+				throw IUResendRequestFailedError();
+			} else {
+				std::cout << "revision " << *result << std::endl;
+			}
+		}
+	}
+}
 IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 {
+	std::cout << "handle iu events" << std::endl;
 	std::string type = event->getType();
 	if (type == "ipaaca::RemotePushIU") {
 		boost::shared_ptr<RemotePushIU> iu = boost::static_pointer_cast<RemotePushIU>(event->getData());
@@ -790,19 +893,20 @@ IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 		if (type == "ipaaca::IUPayloadUpdate") {
 			boost::shared_ptr<IUPayloadUpdate> update = boost::static_pointer_cast<IUPayloadUpdate>(event->getData());
 			//IPAACA_INFO("** writer name: " << update->writer_name)
+			std::cout << "writer name " << update->writer_name << std::endl;
 			if (update->writer_name == _unique_name) {
 				return;
 			}
 			it = _iu_store.find(update->uid);
 			if (it == _iu_store.end()) {
-				IPAACA_INFO("Ignoring UPDATED message for an IU that we did not fully receive before")
+				_trigger_resend_request(event);
+				IPAACA_INFO("Using UPDATED message for an IU that we did not fully receive before")
 				return;
 			}
-			//
+
 			it->second->_apply_update(update);
 			call_iu_event_handlers(it->second, false, IU_UPDATED, it->second->category() );
-			//
-			//
+
 		} else if (type == "ipaaca::IULinkUpdate") {
 			boost::shared_ptr<IULinkUpdate> update = boost::static_pointer_cast<IULinkUpdate>(event->getData());
 			if (update->writer_name == _unique_name) {
@@ -810,14 +914,14 @@ IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 			}
 			it = _iu_store.find(update->uid);
 			if (it == _iu_store.end()) {
+				_trigger_resend_request(event);
 				IPAACA_INFO("Ignoring LINKSUPDATED message for an IU that we did not fully receive before")
 				return;
 			}
-			//
+
 			it->second->_apply_link_update(update);
 			call_iu_event_handlers(it->second, false, IU_LINKSUPDATED, it->second->category() );
-			//
-			//
+
 		} else if (type == "ipaaca::protobuf::IUCommission") {
 			boost::shared_ptr<protobuf::IUCommission> update = boost::static_pointer_cast<protobuf::IUCommission>(event->getData());
 			if (update->writer_name() == _unique_name) {
@@ -825,6 +929,7 @@ IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 			}
 			it = _iu_store.find(update->uid());
 			if (it == _iu_store.end()) {
+				_trigger_resend_request(event);
 				IPAACA_INFO("Ignoring COMMITTED message for an IU that we did not fully receive before")
 				return;
 			}
@@ -838,6 +943,7 @@ IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 			boost::shared_ptr<protobuf::IURetraction> update = boost::static_pointer_cast<protobuf::IURetraction>(event->getData());
 			it = _iu_store.find(update->uid());
 			if (it == _iu_store.end()) {
+				_trigger_resend_request(event);
 				IPAACA_INFO("Ignoring RETRACTED message for an IU that we did not fully receive before")
 				return;
 			}
@@ -856,7 +962,6 @@ IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 		//IPAACA_INFO( "New RemotePushIU state: " << *(it->second) )
 	}
 }
-
 //}}}
 
 
@@ -982,6 +1087,27 @@ IPAACA_EXPORT void IU::_modify_links(bool is_delta, const LinkMap& new_links, co
 	}
 	_revision_lock.unlock();
 }
+
+
+IPAACA_EXPORT void IU::_publish_resend(IU::ptr iu, const std::string& hidden_scope_name)
+{
+	//_revision_lock.lock();
+	//if (_committed) {
+	//	_revision_lock.unlock();
+	//	throw IUCommittedError();
+	//}
+	//_increase_revision_number();
+	//if (is_published()) {
+	//IUInterface* iu, bool is_delta, revision_t revision, const LinkMap& new_links, const LinkMap& links_to_remove, const std::string& writer_name
+	_buffer->_publish_iu_resend(iu, hidden_scope_name);
+	//}
+	//_revision_lock.unlock();
+}
+
+
+
+
+
 IPAACA_EXPORT void IU::_modify_payload(bool is_delta, const std::map<std::string, std::string>& new_items, const std::vector<std::string>& keys_to_remove, const std::string& writer_name)
 {
 	_revision_lock.lock();
diff --git a/ipaacalib/cpp/test/src/Makefile b/ipaacalib/cpp/test/src/Makefile
index 11a2336bdded24ce11d4832b37928f1b9ec3beb3..ff3b45be572668655974721966705405b016ae11 100644
--- a/ipaacalib/cpp/test/src/Makefile
+++ b/ipaacalib/cpp/test/src/Makefile
@@ -2,7 +2,7 @@ CONFIG = -DIPAACA_DEBUG_MESSAGES
 #IPAACASOURCES = ../../src/ipaaca.cc ipaaca.pb.cc
 #TEXTSOURCES = ${IPAACASOURCES} testipaaca.cc
 TEXTSOURCES = testipaaca.cc
-CCFLAGS=-I../../../../deps/include -I../../../../dist/include -I. -I../../src -I/usr/local/include -I/opt/local/include ${CONFIG}
+CCFLAGS=-I../../build -I../../../../deps/include -I../../../../dist/include -I. -I../../src -I/usr/local/include -I/opt/local/include ${CONFIG}
 BOOSTLIBS = -L/opt/local/lib -lboost_regex-mt -lboost_date_time-mt -lboost_thread-mt 
 PROTOLIBS = -L/opt/local/lib -lprotobuf
 #LIBS = ${BOOSTLIBS} ${PROTOLIBS} -L/usr/local/lib -lrsc -lrsbcore
diff --git a/ipaacalib/cpp/test/src/Makefile~ b/ipaacalib/cpp/test/src/Makefile~
new file mode 100644
index 0000000000000000000000000000000000000000..6227f8f6720efbc3993471f65520989c5f5b0fbc
--- /dev/null
+++ b/ipaacalib/cpp/test/src/Makefile~
@@ -0,0 +1,27 @@
+CONFIG = -DIPAACA_DEBUG_MESSAGES
+#IPAACASOURCES = ../../src/ipaaca.cc ipaaca.pb.cc
+#TEXTSOURCES = ${IPAACASOURCES} testipaaca.cc
+TEXTSOURCES = testipaaca.cc
+CCFLAGS=-I../../build -I../../../../deps/include -I../../../../dist/include -I. -I../../src -I/usr/local/include -I/opt/local/include ${CONFIG}
+BOOSTLIBS = -L/opt/local/lib -lboost_regex-mt -lboost_date_time-mt -lboost_thread-mt 
+PROTOLIBS = -L/opt/local/lib -lprotobuf
+#LIBS = ${BOOSTLIBS} ${PROTOLIBS} -L/usr/local/lib -lrsc -lrsbcore
+#LIBS = -L../../../../deps/lib -L../../../../dist/lib -lipaaca
+LIBS = -L../../build -L../../../../deps/lib -L../../../../dist/lib -lipaaca
+
+#COMPILER = gfilt
+COMPILER = gcc
+
+all: testipaaca
+	
+
+testipaaca:
+	${COMPILER} ${CCFLAGS} -o testipaaca ${TEXTSOURCES} ${LIBS}
+
+protoc:
+	protoc --proto_path=../../../proto ../../../proto/ipaaca.proto --cpp_out=.
+
+clean:
+	rm -f testipaaca ipaaca.pb.h ipaaca.pb.cc
+
+
diff --git a/ipaacalib/cpp/test/src/testipaaca.cc b/ipaacalib/cpp/test/src/testipaaca.cc
index 0de077af57c46d9bed0a44077c18709d9a9c0873..828136ba81da19eaf49546b225f229788c5ed986 100644
--- a/ipaacalib/cpp/test/src/testipaaca.cc
+++ b/ipaacalib/cpp/test/src/testipaaca.cc
@@ -138,7 +138,7 @@ void TextSender::publish_text_to_print(const std::string& text, const std::strin
 	}
 }
 	
-int old_main() {
+int main() {
 	TextSender sender;
 	sleep(1);
 	sender.publish_text_to_print("(INIT)");
@@ -146,7 +146,7 @@ int old_main() {
 	while (true) sleep(1);
 }
 
-int main() {
+int old_main() {
 	std::cerr << "TODO: implement Ipaaca C++ test cases." << std::endl;
 	return 0;
 }
diff --git a/ipaacalib/java/src/ipaaca/IUResendFailedException.java b/ipaacalib/java/src/ipaaca/IUResendFailedException.java
new file mode 100644
index 0000000000000000000000000000000000000000..04d1a06431552ea060cac8d5f066bc8c5a92a6bc
--- /dev/null
+++ b/ipaacalib/java/src/ipaaca/IUResendFailedException.java
@@ -0,0 +1,55 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".  
+ *
+ * Copyright (c) 2009-2013 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.
+ */
+
+package ipaaca;
+
+/**
+ * Error indicating that an IU is immutable because it has been committed to.
+ * @author hvanwelbergen
+ * 
+ */
+public class IUResendFailedException extends RuntimeException
+{
+    private static final long serialVersionUID = 1L;
+    private final AbstractIU iu;
+
+    public AbstractIU getIU()
+    {
+        return iu;
+    }
+
+    public IUResendFailedException(AbstractIU iu)
+    {
+        super("Resending IU " + iu.getUid() + " failed.");
+        this.iu = iu;
+    }
+}
diff --git a/ipaacalib/java/src/ipaaca/Initializer.java b/ipaacalib/java/src/ipaaca/Initializer.java
index e835f43456241ced846f580f861a873bd3f9c027..0af784bd8e7051dd1889edb0465ef07add9de566 100644
--- a/ipaacalib/java/src/ipaaca/Initializer.java
+++ b/ipaacalib/java/src/ipaaca/Initializer.java
@@ -33,6 +33,7 @@
 package ipaaca;
 
 import ipaaca.protobuf.Ipaaca.IUCommission;
+import ipaaca.protobuf.Ipaaca.IUResendRequest;
 import rsb.converter.ConverterSignature;
 import rsb.converter.DefaultConverterRepository;
 import rsb.converter.ProtocolBufferConverter;
@@ -55,6 +56,9 @@ public final class Initializer
         DefaultConverterRepository.getDefaultConverterRepository().addConverter(new IntConverter());
         DefaultConverterRepository.getDefaultConverterRepository().addConverter(
                 new ProtocolBufferConverter<IUCommission>(IUCommission.getDefaultInstance()));
+	// dlw
+	DefaultConverterRepository.getDefaultConverterRepository().addConverter(
+                new ProtocolBufferConverter<IUResendRequest>(IUResendRequest.getDefaultInstance()));
 
         DefaultConverterRepository.getDefaultConverterRepository().addConverter(
                 new IUConverter(new ConverterSignature("ipaaca-iu", RemotePushIU.class)));
diff --git a/ipaacalib/java/src/ipaaca/InputBuffer.java b/ipaacalib/java/src/ipaaca/InputBuffer.java
index 6017749cb78faf64c1a4be48c22aba6021a11dfa..444d9aba5b1c70bc64d3b509200d07b1b0ab7599 100644
--- a/ipaacalib/java/src/ipaaca/InputBuffer.java
+++ b/ipaacalib/java/src/ipaaca/InputBuffer.java
@@ -33,6 +33,7 @@
 package ipaaca;
 
 import ipaaca.protobuf.Ipaaca.IUCommission;
+import ipaaca.protobuf.Ipaaca.IUResendRequest;
 import ipaaca.protobuf.Ipaaca.IULinkUpdate;
 import ipaaca.protobuf.Ipaaca.IUPayloadUpdate;
 
@@ -51,6 +52,8 @@ import rsb.Event;
 import rsb.Factory;
 import rsb.Handler;
 import rsb.InitializeException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
 import rsb.Listener;
 import rsb.RSBException;
 import rsb.Scope;
@@ -69,7 +72,9 @@ public class InputBuffer extends Buffer
     private final static Logger logger = LoggerFactory.getLogger(InputBuffer.class.getName());
     private IUStore<RemotePushIU> iuStore = new IUStore<RemotePushIU>();
     private IUStore<RemoteMessageIU> messageStore = new IUStore<RemoteMessageIU>();
+
     private String channel;
+    private boolean resendActive;
 
     public void close()
     {
@@ -130,14 +135,42 @@ public class InputBuffer extends Buffer
     public InputBuffer(String owningComponentName, Set<String> categoryInterests, String ipaaca_channel)
     {
         super(owningComponentName);
-        uniqueName = "/ipaaca/component/" + getUniqueShortName() + "/IB";
+        resendActive = false;
+        String shortIDName = getUniqueShortName();
+        uniqueName = "/ipaaca/component/" + shortIDName + "/IB";
 
         for (String cat : categoryInterests)
         {
             createCategoryListenerIfNeeded(cat);
         }
-
         this.channel = ipaaca_channel;
+
+    // add own uuid as identifier for hidden channel. (dlw)
+    createCategoryListenerIfNeeded(shortIDName);
+    }
+
+    /** Pass resendActive to toggle resendRequest-functionality. */
+    public InputBuffer(String owningComponentName, Set<String> categoryInterests, boolean resendActive)
+    {
+        super(owningComponentName);
+        this.resendActive = resendActive;
+        String shortIDName = getUniqueShortName();
+        uniqueName = "/ipaaca/component/" + shortIDName + "/IB";
+
+        for (String cat : categoryInterests)
+        {
+            createCategoryListenerIfNeeded(cat);
+        }
+        // add own uuid as identifier for hidden channel. (dlw)
+        createCategoryListenerIfNeeded(shortIDName);
+    }
+
+    public boolean isResendActive() {
+        return this.resendActive;
+    }
+
+    public void setResendActive(boolean active) {
+        this.resendActive = active;
     }
 
     // def _get_remote_server(self, iu):
@@ -171,6 +204,30 @@ public class InputBuffer extends Buffer
         return remoteServer;
     }
 
+    protected RemoteServer getRemoteServer(String ownerName)
+    {
+        if (remoteServerStore.containsKey(ownerName))
+        {
+            return remoteServerStore.get(ownerName);
+        }
+        logger.debug("Getting remote server for {}", ownerName);
+        RemoteServer remoteServer = Factory.getInstance().createRemoteServer(new Scope(ownerName));
+        try
+        {
+            remoteServer.activate();
+        }
+        catch (InitializeException e)
+        {
+            throw new RuntimeException(e);
+        }
+        catch (RSBException e)
+        {
+            throw new RuntimeException(e);
+        }
+        remoteServerStore.put(ownerName, remoteServer);
+        return remoteServer;
+    }
+
     // def _create_category_listener_if_needed(self, iu_category):
     // '''Return (or create, store and return) a category listener.'''
     // if iu_category in self._listener_store: return self._informer_store[iu_category]
@@ -318,7 +375,12 @@ public class InputBuffer extends Buffer
                 }
                 if (!iuStore.containsKey(iuLinkUpdate.getUid()))
                 {
-                    logger.warn("Link update message for IU which we did not fully receive before.");
+                    if (resendActive)
+                    {
+                        triggerResendRequest(event.getData(), getUniqueShortName());
+                    } else {
+                        logger.warn("Link update message for IU which we did not fully receive before.");
+                    }
                     return;
                 }
                 RemotePushIU iu = this.iuStore.get(iuLinkUpdate.getUid());
@@ -336,7 +398,12 @@ public class InputBuffer extends Buffer
                 }
                 if (!iuStore.containsKey(iuUpdate.getUid()))
                 {
-                    logger.warn("Update message for IU which we did not fully receive before.");
+                    if (resendActive)
+                    {
+                        triggerResendRequest(event.getData(), getUniqueShortName());
+                    } else {
+                        logger.warn("Update message for IU which we did not fully receive before.");
+                    }
                     return;
                 }
                 RemotePushIU iu = this.iuStore.get(iuUpdate.getUid());
@@ -356,7 +423,12 @@ public class InputBuffer extends Buffer
                 }
                 if (!iuStore.containsKey(iuc.getUid()))
                 {
-                    logger.warn("Update message for IU which we did not fully receive before.");
+                    if (resendActive)
+                    {
+                        triggerResendRequest(event.getData(), getUniqueShortName());
+                    } else {
+                        logger.warn("Update message for IU which we did not fully receive before.");
+                    }
                     return;
                 }
                 RemotePushIU iu = this.iuStore.get(iuc.getUid());
@@ -367,6 +439,52 @@ public class InputBuffer extends Buffer
         }
     }
 
+    private void triggerResendRequest(Object aiuObj, String hiddenScopeName)
+    {
+        String uid = null;
+        String writerName = null;
+        if (aiuObj instanceof IULinkUpdate) {
+            IULinkUpdate tmp = (IULinkUpdate)aiuObj;
+            uid = tmp.getUid();
+            writerName = tmp.getWriterName();
+        } else if (aiuObj instanceof IUPayloadUpdate) {
+            IUPayloadUpdate tmp = (IUPayloadUpdate)aiuObj;
+            uid = tmp.getUid();
+            writerName = tmp.getWriterName();
+        } else if (aiuObj instanceof IUCommission) {
+            IUCommission tmp = (IUCommission)aiuObj;
+            uid = tmp.getUid();
+            writerName = tmp.getWriterName();
+        }
+        RemoteServer rServer = null;
+        if (writerName != null)
+            rServer = getRemoteServer(writerName);
+        if ((rServer != null)&&(uid != null)) {
+            IUResendRequest iurr = IUResendRequest.newBuilder().setUid(uid).setHiddenScopeName(hiddenScopeName).build();
+            int rRevision = 0;
+            try
+                {
+                    rRevision = (Integer) rServer.call("resendRequest", iurr);
+                }
+                catch (RSBException e)
+                {
+                    throw new RuntimeException(e);
+                }
+                catch (ExecutionException e)
+                {
+                    throw new RuntimeException(e);
+                }
+                catch (TimeoutException e)
+                {
+                    throw new RuntimeException(e);
+                }
+            if (rRevision == 0)
+            {
+                //throw new IUResendFailedException(aiu); // TODO
+            }
+        }
+    }
+
     public InputBuffer(String owningComponentName)
     {
         super(owningComponentName);
diff --git a/ipaacalib/java/src/ipaaca/OutputBuffer.java b/ipaacalib/java/src/ipaaca/OutputBuffer.java
index 000b61388433dac40d1f41c439a8408aaaead55d..62efe3ae16f46caaab97f61db09a333377b6d008 100644
--- a/ipaacalib/java/src/ipaaca/OutputBuffer.java
+++ b/ipaacalib/java/src/ipaaca/OutputBuffer.java
@@ -34,6 +34,7 @@ package ipaaca;
 
 import ipaaca.protobuf.Ipaaca;
 import ipaaca.protobuf.Ipaaca.IUCommission;
+import ipaaca.protobuf.Ipaaca.IUResendRequest;
 import ipaaca.protobuf.Ipaaca.IULinkUpdate;
 import ipaaca.protobuf.Ipaaca.IUPayloadUpdate;
 import ipaaca.protobuf.Ipaaca.LinkSet;
@@ -112,6 +113,8 @@ public class OutputBuffer extends Buffer
             server.addMethod("updatePayload", new RemoteUpdatePayload());
             server.addMethod("updateLinks", new RemoteUpdateLinks());
             server.addMethod("commit", new RemoteCommit());
+	    // add method to trigger a resend request. (dlw)
+	    server.addMethod("resendRequest", new RemoteResendRequest());
             server.activate();
         }
         catch (InitializeException e)
@@ -159,6 +162,17 @@ public class OutputBuffer extends Buffer
 
     }
 
+    private final class RemoteResendRequest extends DataCallback<Integer, IUResendRequest>
+    {
+        @Override
+        public Integer invoke(IUResendRequest data) throws Throwable
+        {
+            logger.debug("remoteResendRequest");
+            return remoteResendRequest(data);
+        }
+
+    }
+
     // def _remote_update_payload(self, update):
     // '''Apply a remotely requested update to one of the stored IUs.'''
     // if update.uid not in self._iu_store:
@@ -317,6 +331,35 @@ public class OutputBuffer extends Buffer
         }
     }
 
+    /*
+     * Resend an requested iu over the specific hidden channel. (dlw) TODO
+     */
+    private int remoteResendRequest(IUResendRequest iu_resend_request_pack)
+    {
+        if (!iuStore.containsKey(iu_resend_request_pack.getUid()))
+        {
+            logger.warn("Remote InBuffer tried to spuriously write non-existent IU {}", iu_resend_request_pack.getUid());
+            return 0;
+        }
+        AbstractIU iu = iuStore.get(iu_resend_request_pack.getUid());
+        if ((iu_resend_request_pack.hasHiddenScopeName() == true)&&(!iu_resend_request_pack.getHiddenScopeName().equals("")))
+        {
+	    Informer<Object> informer = getInformer(iu_resend_request_pack.getHiddenScopeName());
+            try
+            {
+                informer.send(iu);
+            }
+            catch (RSBException e)
+            {
+                throw new RuntimeException(e);
+            }
+            return iu.getRevision();
+        } else
+        {
+            return 0;
+        }
+    }
+
     // def _get_informer(self, iu_category):
     // '''Return (or create, store and return) an informer object for IUs of the specified category.'''
     // if iu_category in self._informer_store:
diff --git a/ipaacalib/java/src/ipaacademo/TestListener.java b/ipaacalib/java/src/ipaacademo/TestListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..4759207badc3fc5c609ca5f9c61949af0c4c3d7c
--- /dev/null
+++ b/ipaacalib/java/src/ipaacademo/TestListener.java
@@ -0,0 +1,125 @@
+/*
+ * This file is part of IPAACA, the
+ *  "Incremental Processing Architecture
+ *   for Artificial Conversational Agents".
+ *
+ * Copyright (c) 2009-2013 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.
+ */
+
+package ipaacademo;
+
+import ipaaca.AbstractIU;
+import ipaaca.HandlerFunctor;
+import ipaaca.IUEventHandler;
+import ipaaca.IUEventType;
+import ipaaca.Initializer;
+import ipaaca.InputBuffer;
+import ipaaca.OutputBuffer;
+import ipaaca.RemotePushIU;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+import javax.swing.JFrame;
+import javax.swing.JLabel;
+
+import com.google.common.collect.ImmutableSet;
+
+public class TestListener
+{
+
+    private static final class MyEventHandler implements HandlerFunctor
+    {
+        @Override
+        public void handle(AbstractIU iu, IUEventType type, boolean local)
+        {
+            switch(type)
+            {
+            case ADDED:  System.out.println("IU added "+iu.getPayload().get("CONTENT"));  break;
+            case COMMITTED: System.out.println("IU committed");  break;
+            case UPDATED: System.out.println("IU updated "+iu.getPayload()); break;
+            case LINKSUPDATED: System.out.println("IU links updated"); break;
+            case RETRACTED: break;
+            case DELETED: break;
+            }
+        }
+
+    }
+
+    static
+    {
+        Initializer.initializeIpaacaRsb();
+    }
+
+    private static final String CATEGORY = "spam";
+    private static final double RATE = 0.5;
+    private UpdateThread updateThread;
+
+    public TestListener()
+    {
+        Set<String> categories = new ImmutableSet.Builder<String>().add(CATEGORY).build();
+        JLabel label = new JLabel("");
+
+        updateThread = new UpdateThread(new InputBuffer("TestListener", categories),label);
+    }
+
+    public void start()
+    {
+        updateThread.start();
+    }
+
+    private static class UpdateThread extends Thread
+    {
+        private InputBuffer inBuffer;
+        private JLabel label;
+
+        public UpdateThread(InputBuffer inBuffer, JLabel label)
+        {
+            this.inBuffer = inBuffer;
+            this.label = label;
+
+            EnumSet<IUEventType> types = EnumSet.of(IUEventType.ADDED,IUEventType.COMMITTED,IUEventType.UPDATED,IUEventType.LINKSUPDATED);
+            Set<String> categories = new ImmutableSet.Builder<String>().add(CATEGORY).build();
+            MyEventHandler printingEventHandler;
+            printingEventHandler = new MyEventHandler();
+            this.inBuffer.registerHandler(new IUEventHandler(printingEventHandler,types,categories));
+        }
+
+        @Override
+        public void run()
+        {
+        	System.out.println("Starting!");
+        }
+
+    }
+
+    public static void main(String args[])
+    {
+        TestListener tl = new TestListener();
+        tl.start();
+    }
+}
diff --git a/ipaacalib/java/src/ipaacademo/TextPrinter.java b/ipaacalib/java/src/ipaacademo/TextPrinter.java
index 13ef1a1fd287649b1d82c211eb910cca308f00dd..5161ad3b7eb1c91ea02e23f4c0f6ccb4399ef500 100644
--- a/ipaacalib/java/src/ipaacademo/TextPrinter.java
+++ b/ipaacalib/java/src/ipaacademo/TextPrinter.java
@@ -222,7 +222,8 @@ public class TextPrinter
         TextPrinter tp = new TextPrinter();        
         
         
-        OutputBuffer outBuffer = new OutputBuffer("componentX");
+        //OutputBuffer outBuffer = new OutputBuffer("componentX");
+
         /*String[] inputString = {"h","e","l","l","o"," ","w","o","r","l","d","!"};
         LocalIU predIU = null;        
         for(String str:inputString)
diff --git a/ipaacalib/proto/ipaaca.proto b/ipaacalib/proto/ipaaca.proto
index 7288dc84a0f8dcef4689166b26571c2d936c6200..74db0cadfd526712cd7b80320de8191028a49c52 100755
--- a/ipaacalib/proto/ipaaca.proto
+++ b/ipaacalib/proto/ipaaca.proto
@@ -84,6 +84,11 @@ message IUCommission {
 	required string writer_name = 3;
 }
 
+message IUResendRequest {
+	required string uid = 1;
+	required string hidden_scope_name = 2;
+}
+
 message IULinkUpdate {
 	required string uid = 1;
 	required uint32 revision = 2;
diff --git a/ipaacalib/python/src/ipaaca/__init__.py b/ipaacalib/python/src/ipaaca/__init__.py
index e1552113e3538adef011a379816277da4a525be4..1a017c316e64c509ed0067f15530747df5b1a3b4 100755
--- a/ipaacalib/python/src/ipaaca/__init__.py
+++ b/ipaacalib/python/src/ipaaca/__init__.py
@@ -65,7 +65,7 @@ __all__ = [
 	'IUAccessMode',
 	'InputBuffer', 'OutputBuffer',
 	'IU',
-	'IUPublishedError', 'IUUpdateFailedError', 'IUCommittedError', 'IUReadOnlyError', 'IUNotFoundError',
+	'IUPublishedError', 'IUUpdateFailedError', 'IUCommittedError', 'IUReadOnlyError', 'IUNotFoundError', 'IUResendFailedError',
 	'logger'
 ]
 
@@ -141,6 +141,10 @@ class IUUpdateFailedError(Exception):
 	def __init__(self, iu):
 		super(IUUpdateFailedError, self).__init__('Remote update failed for IU ' + str(iu.uid) + '.')
 
+class IUResendFailedError(Exception):
+	"""Error indicating that a remote IU resend failed."""
+	def __init__(self, iu):
+		super(IUResendFailedError, self).__init__('Remote resend failed for IU ' + str(iu.uid) + '.')
 
 class IUCommittedError(Exception):
 	"""Error indicating that an IU is immutable because it has been committed to."""
@@ -1236,7 +1240,8 @@ class InputBuffer(Buffer):
 
 	"""An InputBuffer that holds remote IUs."""
 
-	def __init__(self, owning_component_name, category_interests=None, channel="default", participant_config=None):
+
+	def __init__(self, owning_component_name, category_interests=None, channel="default", participant_config=None, resend_active = False ):
 		'''Create an InputBuffer.
 
 		Keyword arguments:
@@ -1245,6 +1250,7 @@ class InputBuffer(Buffer):
 		participant_config = RSB configuration
 		'''
 		super(InputBuffer, self).__init__(owning_component_name, participant_config)
+		self._resend_active = resend_active
 		self._unique_name = '/ipaaca/component/'+str(owning_component_name)+'ID'+self._uuid+'/IB'
 		self._listener_store = {} # one per IU category
 		self._remote_server_store = {} # one per remote-IU-owning Component
@@ -1253,14 +1259,22 @@ class InputBuffer(Buffer):
 		if category_interests is not None:
 			for cat in category_interests:
 				self._add_category_listener(cat)
+		# add own uuid as identifier for hidden channel. (dlw)
+		self._add_category_listener(str(self._uuid))
 
 	def _get_remote_server(self, iu):
 		'''Return (or create, store and return) a remote server.'''
-		if iu.owner_name in self._remote_server_store:
-			return self._remote_server_store[iu.owner_name]
-		#  TODO remove the str() when unicode is supported (issue #490)
-		remote_server = rsb.createRemoteServer(rsb.Scope(str(iu.owner_name)))
-		self._remote_server_store[iu.owner_name] = remote_server
+		_owner = None
+		if hasattr(iu,'owner_name'):
+			_owner = iu.owner_name
+		elif hasattr(iu,'writer_name'):
+			_owner = iu.writer_name
+		if _owner is not None:
+			if _owner in self._remote_server_store:
+				return self._remote_server_store[_owner]
+			#  TODO remove the str() when unicode is supported (issue #490)
+			remote_server = rsb.createRemoteServer(rsb.Scope(str(_owner)))
+			self._remote_server_store[_owner] = remote_server
 		return remote_server
 
 	def _add_category_listener(self, iu_category):
@@ -1272,6 +1286,7 @@ class InputBuffer(Buffer):
 			self._category_interests.append(iu_category)
 			logger.info("Added listener in scope "+"/ipaaca/channel/"+str(self._channel)+"/category/"+iu_category)
 
+
 	def _handle_iu_events(self, event):
 		'''Dispatch incoming IU events.
 
@@ -1298,11 +1313,21 @@ class InputBuffer(Buffer):
 			self.call_iu_event_handlers(event.data.uid, local=False, event_type=IUEventType.MESSAGE, category=event.data.category)
 			del self._iu_store[ event.data.uid ]
 		else:
-			# an update to an existing IU
-			if event.data.uid not in self._iu_store:
-				# TODO: we should request the IU's owner to send us the IU
-				logger.warning("Update message for IU which we did not fully receive before.")
+			if event.data.uid not in self._iu_store: # TODO switch default off
+				if self._resend_active == True:
+					logger.warning("Resend message for IU which we did not fully receive before.")
+					# send resend request to remote server (dlw).
+					remote_server = self._get_remote_server(event.data)
+					resend_request = ipaaca_pb2.IUResendRequest()
+					resend_request.uid = event.data.uid # target iu
+					resend_request.hidden_scope_name = str(self._uuid) # hidden channel name
+					rRevision = remote_server.resendRequest(resend_request)
+					if rRevision == 0:
+						raise IUResendFailedError(self)
+				else:
+					logger.warning("Update message for IU which we did not fully receive before.")
 				return
+			# an update to an existing IU
 			if type_ is ipaaca_pb2.IURetraction:
 				# IU retraction (cannot be triggered remotely)
 				iu = self._iu_store[event.data.uid]
@@ -1344,12 +1369,19 @@ class InputBuffer(Buffer):
 		for interest in category_interests:
 			self._add_category_listener(interest)
 
+	def is_resend_active():
+		return self._resend_active
+
+	def set_resend_active(active):
+		self._resend_active = active
+
 
 class OutputBuffer(Buffer):
 
 	"""An OutputBuffer that holds local IUs."""
 
 	def __init__(self, owning_component_name, channel='default', participant_config=None):
+
 		'''Create an Output Buffer.
 
 		Keyword arguments:
@@ -1362,10 +1394,13 @@ class OutputBuffer(Buffer):
 		self._server.addMethod('updateLinks', self._remote_update_links, IULinkUpdate, int)
 		self._server.addMethod('updatePayload', self._remote_update_payload, IUPayloadUpdate, int)
 		self._server.addMethod('commit', self._remote_commit, ipaaca_pb2.IUCommission, int)
+		# add method to trigger a resend request. (dlw)
+		self._server.addMethod('resendRequest', self._remote_resend_request, ipaaca_pb2.IUResendRequest, int)
 		self._informer_store = {}
 		self._id_prefix = str(owning_component_name)+'-'+str(self._uuid)+'-IU-'
 		self.__iu_id_counter_lock = threading.Lock()
 		#self.__iu_id_counter = 0 # hbuschme: IUs now have their Ids assigned on creation
+
 		self._channel = channel
 
 	def _create_own_name_listener(self, iu_category):
@@ -1434,6 +1469,20 @@ class OutputBuffer(Buffer):
 			self.call_iu_event_handlers(update.uid, local=True, event_type=IUEventType.UPDATED, category=iu.category)
 			return iu.revision
 
+	def _remote_resend_request(self, iu_resend_request_pack):
+		''' Resend an requested iu over the specific hidden channel. (dlw) '''
+		if iu_resend_request_pack.uid not in self._iu_store:
+			logger.warning("Remote InBuffer tried to spuriously write non-existent IU "+str(iu_resend_request_pack.uid))
+			return 0
+		iu = self._iu_store[iu_resend_request_pack.uid]
+		with iu.revision_lock:
+			if (iu_resend_request_pack.hidden_scope_name is not None) and (iu_resend_request_pack.hidden_scope_name is not ""):
+				informer = self._get_informer(iu_resend_request_pack.hidden_scope_name)
+				informer.publishData(iu)
+				return iu.revision
+			else:
+				return 0
+
 	def _remote_commit(self, iu_commission):
 		'''Apply a remotely requested commit to one of the stored IUs.'''
 		if iu_commission.uid not in self._iu_store:
@@ -1602,6 +1651,9 @@ def initialize_ipaaca_rsb():#{{{
 	rsb.converter.registerGlobalConverter(
 		rsb.converter.ProtocolBufferConverter(
 			messageClass=ipaaca_pb2.IUCommission))
+	rsb.converter.registerGlobalConverter(
+		rsb.converter.ProtocolBufferConverter(
+			messageClass=ipaaca_pb2.IUResendRequest)) # dlw
 	rsb.converter.registerGlobalConverter(
 		rsb.converter.ProtocolBufferConverter(
 			messageClass=ipaaca_pb2.IURetraction))
diff --git a/ipaacatools/scripts/ipaaca-iu-injector.py b/ipaacatools/scripts/ipaaca-iu-injector.py
index 344badea87b613ec4ea8798cf9f4c3886de8b228..58d1e9aec600cda0aea35cfd57ad98bf7fd44bba 100755
--- a/ipaacatools/scripts/ipaaca-iu-injector.py
+++ b/ipaacatools/scripts/ipaaca-iu-injector.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 # This file is part of IPAACA, the
 #  "Incremental Processing Architecture
diff --git a/ipaacatools/scripts/ipaaca-iu-sniffer.py b/ipaacatools/scripts/ipaaca-iu-sniffer.py
index 4faa398798135bcec21f3116f08218fc5ef14e11..fcf26184ca4e14a9e216978c7be08d53632090f4 100755
--- a/ipaacatools/scripts/ipaaca-iu-sniffer.py
+++ b/ipaacatools/scripts/ipaaca-iu-sniffer.py
@@ -1,4 +1,5 @@
 #!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
 # This file is part of IPAACA, the
 #  "Incremental Processing Architecture