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 6bcdd8d137d372ce249b99aaa2f279e723084d16..f2fb763945858cd956d0d8a11a8b2836eeea9824 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca.h
@@ -1,10 +1,10 @@
 /*
  * This file is part of IPAACA, the
  *  "Incremental Processing Architecture
- *   for Artificial Conversational Agents".  
+ *   for Artificial Conversational Agents".
  *
  * Copyright (c) 2009-2013 Sociable Agents Group
- *                         CITEC, Bielefeld University   
+ *                         CITEC, Bielefeld University
  *
  * http://opensource.cit-ec.de/projects/ipaaca/
  * http://purl.org/net/ipaaca
@@ -21,7 +21,7 @@
  * 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.  
+ * 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.
@@ -192,6 +192,7 @@ class OutputBuffer;
 class CallbackIUPayloadUpdate;
 class CallbackIULinkUpdate;
 class CallbackIUCommission;
+class CallbackIUResendRequest;
 class CallbackIURetraction;
 
 class IUConverter;
@@ -330,7 +331,7 @@ IPAACA_HEADER_EXPORT class SmartLinkMap {
 	public:
 		IPAACA_HEADER_EXPORT const LinkSet& get_links(const std::string& key);
 		IPAACA_HEADER_EXPORT const LinkMap& get_all_links();
-	
+
 	protected:
 		IPAACA_MEMBER_VAR_EXPORT LinkMap _links;
 		IPAACA_MEMBER_VAR_EXPORT static LinkSet empty_link_set;
@@ -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);
@@ -414,13 +420,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);
@@ -452,12 +462,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")
@@ -466,7 +481,15 @@ 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_MEMBER_VAR_EXPORT bool triggerResend;
+		IPAACA_HEADER_EXPORT void SetResend(bool resendActive);
+		IPAACA_HEADER_EXPORT bool GetResend();
+
 		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::set<std::string>& category_interests);
 		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::vector<std::string>& category_interests);
 		IPAACA_HEADER_EXPORT InputBuffer(const std::string& basename, const std::string& category_interest1);
@@ -642,6 +665,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 = "");
@@ -659,6 +684,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:
@@ -676,6 +702,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 = "");
@@ -689,6 +718,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:
@@ -794,6 +824,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:
@@ -867,6 +905,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 879e76c377e3ad9f45582cd81e300b85b8c74c4a..84189d4181337b43c9f99acfd9be95524167a742 100644
--- a/ipaacalib/cpp/src/ipaaca.cc
+++ b/ipaacalib/cpp/src/ipaaca.cc
@@ -1,10 +1,10 @@
 /*
  * This file is part of IPAACA, the
  *  "Incremental Processing Architecture
- *   for Artificial Conversational Agents".  
+ *   for Artificial Conversational Agents".
  *
  * Copyright (c) 2009-2013 Sociable Agents Group
- *                         CITEC, Bielefeld University   
+ *                         CITEC, Bielefeld University
  *
  * http://opensource.cit-ec.de/projects/ipaaca/
  * http://purl.org/net/ipaaca
@@ -21,7 +21,7 @@
  * 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.  
+ * 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.
@@ -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//{{{
@@ -64,36 +64,40 @@ IPAACA_EXPORT bool Initializer::initialized() { return _initialized; }
 IPAACA_EXPORT void Initializer::initialize_ipaaca_rsb_if_needed()
 {
 	if (_initialized) return;
-	
+
 	//IPAACA_INFO("Calling initialize_updated_default_config()")
 	initialize_updated_default_config();
 
 	// RYT FIXME This configuration stuff has been simply removed in rsb!
 	//ParticipantConfig config = ParticipantConfig::fromConfiguration();
 	//getFactory().setDefaultParticipantConfig(config);
-	
+
 	//IPAACA_INFO("Creating and registering Converters")
 	boost::shared_ptr<IUConverter> iu_converter(new IUConverter());
 	converterRepository<std::string>()->registerConverter(iu_converter);
-	
+
 	boost::shared_ptr<MessageConverter> message_converter(new MessageConverter());
 	converterRepository<std::string>()->registerConverter(message_converter);
-	
+
 	boost::shared_ptr<IUPayloadUpdateConverter> payload_update_converter(new IUPayloadUpdateConverter());
 	converterRepository<std::string>()->registerConverter(payload_update_converter);
-	
+
 	boost::shared_ptr<IULinkUpdateConverter> link_update_converter(new IULinkUpdateConverter());
 	converterRepository<std::string>()->registerConverter(link_update_converter);
-	
+
 	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);
-	
+
 	boost::shared_ptr<IntConverter> int_converter(new IntConverter());
 	converterRepository<std::string>()->registerConverter(int_converter);
-	
+
 	//IPAACA_INFO("Initialization complete.")
 	_initialized = true;
 	//IPAACA_TODO("initialize all converters")
@@ -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//{{{
@@ -506,6 +535,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)
@@ -564,11 +596,16 @@ IPAACA_EXPORT void OutputBuffer::_send_iu_commission(IUInterface* iu, revision_t
 	data->set_revision(revision);
 	if (writer_name=="") data->set_writer_name(_unique_name);
 	else data->set_writer_name(writer_name);
-	
+
 	Informer<AnyType>::Ptr informer = _get_informer(iu->category());
 	informer->publish(data);
 }
 
+
+
+
+
+
 IPAACA_EXPORT void OutputBuffer::add(IU::ptr iu)
 {
 	if (_iu_store.count(iu->uid()) > 0) {
@@ -592,12 +629,22 @@ 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) {
 		return _informer_store[category];
 	} else {
-		//IPAACA_INFO("Making new informer for category " << category)
+		IPAACA_INFO("Making new informer for category " << category)
 		std::string scope_string = "/ipaaca/category/" + category;
 		Informer<AnyType>::Ptr informer = getFactory().createInformer<AnyType> ( Scope(scope_string));
 		_informer_store[category] = informer;
@@ -640,6 +687,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)
 :Buffer(basename, "IB")
@@ -647,17 +696,23 @@ 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)
 :Buffer(basename, "IB")
 {
 	_create_category_listener_if_needed(category_interest1);
+	_create_category_listener_if_needed(_uuid);
+	triggerResend = false;
 }
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2)
 :Buffer(basename, "IB")
 {
 	_create_category_listener_if_needed(category_interest1);
 	_create_category_listener_if_needed(category_interest2);
+	_create_category_listener_if_needed(_uuid);
+	triggerResend = false;
 }
 IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::string& category_interest1, const std::string& category_interest2, const std::string& category_interest3)
 :Buffer(basename, "IB")
@@ -665,6 +720,8 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 	_create_category_listener_if_needed(category_interest1);
 	_create_category_listener_if_needed(category_interest2);
 	_create_category_listener_if_needed(category_interest3);
+	_create_category_listener_if_needed(_uuid);
+	triggerResend = false;
 }
 IPAACA_EXPORT InputBuffer::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)
 :Buffer(basename, "IB")
@@ -673,6 +730,8 @@ IPAACA_EXPORT InputBuffer::InputBuffer(const std::string& basename, const std::s
 	_create_category_listener_if_needed(category_interest2);
 	_create_category_listener_if_needed(category_interest3);
 	_create_category_listener_if_needed(category_interest4);
+	_create_category_listener_if_needed(_uuid);
+	triggerResend = false;
 }
 
 
@@ -707,6 +766,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));
 }
 
+
+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
@@ -732,16 +803,16 @@ 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)
+	IPAACA_INFO("Creating a new listener for category " << category)
 	std::string scope_string = "/ipaaca/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)
@@ -749,11 +820,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());
@@ -777,19 +886,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) {
@@ -797,14 +907,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) {
@@ -812,6 +922,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;
 			}
@@ -825,6 +936,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;
 			}
@@ -843,7 +955,6 @@ IPAACA_EXPORT void InputBuffer::_handle_iu_events(EventPtr event)
 		//IPAACA_INFO( "New RemotePushIU state: " << *(it->second) )
 	}
 }
-
 //}}}
 
 
@@ -867,7 +978,7 @@ IPAACA_EXPORT void IUInterface::_set_buffer(Buffer* buffer) { //boost::shared_pt
 		throw IUAlreadyInABufferError();
 	}
 	_buffer = buffer;
-	
+
 }
 
 IPAACA_EXPORT void IUInterface::_set_owner_name(const std::string& owner_name) {
@@ -969,6 +1080,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();
@@ -1035,7 +1167,7 @@ void Message::_internal_commit(const std::string& writer_name)
 	if (is_published()) {
 		IPAACA_INFO("Info: committing to a Message after sending has no global effects")
 	}
-	
+
 }
 //}}}
 
@@ -1468,7 +1600,7 @@ IPAACA_EXPORT AnnotatedData IUConverter::deserialize(const std::string& wireSche
 			//return std::make_pair(getDataType(), obj);
 			return std::make_pair("ipaaca::RemoteMessage", obj);
 			break;
-			} 
+			}
 		default:
 			// other cases not handled yet! ( TODO )
 			throw NotImplementedError();
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 1a3bdb4fc76045b3858d5d9b49c6c888fd0d314a..c58049aa098611c4961313df0a318acf9a993911 100644
--- a/ipaacalib/java/src/ipaaca/InputBuffer.java
+++ b/ipaacalib/java/src/ipaaca/InputBuffer.java
@@ -1,10 +1,10 @@
 /*
  * This file is part of IPAACA, the
  *  "Incremental Processing Architecture
- *   for Artificial Conversational Agents".  
+ *   for Artificial Conversational Agents".
  *
  * Copyright (c) 2009-2013 Sociable Agents Group
- *                         CITEC, Bielefeld University   
+ *                         CITEC, Bielefeld University
  *
  * http://opensource.cit-ec.de/projects/ipaaca/
  * http://purl.org/net/ipaaca
@@ -21,7 +21,7 @@
  * 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.  
+ * 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.
@@ -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,6 +72,7 @@ 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 boolean resendActive;
 
     public void close()
     {
@@ -123,12 +127,40 @@ public class InputBuffer extends Buffer
     public InputBuffer(String owningComponentName, Set<String> categoryInterests)
     {
         super(owningComponentName);
-        uniqueName = "/ipaaca/component/" + getUniqueShortName() + "/IB";
+        resendActive = false;
+        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);
+    }
+
+    /** 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):
@@ -162,6 +194,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]
@@ -273,7 +329,7 @@ public class InputBuffer extends Buffer
                 logger.warn("Spurious RemoteMessage event: already got this UID: "+rm.getUid());
                 return;
             }
-            
+
             //logger.info("Adding Message "+rm.getUid());
             messageStore.put(rm.getUid(), rm);
             //logger.info("Calling handlers for Message "+rm.getUid());
@@ -309,7 +365,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());
@@ -327,7 +388,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());
@@ -347,7 +413,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());
@@ -358,6 +429,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 35bdae69e8eb5917791cda1ff811869fecfe2820..5b370ace4c5a4ff666a7099853be3788c018f319 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;
@@ -101,6 +102,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)
@@ -147,6 +150,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:
@@ -305,6 +319,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
old mode 100755
new mode 100644
index 0bd8bbb2c5c891b00eff0d30ef746c30e0cd4201..41b88f612e93e2afd7b02221952dbe9b05050978
--- a/ipaacalib/python/src/ipaaca/__init__.py
+++ b/ipaacalib/python/src/ipaaca/__init__.py
@@ -2,10 +2,10 @@
 
 # This file is part of IPAACA, the
 #  "Incremental Processing Architecture
-#   for Artificial Conversational Agents".	
+#   for Artificial Conversational Agents".
 #
 # Copyright (c) 2009-2013 Sociable Agents Group
-#                         CITEC, Bielefeld University	
+#                         CITEC, Bielefeld University
 #
 # http://opensource.cit-ec.de/projects/ipaaca/
 # http://purl.org/net/ipaaca
@@ -22,7 +22,7 @@
 # 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.	
+# 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.
@@ -65,7 +65,7 @@ __all__ = [
 	'IUAccessMode',
 	'InputBuffer', 'OutputBuffer',
 	'IU',
-	'IUPublishedError', 'IUUpdateFailedError', 'IUCommittedError', 'IUReadOnlyError', 'IUNotFoundError',
+	'IUPublishedError', 'IUUpdateFailedError', 'IUCommittedError', 'IUReadOnlyError', 'IUNotFoundError', 'IUResendFailedError',
 	'logger'
 ]
 
@@ -75,7 +75,7 @@ __all__ = [
 
 def enum(*sequential, **named):
 	"""Create an enum type.
-	
+
 	Based on suggestion of Alec Thomas on stackoverflow.com:
 	http://stackoverflow.com/questions/36932/
 		whats-the-best-way-to-implement-an-enum-in-python/1695250#1695250
@@ -96,12 +96,12 @@ def unpack_typed_payload_item(protobuf_object):
 
 
 class IpaacaLoggingHandler(logging.Handler):
-	
+
 	def __init__(self, level=logging.DEBUG):
 		logging.Handler.__init__(self, level)
-	
+
 	def emit(self, record):
-		meta = '[ipaaca] (' + str(record.levelname) + ') ' 
+		meta = '[ipaaca] (' + str(record.levelname) + ') '
 		msg = str(record.msg.format(record.args))
 		print(meta + msg)
 
@@ -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."""
@@ -253,13 +257,13 @@ class Payload(dict):
 		#print("Payload.__delitem__() OUT")
 		self._batch_update_lock.release()
 		return r
-	
-	# Context-manager based batch updates, not yet thread-safe (on remote updates)	
+
+	# Context-manager based batch updates, not yet thread-safe (on remote updates)
 	def __enter__(self):
 		#print('running Payload.__enter__()')
 		self._wait_batch_update_lock(self._update_timeout)
 		self._update_on_every_change = False
-	
+
 	def __exit__(self, type, value, traceback):
 		#print('running Payload.__exit__()')
 		self.iu._modify_payload(is_delta=True, new_items=self._collected_modifications, keys_to_remove=self._collected_removals, writer_name=self._batch_update_writer_name)
@@ -291,12 +295,12 @@ class Payload(dict):
 
 
 class IUInterface(object): #{{{
-	
+
 	"""Base class of all specialised IU classes."""
-	
+
 	def __init__(self, uid, access_mode=IUAccessMode.PUSH, read_only=False):
 		"""Creates an IU.
-		
+
 		Keyword arguments:
 		uid -- unique ID of this IU
 		access_mode -- access mode of this IU
@@ -314,7 +318,7 @@ class IUInterface(object): #{{{
 		self._buffer = None
 		# payload is not present here
 		self._links = collections.defaultdict(set)
-	
+
 	def __str__(self):
 		s = unicode(self.__class__)+"{ "
 		s += "category="+("<None>" if self._category is None else self._category)+" "
@@ -331,8 +335,8 @@ class IUInterface(object): #{{{
 		s += "} "
 		s += "}"
 		return s
-	
-	
+
+
 	def _add_and_remove_links(self, add, remove):
 		'''Just add and remove the new links in our links set, do not send an update here'''
 		'''Note: Also used for remotely enforced links updates.'''
@@ -343,7 +347,7 @@ class IUInterface(object): #{{{
 		'''Note: Also used for remotely enforced links updates.'''
 		self._links = collections.defaultdict(set)
 		for type in links.keys(): self._links[type] |= set(links[type])
-		
+
 	def add_links(self, type, targets, writer_name=None):
 		'''Attempt to add links if the conditions are met
 		and send an update message. Then call the local setter.'''
@@ -370,45 +374,45 @@ class IUInterface(object): #{{{
 		return set(self._links[type])
 	def get_all_links(self):
 		return copy.deepcopy(self._links)
-	
+
 	def _get_revision(self):
 		return self._revision
 	revision = property(fget=_get_revision, doc='Revision number of the IU.')
-	
+
 	def _get_category(self):
 		return self._category
 	category = property(fget=_get_category, doc='Category of the IU.')
-	
+
 	def _get_payload_type(self):
 		return self._payload_type
 	payload_type = property(fget=_get_payload_type, doc='Type of the IU payload')
-	
+
 	def _get_committed(self):
 		return self._committed
 	committed = property(
 			fget=_get_committed,
 			doc='Flag indicating whether this IU has been committed to.')
-	
+
 	def _get_retracted(self):
 		return self._retracted
 	retracted = property(
 			fget=_get_retracted,
 			doc='Flag indicating whether this IU has been retracted.')
-	
+
 	def _get_uid(self):
 		return self._uid
 	uid = property(fget=_get_uid, doc='Unique ID of the IU.')
-	
+
 	def _get_access_mode(self):
 		return self._access_mode
 	access_mode = property(fget=_get_access_mode, doc='Access mode of the IU.')
-	
+
 	def _get_read_only(self):
 		return self._read_only
 	read_only = property(
-			fget=_get_read_only, 
+			fget=_get_read_only,
 			doc='Flag indicating whether this IU is read only.')
-	
+
 	def _get_buffer(self):
 		return self._buffer
 	def _set_buffer(self, buffer):
@@ -417,9 +421,9 @@ class IUInterface(object): #{{{
 		self._buffer = buffer
 	buffer = property(
 			fget=_get_buffer,
-			fset=_set_buffer, 
+			fset=_set_buffer,
 			doc='Buffer this IU is held in.')
-	
+
 	def _get_owner_name(self):
 		return self._owner_name
 	def _set_owner_name(self, owner_name):
@@ -444,7 +448,7 @@ class IU(IUInterface):#{{{
 		self._payload_type = _payload_type
 		self.revision_lock = threading.RLock()
 		self._payload = Payload(iu=self)
-	
+
 	def _modify_links(self, is_delta=False, new_links={}, links_to_remove={}, writer_name=None):
 		if self.committed:
 			raise IUCommittedError(self)
@@ -460,7 +464,7 @@ class IU(IUInterface):#{{{
 						new_links=new_links,
 						links_to_remove=links_to_remove,
 						writer_name=self.owner_name if writer_name is None else writer_name)
-	
+
 	def _modify_payload(self, is_delta=True, new_items={}, keys_to_remove=[], writer_name=None):
 		"""Modify the payload: add or remove items from this payload locally and send update."""
 		if self.committed:
@@ -479,10 +483,10 @@ class IU(IUInterface):#{{{
 						new_items=new_items,
 						keys_to_remove=keys_to_remove,
 						writer_name=self.owner_name if writer_name is None else writer_name)
-	
+
 	def _increase_revision_number(self):
 		self._revision += 1
-	
+
 	def _internal_commit(self, writer_name=None):
 		if self.committed:
 			raise IUCommittedError(self)
@@ -492,11 +496,11 @@ class IU(IUInterface):#{{{
 				self._committed = True
 				if self.buffer is not None:
 					self.buffer._send_iu_commission(self, writer_name=writer_name)
-	
+
 	def commit(self):
 		"""Commit to this IU."""
 		return self._internal_commit()
-	
+
 	def _get_payload(self):
 		return self._payload
 	def _set_payload(self, new_pl, writer_name=None):
@@ -512,13 +516,13 @@ class IU(IUInterface):#{{{
 			fget=_get_payload,
 			fset=_set_payload,
 			doc='Payload dictionary of this IU.')
-	
+
 	def _get_is_published(self):
 		return self.buffer is not None
 	is_published = property(
-			fget=_get_is_published, 
+			fget=_get_is_published,
 			doc='Flag indicating whether this IU has been published or not.')
-	
+
 	def _set_buffer(self, buffer):
 		if self._buffer is not None:
 			raise Exception('The IU is already in a buffer, cannot move it.')
@@ -529,7 +533,7 @@ class IU(IUInterface):#{{{
 			fget=IUInterface._get_buffer,
 			fset=_set_buffer,
 			doc='Buffer this IU is held in.')
-	
+
 	def _set_uid(self, uid):
 		if self._uid is not None:
 			raise AttributeError('The uid of IU ' + self.uid + ' has already been set, cannot change it.')
@@ -545,25 +549,25 @@ class Message(IU):#{{{
 	"""Local IU of Message sub-type. Can be handled like a normal IU, but on the remote side it is only existent during the handler calls."""
 	def __init__(self, category='undef', access_mode=IUAccessMode.MESSAGE, read_only=True, _payload_type='MAP'):
 		super(Message, self).__init__(category=category, access_mode=access_mode, read_only=read_only, _payload_type=_payload_type)
-	
+
 	def _modify_links(self, is_delta=False, new_links={}, links_to_remove={}, writer_name=None):
 		if self.is_published:
 			logger.info('Info: modifying a Message after sending has no global effects')
-	
+
 	def _modify_payload(self, is_delta=True, new_items={}, keys_to_remove=[], writer_name=None):
 		if self.is_published:
 			logger.info('Info: modifying a Message after sending has no global effects')
-	
+
 	def _increase_revision_number(self):
 		self._revision += 1
-	
+
 	def _internal_commit(self, writer_name=None):
 		if self.is_published:
 			logger.info('Info: committing to a Message after sending has no global effects')
-	
+
 	def commit(self):
 		return self._internal_commit()
-	
+
 	def _get_payload(self):
 		return self._payload
 	def _set_payload(self, new_pl, writer_name=None):
@@ -582,13 +586,13 @@ class Message(IU):#{{{
 			fget=_get_payload,
 			fset=_set_payload,
 			doc='Payload dictionary of this IU.')
-	
+
 	def _get_is_published(self):
 		return self.buffer is not None
 	is_published = property(
-			fget=_get_is_published, 
+			fget=_get_is_published,
 			doc='Flag indicating whether this IU has been published or not.')
-	
+
 	def _set_buffer(self, buffer):
 		if self._buffer is not None:
 			raise Exception('The IU is already in a buffer, cannot move it.')
@@ -599,7 +603,7 @@ class Message(IU):#{{{
 			fget=IUInterface._get_buffer,
 			fset=_set_buffer,
 			doc='Buffer this IU is held in.')
-	
+
 	def _set_uid(self, uid):
 		if self._uid is not None:
 			raise AttributeError('The uid of IU ' + self.uid + ' has already been set, cannot change it.')
@@ -611,9 +615,9 @@ class Message(IU):#{{{
 #}}}
 
 class RemoteMessage(IUInterface):#{{{
-	
+
 	"""A remote IU with access mode 'MESSAGE'."""
-	
+
 	def __init__(self, uid, revision, read_only, owner_name, category, payload_type, committed, payload, links):
 		super(RemoteMessage, self).__init__(uid=uid, access_mode=IUAccessMode.PUSH, read_only=read_only)
 		self._revision = revision
@@ -627,10 +631,10 @@ class RemoteMessage(IUInterface):#{{{
 		#  We are just receiving it here and applying the new data.
 		self._payload = Payload(iu=self, new_payload=payload, omit_init_update_message=True)
 		self._links = links
-	
+
 	def _modify_links(self, is_delta=False, new_links={}, links_to_remove={}, writer_name=None):
 		logger.info('Info: modifying a RemoteMessage only has local effects')
-	
+
 	def _modify_payload(self, is_delta=True, new_items={}, keys_to_remove=[], writer_name=None):
 		logger.info('Info: modifying a RemoteMessage only has local effects')
 
@@ -655,7 +659,7 @@ class RemoteMessage(IUInterface):#{{{
 			self._add_and_remove_links(add=update.new_links, remove=update.links_to_remove)
 		else:
 			self._replace_links(links=update.new_links)
-	
+
 	def _apply_update(self, update):
 		"""Apply a IUPayloadUpdate to the IU."""
 		logger.warning('Warning: should never be called: RemoteMessage._apply_update')
@@ -666,12 +670,12 @@ class RemoteMessage(IUInterface):#{{{
 		else:
 			# NOTE Please read the comment in the constructor
 			self._payload = Payload(iu=self, new_payload=update.new_items, omit_init_update_message=True)
-	
+
 	def _apply_commission(self):
 		"""Apply commission to the IU"""
 		logger.warning('Warning: should never be called: RemoteMessage._apply_commission')
 		self._committed = True
-	
+
 	def _apply_retraction(self):
 		"""Apply retraction to the IU"""
 		logger.warning('Warning: should never be called: RemoteMessage._apply_retraction')
@@ -679,9 +683,9 @@ class RemoteMessage(IUInterface):#{{{
 #}}}
 
 class RemotePushIU(IUInterface):#{{{
-	
+
 	"""A remote IU with access mode 'PUSH'."""
-	
+
 	def __init__(self, uid, revision, read_only, owner_name, category, payload_type, committed, payload, links):
 		super(RemotePushIU, self).__init__(uid=uid, access_mode=IUAccessMode.PUSH, read_only=read_only)
 		self._revision = revision
@@ -695,7 +699,7 @@ class RemotePushIU(IUInterface):#{{{
 		#  We are just receiving it here and applying the new data.
 		self._payload = Payload(iu=self, new_payload=payload, omit_init_update_message=True)
 		self._links = links
-	
+
 	def _modify_links(self, is_delta=False, new_links={}, links_to_remove={}, writer_name=None):
 		"""Modify the links: add or remove item from this payload remotely and send update."""
 		if self.committed:
@@ -715,7 +719,7 @@ class RemotePushIU(IUInterface):#{{{
 			raise IUUpdateFailedError(self)
 		else:
 			self._revision = new_revision
-	
+
 	def _modify_payload(self, is_delta=True, new_items={}, keys_to_remove=[], writer_name=None):
 		"""Modify the payload: add or remove item from this payload remotely and send update."""
 		if self.committed:
@@ -790,7 +794,7 @@ class RemotePushIU(IUInterface):#{{{
 			self._add_and_remove_links(add=update.new_links, remove=update.links_to_remove)
 		else:
 			self._replace_links(links=update.new_links)
-	
+
 	def _apply_update(self, update):
 		"""Apply a IUPayloadUpdate to the IU."""
 		self._revision = update.revision
@@ -800,11 +804,11 @@ class RemotePushIU(IUInterface):#{{{
 		else:
 			# NOTE Please read the comment in the constructor
 			self._payload = Payload(iu=self, new_payload=update.new_items, omit_init_update_message=True)
-	
+
 	def _apply_commission(self):
 		"""Apply commission to the IU"""
 		self._committed = True
-	
+
 	def _apply_retraction(self):
 		"""Apply retraction to the IU"""
 		self._retracted = True
@@ -815,12 +819,12 @@ class IntConverter(rsb.converter.Converter):#{{{
 	"""Convert Python int objects to Protobuf ints and vice versa."""
 	def __init__(self, wireSchema="int", dataType=int):
 		super(IntConverter, self).__init__(bytearray, dataType, wireSchema)
-	
+
 	def serialize(self, value):
 		pbo = ipaaca_pb2.IntMessage()
 		pbo.value = value
 		return bytearray(pbo.SerializeToString()), self.wireSchema
-	
+
 	def deserialize(self, byte_stream, ws):
 		pbo = ipaaca_pb2.IntMessage()
 		pbo.ParseFromString( str(byte_stream) )
@@ -835,7 +839,7 @@ class IUConverter(rsb.converter.Converter):#{{{
 	'''
 	def __init__(self, wireSchema="ipaaca-iu", dataType=IU):
 		super(IUConverter, self).__init__(bytearray, dataType, wireSchema)
-	
+
 	def serialize(self, iu):
 		pbo = ipaaca_pb2.IU()
 		pbo.uid = iu._uid
@@ -859,7 +863,7 @@ class IUConverter(rsb.converter.Converter):#{{{
 			linkset.targets.extend(iu._links[type_])
 		ws = "ipaaca-messageiu" if iu._access_mode == IUAccessMode.MESSAGE else self.wireSchema
 		return bytearray(pbo.SerializeToString()), ws
-	
+
 	def deserialize(self, byte_stream, ws):
 		type = self.getDataType()
 		#print('IUConverter.deserialize got a '+str(type)+' over wireSchema '+ws)
@@ -921,7 +925,7 @@ class MessageConverter(rsb.converter.Converter):#{{{
 	'''
 	def __init__(self, wireSchema="ipaaca-messageiu", dataType=Message):
 		super(IUConverter, self).__init__(bytearray, dataType, wireSchema)
-	
+
 	def serialize(self, iu):
 		pbo = ipaaca_pb2.IU()
 		pbo.uid = iu._uid
@@ -945,7 +949,7 @@ class MessageConverter(rsb.converter.Converter):#{{{
 			linkset.targets.extend(iu._links[type_])
 		ws = "ipaaca-messageiu" if iu._access_mode == IUAccessMode.MESSAGE else self.wireSchema
 		return bytearray(pbo.SerializeToString()), ws
-	
+
 	def deserialize(self, byte_stream, ws):
 		type = self.getDataType()
 		#print('MessageConverter.deserialize got a '+str(type)+' over wireSchema '+ws)
@@ -1002,7 +1006,7 @@ class MessageConverter(rsb.converter.Converter):#{{{
 
 
 class IULinkUpdate(object):#{{{
-	
+
 	def __init__(self, uid, revision, is_delta, writer_name="undef", new_links=None, links_to_remove=None):
 		super(IULinkUpdate, self).__init__()
 		self.uid = uid
@@ -1011,7 +1015,7 @@ class IULinkUpdate(object):#{{{
 		self.is_delta = is_delta
 		self.new_links = collections.defaultdict(set) if new_links is None else collections.defaultdict(set, new_links)
 		self.links_to_remove = collections.defaultdict(set) if links_to_remove is None else collections.defaultdict(set, links_to_remove)
-	
+
 	def __str__(self):
 		s =  'LinkUpdate(' + 'uid=' + self.uid + ', '
 		s += 'revision='+str(self.revision)+', '
@@ -1023,7 +1027,7 @@ class IULinkUpdate(object):#{{{
 #}}}
 
 class IUPayloadUpdate(object):#{{{
-	
+
 	def __init__(self, uid, revision, is_delta, writer_name="undef", new_items=None, keys_to_remove=None):
 		super(IUPayloadUpdate, self).__init__()
 		self.uid = uid
@@ -1032,7 +1036,7 @@ class IUPayloadUpdate(object):#{{{
 		self.is_delta = is_delta
 		self.new_items = {} if new_items is None else new_items
 		self.keys_to_remove = [] if keys_to_remove is None else keys_to_remove
-	
+
 	def __str__(self):
 		s =  'PayloadUpdate(' + 'uid=' + self.uid + ', '
 		s += 'revision='+str(self.revision)+', '
@@ -1046,7 +1050,7 @@ class IUPayloadUpdate(object):#{{{
 class IULinkUpdateConverter(rsb.converter.Converter):#{{{
 	def __init__(self, wireSchema="ipaaca-iu-link-update", dataType=IULinkUpdate):
 		super(IULinkUpdateConverter, self).__init__(bytearray, dataType, wireSchema)
-	
+
 	def serialize(self, iu_link_update):
 		pbo = ipaaca_pb2.IULinkUpdate()
 		pbo.uid = iu_link_update.uid
@@ -1062,7 +1066,7 @@ class IULinkUpdateConverter(rsb.converter.Converter):#{{{
 			linkset.targets.extend(iu_link_update.links_to_remove[type_])
 		pbo.is_delta = iu_link_update.is_delta
 		return bytearray(pbo.SerializeToString()), self.wireSchema
-	
+
 	def deserialize(self, byte_stream, ws):
 		type = self.getDataType()
 		if type == IULinkUpdate:
@@ -1082,7 +1086,7 @@ class IULinkUpdateConverter(rsb.converter.Converter):#{{{
 class IUPayloadUpdateConverter(rsb.converter.Converter):#{{{
 	def __init__(self, wireSchema="ipaaca-iu-payload-update", dataType=IUPayloadUpdate):
 		super(IUPayloadUpdateConverter, self).__init__(bytearray, dataType, wireSchema)
-	
+
 	def serialize(self, iu_payload_update):
 		pbo = ipaaca_pb2.IUPayloadUpdate()
 		pbo.uid = iu_payload_update.uid
@@ -1094,7 +1098,7 @@ class IUPayloadUpdateConverter(rsb.converter.Converter):#{{{
 		pbo.keys_to_remove.extend(iu_payload_update.keys_to_remove)
 		pbo.is_delta = iu_payload_update.is_delta
 		return bytearray(pbo.SerializeToString()), self.wireSchema
-	
+
 	def deserialize(self, byte_stream, ws):
 		type = self.getDataType()
 		if type == IUPayloadUpdate:
@@ -1128,12 +1132,12 @@ class FrozenIUStore(IUStore):
 		raise AttributeError()
 
 class IUEventHandler(object):
-	
+
 	"""Wrapper for IU event handling functions."""
-	
+
 	def __init__(self, handler_function, for_event_types=None, for_categories=None):
 		"""Create an IUEventHandler.
-		
+
 		Keyword arguments:
 		handler_function -- the handler function with the signature
 			(IU, event_type, local)
@@ -1150,10 +1154,10 @@ class IUEventHandler(object):
 		self._for_categories = (
 			None if for_categories is None else
 			(for_categories[:] if hasattr(for_categories, '__iter__') else [for_categories]))
-	
+
 	def condition_met(self, event_type, category):
 		"""Check whether this IUEventHandler should be called.
-		
+
 		Keyword arguments:
 		event_type -- type of the IU event
 		category -- category of the IU which triggered the event
@@ -1161,10 +1165,10 @@ class IUEventHandler(object):
 		type_condition_met = (self._for_event_types is None or event_type in self._for_event_types)
 		cat_condition_met = (self._for_categories is None or category in self._for_categories)
 		return type_condition_met and cat_condition_met
-	
+
 	def call(self, buffer, iu_uid, local, event_type, category):
 		"""Call this IUEventHandler's function, if it applies.
-		
+
 		Keyword arguments:
 		buffer -- the buffer in which the IU is stored
 		iu_uid -- the uid of the IU
@@ -1178,12 +1182,12 @@ class IUEventHandler(object):
 
 
 class Buffer(object):
-	
+
 	"""Base class for InputBuffer and OutputBuffer."""
-	
+
 	def __init__(self, owning_component_name, participant_config=None):
 		'''Create a Buffer.
-		
+
 		Keyword arguments:
 		owning_compontent_name -- name of the entity that owns this Buffer
 		participant_config -- RSB configuration
@@ -1196,55 +1200,56 @@ class Buffer(object):
 		self._unique_name = "undef-"+self._uuid
 		self._iu_store = IUStore()
 		self._iu_event_handlers = []
-	
+
 	def _get_frozen_iu_store(self):
 		return FrozenIUStore(original_iu_store = self._iu_store)
 	iu_store = property(fget=_get_frozen_iu_store, doc='Copy-on-read version of the internal IU store')
-	
+
 	def register_handler(self, handler_function, for_event_types=None, for_categories=None):
 		"""Register a new IU event handler function.
-		
+
 		Keyword arguments:
 		handler_function -- a function with the signature (IU, event_type, local)
 		for_event_types -- a list of event types or None if handler should
 			be called for all event types
 		for_categories -- a list of category names or None if handler should
 			be called for all categories
-		
+
 		 """
 		handler = IUEventHandler(handler_function=handler_function, for_event_types=for_event_types, for_categories=for_categories)
 		self._iu_event_handlers.append(handler)
-	
+
 	def call_iu_event_handlers(self, uid, local, event_type, category):
 		"""Call registered IU event handler functions registered for this event_type and category."""
 		for h in self._iu_event_handlers:
 			h.call(self, uid, local=local, event_type=event_type, category=category)
-	
+
 	def _get_owning_component_name(self):
 		"""Return the name of this Buffer's owning component"""
 		return self._owning_component_name
 	owning_component_name = property(_get_owning_component_name)
-	
+
 	def _get_unique_name(self):
 		"""Return the Buffer's unique name."""
 		return self._unique_name
 	unique_name = property(_get_unique_name)
-	
+
 
 
 class InputBuffer(Buffer):
-	
+
 	"""An InputBuffer that holds remote IUs."""
-	
-	def __init__(self, owning_component_name, category_interests=None, participant_config=None):
+
+	def __init__(self, owning_component_name, category_interests=None, participant_config=None, resend_active = False ):
 		'''Create an InputBuffer.
-		
+
 		Keyword arguments:
 		owning_compontent_name -- name of the entity that owns this InputBuffer
 		category_interests -- list of IU categories this Buffer is interested in
 		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
@@ -1252,31 +1257,39 @@ 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):
 		'''Return (or create, store and return) a category listener.'''
-		if iu_category not in self._listener_store: 
+		if iu_category not in self._listener_store:
 			cat_listener = rsb.createListener(rsb.Scope("/ipaaca/category/"+str(iu_category)), config=self._participant_config)
 			cat_listener.addHandler(self._handle_iu_events)
 			self._listener_store[iu_category] = cat_listener
 			self._category_interests.append(iu_category)
-			logger.info("Added listener in scope "+"/ipaaca/category/"+iu_category)
-	
+			logger.warning("Added listener in scope "+"/ipaaca/category/"+iu_category)#info
+
 	def _handle_iu_events(self, event):
 		'''Dispatch incoming IU events.
-		
+
 		Adds incoming IU's to the store, applies payload and commit updates to
 		IU, calls IU event handlers.'
-		
+
 		Keyword arguments:
 		event -- a converted RSB event
 		'''
@@ -1297,11 +1310,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]
@@ -1319,7 +1342,7 @@ class InputBuffer(Buffer):
 					return
 				#else:
 				#	print('Got update written by buffer '+str(event.data.writer_name))
-					
+
 				if type_ is ipaaca_pb2.IUCommission:
 					# IU commit
 					iu = self._iu_store[event.data.uid]
@@ -1343,14 +1366,20 @@ 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, participant_config=None):
 		'''Create an Output Buffer.
-		
+
 		Keyword arguments:
 		owning_component_name -- name of the entity that own this buffer
 		participant_config -- RSB configuration
@@ -1361,11 +1390,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
-	
+
 	def _create_own_name_listener(self, iu_category):
 		# FIXME replace this
 		'''Create an own name listener.'''
@@ -1377,7 +1408,7 @@ class OutputBuffer(Buffer):
 		#logger.info("Added category listener for "+iu_category)
 		#return cat_listener
 		pass
-	
+
 	# hbuschme: IUs now have their Ids assigned on creation
 	#def _generate_iu_uid(self):
 	#	'''Generate a unique IU id of the form ????'''
@@ -1403,7 +1434,7 @@ class OutputBuffer(Buffer):
 				iu.set_links(links=update.new_links, writer_name=update.writer_name)
 			self.call_iu_event_handlers(update.uid, local=True, event_type=IUEventType.LINKSUPDATED, category=iu.category)
 			return iu.revision
-	
+
 	def _remote_update_payload(self, update):
 		'''Apply a remotely requested update to one of the stored IU's payload.'''
 		if update.uid not in self._iu_store:
@@ -1431,7 +1462,21 @@ class OutputBuffer(Buffer):
 				# _set_payload etc. have also incremented the revision number
 			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:
@@ -1449,7 +1494,7 @@ class OutputBuffer(Buffer):
 				iu._internal_commit(writer_name=iu_commission.writer_name)
 				self.call_iu_event_handlers(iu_commission.uid, local=True, event_type=IUEventType.COMMITTED, category=iu.category)
 				return iu.revision
-	
+
 	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:
@@ -1462,7 +1507,7 @@ class OutputBuffer(Buffer):
 		self._informer_store[iu_category] = informer_iu #new_tuple
 		logger.info("Returning NEW informer on scope "+"/ipaaca/category/"+str(iu_category))
 		return informer_iu #return new_tuple
-	
+
 	def add(self, iu):
 		'''Add an IU to the IU store, assign an ID and publish it.'''
 		# hbuschme: IUs now have their Ids assigned on creation
@@ -1478,7 +1523,7 @@ class OutputBuffer(Buffer):
 			self._iu_store[iu.uid] = iu
 		iu.buffer = self
 		self._publish_iu(iu)
-	
+
 	def remove(self, iu=None, iu_uid=None):
 		'''Remove the iu or an IU corresponding to iu_uid from the OutputBuffer, retracting it from the system.'''
 		if iu is None:
@@ -1492,12 +1537,12 @@ class OutputBuffer(Buffer):
 		self._retract_iu(iu)
 		del self._iu_store[iu.uid]
 		return iu
-	
+
 	def _publish_iu(self, iu):
 		'''Publish an IU.'''
 		informer = self._get_informer(iu._category)
 		informer.publishData(iu)
-	
+
 	def _retract_iu(self, iu):
 		'''Retract (unpublish) an IU.'''
 		iu_retraction = ipaaca_pb2.IURetraction()
@@ -1505,10 +1550,10 @@ class OutputBuffer(Buffer):
 		iu_retraction.revision = iu.revision
 		informer = self._get_informer(iu._category)
 		informer.publishData(iu_retraction)
-	
+
 	def _send_iu_commission(self, iu, writer_name):
 		'''Send IU commission.
-		
+
 		Keyword arguments:
 		iu -- the IU that has been committed to
 		writer_name -- name of the Buffer that initiated this commit, necessary
@@ -1523,10 +1568,10 @@ class OutputBuffer(Buffer):
 		iu_commission.writer_name = iu.owner_name if writer_name is None else writer_name
 		informer = self._get_informer(iu._category)
 		informer.publishData(iu_commission)
-	
+
 	def _send_iu_link_update(self, iu, is_delta, revision, new_links=None, links_to_remove=None, writer_name="undef"):
 		'''Send an IU link update.
-		
+
 		Keyword arguments:
 		iu -- the IU being updated
 		is_delta -- whether this is an incremental update or a replacement
@@ -1550,10 +1595,10 @@ class OutputBuffer(Buffer):
 		informer = self._get_informer(iu._category)
 		informer.publishData(link_update)
 		# FIXME send the notification to the target, if the target is not the writer_name
-	
+
 	def _send_iu_payload_update(self, iu, is_delta, revision, new_items=None, keys_to_remove=None, writer_name="undef"):
 		'''Send an IU payload update.
-		
+
 		Keyword arguments:
 		iu -- the IU being updated
 		is_delta -- whether this is an incremental update or a replacement
@@ -1600,6 +1645,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))