Merge branch 'master' of git@github.com:Qi4j/qi4j-sandbox

Conflicts:
	extensions/osgi/bootstrap/pom.xml
	extensions/osgi/example/pom.xml
	extensions/osgi/integrationTests/pom.xml
	extensions/osgi/testBootstrap/pom.xml
	extensions/pom.xml
	libraries/entityproxy/pom.xml
	libraries/pom.xml
diff --git a/extensions/entitystore-javaspaces/src/main/java/org/qi4j/entitystore/javaspaces/JavaSpacesEntityStoreMixin.java b/extensions/entitystore-javaspaces/src/main/java/org/qi4j/entitystore/javaspaces/JavaSpacesEntityStoreMixin.java
index da1d9c7..6038807 100644
--- a/extensions/entitystore-javaspaces/src/main/java/org/qi4j/entitystore/javaspaces/JavaSpacesEntityStoreMixin.java
+++ b/extensions/entitystore-javaspaces/src/main/java/org/qi4j/entitystore/javaspaces/JavaSpacesEntityStoreMixin.java
@@ -16,19 +16,20 @@
  */
 package org.qi4j.entitystore.javaspaces;
 
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.Service;
+import org.qi4j.api.io.Input;
+import org.qi4j.api.io.Output;
+import org.qi4j.api.io.Receiver;
+import org.qi4j.api.io.Sender;
 import org.qi4j.entitystore.map.MapEntityStore;
 import org.qi4j.library.spaces.Space;
 import org.qi4j.spi.entity.EntityType;
 import org.qi4j.spi.entitystore.EntityNotFoundException;
 import org.qi4j.spi.entitystore.EntityStoreException;
 
+import java.io.*;
+
 /**
  * Java Spaces implementation of EntityStore.
  */
@@ -50,16 +51,26 @@
         return new StringReader( jsonData );
     }
 
-    public <ThrowableType extends Throwable> void visitMap( MapEntityStoreVisitor<ThrowableType> visitor )
-        throws ThrowableType
+    public Input<Reader, IOException> entityStates()
     {
-        for( String json : space )
+        return new Input<Reader, IOException>()
         {
-            Reader state = new StringReader( json );
-            visitor.visitEntity( state );
-        }
+            public <ReceiverThrowableType extends Throwable> void transferTo( Output<Reader, ReceiverThrowableType> output ) throws IOException, ReceiverThrowableType
+            {
+                output.receiveFrom( new Sender<Reader, IOException>()
+                {
+                    public <ReceiverThrowableType extends Throwable> void sendTo( Receiver<Reader, ReceiverThrowableType> receiver ) throws ReceiverThrowableType, IOException
+                    {
+                        for (String json : space)
+                        {
+                            Reader state = new StringReader( json );
+                            receiver.receive( state );
+                        }
+                    }
+                });
+            }
+        };
     }
