diff --git a/source/Applications/Thermoplast/config.txt b/source/Applications/Thermoplast/config.txt
index 654263c4da9faa0729d3e3896f191a98c009391e..bce2bb29f67465bb4492d7ca4023ca12eab3d009 100644
--- a/source/Applications/Thermoplast/config.txt
+++ b/source/Applications/Thermoplast/config.txt
@@ -10,7 +10,7 @@ boundingBox = 60 1370 130 190 1530 320 #test bb
 blocknx = 10 10 10 
 #blocknx = 300 420 320
 endTime = 100000
-outTime = 1
+outTime = 100
 availMem = 25e9
 uLB = 0.1
 
@@ -31,7 +31,7 @@ pathGeo = d:/Projects/ThermoPlast/SimGeo
 michel = /michel.stl
 plexiglas = /plexiglas.stl
 
-pathOut = g:/temp/thermoplastCluster1
+pathOut = g:/temp/thermoplast
 
 #restart
 cpStart = 20000000
diff --git a/source/Applications/Thermoplast/thermoplast.cpp b/source/Applications/Thermoplast/thermoplast.cpp
index 484795506a7c798ef376ecf89162b804951106fd..353dc56051d8ad1678cf69d4d8fac37d52140fca 100644
--- a/source/Applications/Thermoplast/thermoplast.cpp
+++ b/source/Applications/Thermoplast/thermoplast.cpp
@@ -551,7 +551,7 @@ void thermoplast(string configname)
    //         createSphereCoProcessor->addGeoObject(sphere, Vector3D(uLB, 0.0, 0.0));
    //      }
 
-   createSphereCoProcessor->process(0);
+   //createSphereCoProcessor->process(0);
 
    //write data for visualization of macroscopic quantities
    SPtr<UbScheduler> visSch(new UbScheduler(outTime));
diff --git a/source/DemCoupling/CreateDemObjectsCoProcessor.cpp b/source/DemCoupling/CreateDemObjectsCoProcessor.cpp
index 58790643ffce06d177bbd1fa417d88f357947dd6..b7401d07f04b1a17a2959b7475cd796d30a3cac7 100644
--- a/source/DemCoupling/CreateDemObjectsCoProcessor.cpp
+++ b/source/DemCoupling/CreateDemObjectsCoProcessor.cpp
@@ -49,7 +49,7 @@ void CreateDemObjectsCoProcessor::process(double step)
       if (comm->isRoot()) UBLOG(logINFO, "CreateDemObjectsCoProcessor::process start step: " << istep);
       timer.resetAndStart();
 #endif
-
+      
       createGeoObjects();
 
 #ifdef TIMING
@@ -59,10 +59,10 @@ void CreateDemObjectsCoProcessor::process(double step)
 #endif
       
       demCoProcessor->distributeIDs();
-//
-//#ifdef TIMING
-//      if (comm->isRoot()) UBLOG(logINFO, "demCoProcessor->distributeIDs() time = "<<timer.stop()<<" s");
-//#endif
+
+#ifdef TIMING
+      if (comm->isRoot()) UBLOG(logINFO, "demCoProcessor->distributeIDs() time = "<<timer.stop()<<" s");
+#endif
 
       
    }
diff --git a/source/DemCoupling/CreateDemObjectsCoProcessor.h b/source/DemCoupling/CreateDemObjectsCoProcessor.h
index ffb26a35d10b5c7a6d469d5fdfa8d44da195221c..bfd0d0c641d2a7ea0d641e4dcff1f7b475d46b5e 100644
--- a/source/DemCoupling/CreateDemObjectsCoProcessor.h
+++ b/source/DemCoupling/CreateDemObjectsCoProcessor.h
@@ -7,7 +7,7 @@
 #include <array>
 
 
-//#define TIMING
+#define TIMING
 
 #ifdef TIMING
 #include "UbTiming.h"
diff --git a/source/DemCoupling/DemCoProcessor.cpp b/source/DemCoupling/DemCoProcessor.cpp
index 56dc9cdecf5fc1f76722fa55e6055843e1f71fdc..be3d7207075e4601c612f232ba7ca070b0f22b0d 100644
--- a/source/DemCoupling/DemCoProcessor.cpp
+++ b/source/DemCoupling/DemCoProcessor.cpp
@@ -585,7 +585,7 @@ bool DemCoProcessor::isSpheresIntersection(double centerX1, double centerX2, dou
 
 void DemCoProcessor::distributeIDs()
 {
-   std::vector<int> peIDsSend;
+   std::vector<unsigned long long> peIDsSend;
    std::vector<int> vfIDsSend;
 
    for (int i = 0; i < interactors.size(); i++)
@@ -597,13 +597,13 @@ void DemCoProcessor::distributeIDs()
       }
    }
 
-   std::vector<int> peIDsRecv;
+   std::vector<unsigned long long> peIDsRecv;
    std::vector<int> vfIDsRecv;
 
    comm->allGather(peIDsSend, peIDsRecv);
    comm->allGather(vfIDsSend, vfIDsRecv);
 
