diff --git a/java/src/ipaaca/AbstractIU.java b/java/src/ipaaca/AbstractIU.java
index 9937f8e6c8f17bee18a116c271a529684c792c8a..378659915f967128a398c2829e1cfcc4bbdc0cb5 100644
--- a/java/src/ipaaca/AbstractIU.java
+++ b/java/src/ipaaca/AbstractIU.java
@@ -32,11 +32,28 @@ public abstract class AbstractIU
     protected SetMultimap<String, String> links = HashMultimap.create();
     private final SetMultimap<String, String> EMPTYLINKS = HashMultimap.create();
 
+    public SetMultimap<String, String> getAllLinks()
+    {
+        return links;
+    }
+    
     public Set<String> getLinks(String type)
     {
         return links.get(type);
     }
 
+    public void setLinksLocally(SetMultimap<String, String> l)
+    {
+        links.clear();
+        links.putAll(l);
+    }
+    
+    public void setLinksLocally(String type, Set<String> values)
+    {
+        links.removeAll(type);
+        links.putAll(type, values);        
+    }
+    
     /**
      * Replace all links
      */
diff --git a/java/src/ipaaca/IUConverter.java b/java/src/ipaaca/IUConverter.java
index b1365dc499419b81e1fe182ac2b6251fe7f29bd6..5d0508fe112141c572081d5477909867d4354f3e 100644
--- a/java/src/ipaaca/IUConverter.java
+++ b/java/src/ipaaca/IUConverter.java
@@ -1,9 +1,12 @@
 package ipaaca;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map.Entry;
 
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.SetMultimap;
 import com.google.protobuf.InvalidProtocolBufferException;
 
 import rsb.converter.ConversionException;
@@ -12,6 +15,7 @@ import rsb.converter.ConverterSignature;
 import rsb.converter.UserData;
 import rsb.converter.WireContents;
 import ipaaca.Ipaaca.IU;
