diff --git a/etc/bashrc b/etc/bashrc
index 0f0ff50..9ce7bc3 100644
--- a/etc/bashrc
+++ b/etc/bashrc
@@ -63,7 +63,7 @@ foamCompiler=system
 
 #- Compiler:
 #    WM_COMPILER = Gcc | Gcc45 | Gcc46 | Gcc47 | Clang | Icc (Intel icc)
-export WM_COMPILER=Gcc
+export WM_COMPILER=Icc
 unset WM_COMPILER_ARCH WM_COMPILER_LIB_ARCH
 
 #- Architecture:
@@ -76,12 +76,12 @@ export WM_PRECISION_OPTION=DP
 
 #- Optimised, debug, profiling:
 #    WM_COMPILE_OPTION = Opt | Debug | Prof
-export WM_COMPILE_OPTION=Opt
+export WM_COMPILE_OPTION=Debug
 
 #- MPI implementation:
 #    WM_MPLIB = SYSTEMOPENMPI | OPENMPI | MPICH | MPICH-GM | HPMPI
 #               | GAMMA | MPI | QSMPI | SGIMPI
-export WM_MPLIB=OPENMPI
+export WM_MPLIB=SGIMPI
 
 #- Operating System:
 #    WM_OSTYPE = POSIX | ???
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H
index c26e0d7..3d2f3d9 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/Pstream.H
@@ -294,6 +294,14 @@ public:
                 const bool block = true
             );
 
+            template<class Container, class T>
+            static void exchange
+            (
+                const List<Container >&,
+                List<Container >&,
+                const int tag = UPstream::msgType(),
+                const bool block = true
+            );
 };
 
 
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C
index 24eec63..35b4170 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/PstreamBuffers.C
@@ -88,7 +88,6 @@ void Foam::PstreamBuffers::finishedSends(const bool block)
         (
             sendBuf_,
             recvBuf_,
-            sizes,
             tag_,
             block
         );
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/UPstream.H b/src/OpenFOAM/db/IOstreams/Pstreams/UPstream.H
index 1ad4aa9..d8d46bc 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/UPstream.H
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/UPstream.H
@@ -376,7 +376,7 @@ public:
         //- Abort program
         static void abort();
 
-
+        static void alltoall(int* sendCounts, int* recvCounts);
 };
 
 
diff --git a/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C b/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C
index 8c0cb4b..62a9419 100644
--- a/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C
+++ b/src/OpenFOAM/db/IOstreams/Pstreams/exchange.C
@@ -38,7 +38,6 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
 
-//template<template<class> class ListType, class T>
 template<class Container, class T>
 void Pstream::exchange
 (
@@ -149,6 +148,128 @@ void Pstream::exchange
     recvBufs[Pstream::myProcNo()] = sendBufs[Pstream::myProcNo()];
 }
 
+// My version without sizes argument and alltoall
+//template<template<class> class ListType, class T>
+template<class Container, class T>
+void Pstream::exchange
+(
+    const List<Container>& sendBufs,
+    List<Container>& recvBufs,
+    const int tag,
+    const bool block
+)
+{
+    if (!contiguous<T>())
+    {
+        FatalErrorIn
+        (
+            "Pstream::exchange(..)"
+        )   << "Continuous data only." << Foam::abort(FatalError);
+    }
+
+    if (sendBufs.size() != UPstream::nProcs())
+    {
+        FatalErrorIn
+        (
+            "Pstream::exchange(..)"
+        )   << "Size of list:" << sendBufs.size()
+            << " does not equal the number of processors:"
+            << UPstream::nProcs()
+            << Foam::abort(FatalError);
+    }
+
+    /*sizes.setSize(UPstream::nProcs());
+    labelList& nsTransPs = sizes[UPstream::myProcNo()];
+    nsTransPs.setSize(UPstream::nProcs());*/
+    int nProcs = UPstream::nProcs();
+    int *sendCounts = new int[nProcs];
+    int *recvCounts = new int[nProcs];
+
+    forAll(sendBufs, procI)
+    {
+    	//nsTransPs[procI] = sendBufs[procI].size();
+    	sendCounts[procI] = sendBufs[procI].size();
+    }
+
+    // Send sizes across. Note: blocks.
+    //combineReduce(sizes, UPstream::listEq(), tag);
+    UPstream::alltoall(sendCounts, recvCounts);
+
+    if (Pstream::parRun())
+    {
+        label startOfRequests = Pstream::nRequests();
+
+        // Set up receives
+        // ~~~~~~~~~~~~~~~
+
+        recvBufs.setSize(sendBufs.size());
+
+        //forAll(sizes, procI)
+        for(int procI = 0; procI < nProcs; procI++)
+        {
+            //label nRecv = sizes[procI][UPstream::myProcNo()];
+            label nRecv = recvCounts[procI];
+
+            if (procI != Pstream::myProcNo() && nRecv > 0)
+            {
+                recvBufs[procI].setSize(nRecv);
+                UIPstream::read
+                (
+                    UPstream::nonBlocking,
+                    procI,
+                    reinterpret_cast<char*>(recvBufs[procI].begin()),
+                    nRecv*sizeof(T),
+                    tag
+                );
+            }
+        }
+
+
+        // Set up sends
+        // ~~~~~~~~~~~~
+
+        forAll(sendBufs, procI)
+        {
+            if (procI != Pstream::myProcNo() && sendBufs[procI].size() > 0)
+            {
+                if
+                (
+                   !UOPstream::write
+                    (
+                        UPstream::nonBlocking,
+                        procI,
+                        reinterpret_cast<const char*>(sendBufs[procI].begin()),
+                        sendBufs[procI].size()*sizeof(T),
+                        tag
+                    )
+                )
+                {
+                    FatalErrorIn("Pstream::exchange(..)")
+                        << "Cannot send outgoing message. "
+                        << "to:" << procI << " nBytes:"
+                        << label(sendBufs[procI].size()*sizeof(T))
+                        << Foam::abort(FatalError);
+                }
+            }
+        }
+
+
+        // Wait for all to finish
+        // ~~~~~~~~~~~~~~~~~~~~~~
+
+        if (block)
+        {
+            Pstream::waitRequests(startOfRequests);
+        }
+    }
+
+    delete[] sendCounts;
+    delete[] recvCounts;
+
+    // Do myself
+    recvBufs[Pstream::myProcNo()] = sendBufs[Pstream::myProcNo()];
+}
+
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
diff --git a/src/Pstream/dummy/UPstream.C b/src/Pstream/dummy/UPstream.C
index 183a86c..5a95ac6 100644
--- a/src/Pstream/dummy/UPstream.C
+++ b/src/Pstream/dummy/UPstream.C
@@ -104,5 +104,7 @@ bool Foam::UPstream::finishedRequest(const label i)
     return false;
 }
 
+void Foam::UPstream::alltoall(int* sendCounts, int* recvCounts) {
+}
 
 // ************************************************************************* //
diff --git a/src/Pstream/mpi/UPstream.C b/src/Pstream/mpi/UPstream.C
index bf7af5d..b95d789 100644
--- a/src/Pstream/mpi/UPstream.C
+++ b/src/Pstream/mpi/UPstream.C
@@ -378,5 +378,9 @@ bool Foam::UPstream::finishedRequest(const label i)
     return flag != 0;
 }
 
+void Foam::UPstream::alltoall(int* sendCounts, int* recvCounts) {
+    MPI_Alltoall(sendCounts, 1, MPI_INT, recvCounts, 1, MPI_INT, MPI_COMM_WORLD);
+}
+
 
 // ************************************************************************* //
