diff --git a/ipaacalib/java/src/ipaaca/Buffer.java b/ipaacalib/java/src/ipaaca/Buffer.java
index e335e1f4175e82a68e8e6b2e7873a724f0c94d87..1795283ad9aebdff32695f48959e2111498a85ab 100644
--- a/ipaacalib/java/src/ipaaca/Buffer.java
+++ b/ipaacalib/java/src/ipaaca/Buffer.java
@@ -1,7 +1,9 @@
 package ipaaca;
 
 import java.util.ArrayList;
+import java.util.EnumSet;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 
 /**
@@ -63,10 +65,35 @@ public abstract class Buffer
     // """
     // handler = IUEventHandler(handler_function=handler_function, for_event_types=for_event_types, for_categories=for_categories)
     // self._iu_event_handlers.append(handler)
+
     public void registerHandler(IUEventHandler handler)
     {
         eventHandlers.add(handler);
     }
+   
+    public void registerHandler(HandlerFunctor func) {
+    	IUEventHandler handler;
+    	handler = new IUEventHandler(func);
+    	registerHandler(handler);
+    }
+    
+    public void registerHandler(HandlerFunctor func, Set<String> categories) {
+    	IUEventHandler handler;
+    	handler = new IUEventHandler(func, categories);
+    	registerHandler(handler);
+    }
+    
+    public void registerHandler(HandlerFunctor func, EnumSet<IUEventType> eventTypes) {
+    	IUEventHandler handler;
+    	handler = new IUEventHandler(func, eventTypes);
+    	registerHandler(handler);
+    }
+   
+    public void registerHandler(HandlerFunctor func, EnumSet<IUEventType> eventTypes, Set<String> categories) {
+    	IUEventHandler handler;
+    	handler = new IUEventHandler(func, eventTypes, categories);
+    	registerHandler(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."""
@@ -76,7 +103,7 @@ public abstract class Buffer
     /**
      * Call registered IU event handler functions registered for this event_type and category.
      */