-   std::map<int, int> idMap;
+   std::map<int, unsigned long long> idMap;
 
    for (int i = 0; i < peIDsRecv.size(); i++)
    {
@@ -612,25 +612,25 @@ void DemCoProcessor::distributeIDs()
 
    for (int i = 0; i < interactors.size(); i++)
    {
-      std::map<int, int>::const_iterator it;
+      std::map<int, unsigned long long>::const_iterator it;
       if ((it=idMap.find(interactors[i]->getID())) == idMap.end())
       {
          throw UbException(UB_EXARGS, "Interactor ID is invalid! The DEM object may be not in PE domain!");
       }
 
 
-      std::dynamic_pointer_cast<PePhysicsEngineGeometryAdapter>(physicsEngineGeometrieAdapters[i])->setId(it->second);
+      std::dynamic_pointer_cast<PePhysicsEngineGeometryAdapter>(physicsEngineGeometrieAdapters[i])->setSystemId(it->second);
       //std::dynamic_pointer_cast<PePhysicsEngineGeometryAdapter>(physicsEngineGeometries[i])->setId(idMap.find(interactors[i]->getID())->second);
    }
 
-   for (int i = 0; i < physicsEngineGeometrieAdapters.size(); i++)
-   {
-      //physicsEngineSolver->updateGeometry(physicsEngineGeometries[i]);
-      if (std::dynamic_pointer_cast<PePhysicsEngineGeometryAdapter>(physicsEngineGeometrieAdapters[i])->isActive())
-      {
-         interactors[i]->setPhysicsEngineGeometry(physicsEngineGeometrieAdapters[i]);
-      }
-   }
+   //for (int i = 0; i < physicsEngineGeometrieAdapters.size(); i++)
+   //{
+   //   //physicsEngineSolver->updateGeometry(physicsEngineGeometries[i]);
+   //   if (std::dynamic_pointer_cast<PePhysicsEngineGeometryAdapter>(physicsEngineGeometrieAdapters[i])->isActive())
+   //   {
+   //      interactors[i]->setPhysicsEngineGeometry(physicsEngineGeometrieAdapters[i]);
+   //   }
+   //}
 }
 
 void DemCoProcessor::setBlockVisitor(std::shared_ptr<BoundaryConditionsBlockVisitor> boundaryConditionsBlockVisitor)
diff --git a/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineGeometryAdapter.h b/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineGeometryAdapter.h
index 03349b61cfc6908f35b0cd5781bcd69bb579792c..feea998f902724217bd88fffcea928820bf3bb3d 100644
--- a/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineGeometryAdapter.h
+++ b/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineGeometryAdapter.h
@@ -7,6 +7,7 @@
 
 
 #include "PhysicsEngineGeometryAdapter.h"
+#include <core\DataTypes.h>
 
 namespace walberla
 {
@@ -56,13 +57,14 @@ public:
     int shadowCounter;
     int counter;
 
-    int getSystemId() const { return systemId; }
-    void setSystemId(int val) { systemId = val; }
+    unsigned long long getSystemId() const { return systemId; }
+    void setSystemId(unsigned long long val) { systemId = val; }
 private:
     walberla::pe::RigidBody* peGeoObject;
     //unsigned long long id;
     int id;
-    int systemId;
+    //walberla::id_t systemId;
+    unsigned long long systemId;
     bool active;
 
 };
diff --git a/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineSolverAdapter.cpp b/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineSolverAdapter.cpp
index fd227a65b7079c6bfa2a952cca487834a9851c77..7e5f5fccef7f7b4c9da9498d2c30ab284479715f 100644
--- a/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineSolverAdapter.cpp
+++ b/source/DemCoupling/physicsEngineAdapter/pe/PePhysicsEngineSolverAdapter.cpp
@@ -46,8 +46,8 @@ std::shared_ptr<PhysicsEngineGeometryAdapter> PePhysicsEngineSolverAdapter::crea
        peGeometryAdapter->setId(id);
        peGeometryAdapter->setSystemId(peGeometry->getSystemID());
        
-       if(peGeometry->getSystemID() != id+1)
-          UB_THROW(UbException(UB_EXARGS, "id="+UbSystem::toString(id)+" does not match pe::SystemId="+UbSystem::toString(peGeometry->getSystemID())));
+       //if(peGeometry->getSystemID() != id+1)
+       //   UB_THROW(UbException(UB_EXARGS, "id="+UbSystem::toString(id)+" does not match pe::SystemId="+UbSystem::toString(peGeometry->getSystemID())));
 
        peGeometryAdapter->setActive();
        peGeometryAdapter->setGeometry(peGeometry);
diff --git a/source/VirtualFluidsCore/Parallel/Communicator.h b/source/VirtualFluidsCore/Parallel/Communicator.h
index aa2e3d35d1371dbeb789e38d6a75848624b9df8e..3d07e06d41366c268e3d4d78e7d4ff7761e3fe70 100644
--- a/source/VirtualFluidsCore/Parallel/Communicator.h
+++ b/source/VirtualFluidsCore/Parallel/Communicator.h
@@ -33,10 +33,12 @@ public:
    virtual std::vector<int> gather(std::vector<int>& values) = 0;
    virtual std::vector<float> gather(std::vector<float>& values) = 0;
    virtual std::vector<double> gather(std::vector<double>& values) = 0;
