diff --git a/Filters/Sources/Testing/Cxx/CMakeLists.txt b/Filters/Sources/Testing/Cxx/CMakeLists.txt
index 2764e7177eb95e457436dfe4bc1a24660858cc09..f5b9e15c19815bc9058dc25fd171c75e2e28d897 100644
--- a/Filters/Sources/Testing/Cxx/CMakeLists.txt
+++ b/Filters/Sources/Testing/Cxx/CMakeLists.txt
@@ -35,7 +35,18 @@ vtk_add_test_cxx(vtkFiltersSourcesCxxTests tests
   TestTextSource.cxx,NO_VALID
   TestTexturedSphereSource.cxx,NO_VALID
   )
-vtk_test_cxx_executable(vtkFiltersSourcesCxxTests tests
+
+vtk_add_test_mpi(vtkFiltersSourcesCxxTests tests_mpi
+  TESTING_DATA
+  TestSpatioTemporalHarmonicsSourceDistributed.cxx
+  )
+
+set(all_tests
+  ${tests}
+  ${tests_mpi}
+  )
+
+vtk_test_cxx_executable(vtkFiltersSourcesCxxTests all_tests
   DISABLE_FLOATING_POINT_EXCEPTIONS
   RENDERING_FACTORY
   )
diff --git a/Filters/Sources/Testing/Cxx/TestSpatioTemporalHarmonicsSourceDistributed.cxx b/Filters/Sources/Testing/Cxx/TestSpatioTemporalHarmonicsSourceDistributed.cxx
new file mode 100644
index 0000000000000000000000000000000000000000..172af0d2a72b1d60b695a314e62a09cf64977b2e
--- /dev/null
+++ b/Filters/Sources/Testing/Cxx/TestSpatioTemporalHarmonicsSourceDistributed.cxx
@@ -0,0 +1,94 @@
+// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+// SPDX-License-Identifier: BSD-3-Clause
+
+#include "vtkActor.h"
+#include "vtkCamera.h"
+#include "vtkCompositeRenderManager.h"
+#include "vtkDataArray.h"
+#include "vtkDataSet.h"
+#include "vtkDataSetSurfaceFilter.h"
+#include "vtkImageData.h"
+#include "vtkMPIController.h"
+#include "vtkNew.h"
+#include "vtkPieceScalars.h"
+#include "vtkPointData.h"
+#include "vtkPolyDataMapper.h"
+#include "vtkRegressionTestImage.h"
+#include "vtkRenderWindow.h"
+#include "vtkRenderWindowInteractor.h"
+#include "vtkRenderer.h"
+#include "vtkSpatioTemporalHarmonicsSource.h"
+
+int TestSpatioTemporalHarmonicsSourceDistributed(int argc, char* argv[])
+{
+  // Setup mpi
+  vtkNew<vtkMPIController> controller;
+  controller->Initialize(&argc, &argv);
+
+  const int myId = controller->GetLocalProcessId();
+  const int numProcs = controller->GetNumberOfProcesses();
+
+  // Setup parallel rendering
+  vtkNew<vtkCompositeRenderManager> prm;
+  vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::Take(prm->MakeRenderer());
+  vtkSmartPointer<vtkRenderWindow> renWin =
+    vtkSmartPointer<vtkRenderWindow>::Take(prm->MakeRenderWindow());
+  renWin->AddRenderer(renderer);
+  renWin->DoubleBufferOn();
+  renWin->SetMultiSamples(0);
+
+  vtkNew<vtkRenderWindowInteractor> iren;
+  iren->SetRenderWindow(renWin);
+
+  prm->SetRenderWindow(renWin);
+  prm->SetController(controller);
+
+  // Create source
+  vtkNew<vtkSpatioTemporalHarmonicsSource> source;
+  vtkNew<vtkDataSetSurfaceFilter> toPolyData;
+  toPolyData->SetInputConnection(source->GetOutputPort());
+
+  vtkNew<vtkPieceScalars> pieceScalars;
+  pieceScalars->SetInputConnection(toPolyData->GetOutputPort());
+  pieceScalars->SetScalarModeToCellData();
+
+  // Execute pipeline and render
+  vtkNew<vtkPolyDataMapper> mapper;
+  mapper->SetInputConnection(pieceScalars->GetOutputPort());
+  mapper->SetScalarModeToUseCellFieldData();
+  mapper->SetPiece(myId);
+  mapper->SetNumberOfPieces(numProcs);
+  mapper->SelectColorArray("Piece");
+  mapper->SetScalarRange(0, numProcs - 1);
+
+  vtkNew<vtkActor> actor;
+  actor->SetMapper(mapper);
+  renderer->AddActor(actor);
+
+  int retVal;
+  if (myId == 0)
+  {
+    prm->ResetAllCameras();
+    renderer->GetActiveCamera()->SetPosition(50.0, 40.0, 30.0);
+    renderer->GetActiveCamera()->SetFocalPoint(0.0, 0.0, 0.0);
+    renderer->ResetCameraClippingRange();
+
+    renWin->Render();
+    retVal = vtkRegressionTester::Test(argc, argv, renWin, 10);
+    if (retVal == vtkRegressionTester::DO_INTERACTOR)
+    {
+      prm->StartInteractor();
+    }
+    controller->TriggerBreakRMIs();
+  }
+  else
+  {
+    prm->StartServices();
+  }
+  controller->Barrier();
+  controller->Broadcast(&retVal, 1, 0);
+
+  controller->Finalize();
+
+  return !retVal;
+}
diff --git a/Filters/Sources/Testing/Data/Baseline/TestSpatioTemporalHarmonicsSourceDistributed.png.sha512 b/Filters/Sources/Testing/Data/Baseline/TestSpatioTemporalHarmonicsSourceDistributed.png.sha512
new file mode 100644
index 0000000000000000000000000000000000000000..0e931638dcf328dc6662bdb7d52459ddc04b3d5b
--- /dev/null
+++ b/Filters/Sources/Testing/Data/Baseline/TestSpatioTemporalHarmonicsSourceDistributed.png.sha512
@@ -0,0 +1 @@
+30000d4f47cf2a23a47d6351ed4cc09b902b5290220bc27cfdcb97ef206af59dcdad34504f1c4759ba4ef37f1cc326f19ec7c5dcafeddefddc058e1ea9dcd29d
diff --git a/Filters/Sources/vtk.module b/Filters/Sources/vtk.module
index 13232bcec66b04b6f7c4519e7ad7c12f63fe8d1b..8016313f2d438d9947a699be0f0e498bc7dd9319 100644
--- a/Filters/Sources/vtk.module
+++ b/Filters/Sources/vtk.module
@@ -32,11 +32,14 @@ TEST_DEPENDS
   VTK::FiltersGeometry
   VTK::FiltersHyperTree
   VTK::FiltersModeling
+  VTK::FiltersParallel
   VTK::FiltersVerdict
   VTK::IOParallel
   VTK::IOXML
   VTK::InteractionStyle
+  VTK::ParallelMPI
   VTK::RenderingFreeType
   VTK::RenderingOpenGL2
+  VTK::RenderingParallel
   VTK::TestingCore
   VTK::TestingRendering