diff --git a/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx b/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx
index b6e503ed4c4ceccfb8f55ed548cfcfab90220224..1602c43ad5352153dde11051bb4cf8c6d2c3e2e9 100644
--- a/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx
+++ b/IO/Geometry/Testing/Cxx/TestOpenFOAMReaderLagrangianSerial.cxx
@@ -1,7 +1,7 @@
 /*=========================================================================
 
   Program:   Visualization Toolkit
-  Module:    TestSimplePointsReaderWriter.cxx
+  Module:    TestOpenFOAMReaderLagrangianSerial
 
   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
   All rights reserved.
@@ -63,18 +63,13 @@ int TestOpenFOAMReaderLagrangianSerial(int argc, char* argv[])
   reader->SetFileName(filename);
   delete[] filename;
   reader->Update();
-
-  reader->SetTimeValue(0.01);
-  // reader->CreateCellToPointOn();
-  // reader->ReadZonesOn();
+  reader->SetTimeValue(0.005);
 
   // Re-read with everything selected
   reader->EnableAllPatchArrays();
   reader->Update();
-
   reader->Print(std::cout);
-  reader->GetOutput()->Print(std::cout);
-  // reader->GetOutput()->GetBlock(0)->Print(std::cout);
+  // reader->GetOutput()->Print(std::cout);
 
   auto* allBlocks = vtkMultiBlockDataSet::SafeDownCast(reader->GetOutput());
   auto* lagrangianBlocks = findBlock<vtkMultiBlockDataSet>(allBlocks, "lagrangian");
@@ -85,8 +80,8 @@ int TestOpenFOAMReaderLagrangianSerial(int argc, char* argv[])
     return 1;
   }
 
-  vtkIdType nClouds = 0;
-  vtkIdType nParticles = 0;
+  long nClouds = 0;
+  long nParticles = 0;
 
   const int nLagrangianFields = reader->GetNumberOfLagrangianArrays();
   std::cout << "----- Have " << nLagrangianFields << " Lagrangian fields" << std::endl;
@@ -97,14 +92,12 @@ int TestOpenFOAMReaderLagrangianSerial(int argc, char* argv[])
     std::string displayName(reader->GetPatchArrayName(i));
     auto slash = displayName.rfind('/');
 
-    if (displayName.compare(0, slash, "lagrangian") == 0 && slash != std::string::npos)
+    if (slash != std::string::npos && displayName.compare(0, ++slash, "lagrangian/") == 0)
     {
-      ++slash;
       std::string cloudName(displayName.substr(slash));
       std::cout << "  Display " << displayName << " = Cloud <" << cloudName << ">" << std::endl;
 
       auto* cloudData = findBlock<vtkPolyData>(lagrangianBlocks, cloudName.c_str());
-
       if (cloudData)
       {
         ++nClouds;
diff --git a/IO/Parallel/Testing/Cxx/CMakeLists.txt b/IO/Parallel/Testing/Cxx/CMakeLists.txt
index 9fabed257cd8be0de32a6c0b57bcb379d099e4b4..ee54239a1eaf6a532429493bd9dfdf4aa17c34e1 100644
--- a/IO/Parallel/Testing/Cxx/CMakeLists.txt
+++ b/IO/Parallel/Testing/Cxx/CMakeLists.txt
@@ -2,6 +2,7 @@ if (TARGET VTK::ParallelMPI)
   vtk_add_test_mpi(vtkIOParallelCxxTests-MPI tests
     TESTING_DATA
     TestPOpenFOAMReader.cxx
+    TestPOpenFOAMReaderLagrangianSerial.cxx,NO_VALID
     TestPOpenFOAMReaderLagrangianUncollated.cxx,NO_VALID
     )
   vtk_test_cxx_executable(vtkIOParallelCxxTests-MPI tests)
@@ -9,6 +10,7 @@ endif()
 
 vtk_add_test_cxx(vtkIOParallelCxxTests tests
   TestPOpenFOAMReader.cxx
+  TestPOpenFOAMReaderLagrangianSerial.cxx,NO_VALID
   TestPOpenFOAMReaderLagrangianUncollated.cxx,NO_VALID
   TestBigEndianPlot3D.cxx,NO_VALID
   )
diff --git a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx
index 8a2f1014a8e52304e5e6eaa625aef9dc89340155..1d8cb090cbc1ee47289362ef0d3811d6940a1fbe 100644
--- a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx
+++ b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReader.cxx
@@ -1,7 +1,7 @@
 /*=========================================================================
 
   Program:   Visualization Toolkit
-  Module:    TestSimplePointsReaderWriter.cxx
+  Module:    TestPOpenFOAMReader
 
   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
   All rights reserved.
diff --git a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianSerial.cxx b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianSerial.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..22ecd6f37423265f0577c264206acda58754c6c2
--- /dev/null
+++ b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianSerial.cxx
@@ -0,0 +1,164 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    TestPOpenFOAMReaderLagrangianSerial
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#if VTK_MODULE_ENABLE_VTK_ParallelMPI
+#include "vtkMPIController.h"
+#else
+#include "vtkDummyController.h"
+#endif
+
+#include "vtkPOpenFOAMReader.h"
+
+#include "vtkCellData.h"
+#include "vtkCompositeDataSet.h"
+#include "vtkDataSetMapper.h"
+#include "vtkInformation.h"
+#include "vtkLogger.h"
+#include "vtkMultiBlockDataSet.h"
+#include "vtkPointData.h"
+#include "vtkPolyData.h"
+#include "vtkSmartPointer.h"
+#include "vtkTestUtilities.h"
+#include "vtkUnstructuredGrid.h"
+
+namespace
+{
+
+// Get named block of specified type
+template <class Type>
+static Type* findBlock(vtkMultiBlockDataSet* mb, const char* blockName)
+{
+  Type* dataset = nullptr;
+  const unsigned int nblocks = (mb ? mb->GetNumberOfBlocks() : 0u);
+  for (unsigned int blocki = 0; !dataset && blocki < nblocks; ++blocki)
+  {
+    vtkDataObject* obj = mb->GetBlock(blocki);
+    if (strcmp(mb->GetMetaData(blocki)->Get(vtkCompositeDataSet::NAME()), blockName) == 0)
+    {
+      dataset = Type::SafeDownCast(obj);
+    }
+    if (!dataset)
+    {
+      dataset = findBlock<Type>(vtkMultiBlockDataSet::SafeDownCast(obj), blockName);
+    }
+  }
+  return dataset;
+}
+
+} // End anonymous namespace
+
+int TestPOpenFOAMReaderLagrangianSerial(int argc, char* argv[])
+{
+#if VTK_MODULE_ENABLE_VTK_ParallelMPI
+  vtkNew<vtkMPIController> controller;
+#else
+  vtkNew<vtkDummyController> controller;
+#endif
+  controller->Initialize(&argc, &argv);
+  int rank = controller->GetLocalProcessId();
+  vtkLogger::SetThreadName("rank=" + std::to_string(rank));
+  vtkMultiProcessController::SetGlobalController(controller);
+
+  // Read file name.
+  char* filename = vtkTestUtilities::ExpandDataFileName(
+    argc, argv, "Data/OpenFOAM/simplifiedSiwek-serial/simplifiedSiwek-serial.foam");
+
+  // Read the file
+  vtkNew<vtkPOpenFOAMReader> reader;
+  reader->SetFileName(filename);
+  delete[] filename;
+  reader->SetCaseType(vtkPOpenFOAMReader::RECONSTRUCTED_CASE);
+  reader->Update();
+
+  reader->SetTimeValue(0.005);
+
+  // Re-read with everything selected
+  reader->EnableAllPatchArrays();
+  reader->Update();
+  reader->Print(std::cout);
+  // reader->GetOutput()->Print(std::cout);
+
+  auto* allBlocks = vtkMultiBlockDataSet::SafeDownCast(reader->GetOutput());
+  auto* lagrangianBlocks = findBlock<vtkMultiBlockDataSet>(allBlocks, "lagrangian");
+
+  if (!lagrangianBlocks)
+  {
+    std::cout << "No lagrangian blocks!\n";
+    return 1;
+  }
+
+  long nClouds = 0;
+  long nParticles = 0;
+  int hasLagrangian = 0;
+
+  do
+  {
+    auto* allBlocks = vtkMultiBlockDataSet::SafeDownCast(reader->GetOutput());
+    if (!allBlocks)
+    {
+      std::cout << "No blocks!\n";
+      break;
+    }
+    std::cout << "Read " << allBlocks->GetNumberOfBlocks() << " blocks" << std::endl;
+
+    auto* lagrangianBlocks = findBlock<vtkMultiBlockDataSet>(allBlocks, "lagrangian");
+    if (!lagrangianBlocks)
+    {
+      std::cout << "No lagrangian blocks!\n";
+      break;
+    }
+
+    // Bad name, but it is what we have
+    for (int i = 0; i < reader->GetNumberOfPatchArrays(); ++i)
+    {
+      std::string displayName(reader->GetPatchArrayName(i));
+      auto slash = displayName.rfind('/');
+
+      if (slash != std::string::npos && displayName.compare(0, ++slash, "lagrangian/") == 0)
+      {
+        hasLagrangian = 1;
+        std::string cloudName(displayName.substr(slash));
+        std::cout << "  Display " << displayName << " = Cloud <" << cloudName << ">" << std::endl;
+
+        auto* cloudData = findBlock<vtkPolyData>(lagrangianBlocks, cloudName.c_str());
+        if (cloudData)
+        {
+          ++nClouds;
+          nParticles += static_cast<long>(cloudData->GetNumberOfPoints());
+        }
+      }
+    }
+  } while (false);
+
+  int globalHasLagrangian = hasLagrangian;
+  long nGlobalClouds = nClouds;
+  long nGlobalParticles = nParticles;
+
+  // maxOp for clouds may be misleading, but good enough for test
+  controller->AllReduce(&hasLagrangian, &globalHasLagrangian, 1, vtkCommunicator::LOGICAL_OR_OP);
+  controller->AllReduce(&nClouds, &nGlobalClouds, 1, vtkCommunicator::MAX_OP);
+  controller->AllReduce(&nParticles, &nGlobalParticles, 1, vtkCommunicator::SUM_OP);
+
+  int retVal = 0;
+  if (rank == 0)
+  {
+    std::cout << "  Read " << nParticles << " particles from " << nClouds << " clouds" << std::endl;
+    retVal = (nParticles != 0);
+  }
+  controller->Barrier();
+  controller->Broadcast(&retVal, 1, 0);
+
+  return !retVal;
+}
diff --git a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx
index 9bd53a6ce9487f1c3d5dde81ffde33c17f646d30..e57b982885152592b06a11e4ffcc7f35a695acaa 100644
--- a/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx
+++ b/IO/Parallel/Testing/Cxx/TestPOpenFOAMReaderLagrangianUncollated.cxx
@@ -1,7 +1,7 @@
 /*=========================================================================
 
   Program:   Visualization Toolkit
-  Module:    TestSimplePointsReaderWriter.cxx
+  Module:    TestPOpenFOAMReaderLagrangianUncollated
 
   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
   All rights reserved.
@@ -81,21 +81,17 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[])
   reader->SetCaseType(vtkPOpenFOAMReader::DECOMPOSED_CASE);
   reader->Update();
 
-  reader->SetTimeValue(0.01);
+  reader->SetTimeValue(0.005);
+
   // Re-read with everything selected
   reader->EnableAllPatchArrays();
-  reader->SetCaseType(vtkPOpenFOAMReader::DECOMPOSED_CASE);
   reader->Update();
-
   reader->Print(std::cout);
   reader->GetOutput()->Print(std::cout);
-  // reader->GetOutput()->GetBlock(0)->Print(std::cout);
 
-  std::cout << "CaseType: " << int(reader->GetCaseType()) << std::endl;
-
-  int hasLagrangian = 0;
   long nClouds = 0;
   long nParticles = 0;
+  int hasLagrangian = 0;
 
   do
   {
@@ -120,15 +116,13 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[])
       std::string displayName(reader->GetPatchArrayName(i));
       auto slash = displayName.rfind('/');
 
-      if (displayName.compare(0, slash, "lagrangian") == 0 && slash != std::string::npos)
+      if (slash != std::string::npos && displayName.compare(0, ++slash, "lagrangian/") == 0)
       {
         hasLagrangian = 1;
-        ++slash;
         std::string cloudName(displayName.substr(slash));
         std::cout << "  Display " << displayName << " = Cloud <" << cloudName << ">" << std::endl;
 
         auto* cloudData = findBlock<vtkPolyData>(lagrangianBlocks, cloudName.c_str());
-
         if (cloudData)
         {
           ++nClouds;
@@ -147,9 +141,6 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[])
   controller->AllReduce(&nClouds, &nGlobalClouds, 1, vtkCommunicator::MAX_OP);
   controller->AllReduce(&nParticles, &nGlobalParticles, 1, vtkCommunicator::SUM_OP);
 
-  // No need for Barrier after AllReduce
-  controller->Finalize();
-
   int retVal = 0;
   if (rank == 0)
   {
@@ -159,13 +150,5 @@ int TestPOpenFOAMReaderLagrangianUncollated(int argc, char* argv[])
   controller->Barrier();
   controller->Broadcast(&retVal, 1, 0);
 
-  controller->Finalize();
-
-  if (!retVal)
-  {
-    std::cout << "WARNING: test needs revising" << std::endl;
-    return 0;
-  }
-
   return !retVal;
 }