-
     public void applyChanges( MapChanges changes )
         throws IOException
     {
diff --git a/extensions/entitystore-jgroups/osgi.bundle b/extensions/entitystore-jgroups/osgi.bundle
index 4c53b48..30d169e 100644
--- a/extensions/entitystore-jgroups/osgi.bundle
+++ b/extensions/entitystore-jgroups/osgi.bundle
@@ -26,6 +26,7 @@
                 org.qi4j.api.concern, \
                 org.qi4j.api.entity, \
                 org.qi4j.api.injection.scope, \
+                org.qi4j.api.io, \
                 org.qi4j.api.mixin, \
                 org.qi4j.api.service, \
                 org.qi4j.api.structure,\
diff --git a/extensions/entitystore-jgroups/src/main/java/org/qi4j/entitystore/jgroups/JGroupsEntityStoreMixin.java b/extensions/entitystore-jgroups/src/main/java/org/qi4j/entitystore/jgroups/JGroupsEntityStoreMixin.java
index 429e1e5..c1bfcff 100644
--- a/extensions/entitystore-jgroups/src/main/java/org/qi4j/entitystore/jgroups/JGroupsEntityStoreMixin.java
+++ b/extensions/entitystore-jgroups/src/main/java/org/qi4j/entitystore/jgroups/JGroupsEntityStoreMixin.java
@@ -17,26 +17,26 @@
 
 package org.qi4j.entitystore.jgroups;
 
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.Writer;
-import java.util.Map;
 import org.jgroups.JChannel;
 import org.jgroups.blocks.ReplicatedHashMap;
 import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.io.Input;
+import org.qi4j.api.io.Output;
+import org.qi4j.api.io.Receiver;
+import org.qi4j.api.io.Sender;
 import org.qi4j.api.service.Activatable;
 import org.qi4j.entitystore.map.MapEntityStore;
 import org.qi4j.spi.entity.EntityType;
 import org.qi4j.spi.entitystore.EntityNotFoundException;
 import org.qi4j.spi.entitystore.EntityStoreException;
 
+import java.io.*;
+
 /**
  * JGroups implementation of EntityStore
  */
 public class JGroupsEntityStoreMixin
-    implements Activatable, MapEntityStore
+        implements Activatable, MapEntityStore
 {
     private JChannel channel;
     private ReplicatedHashMap<String, String> replicatedMap;
@@ -55,30 +55,41 @@
     }
 
     public Reader get( EntityReference entityReference )
-        throws EntityStoreException
+            throws EntityStoreException
     {
         try
         {
             String data = replicatedMap.get( entityReference.identity() );
-            if( data == null )
+            if (data == null)
             {
                 throw new EntityNotFoundException( entityReference );
             }
             return new StringReader( data );
         }
-        catch( RuntimeException e )
+        catch (RuntimeException e)
         {
             throw new EntityStoreException( e );
         }
     }
 
-    public <ThrowableType extends Throwable> void visitMap( MapEntityStoreVisitor<ThrowableType> visitor )
-        throws ThrowableType
+    public Input<Reader, IOException> entityStates()
     {
-        for( Map.Entry<String, String> key : replicatedMap.entrySet() )
+        return new Input<Reader, IOException>()
         {
-            visitor.visitEntity( new StringReader( key.getValue() ) );
-        }
+            public <ReceiverThrowableType extends Throwable> void transferTo( Output<Reader, ReceiverThrowableType> output ) throws IOException, ReceiverThrowableType
+            {
+                output.receiveFrom( new Sender<Reader, IOException>()
+                {
+                    public <ReceiverThrowableType extends Throwable> void sendTo( Receiver<Reader, ReceiverThrowableType> receiver ) throws ReceiverThrowableType, IOException
+                    {
+                        for (String json : replicatedMap.values())
+                        {
+                            receiver.receive( new StringReader(json) );
+                        }
+                    }
+                } );
+            }
+        };
     }
 
     public void applyChanges( MapChanges changes ) throws IOException