-    public void callIuEventHandlers(String uid, boolean local, IUEventType type, String category)
+    protected void callIuEventHandlers(String uid, boolean local, IUEventType type, String category)
     {
         for (IUEventHandler h : eventHandlers)
         {
diff --git a/ipaacalib/java/src/ipaaca/IUEventHandler.java b/ipaacalib/java/src/ipaaca/IUEventHandler.java
index 25f2135f70f7a46e527653fd1347c90d8b5c509d..263c9c6fc26cf178266f3532bb7487539f3ec924 100644
--- a/ipaacalib/java/src/ipaaca/IUEventHandler.java
+++ b/ipaacalib/java/src/ipaaca/IUEventHandler.java
@@ -1,6 +1,7 @@
 package ipaaca;
 
 import java.util.EnumSet;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -32,6 +33,27 @@ public class IUEventHandler
     // self._for_categories = (
     // None if for_categories is None else
     // (for_categories[:] if hasattr(for_categories, '__iter__') else [for_categories]))
+    
+    public IUEventHandler(HandlerFunctor func)
+    {
+        this.handleFunctor = func;
+        this.categories = new HashSet<String>();
+        this.eventTypes = EnumSet.allOf(IUEventType.class);
+    }
+    
+    public IUEventHandler(HandlerFunctor func, Set<String> categories)
+    {
+        this.handleFunctor = func;
+        this.categories = categories;
+        this.eventTypes = EnumSet.allOf(IUEventType.class);
+    }
+    
+    public IUEventHandler(HandlerFunctor func, EnumSet<IUEventType> eventTypes)
+    {
+        this.handleFunctor = func;
+        this.eventTypes = eventTypes;
+        this.categories = new HashSet<String>();
+    }
 
     public IUEventHandler(HandlerFunctor func, EnumSet<IUEventType> eventTypes, Set<String> categories)
     {
@@ -57,7 +79,13 @@ public class IUEventHandler
      */
     private boolean conditionMet(IUEventType type, String category)
     {
-        return eventTypes.contains(type) && categories.contains(category);
+    	if (this.categories.isEmpty()) { // match any category
+    		return this.eventTypes.contains(type);
+    	}
+    	else
+    	{
+    		return this.eventTypes.contains(type) && this.categories.contains(category);
+    	}
     }
 
     // def call(self, buffer, iu_uid, local, event_type, category):
diff --git a/ipaacalib/java/src/ipaaca/InputBuffer.java b/ipaacalib/java/src/ipaaca/InputBuffer.java
index ce3156c8aa814d90b1ad84f16f59dd7852944011..77db1c3045f48d6e29cfe1b585f6bcb05c77d06f 100644
--- a/ipaacalib/java/src/ipaaca/InputBuffer.java
+++ b/ipaacalib/java/src/ipaaca/InputBuffer.java
@@ -80,7 +80,7 @@ public class InputBuffer extends Buffer
     // remote_server = rsb.createRemoteServer(rsb.Scope(str(iu.owner_name)))
     // self._remote_server_store[iu.owner_name] = remote_server
     // return remote_server
-    public RemoteServer getRemoteServer(AbstractIU iu)
+    protected RemoteServer getRemoteServer(AbstractIU iu)
     {
         if (remoteServerStore.containsKey(iu.getOwnerName()))
         {
diff --git a/ipaacalib/java/src/ipaaca/LocalIU.java b/ipaacalib/java/src/ipaaca/LocalIU.java
index 3581d546d5c9566418d3505fe14d4ca359d2bfe7..7e560c8ee9dcf73a4a75403a515a9216281fe4a5 100644
--- a/ipaacalib/java/src/ipaaca/LocalIU.java
+++ b/ipaacalib/java/src/ipaaca/LocalIU.java
@@ -38,6 +38,15 @@ public class LocalIU extends AbstractIU
         payload = new Payload(this);
     }
 
+    public LocalIU(String category)
+    {
+        super(UUID.randomUUID().toString());
+        this.category = category;
+        revision = 1;
+        payload = new Payload(this); 
+    }
+    
+    
     // def _set_buffer(self, buffer):
     // if self._buffer is not None:
     // raise Exception('The IU is already in a buffer, cannot move it.')
@@ -45,7 +54,7 @@ public class LocalIU extends AbstractIU
     // self.owner_name = buffer.unique_name
     // self._payload.owner_name = buffer.unique_name
     //
-    public void setBuffer(OutputBuffer buffer)
+    protected void setBuffer(OutputBuffer buffer)
     {
         if (outputBuffer != null)
         {
diff --git a/ipaacalib/java/src/ipaaca/LocalMessageIU.java b/ipaacalib/java/src/ipaaca/LocalMessageIU.java
index c67c87ccf3656258cd05dc34e24c7d27141b7bfd..b749fadc1dd9a703515a993eaa38a66c3362092e 100644
--- a/ipaacalib/java/src/ipaaca/LocalMessageIU.java
+++ b/ipaacalib/java/src/ipaaca/LocalMessageIU.java
@@ -1,5 +1,6 @@
 package ipaaca;
 
+
 /**
  * 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.
  * @author hvanwelbergen
@@ -7,4 +8,14 @@ package ipaaca;
 public class LocalMessageIU extends LocalIU
 {
 
+    public LocalMessageIU()
+    {
+        super();
+    }
+
+    public LocalMessageIU(String category)
+    {
+        super(category);
+    }
+
 }
diff --git a/ipaacalib/java/src/ipaaca/OutputBuffer.java b/ipaacalib/java/src/ipaaca/OutputBuffer.java
index de5e64652e465c3376522d9007183ccdc48b236e..9d66806b7a976658263e35f58f88b29c00ff9526 100644
--- a/ipaacalib/java/src/ipaaca/OutputBuffer.java
+++ b/ipaacalib/java/src/ipaaca/OutputBuffer.java
@@ -327,7 +327,7 @@ public class OutputBuffer extends Buffer
     // '''Publish an IU.'''
     // informer = self._get_informer(iu._category)
     // informer.publishData(iu)
-    public void publishIU(AbstractIU iu)
+    private void publishIU(AbstractIU iu)
     {
         Informer<Object> informer = getInformer(iu.getCategory());
         try
@@ -364,7 +364,7 @@ public class OutputBuffer extends Buffer
      *            to enable remote components to filter out updates that originated
      *            from their own operations
      */
-    public void sendIUCommission(AbstractIU iu, String writerName)
+    protected void sendIUCommission(AbstractIU iu, String writerName)
     {
         IUCommission iuc = Ipaaca.IUCommission.newBuilder().setUid(iu.getUid()).setRevision(iu.getRevision())
                 .setWriterName(iu.getOwnerName() != null ? iu.getOwnerName() : writerName).build();
@@ -406,7 +406,7 @@ public class OutputBuffer extends Buffer
     // informer = self._get_informer(iu._category)
     // informer.publishData(payload_update)
 
-    public void sendIUPayloadUpdate(AbstractIU iu, IUPayloadUpdate update)
+    protected void sendIUPayloadUpdate(AbstractIU iu, IUPayloadUpdate update)
     {
         Informer<Object> informer = getInformer(iu.getCategory());
         try
@@ -419,7 +419,7 @@ public class OutputBuffer extends Buffer
         }
     }
 
-    public void sendIULinkUpdate(AbstractIU iu, IULinkUpdate update)
+    protected void sendIULinkUpdate(AbstractIU iu, IULinkUpdate update)
     {
         Informer<Object> informer = getInformer(iu.getCategory());
         try