+   virtual std::vector<unsigned long long> gather(std::vector<unsigned long long>& values) = 0;
 
    virtual void allGather(std::vector<int>& svalues, std::vector<int>& rvalues) = 0;
    virtual void allGather(std::vector<float>& svalues, std::vector<float>& rvalues) = 0;
    virtual void allGather(std::vector<double>& svalues, std::vector<double>& rvalues) = 0;
+   virtual void allGather(std::vector<unsigned long long>& svalues, std::vector<unsigned long long>& rvalues) = 0;
    
    virtual void broadcast(int& value) = 0;
    virtual void broadcast(float& value) = 0;
diff --git a/source/VirtualFluidsCore/Parallel/MPICommunicator.cpp b/source/VirtualFluidsCore/Parallel/MPICommunicator.cpp
index e2c32cdbcb8779150ea58e75eacd0bc710f5e925..cbd3cdf105c5567227b044ce1f3188cec680fde6 100644
--- a/source/VirtualFluidsCore/Parallel/MPICommunicator.cpp
+++ b/source/VirtualFluidsCore/Parallel/MPICommunicator.cpp
@@ -97,6 +97,11 @@ vector<double> MPICommunicator::gather(vector<double>& values)
    return gather<double>(values);
 }
 //////////////////////////////////////////////////////////////////////////
+std::vector<unsigned long long> MPICommunicator::gather(std::vector<unsigned long long>& values)
+{
+   return gather<unsigned long long>(values);
+}
+//////////////////////////////////////////////////////////////////////////
 int MPICommunicator::getProcessID()
 {
    return PID;
@@ -193,6 +198,11 @@ void MPICommunicator::allGather(std::vector<double>& svalues, std::vector<double
    allGather<double>(svalues, rvalues);
 }
 //////////////////////////////////////////////////////////////////////////
+void MPICommunicator::allGather(std::vector<unsigned long long>& svalues, std::vector<unsigned long long>& rvalues)
+{
+   allGather<unsigned long long>(svalues, rvalues);
+}
+//////////////////////////////////////////////////////////////////////////
 void MPICommunicator::broadcast(std::vector<int>& values)
 {
    broadcast<int>(values);
diff --git a/source/VirtualFluidsCore/Parallel/MPICommunicator.h b/source/VirtualFluidsCore/Parallel/MPICommunicator.h
index f57a7db4c9a1346239142517e54e28360d69cbf5..9338a29259f6df3d71881a8095df2a4ff368b626 100644
--- a/source/VirtualFluidsCore/Parallel/MPICommunicator.h
+++ b/source/VirtualFluidsCore/Parallel/MPICommunicator.h
@@ -45,10 +45,12 @@ public:
    std::vector<int> gather(std::vector<int>& values);
    std::vector<float> gather(std::vector<float>& values);
    std::vector<double> gather(std::vector<double>& values);
+   std::vector<unsigned long long> gather(std::vector<unsigned long long>& values);
 
    void allGather(std::vector<int>& svalues, std::vector<int>& rvalues);
    void allGather(std::vector<float>& svalues, std::vector<float>& rvalues);
    void allGather(std::vector<double>& svalues, std::vector<double>& rvalues);
+   void allGather(std::vector<unsigned long long>& svalues, std::vector<unsigned long long>& rvalues);
 
    void broadcast(int& value);
    void broadcast(float& value);
@@ -85,6 +87,7 @@ std::vector<T> MPICommunicator::gather(std::vector<T>& values)
    if ((std::string)typeid(T).name()==(std::string)typeid(double).name()) mpiDataType = MPI_DOUBLE;
    else if ((std::string)typeid(T).name()==(std::string)typeid(float).name()) mpiDataType = MPI_FLOAT;
    else if ((std::string)typeid(T).name()==(std::string)typeid(int).name()) mpiDataType = MPI_INT;
+   else if ((std::string)typeid(T).name()==(std::string)typeid(unsigned long long).name()) mpiDataType = MPI_UNSIGNED_LONG_LONG;
    else throw UbException(UB_EXARGS, "no MpiDataType for T"+(std::string)typeid(T).name());
 
    int count = static_cast<int> (values.size());
@@ -107,6 +110,7 @@ void MPICommunicator::allGather(std::vector<T>& svalues, std::vector<T>& rvalues
    if ((std::string)typeid(T).name()==(std::string)typeid(double).name()) mpiDataType = MPI_DOUBLE;
    else if ((std::string)typeid(T).name()==(std::string)typeid(float).name()) mpiDataType = MPI_FLOAT;
    else if ((std::string)typeid(T).name()==(std::string)typeid(int).name()) mpiDataType = MPI_INT;
+   else if ((std::string)typeid(T).name()==(std::string)typeid(unsigned long long).name()) mpiDataType = MPI_UNSIGNED_LONG_LONG;
    else throw UbException(UB_EXARGS, "no MpiDataType for T"+(std::string)typeid(T).name());
 
    int scount;