@@ -91,7 +102,8 @@
                 {
                     return new StringWriter( 1000 )
                     {
-                        @Override public void close() throws IOException
+                        @Override
+                        public void close() throws IOException
                         {
                             super.close();
                             String value = toString();
@@ -105,7 +117,8 @@
                 {
                     return new StringWriter( 1000 )
                     {
-                        @Override public void close() throws IOException
+                        @Override
+                        public void close() throws IOException
                         {
                             super.close();
                             String value = toString();
@@ -121,7 +134,7 @@
                 }
             } );
         }
-        catch( RuntimeException e )
+        catch (RuntimeException e)
         {
             IOException exception = new IOException();
             exception.initCause( e );
diff --git a/extensions/entitystore-jndi/osgi.bundle b/extensions/entitystore-jndi/osgi.bundle
index 7edd201..ddb1f77 100644
--- a/extensions/entitystore-jndi/osgi.bundle
+++ b/extensions/entitystore-jndi/osgi.bundle
@@ -7,6 +7,7 @@
     org.qi4j.api.configuration, \
     org.qi4j.api.entity, \
     org.qi4j.api.injection.scope, \
+    org.qi4j.api.io, \
     org.qi4j.api.mixin, \
     org.qi4j.api.property, \
     org.qi4j.api.service, \
diff --git a/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiEntityStoreMixin.java b/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiEntityStoreMixin.java
index 1cba272..6a124e4 100644
--- a/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiEntityStoreMixin.java
+++ b/extensions/entitystore-jndi/src/main/java/org/qi4j/entitystore/jndi/JndiEntityStoreMixin.java
@@ -17,20 +17,24 @@
  */
 package org.qi4j.entitystore.jndi;
 
-import java.util.Hashtable;
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.naming.directory.InitialDirContext;
 import org.qi4j.api.configuration.Configuration;
 import org.qi4j.api.injection.scope.This;
+import org.qi4j.api.io.Input;
+import org.qi4j.api.io.Output;
 import org.qi4j.api.property.Property;
 import org.qi4j.api.service.Activatable;
 import org.qi4j.api.usecase.Usecase;
-import org.qi4j.api.structure.Module;
+import org.qi4j.spi.entity.EntityState;
 import org.qi4j.spi.entitystore.EntityStore;
+import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.entitystore.EntityStoreUnitOfWork;
 import org.qi4j.spi.structure.ModuleSPI;
 
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.directory.InitialDirContext;
+import java.util.Hashtable;
+
 public class JndiEntityStoreMixin
     implements Activatable, EntityStore
 {
@@ -110,10 +114,14 @@
       return new JndiUow( setup, usecase, module );
    }
 
-   public EntityStoreUnitOfWork visitEntityStates( EntityStateVisitor visitor, ModuleSPI module )
-   {
-      JndiUow uow = new JndiUow(setup, Usecase.DEFAULT, module);
-      // TODO Actual iteration
-      return uow;
-   }
+    public Input<EntityState, EntityStoreException> entityStates( ModuleSPI module )
+    {
+        return new Input<EntityState, EntityStoreException>()
+        {
+            public <ReceiverThrowableType extends Throwable> void transferTo( Output<EntityState, ReceiverThrowableType> entityStateReceiverThrowableTypeOutput ) throws EntityStoreException, ReceiverThrowableType
+            {
+                // TODO Actual iteration
+            }
+        };
+    }
 }
\ No newline at end of file
diff --git a/extensions/entitystore-rmi/osgi.bundle b/extensions/entitystore-rmi/osgi.bundle
index 4ad337f..66452e5 100644
--- a/extensions/entitystore-rmi/osgi.bundle
+++ b/extensions/entitystore-rmi/osgi.bundle
@@ -9,6 +9,7 @@
                 org.qi4j.api.configuration, \
                 org.qi4j.api.entity, \
                 org.qi4j.api.injection.scope, \
+                org.qi4j.api.io, \
                 org.qi4j.api.mixin, \
                 org.qi4j.api.property, \
                 org.qi4j.api.service, \
diff --git a/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java b/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java
index 18ac4e4..450a56c 100644
--- a/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java
+++ b/extensions/entitystore-rmi/src/main/java/org/qi4j/entitystore/rmi/ClientRmiEntityStoreMixin.java
@@ -16,14 +16,17 @@
  */
 package org.qi4j.entitystore.rmi;
 
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.io.Input;
+import org.qi4j.api.io.Output;
+import org.qi4j.api.service.Activatable;
+import org.qi4j.entitystore.map.MapEntityStore;
+import org.qi4j.spi.entitystore.EntityStoreException;
+
 import java.io.IOException;
 import java.io.Reader;
 import java.rmi.registry.LocateRegistry;
 import java.rmi.registry.Registry;
-import org.qi4j.api.entity.EntityReference;
-import org.qi4j.api.service.Activatable;
-import org.qi4j.entitystore.map.MapEntityStore;
-import org.qi4j.spi.entitystore.EntityStoreException;
 
 /**
  * RMI client implementation of Entity
@@ -53,9 +56,15 @@
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
-    public void visitMap( MapEntityStoreVisitor visitor )
+    public Input<Reader, IOException> entityStates()
     {
-        //To change body of implemented methods use File | Settings | File Templates.
+        return new Input<Reader, IOException>()
+        {
+            public <ReceiverThrowableType extends Throwable> void transferTo( Output<Reader, ReceiverThrowableType> readerReceiverThrowableTypeOutput ) throws IOException, ReceiverThrowableType
+            {
+                // TODO Implement this
+            }
+        };
     }
 
     public void applyChanges( MapChanges changes )
diff --git a/extensions/entitystore-s3/osgi.bundle b/extensions/entitystore-s3/osgi.bundle
index 69e957d..2156ebb 100644
--- a/extensions/entitystore-s3/osgi.bundle
+++ b/extensions/entitystore-s3/osgi.bundle
@@ -13,6 +13,7 @@
                 org.qi4j.api.configuration, \
                 org.qi4j.api.entity, \
                 org.qi4j.api.injection.scope, \
+                org.qi4j.api.io, \
                 org.qi4j.entitystore.map, \
                 org.qi4j.library.locking, \
                 org.qi4j.api.property, \
diff --git a/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3SerializationStoreMixin.java b/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3SerializationStoreMixin.java
index fb42e77..ae2547d 100644
--- a/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3SerializationStoreMixin.java
+++ b/extensions/entitystore-s3/src/main/java/org/qi4j/entitystore/s3/S3SerializationStoreMixin.java
@@ -16,8 +16,6 @@
  */
 package org.qi4j.entitystore.s3;
 
-import java.io.IOException;
-import java.io.Reader;
 import org.jets3t.service.S3Service;
 import org.jets3t.service.impl.rest.httpclient.RestS3Service;
 import org.jets3t.service.model.S3Bucket;
@@ -25,10 +23,15 @@
 import org.qi4j.api.configuration.Configuration;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.This;
+import org.qi4j.api.io.Input;
+import org.qi4j.api.io.Output;
 import org.qi4j.api.service.Activatable;
 import org.qi4j.entitystore.map.MapEntityStore;
 import org.qi4j.spi.entitystore.EntityStoreException;
 
+import java.io.IOException;
+import java.io.Reader;
+
 /**
  * Amazon S3 implementation of SerializationStore.
  * <p/>
@@ -85,9 +88,15 @@
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
-    public void visitMap( MapEntityStoreVisitor visitor )
+    public Input<Reader, IOException> entityStates()
     {
-        //To change body of implemented methods use File | Settings | File Templates.
+        return new Input<Reader, IOException>()
+        {
+            public <ReceiverThrowableType extends Throwable> void transferTo( Output<Reader, ReceiverThrowableType> readerReceiverThrowableTypeOutput ) throws IOException, ReceiverThrowableType
+            {
+                // TODO Implement this
+            }
+        };
     }
 
     public void applyChanges( MapChanges changes )
diff --git a/extensions/entitystore-swift/osgi.bundle b/extensions/entitystore-swift/osgi.bundle
index a6fe903..6571e76 100644
--- a/extensions/entitystore-swift/osgi.bundle
+++ b/extensions/entitystore-swift/osgi.bundle
@@ -10,6 +10,7 @@
                 org.qi4j.api.configuration, \
                 org.qi4j.api.entity, \
                 org.qi4j.api.injection.scope, \
+                org.qi4j.api.io, \
                 org.qi4j.api.mixin, \
                 org.qi4j.api.property, \
                 org.qi4j.api.sideeffect, \
diff --git a/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/DataStore.java b/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/DataStore.java
index 17bc80a..7568b80 100644
--- a/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/DataStore.java
+++ b/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/DataStore.java
@@ -17,25 +17,26 @@
  */
 package org.qi4j.entitystore.swift;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.io.StringReader;
 import org.qi4j.api.entity.EntityReference;
-import org.qi4j.entitystore.map.MapEntityStore;
+import org.qi4j.api.io.Input;
+import org.qi4j.api.io.Output;
+import org.qi4j.api.io.Receiver;
+import org.qi4j.api.io.Sender;
 import org.qi4j.spi.entitystore.EntityStoreException;
 
+import java.io.*;
+
 /**
  * This class handles the Heap Data file.
  * The format of the file is as follows;
- *
+ * <p/>
  * <code><pre>
  * At OFFSET = 0
  * [cleanShutDown]  1 byte
  * [formatVersion]  4 bytes
  * [noOfEntries]    4 bytes
  * [noOfIDentries]  4 bytes
- *
+ * <p/>
  * At OFFSET 256
  * [blockSize]     4 bytes
  * [usage]         1 byte    (0=Unused, 1=prime, 2=mirror, 3=primeChanged, 4=mirrorChanged)
@@ -48,7 +49,7 @@
  * [primeData]     n bytes
  * [mirrorDataLength] 4 bytes
  * [mirrorData]    n bytes
- *
+ * <p/>
  * At OFFSET 256 + [blockSize]
  * same as above, repeat until [blockSize] == -1 marking end of DataArea.
  * </pre></code>
@@ -82,13 +83,13 @@
         this.dataDir = dataDirectory.getAbsoluteFile();
         dataDir.mkdirs();
         File file = new File( dataDir, HEAP_DATA_FILENAME );
-        if( !file.exists() )
+        if (!file.exists())
         {
             file.createNewFile();
         }
         dataFile = new RandomAccessFile( file, "rw" );
         boolean cleanShutDown;
-        if( file.length() > 0 )
+        if (file.length() > 0)
         {
             dataFile.seek( 0 );
             cleanShutDown = dataFile.readBoolean();
@@ -97,8 +98,7 @@
             dataFile.writeInt( CURRENT_VERSION );  // Write Version.
             entries = dataFile.readInt();
             identityMaxLength = dataFile.readInt();
-        }
-        else
+        } else
         {
             cleanShutDown = false;
             dataFile.writeBoolean( false );
@@ -116,23 +116,22 @@
 
         dataFile = new RandomAccessFile( file, "rw" );
 
-        if( !cleanShutDown )
+        if (!cleanShutDown)
         {
             reIndex();
-        }
-        else
+        } else
         {
             File idDir = new File( dataDir, "idx" );
             try
             {
                 identityFile = IdentityFile.use( idDir );
             }
-            catch( MalformedIdentityDirectoryException e )
+            catch (MalformedIdentityDirectoryException e)
             {
                 reIndex();
             }
         }
-        if( identityFile.entries() < entries * 2 )
+        if (identityFile.entries() < entries * 2)
         {
             reIndex();
         }
@@ -152,7 +151,7 @@
         throws IOException
     {
         long pos = identityFile.find( reference );
-        if( pos < 0 )
+        if (pos < 0)
         {
             return null;
         }
@@ -165,11 +164,10 @@
         throws IOException
     {
         long pos = identityFile.find( data.reference );
-        if( pos < 0 )
+        if (pos < 0)
         {
             putNewData( data );
-        }
-        else
+        } else
         {
             dataFile.seek( pos );
             int blockSize = dataFile.readInt();
@@ -177,12 +175,11 @@
             byte usage = dataFile.readByte();
             dataFile.skipBytes( -1 );
             dataFile.writeByte( usage == USAGE_PRIME ? USAGE_PRIMECHANGE : USAGE_MIRRORCHANGE );
-            int dataAreaSize = ( blockSize - BLOCK_OVERHEAD ) / 2 - 4;
-            if( dataAreaSize < data.data.length )
+            int dataAreaSize = (blockSize - BLOCK_OVERHEAD) / 2 - 4;
+            if (dataAreaSize < data.data.length)
             {
                 putTooLarge( data, pos, usagePointer, usage );
-            }
-            else
+            } else
             {
                 putOver( data, pos, usagePointer, usage );
             }
@@ -190,18 +187,19 @@
     }
 
     /* In this case we need to write the new data to the opposite of the current active block. */
+
     private void putOver( DataBlock data, long pos, long usagePointer, byte usage )
         throws IOException
     {
         dataFile.seek( usagePointer ); // Point to "usage"
         dataFile.skipBytes( 13 ); // Skip usage, instanceVersion and schemaVersion
         EntityReference existingReference = readReference();
-        if( !existingReference.equals( data.reference ) )
+        if (!existingReference.equals( data.reference ))
         {
             throw new EntityStoreException( "Inconsistent Data Heap: was " + existingReference + ", expected " + data.reference );
         }
         long mirror = dataFile.readLong();
-        if( usage == USAGE_PRIME )
+        if (usage == USAGE_PRIME)
         {
             dataFile.seek( mirror );
         }
@@ -217,6 +215,7 @@
     /* This case is when the data doesn't fit in the pre-allocated extra space. Write it to the end, and mark the
        previous block unused.
      */
+
     private void putTooLarge( DataBlock data, long pos, long usagePointer, byte usage )
         throws IOException
     {
@@ -244,7 +243,7 @@
         throws IOException
     {
         long pos = identityFile.find( reference );
-        if( pos < 0 )
+        if (pos < 0)
         {
             // Doesn't exist.
             return;
@@ -252,7 +251,7 @@
         dataFile.seek( pos );
         dataFile.skipBytes( 4 ); // Skip BlockSize
         byte usage = dataFile.readByte();
-        if( usage == USAGE_UNUSED )
+        if (usage == USAGE_UNUSED)
         {
             // Not used?? Why is the IdentityFile pointing to it then?? Should the following line actually be
             // executed here.
@@ -293,7 +292,7 @@
         long blockStart = dataFile.getFilePointer();
 
         // Allow each datablock to grow to twice its size, and provide a primary and mirror allocation.
-        int dataAreaSize = ( block.data.length * 2 + 4 ) * 2;
+        int dataAreaSize = (block.data.length * 2 + 4) * 2;
         UndoExtendCommand undoExtendCommand = new UndoExtendCommand( blockStart );
         undoManager.saveUndoCommand( undoExtendCommand );
 
@@ -319,8 +318,8 @@
     private void writeIdentity( EntityReference reference )
         throws IOException
     {
-        byte[] idBytes = reference.identity().getBytes("UTF-8");
-        if( idBytes.length > identityMaxLength )
+        byte[] idBytes = reference.identity().getBytes( "UTF-8" );
+        if (idBytes.length > identityMaxLength)
         {
             throw new EntityStoreException( "Identity is too long. Only " + identityMaxLength + " characters are allowed in this EntityStore." );
         }
@@ -368,18 +367,18 @@
         identityFile = IdentityFile.create( new File( dataDir, "idx" ), identityMaxLength + 16, entries < 5000 ? 10000 : entries * 2 );
 
         dataFile.seek( DATA_AREA_OFFSET );
-        while( dataFile.getFilePointer() < dataFile.length() )
+        while (dataFile.getFilePointer() < dataFile.length())
         {
             long blockStart = dataFile.getFilePointer();
             int blockSize = dataFile.readInt();
-            if( blockSize == -1 )
+            if (blockSize == -1)
             {
                 break;
             }
             byte usage = dataFile.readByte();
             dataFile.skipBytes( 12 ); // Skip instanceVersion and schemaVersion
             EntityReference reference = readReference();
-            if( usage != USAGE_UNUSED )
+            if (usage != USAGE_UNUSED)
             {
                 identityFile.remember( reference, blockStart );
             }
@@ -387,69 +386,79 @@
         }
     }
 
-    public <ThrowableType extends Throwable> void visitMap( MapEntityStore.MapEntityStoreVisitor<ThrowableType> visitor )
-        throws ThrowableType
+    public Input<Reader, IOException> data()
     {
-        try
+        return new Input<Reader, IOException>()
         {
-            long position = DATA_AREA_OFFSET;
-            while( position < dataFile.length() )
+            public <ReceiverThrowableType extends Throwable> void transferTo( Output<Reader, ReceiverThrowableType> output ) throws IOException, ReceiverThrowableType
             {
-                dataFile.seek( position );
-                int blockSize = dataFile.readInt();
-                if( blockSize == -1 ) // EOF marker
+                output.receiveFrom( new Sender<Reader, IOException>()
                 {
-                    return;
-                }
-                if( blockSize == 0 )
-                {
-                    // TODO This is a bug. Why does it occur??
-                    throw new InternalError();
-                }
-                position = position + blockSize;  // position for next round...
-                DataBlock block = readDataBlock( null );
-                if( block != null )
-                {
-                    visitor.visitEntity( new StringReader( new String( block.data, "UTF-8" ) ) );
-                }
+                    public <ReceiverThrowableType extends Throwable> void sendTo( Receiver<Reader, ReceiverThrowableType> receiver ) throws ReceiverThrowableType, IOException
+                    {
+                        try
+                        {
+                            long position = DATA_AREA_OFFSET;
+                            while (position < dataFile.length())
+                            {
+                                dataFile.seek( position );
+                                int blockSize = dataFile.readInt();
+                                if (blockSize == -1) // EOF marker
+                                {
+                                    return;
+                                }
+                                if (blockSize == 0)
+                                {
+                                    // TODO This is a bug. Why does it occur??
+                                    throw new InternalError();
+                                }
+                                position = position + blockSize;  // position for next round...
+                                DataBlock block = readDataBlock( null );
+                                if (block != null)
+                                {
+                                    receiver.receive( new StringReader( new String( block.data, "UTF-8" ) ) );
+                                }
+                            }
+                        }
+                        catch (IOException e)
+                        {
+                            throw new EntityStoreException( e );
+                        }
+                    }
+                });
             }
-        }
-        catch( IOException e )
-        {
-            throw new EntityStoreException(e);
-        }
+        };
     }
 
     private DataBlock readDataBlock( EntityReference reference )
         throws IOException
     {
         byte usage = dataFile.readByte();
-        if( usage == USAGE_UNUSED )
+        if (usage == USAGE_UNUSED)
         {
             return null;
         }
         long instanceVersion = dataFile.readLong();
         int schemaVersion = dataFile.readInt();
         EntityReference existingReference = readReference();
-        if( reference == null )
+        if (reference == null)
         {
             reference = existingReference;
         }
-        if( !existingReference.equals( reference ) )
+        if (!existingReference.equals( reference ))
         {
             throw new EntityStoreException( "Inconsistent Data Heap." );
         }
-        if( usage == USAGE_MIRROR )
+        if (usage == USAGE_MIRROR)
         {
             long mirror = dataFile.readLong();
             dataFile.seek( mirror );
-        }
-        else
+        } else
         {
             dataFile.skipBytes( 8 ); // skip the MirrorPointer
         }
         int dataSize = dataFile.readInt();
-        if( dataSize < 0 )
+        if (dataSize < 0)
         {
             throw new InternalError();
         }
@@ -462,7 +471,7 @@
         throws IOException
     {
         int idSize = dataFile.readByte();
-        if( idSize < 0 )
+        if (idSize < 0)
         {
             idSize = idSize + 256;  // Fix 2's-complement negative values of bytes into unsigned 8 bit.
         }
diff --git a/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/RecordManager.java b/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/RecordManager.java
index 3d6661c..1df027b 100644
--- a/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/RecordManager.java
+++ b/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/RecordManager.java
@@ -17,13 +17,15 @@
  */
 package org.qi4j.entitystore.swift;
 
+import org.qi4j.api.entity.EntityReference;
+import org.qi4j.api.io.Input;
+import org.qi4j.spi.entitystore.EntityStoreException;
+
 import java.io.File;
 import java.io.IOException;
 import java.io.RandomAccessFile;
+import java.io.Reader;
 import java.util.ArrayList;
-import org.qi4j.api.entity.EntityReference;
-import org.qi4j.entitystore.map.MapEntityStore;
-import org.qi4j.spi.entitystore.EntityStoreException;
 
 public class RecordManager
     implements UndoManager
@@ -188,9 +190,8 @@
         }
     }
 
-    public <ThrowableType extends Throwable> void visitMap( MapEntityStore.MapEntityStoreVisitor<ThrowableType> visitor )
-        throws ThrowableType
+    public Input<Reader, IOException> data()
     {
-        dataStore.visitMap( visitor );
+        return dataStore.data();
     }
 }
diff --git a/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/SwiftEntityStoreMixin.java b/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/SwiftEntityStoreMixin.java
index ccb1c33..6609e81 100644
--- a/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/SwiftEntityStoreMixin.java
+++ b/extensions/entitystore-swift/src/main/java/org/qi4j/entitystore/swift/SwiftEntityStoreMixin.java
@@ -17,18 +17,11 @@
  */
 package org.qi4j.entitystore.swift;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.io.UnsupportedEncodingException;
-import java.io.Writer;
-import java.util.concurrent.locks.ReadWriteLock;
 import org.qi4j.api.configuration.Configuration;
 import org.qi4j.api.entity.EntityReference;
 import org.qi4j.api.injection.scope.This;
 import org.qi4j.api.injection.scope.Uses;
+import org.qi4j.api.io.Input;
 import org.qi4j.api.service.Activatable;
 import org.qi4j.entitystore.map.MapEntityStore;
 import org.qi4j.spi.entity.EntityType;
@@ -36,6 +29,9 @@
 import org.qi4j.spi.entitystore.EntityStoreException;
 import org.qi4j.spi.service.ServiceDescriptor;
 
+import java.io.*;
+import java.util.concurrent.locks.ReadWriteLock;
+
 public class SwiftEntityStoreMixin
     implements Activatable, MapEntityStore
 {
@@ -89,10 +85,9 @@
         }
     }
 
-    public <ThrowableType extends Throwable> void visitMap( MapEntityStoreVisitor<ThrowableType> visitor )
-        throws ThrowableType
+    public Input<Reader, IOException> entityStates()
     {
-        recordManager.visitMap( visitor );
+        return recordManager.data();
     }
 
     public void applyChanges( MapChanges changes )
diff --git a/extensions/osgi/bootstrap/pom.xml b/extensions/osgi/bootstrap/pom.xml
index 55b523c..af7e6c3 100644
--- a/extensions/osgi/bootstrap/pom.xml
+++ b/extensions/osgi/bootstrap/pom.xml
@@ -10,6 +10,7 @@
 
   <groupId>org.qi4j.osgi</groupId>
   <artifactId>qi4j-osgi-bootstrap</artifactId>
+  <version>1.3-SNAPSHOT</version>
   <name>Qi4j Core - OSGi Bootstrap</name>
   <packaging>bundle</packaging>
 
diff --git a/extensions/osgi/example/pom.xml b/extensions/osgi/example/pom.xml
index 93bb7f1..db57b9f 100644
--- a/extensions/osgi/example/pom.xml
+++ b/extensions/osgi/example/pom.xml
@@ -10,6 +10,7 @@
 
   <groupId>org.qi4j.core.osgi</groupId>
   <artifactId>qi4j-osgi-example</artifactId>
+  <version>1.3-SNAPSHOT</version>
   <name>Qi4j Core - OSGi Example</name>
   <packaging>bundle</packaging>
 
diff --git a/extensions/osgi/integrationTests/pom.xml b/extensions/osgi/integrationTests/pom.xml
index d573b74..fbdd2b5 100644
--- a/extensions/osgi/integrationTests/pom.xml
+++ b/extensions/osgi/integrationTests/pom.xml
@@ -10,6 +10,7 @@
 
   <groupId>org.qi4j.core.osgi</groupId>
   <artifactId>qi4j-osgi-integrationTests</artifactId>
+  <version>1.3-SNAPSHOT</version>
   <name>Qi4j Core - OSGi integration test</name>
 
   <build>
diff --git a/extensions/osgi/testBootstrap/pom.xml b/extensions/osgi/testBootstrap/pom.xml
index 4aeb87d..c6415fe 100644
--- a/extensions/osgi/testBootstrap/pom.xml
+++ b/extensions/osgi/testBootstrap/pom.xml
@@ -8,7 +8,10 @@
     <version>1.3-SNAPSHOT</version>
   </parent>
 
+  <groupId>org.qi4j.core.osgi</groupId>
   <artifactId>qi4j-core-osgi-test-bootstrap</artifactId>
+  <version>1.3-SNAPSHOT</version>
+
   <name>Qi4j Core - OSGi Bootstrap tests</name>
 
   <dependencies>
diff --git a/extensions/pom.xml b/extensions/pom.xml
index 33e1c9c..3ad34bd 100644
--- a/extensions/pom.xml
+++ b/extensions/pom.xml
@@ -1,22 +1,23 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

-  <parent>

-    <groupId>org.qi4j.sandbox</groupId>

-    <artifactId>qi4j-sandbox</artifactId>

-    <version>1.3-SNAPSHOT</version>

-  </parent>

-  <modelVersion>4.0.0</modelVersion>

-  <artifactId>sb-extensions-root</artifactId>

-  <name>Qi4j Sandbox Extensions - Build POM</name>

-  <packaging>pom</packaging>

-

-  <modules>

-    <!--module>entitystore-coherence</module-->

-    <module>entitystore-jndi</module>

-    <module>entitystore-javaspaces</module>

-    <module>entitystore-jgroups</module>

-    <module>entitystore-rmi</module>

-    <module>entitystore-s3</module>

-    <module>entitystore-swift</module>

-  </modules>

-</project>

+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <groupId>org.qi4j.sandbox</groupId>
+    <artifactId>qi4j-sandbox</artifactId>
+    <version>1.3-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>sb-extensions-root</artifactId>
+  <version>1.3-SNAPSHOT</version>
+  <name>Qi4j Sandbox Extensions - Build POM</name>
+  <packaging>pom</packaging>
+
+  <modules>
+    <!--module>entitystore-coherence</module-->
+    <module>entitystore-jndi</module>
+    <module>entitystore-javaspaces</module>
+    <module>entitystore-jgroups</module>
+    <module>entitystore-rmi</module>
+    <module>entitystore-s3</module>
+    <module>entitystore-swift</module>
+  </modules>
+</project>
diff --git a/libraries/entityproxy/pom.xml b/libraries/entityproxy/pom.xml
index e91761a..7dcfb78 100644
--- a/libraries/entityproxy/pom.xml
+++ b/libraries/entityproxy/pom.xml
@@ -1,51 +1,51 @@
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

-  <modelVersion>4.0.0</modelVersion>

-  <parent>

-    <artifactId>sb-libraries-root</artifactId>

-    <groupId>org.qi4j.sandbox</groupId>

-    <version>1.3-SNAPSHOT</version>

-  </parent>

-  <groupId>org.qi4j.sandbox</groupId>

-  <artifactId>qi4j-lib-entityproxy</artifactId>

-  <name>Qi4j Library - Entityproxy</name>

-  <description>This library provides easy way to wrap your entities with transient composites so that qi4j-agnostic code may handle them without worrying about unit of work.</description>

-  <dependencies>

-  	<dependency>

-  		<groupId>org.qi4j.core</groupId>

-  		<artifactId>qi4j-core-api</artifactId>

-  		<version>${version.qi4j-core}</version>

-  	</dependency>

-  	<dependency>

-  		<groupId>org.qi4j.library</groupId>

-  		<artifactId>qi4j-lib-constraints</artifactId>

-  		<version>${version.qi4j-core}</version>

-  	</dependency>

-  	<dependency>

-  		<groupId>org.qi4j.core</groupId>

-  		<artifactId>qi4j-core-testsupport</artifactId>

-  		<version>${version.qi4j-core}</version>

-  		<scope>test</scope>

-  	</dependency>

-  	<dependency>

-  		<groupId>org.qi4j.core</groupId>

-  		<artifactId>qi4j-core-runtime</artifactId>

-  		<version>${version.qi4j-core}</version>

-  		<scope>test</scope>

-  	</dependency>

-  </dependencies>

-  <properties>

-  	<version.qi4j-core>1.3-SNAPSHOT</version.qi4j-core>

-  </properties>

-

-  <build>

-   <plugins>

-     <plugin>

-        <artifactId>maven-compiler-plugin</artifactId>

-        <configuration>

-          <source>1.6</source>

-          <target>1.6</target>

-        </configuration>

-      </plugin>

-   </plugins>

-  </build>

-</project>

+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>sb-libraries-root</artifactId>
+    <groupId>org.qi4j.sandbox</groupId>
+    <version>1.3-SNAPSHOT</version>
+  </parent>
+  <groupId>org.qi4j.sandbox</groupId>
+  <artifactId>qi4j-lib-entityproxy</artifactId>
+  <name>Qi4j Library - Entityproxy</name>
+  <description>This library provides easy way to wrap your entities with transient composites so that qi4j-agnostic code may handle them without worrying about unit of work.</description>
+  <dependencies>
+  	<dependency>
+  		<groupId>org.qi4j.core</groupId>
+  		<artifactId>qi4j-core-api</artifactId>
+  		<version>${version.qi4j-core}</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.qi4j.library</groupId>
+  		<artifactId>qi4j-lib-constraints</artifactId>
+  		<version>${version.qi4j-core}</version>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.qi4j.core</groupId>
+  		<artifactId>qi4j-core-testsupport</artifactId>
+  		<version>${version.qi4j-core}</version>
+  		<scope>test</scope>
+  	</dependency>
+  	<dependency>
+  		<groupId>org.qi4j.core</groupId>
+  		<artifactId>qi4j-core-runtime</artifactId>
+  		<version>${version.qi4j-core}</version>
+  		<scope>test</scope>
+  	</dependency>
+  </dependencies>
+  <properties>
+  	<version.qi4j-core>1.3-SNAPSHOT</version.qi4j-core>
+  </properties>
+
+  <build>
+   <plugins>
+     <plugin>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <configuration>
+          <source>1.6</source>
+          <target>1.6</target>
+        </configuration>
+      </plugin>
+   </plugins>
+  </build>
+</project>