+import ipaaca.Ipaaca.LinkSet;
 import ipaaca.Ipaaca.PayloadItem;
 
 /**
@@ -48,6 +52,12 @@ public class IUConverter implements Converter<ByteBuffer>
                     .build());
         }
         
+        List<LinkSet> links = new ArrayList<LinkSet>();
+        for (Entry<String, Collection<String>> entry:iua.getAllLinks().asMap().entrySet())
+        {
+            links.add(LinkSet.newBuilder().setType(entry.getKey()).addAllTargets(entry.getValue()).build());
+        }
+        
         IU iu = IU.newBuilder()
                 .setUid(iua.getUid())
                 .setRevision(iua.getRevision())
@@ -58,6 +68,7 @@ public class IUConverter implements Converter<ByteBuffer>
                 .setReadOnly(iua.isReadOnly())
                 .setPayloadType("MAP")
                 .addAllPayload(payloadItems)
+                .addAllLinks(links)
                 .build();
         return new WireContents<ByteBuffer>(ByteBuffer.wrap(iu.toByteArray()),"ipaaca-remotepushiu");        
     }
@@ -83,7 +94,13 @@ public class IUConverter implements Converter<ByteBuffer>
             iuout.setOwnerName(iu.getOwnerName());
             iuout.setRevision(iu.getRevision());
             iuout.setReadOnly(iu.getReadOnly());            
-            iuout.payload = new Payload(iuout,iu.getPayloadList());       
+            iuout.payload = new Payload(iuout,iu.getPayloadList());            
+            SetMultimap<String, String> links = HashMultimap.create();
+            for(LinkSet ls: iu.getLinksList())
+            {
+                links.putAll(ls.getType(),ls.getTargetsList());
+            }
+            iuout.setLinksLocally(links);
             return new UserData<RemotePushIU>(iuout, RemotePushIU.class);            
         }
         else
diff --git a/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java b/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java
index 455cc025a0756ea8b6242a7c1e783318aa72354e..cb05c0eafccc2824a5648718d1ade71936f2b381 100644
--- a/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java
+++ b/java/test/src/ipaaca/ComponentCommunicationIntegrationTest.java
@@ -109,6 +109,7 @@ public class ComponentCommunicationIntegrationTest
         localIU = new LocalIU();
         localIU.setCategory(CATEGORY);
         localIU.getPayload().put("key1", "item1");
+        localIU.addLinks("INIT", ImmutableSet.of("init1","init2"));
         outBuffer.add(localIU);
     }
     
@@ -126,6 +127,7 @@ public class ComponentCommunicationIntegrationTest
         AbstractIU iuIn = inBuffer.getIU(localIU.getUid());
         assertNotNull(iuIn);
         assertEqualIU(iuIn, localIU);
+        assertThat(localIU.getLinks("INIT"),containsInAnyOrder("init1","init2"));
         assertEquals(1,component2EventHandler.getNumberOfAddEvents(iuIn.getUid()));
         assertEquals(0,component1EventHandler.getNumberOfAddEvents(localIU.getUid()));
     }
diff --git a/java/test/src/ipaaca/IUTestUtil.java b/java/test/src/ipaaca/IUTestUtil.java
index 2a4e6ae7328796089002587cbac0bc9f8374d1dc..f47149c014c614df59ae5fe41941455551dfd96c 100644
--- a/java/test/src/ipaaca/IUTestUtil.java
+++ b/java/test/src/ipaaca/IUTestUtil.java
@@ -1,12 +1,19 @@
 package ipaaca;
-
+import static org.junit.Assert.*;
+import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import ipaaca.Ipaaca.IU;
+import ipaaca.Ipaaca.LinkSet;
 import ipaaca.Ipaaca.PayloadItem;
 
+import java.util.Collection;
+import java.util.List;
 import java.util.Map.Entry;
 
+import com.google.common.collect.SetMultimap;
+
 /**
  * Test utilities for the IU system.
  * @author hvanwelbergen
@@ -22,30 +29,25 @@ public final class IUTestUtil
         assertEquals(iu1.getUid(), iu2.getUid());
         assertEquals(iu1.getRevision(), iu2.getRevision());
         assertEquals(iu1.isReadOnly(), iu2.isReadOnly());
-        iu1.getPayload().equals(iu2.getPayload());
+        assertEquals(iu1.getPayload(),iu2.getPayload());
+        assertEquals(iu1.getAllLinks(),iu2.getAllLinks());
     }
     
-    public static void assertEqualIU(IU iuSrc, AbstractIU iuTarget)
+    public static void assertEqualPayload(Collection<PayloadItem> pl1, Payload pl2)
     {
-        assertEquals(iuSrc.getCategory(), iuTarget.getCategory());
-        assertEquals(iuSrc.getCommitted(), iuTarget.isCommitted());
-        assertEquals(iuSrc.getUid(), iuTarget.getUid());
-        assertEquals(iuSrc.getRevision(), iuTarget.getRevision());
-        assertEquals(iuSrc.getReadOnly(), iuTarget.isReadOnly());
-
-        // all payload items in src are in target
-        for (PayloadItem item : iuSrc.getPayloadList())
+        // all payload items in pl1 are in pl2
+        for (PayloadItem item : pl1)
         {
-            assertTrue("Key "+item.getKey() +" from protocol buffer payload not found in IU payload "+iuTarget.getPayload(),
-                    iuTarget.getPayload().containsKey(item.getKey()));
-            assertEquals(item.getValue(), iuTarget.getPayload().get(item.getKey()));
+            assertTrue("Key "+item.getKey() +" from protocol buffer payload not found in IU payload "+pl2,
+                    pl2.containsKey(item.getKey()));
+            assertEquals(item.getValue(), pl2.get(item.getKey()));
         }
 
-        // all payload items in target are in source
-        for (Entry<String, String> entry : iuTarget.getPayload().entrySet())
+        // all payload items in pl12 are in pl1
+        for (Entry<String, String> entry : pl2.entrySet())
         {
             boolean found = false;
-            for (PayloadItem item : iuSrc.getPayloadList())
+            for (PayloadItem item : pl1)
             {
                 if (item.getKey().equals(entry.getKey()) && item.getValue().equals(entry.getValue()))
                 {
@@ -54,7 +56,44 @@ public final class IUTestUtil
                 }
             }
             assertTrue("Entry " + entry + "from IU implementation not found in protocol buffer. Protocal buffer payload: "
-                    + iuSrc.getPayloadList(),found);
+                    + pl2,found);
+        }
+    }
+    
+    public static void assertEqualLinks(List<LinkSet> links1, SetMultimap<String,String> links2)
+    {
+        // all links in links1 are in links2
+        for(LinkSet ls:links1)
+        {
+            assertThat(links2.get(ls.getType()),containsInAnyOrder(ls.getTargetsList().toArray(new String[0])));            
+        }
+        
+        // all links in links2 are in links1
+        for(Entry<String, Collection<String>> entry:links2.asMap().entrySet())
+        {
+            boolean found = false;
+            for(LinkSet ls:links1)
+            {
+                if(ls.getType().equals(entry.getKey()))
+                {
+                    assertThat(entry.getValue(), containsInAnyOrder(ls.getTargetsList().toArray(new String[0])));            
+                    found = true;
+                    break;
+                }
+            }
+            assertTrue("Link " + entry + "from IU implementation not found in protocol buffer. Protocal buffer links: "
+                    + links2,found);
         }
     }
+    
+    public static void assertEqualIU(IU iuSrc, AbstractIU iuTarget)
+    {
+        assertEquals(iuSrc.getCategory(), iuTarget.getCategory());
+        assertEquals(iuSrc.getCommitted(), iuTarget.isCommitted());
+        assertEquals(iuSrc.getUid(), iuTarget.getUid());
+        assertEquals(iuSrc.getRevision(), iuTarget.getRevision());
+        assertEquals(iuSrc.getReadOnly(), iuTarget.isReadOnly());
+        assertEqualPayload(iuSrc.getPayloadList(),iuTarget.getPayload());
+        assertEqualLinks(iuSrc.getLinksList(),iuTarget.getAllLinks());                
+    }
 }
diff --git a/java/test/src/ipaaca/IuConverterTest.java b/java/test/src/ipaaca/IuConverterTest.java
index 78843d2780cd07a0d24596e0b7ce3382a4a0377f..5e2f8ac755ae6c3a42bc63f937f9c8bc62adc247 100644
--- a/java/test/src/ipaaca/IuConverterTest.java
+++ b/java/test/src/ipaaca/IuConverterTest.java
@@ -7,6 +7,7 @@ import java.util.List;
 import ipaaca.Ipaaca;
 import ipaaca.Ipaaca.IU;
 import ipaaca.Ipaaca.IU.AccessMode;
+import ipaaca.Ipaaca.LinkSet;
 import ipaaca.Ipaaca.PayloadItem;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.*;
@@ -15,6 +16,7 @@ import static org.mockito.Mockito.*;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.protobuf.InvalidProtocolBufferException;
 
 import rsb.converter.ConversionException;
@@ -52,6 +54,8 @@ public class IuConverterTest
         rpIU.getPayload().enforcedSetItem("key1", "value1");
         rpIU.getPayload().enforcedSetItem("key2", "value2");
         rpIU.getPayload().enforcedSetItem("key3", "value3");
+        rpIU.setLinksLocally("SAME_LEVEL",ImmutableSet.of("sibling1","sibling2"));
+        rpIU.setLinksLocally("GROUNDED_IN",ImmutableSet.of("parent1","parent2"));
                 
         WireContents<ByteBuffer> wiu = converter.serialize(RemotePushIU.class,rpIU);
         IU iu = IU.newBuilder().mergeFrom(wiu.getSerialization().array()).build();
@@ -73,7 +77,20 @@ public class IuConverterTest
         List<PayloadItem> payload = new ArrayList<PayloadItem>();
         payload.add(createPayloadItem("key1","value1"));
         payload.add(createPayloadItem("key2","value2"));
-        payload.add(createPayloadItem("key3","value3"));        
+        payload.add(createPayloadItem("key3","value3"));
+        List<LinkSet> links = new ArrayList<LinkSet>();
+        links.add(
+                LinkSet.newBuilder()
+                .addAllTargets(ImmutableSet.of("sibling1","sibling2"))
+                .setType("SAME_LEVEL")
+                .build()
+                );
+        links.add(
+                LinkSet.newBuilder()
+                .addAllTargets(ImmutableSet.of("parent1","parent2"))
+                .setType("GROUNDED_IN")
+                .build()
+                );
         Ipaaca.IU iu = Ipaaca.IU.newBuilder()
                 .setUid("uid1")
                 .setRevision(1)
@@ -83,6 +100,8 @@ public class IuConverterTest
                 .setReadOnly(false)
                 .setCategory(CATEGORY)                
                 .addAllPayload(payload)
+                .addAllLinks(links)
+                .setPayloadType("")
                 .build();
         
         UserData<?> data = converter.deserialize("", ByteBuffer.wrap(iu.toByteArray()));