diff --git a/.gitlab/ci/ctest_exclusions.cmake b/.gitlab/ci/ctest_exclusions.cmake
index 5b534327eed3e49d0ebd597705618a3c4d09c781..98e297a3fe0d45afded302372cc6ac992c96c750 100644
--- a/.gitlab/ci/ctest_exclusions.cmake
+++ b/.gitlab/ci/ctest_exclusions.cmake
@@ -60,9 +60,6 @@ if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "fedora" OR
     "^VTK::FiltersModelingPython-TestCookieCutter$"
     "^VTK::RenderingCoreCxx-TestTextureRGBADepthPeeling$" # seems to just not work here
 
-    # Font rendering differences (new baseline?)
-    "^VTK::RenderingFreeTypeCxx-TestFreeTypeTextMapperWithColumns$"
-
     # Flaky timeouts https://gitlab.kitware.com/vtk/vtk/-/issues/18861
     "^VTK::InteractionWidgetsCxx-TestPickingManagerSeedWidget$"
 
@@ -74,7 +71,12 @@ endif ()
 
 if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "el8")
   list(APPEND test_exclusions
-    # Matplotlib fails to render anything. See #19302.
+    # Matplotlib related issues. See #19302.
+    # Matplotlib fails to render anything.
+    "^VTK::RenderingMatplotlibCxx-TestContextMathTextImage$"
+    "^VTK::RenderingMatplotlibCxx-TestIndexedLookupScalarBar$"
+    "^VTK::RenderingMatplotlibCxx-TestMathTextActor$"
+    "^VTK::RenderingMatplotlibCxx-TestMathTextActor3D$"
     "^VTK::RenderingMatplotlibCxx-TestRenderString$"
     "^VTK::RenderingMatplotlibCxx-TestScalarBarCombinatorics$"
     "^VTK::RenderingMatplotlibCxx-TestStringToPath$"
@@ -82,6 +84,12 @@ if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "el8")
     "^VTK::RenderingMatplotlibPython-TestMathTextActor3D$"
     "^VTK::RenderingMatplotlibPython-TestRenderString$"
     "^VTK::RenderingMatplotlibPython-TestStringToPath$"
+    # Freetype, which depends on Matplotlib, fails to render anything
+    "^VTK::RenderingFreeTypeCxx-TestFontDPIScaling$"
+    "^VTK::RenderingFreeTypeCxx-TestFreeTypeTextMapper$"
+    "^VTK::RenderingFreeTypeCxx-TestFreeTypeTextMapperWithColumns$"
+    "^VTK::RenderingFreeTypeCxx-TestMathTextFonts$"
+    "^VTK::RenderingFreeTypeCxx-TestMathTextFreeTypeTextRenderer$"
 
     # Consistent timeout. Needs investigation.
     # https://gitlab.kitware.com/vtk/vtk/-/issues/19303
@@ -335,6 +343,7 @@ if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "macos_arm64")
     # floating point precision issues (fma optimizations change results)
     # https://gitlab.kitware.com/vtk/vtk/-/issues/19418
     "^VTK::CommonDataModelCxx-TestHyperTreeGridGeometricLocator$"
+    "^VTK::ChartsCoreCxx-TestLinePlot3D$"
     "^VTK::FiltersCoreCxx-TestImplicitPolyDataDistanceCube$"
     "^VTK::FiltersCorePython-TestSphereTreeFilter$"
     "^VTK::FiltersFlowPathsCxx-TestEvenlySpacedStreamlines2D$"
@@ -353,16 +362,24 @@ if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "macos_arm64")
     # https://gitlab.kitware.com/vtk/vtk/-/issues/18229
     "^VTK::FiltersHyperTreeCxx-TestHyperTreeGridBinaryClipPlanes$"
     "^VTK::RenderingAnnotationCxx-TestCubeAxes3$"
-    "^VTK::RenderingAnnotationCxx-TestCubeAxesWithYLines$")
+    "^VTK::RenderingAnnotationCxx-TestCubeAxesWithYLines$"
+
+    # https://gitlab.kitware.com/vtk/vtk/-/issues/19578
+    "^VTK::FiltersGeneralCxx-TestContourTriangulatorHoles$")
 endif ()
 
 if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "macos")
   list(APPEND test_exclusions
+    # line differences https://gitlab.kitware.com/vtk/vtk/-/issues/18229
+    "^VTK::FiltersSourcesCxx-TestHyperTreeGridPreConfiguredSource$"
+    "^VTK::FiltersSourcesCxx-TestRandomHyperTreeGridSource$"
+
     # geometry shader issues (observed on M4 hardware)
     # https://gitlab.kitware.com/vtk/vtk/-/issues/19555
     "^VTK::IOIOSSCxx-TestIOSSApplyDisplacementsCGNS$"
     "^VTK::IOADIOS2Cxx-TestADIOS2BPReaderSingleTimeStep$"
-    "^VTK::CommonDataModelPython-TestClipPolyhedra$")
+    "^VTK::CommonDataModelPython-TestClipPolyhedra$"
+    "^VTK::ImagingCoreCxx-TestStencilWithPolyDataContour$")
 endif ()
 
 if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "wheel_macos" AND
@@ -370,12 +387,16 @@ if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "wheel_macos" AND
   list(APPEND test_exclusions
     # floating point precision issues (fma optimizations change results)
     # https://gitlab.kitware.com/vtk/vtk/-/issues/19418
+    "^VTK::ChartsCoreCxx-TestLinePlot3D$"
     "^VTK::FiltersCorePython-TestSphereTreeFilter$"
     "^VTK::FiltersModelingPython-Hyper$"
     "^VTK::RenderingAnnotationPython-xyPlot$"
     "^VTK::RenderingAnnotationPython-xyPlot2$"
     "^VTK::RenderingAnnotationPython-xyPlot4$"
-    "^VTK::RenderingCorePython-pickImageData$")
+    "^VTK::RenderingCorePython-pickImageData$"
+
+    # https://gitlab.kitware.com/vtk/vtk/-/issues/19578
+    "^VTK::FiltersGeneralCxx-TestContourTriangulatorHoles$")
 endif ()
 
 if ("$ENV{CMAKE_CONFIGURATION}" MATCHES "macos_x86_64")
diff --git a/.gitlab/ci/docker/el8-icc/install_deps.sh b/.gitlab/ci/docker/el8-icc/install_deps.sh
index d87cd9f19b68538fb51b8efeaa2fd88ef47f3957..a4800a069e6222008c3d60c9b14035fbf847b675 100755
--- a/.gitlab/ci/docker/el8-icc/install_deps.sh
+++ b/.gitlab/ci/docker/el8-icc/install_deps.sh
@@ -29,7 +29,7 @@ dnf install -y --setopt=install_weak_deps=False \
     python3.11-pip
 
 python3.11 -m venv /opt/python311/venv
-/opt/python311/venv/bin/pip install matplotlib
+/opt/python311/venv/bin/pip install 'matplotlib<=3.6.3'
 # wslink will bring aiohttp>=3.7.4
 /opt/python311/venv/bin/pip install 'wslink>=1.0.4'
 
diff --git a/CMake/vtkModuleTesting.cmake b/CMake/vtkModuleTesting.cmake
index b14de44af83126cd8dbc79d38c5e4570b3fd015a..d6bfe27f8ba93b0c22be06413e4a637215158219 100644
--- a/CMake/vtkModuleTesting.cmake
+++ b/CMake/vtkModuleTesting.cmake
@@ -360,7 +360,9 @@ function (vtk_add_test_cxx exename _tests)
     # Insufficient graphics resources.
     "Attempt to use a texture buffer exceeding your hardware's limits"
     # Vulkan driver not setup correctly.
-    "vulkan: No DRI3 support detected - required for presentation")
+    "vulkan: No DRI3 support detected - required for presentation"
+    # OpenGL driver cannot render wide lines.
+    "a line width has been requested that is larger than your system supports")
 
   foreach (name IN LISTS names)
     _vtk_test_set_options("${cxx_options}" "local_" ${_${name}_options})
diff --git a/Charts/Core/Testing/Cxx/CMakeLists.txt b/Charts/Core/Testing/Cxx/CMakeLists.txt
index a9c1f3da5692911ac72e2905bad9003962baefe2..4479a1a8108a8b406abafb243851a11daa2505cd 100644
--- a/Charts/Core/Testing/Cxx/CMakeLists.txt
+++ b/Charts/Core/Testing/Cxx/CMakeLists.txt
@@ -43,23 +43,23 @@ vtk_add_test_cxx(vtkChartsCoreCxxTests tests
   TestCompositeControlPointsItem.cxx,NO_DATA,NO_VALID
   TestControlPointsItemEvents.cxx,NO_DATA,NO_VALID
   TestAreaPlot.cxx
-  TestAxes.cxx
+  TestAxes.cxx,LOOSE_VALID
   TestAxes2.cxx
-  TestBagPlot.cxx
-  TestBarGraph.cxx
-  TestBarGraphHorizontal.cxx
-  TestBarGraphSelection.cxx
-  TestBoxPlot.cxx
-  TestBoxPlot2.cxx
+  TestBagPlot.cxx,LOOSE_VALID
+  TestBarGraph.cxx,LOOSE_VALID
+  TestBarGraphHorizontal.cxx,LOOSE_VALID
+  TestBarGraphSelection.cxx,LOOSE_VALID
+  TestBoxPlot.cxx,LOOSE_VALID
+  TestBoxPlot2.cxx,LOOSE_VALID
   TestCategoryLegend.cxx
   TestColorTransferFunction.cxx
-  TestChartBadPoints.cxx
+  TestChartBadPoints.cxx,LOOSE_VALID
   TestChartDouble.cxx
   TestChartDoubleColors.cxx
   TestChartDoubleColorsOpaque.cxx
   TestChartLogScaleUpdates.cxx
-  TestChartMatrix.cxx
-  TestChartMatrix2.cxx
+  TestChartMatrix.cxx,LOOSE_VALID
+  TestChartMatrix2.cxx,LOOSE_VALID
   TestChartMatrix3.cxx
   TestChartPicking.cxx,NO_DATA,NO_VALID
   TestChartTileScaling.cxx
@@ -70,33 +70,33 @@ vtk_add_test_cxx(vtkChartsCoreCxxTests tests
   TestChartXYZMarginsRotations.cxx
   TestChartXYZOuterEdgeLabelling.cxx
   TestChartXYZUnconstrained.cxx
-  TestContext.cxx
-  TestContextArea.cxx
-  TestContextAreaFixedAspect.cxx
-  TestContextAreaFixedMargins.cxx
+  TestContext.cxx,LOOSE_VALID
+  TestContextArea.cxx,LOOSE_VALID
+  TestContextAreaFixedAspect.cxx,LOOSE_VALID
+  TestContextAreaFixedMargins.cxx,LOOSE_VALID
   TestContextAreaFixedRect.cxx
   TestContextImage.cxx
   TestContextItemStacking.cxx
   TestContextUnicode.cxx
   TestControlPointsHandleItem.cxx
   TestDiagram.cxx
-  TestFunctionalBagPlot.cxx
-  TestHistogram2D.cxx
+  TestFunctionalBagPlot.cxx,LOOSE_VALID
+  TestHistogram2D.cxx,LOOSE_VALID
   TestHistogram2DComponent.cxx
   TestHistogram2DMagnitude.cxx
   TestInteractiveChartXYZ.cxx
-  TestLegendHiddenPlots.cxx
+  TestLegendHiddenPlots.cxx,LOOSE_VALID
   TestLinePlot.cxx
   TestLinePlotDouble.cxx
-  TestLinePlotDouble2.cxx
+  TestLinePlotDouble2.cxx,LOOSE_VALID
   TestLinePlot3D.cxx
-  TestLinePlotAxisFonts.cxx
+  TestLinePlotAxisFonts.cxx,LOOSE_VALID
   TestLinePlot2.cxx
   TestLinePlotInteraction.cxx
-  TestLinePlotSelection.cxx
-  TestLinePlotSelection2.cxx
+  TestLinePlotSelection.cxx,LOOSE_VALID
+  TestLinePlotSelection2.cxx,LOOSE_VALID
   TestLinePlotSelectionMultiBlock.cxx
-  TestMultipleChartRenderers.cxx
+  TestMultipleChartRenderers.cxx,LOOSE_VALID
   TestMultipleRenderers.cxx
   TestMultipleScalarsToColors.cxx
   TestParallelCoordinates.cxx
@@ -105,19 +105,19 @@ vtk_add_test_cxx(vtkChartsCoreCxxTests tests
   TestParallelCoordinatesSelection.cxx,NO_VALID
   TestPieChart.cxx
   TestPlotBarRangeHandlesItem.cxx,NO_DATA,NO_VALID
-  TestPlotMatrix.cxx
+  TestPlotMatrix.cxx,LOOSE_VALID
   TestPlotRangeHandlesItem.cxx,NO_DATA,NO_VALID
   TestPropItem.cxx
   TestRangeHandlesItemEvents.cxx,NO_DATA,NO_VALID
   TestScalarsToColors.cxx
-  TestScatterPlot.cxx
+  TestScatterPlot.cxx,LOOSE_VALID
   TestScatterPlotMatrix.cxx
   TestScatterPlotMatrixHistogram.cxx
   TestScatterPlotMatrixVehicles.cxx
   TestScatterPlotMatrixVisible.cxx
-  TestScientificPlot.cxx
+  TestScientificPlot.cxx,LOOSE_VALID
   TestStackedBarGraph.cxx
-  TestStackedPlot.cxx
+  TestStackedPlot.cxx,LOOSE_VALID
   TestSurfacePlot.cxx
   TestZoomAxis.cxx
   TestZoomIndividualAxis.cxx
diff --git a/Charts/Core/Testing/Data/Baseline/TestFunctionalBagPlot.png.sha512 b/Charts/Core/Testing/Data/Baseline/TestFunctionalBagPlot.png.sha512
index 45871913d164f2d6a04f6d2ba9131cddac06acc0..7ab79d9101109953aec081034619b758c741d2c4 100644
--- a/Charts/Core/Testing/Data/Baseline/TestFunctionalBagPlot.png.sha512
+++ b/Charts/Core/Testing/Data/Baseline/TestFunctionalBagPlot.png.sha512
@@ -1 +1 @@
-4c0e5f5c302fb42f5710a73b461727bc190ad825d5933f0c8a50e305a9c7faec748244777c6ab59f4a2dc2498186be85ebf8c2442ebda6026c4807fdde816e54
+ec9d7af2d443f4f1ca500c53196d848cd44d05eb28fa9cb086f025c62eb982bc2545f67539a6606b4d719be84b52f9db93a4e9b18c9059935702c50ad90c50e7
diff --git a/Charts/Core/Testing/Data/Baseline/TestPropItem.png.sha512 b/Charts/Core/Testing/Data/Baseline/TestPropItem.png.sha512
index 279b1e1bb20123d6050e427c2fbbbaef3f64f062..ec5150f9079f69e5e4fc2f79360c99d62ca9d4c9 100644
--- a/Charts/Core/Testing/Data/Baseline/TestPropItem.png.sha512
+++ b/Charts/Core/Testing/Data/Baseline/TestPropItem.png.sha512
@@ -1 +1 @@
-d80dd6b9c0afa2b1fda24c592b402f60fee9b6acbf3b93e7a2e9dbff929da605d0b93ddf755d664046922dea8c650602f806bb3067c352eeb131b8c28ad24ab5
+02c8833b3820bab0ef027a0ebeb737a29cb569f9be34672f8e531e55a7516182a70152f96b4c63fd0de01aebef3f6c2fb5f2edfa405f9c16b899ab052917594a
diff --git a/Common/DataModel/vtkAbstractCellLinks.h b/Common/DataModel/vtkAbstractCellLinks.h
index bd905759e056255737ea833f7082ffe50ce600f3..e48643dab7c0b51d3ec4c98c17fcd9d4218f0e19 100644
--- a/Common/DataModel/vtkAbstractCellLinks.h
+++ b/Common/DataModel/vtkAbstractCellLinks.h
@@ -20,6 +20,7 @@
 #define vtkAbstractCellLinks_h
 
 #include "vtkCommonDataModelModule.h" // For export macro
+#include "vtkDeprecation.h"           // For VTK_DEPRECATED_IN_9_5_0
 #include "vtkObject.h"
 
 VTK_ABI_NAMESPACE_BEGIN
@@ -154,9 +155,28 @@ public:
    * filter always runs in serial mode.) This flag is typically used for
    * benchmarking purposes.
    */
+  VTK_DEPRECATED_IN_9_5_0("No longer used.")
   vtkSetMacro(SequentialProcessing, bool);
+  VTK_DEPRECATED_IN_9_5_0("No longer used.")
   vtkGetMacro(SequentialProcessing, bool);
-  vtkBooleanMacro(SequentialProcessing, bool);
+  VTK_DEPRECATED_IN_9_5_0("No longer used.")
+  virtual void SequentialProcessingOn()
+  {
+    if (!this->SequentialProcessing)
+    {
+      this->SequentialProcessing = true;
+      this->Modified();
+    }
+  }
+  VTK_DEPRECATED_IN_9_5_0("No longer used.")
+  virtual void SequentialProcessingOff()
+  {
+    if (this->SequentialProcessing)
+    {
+      this->SequentialProcessing = false;
+      this->Modified();
+    }
+  }
   ///@}
 
   ///@{
@@ -177,6 +197,7 @@ protected:
   ~vtkAbstractCellLinks() override;
 
   vtkDataSet* DataSet;
+  // VTK_DEPRECATED_IN_9_5_0("No longer used.")
   bool SequentialProcessing; // control whether to thread or not
   int Type;                  // derived classes set this instance variable when constructed
 
diff --git a/Common/DataModel/vtkBoundingBox.cxx b/Common/DataModel/vtkBoundingBox.cxx
index 340d55f3404257263c48142a541195b2dc8bb91e..a3d13096668ea1ca536ca5cdf547060c64164f0e 100644
--- a/Common/DataModel/vtkBoundingBox.cxx
+++ b/Common/DataModel/vtkBoundingBox.cxx
@@ -765,6 +765,36 @@ bool vtkBoundingBox::IntersectsLine(const double p1[3], const double p2[3]) cons
   return false;
 }
 
+// ---------------------------------------------------------------------------
+void vtkBoundingBox::GetDistance(double point[3], double distance[3])
+{
+  for (int i = 0; i < 3; i++)
+  {
+    if (point[i] < this->MinPnt[i])
+    {
+      distance[i] = point[i] - this->MinPnt[i];
+    }
+    else if (point[i] > this->MaxPnt[i])
+    {
+      distance[i] = point[i] - this->MaxPnt[i];
+    }
+    else
+    {
+      distance[i] = 0;
+    }
+  }
+}
+
+// ---------------------------------------------------------------------------
+void vtkBoundingBox::Translate(double motion[3])
+{
+  for (int i = 0; i < 3; i++)
+  {
+    this->MinPnt[i] += motion[i];
+    this->MaxPnt[i] += motion[i];
+  }
+}
+
 // ---------------------------------------------------------------------------
 void vtkBoundingBox::ClampPoint(double point[3])
 {
diff --git a/Common/DataModel/vtkBoundingBox.h b/Common/DataModel/vtkBoundingBox.h
index 77d20375023b5f280e3faf7cd49a4b89b926740e..50fe1839f7ce95b55217f5534d036ff4c8db8f84 100644
--- a/Common/DataModel/vtkBoundingBox.h
+++ b/Common/DataModel/vtkBoundingBox.h
@@ -381,6 +381,20 @@ public:
    */
   void ClampPoint(double point[3]);
 
+  /**
+   * For each axis, get the minimum distance to put the point inside the box.
+   * A value of 0 means "between min and max" (for the given coordinates).
+   * This is useful to get the minimum translation to apply to contains a point.
+   * @see Translate.
+   */
+  void GetDistance(double point[3], double distance[3]);
+
+  /**
+   * Translate box from motion.
+   * The value of motion is added to MinPoint and MaxPoint.
+   */
+  void Translate(double motion[3]);
+
 protected:
   double MinPnt[3], MaxPnt[3];
 };
diff --git a/Common/DataModel/vtkCellLinks.cxx b/Common/DataModel/vtkCellLinks.cxx
index b4c2c65c56b00f5e3765b9b76a15ab7fe3759a31..3cf667c89879e584cd080390bab094f62c22afe9 100644
--- a/Common/DataModel/vtkCellLinks.cxx
+++ b/Common/DataModel/vtkCellLinks.cxx
@@ -249,7 +249,6 @@ void vtkCellLinks::DeepCopy(vtkAbstractCellLinks* src)
   {
     return;
   }
-  this->SetSequentialProcessing(src->GetSequentialProcessing());
   this->Allocate(cellLinks->Size, cellLinks->Extend);
   vtkSMPTools::For(0, cellLinks->MaxId + 1,
     [&](vtkIdType ptId, vtkIdType endPtId)
@@ -277,7 +276,6 @@ void vtkCellLinks::ShallowCopy(vtkAbstractCellLinks* src)
   {
     return;
   }
-  this->SetSequentialProcessing(src->GetSequentialProcessing());
   this->ArraySharedPtr = cellLinks->ArraySharedPtr;
   this->Array = this->ArraySharedPtr.get();
   this->Size = cellLinks->Size;
diff --git a/Common/DataModel/vtkStaticCellLinks.cxx b/Common/DataModel/vtkStaticCellLinks.cxx
index d075e88fb6f2fea71f7728c80f1f7ca42d401d0e..c58265bf27b8b4dbba8e1a3a01bb50ab5503a66e 100644
--- a/Common/DataModel/vtkStaticCellLinks.cxx
+++ b/Common/DataModel/vtkStaticCellLinks.cxx
@@ -28,7 +28,6 @@ void vtkStaticCellLinks::BuildLinks()
   {
     return;
   }
-  this->Impl->SetSequentialProcessing(this->SequentialProcessing);
   this->Impl->BuildLinks(this->DataSet);
   this->BuildTime.Modified();
 }
@@ -41,7 +40,6 @@ void vtkStaticCellLinks::DeepCopy(vtkAbstractCellLinks* src)
   {
     return;
   }
-  this->SetSequentialProcessing(staticCellLinks->GetSequentialProcessing());
   this->Impl->DeepCopy(staticCellLinks->Impl);
   this->BuildTime.Modified();
 }
@@ -54,7 +52,6 @@ void vtkStaticCellLinks::ShallowCopy(vtkAbstractCellLinks* src)
   {
     return;
   }
-  this->SetSequentialProcessing(staticCellLinks->GetSequentialProcessing());
   this->Impl->ShallowCopy(staticCellLinks->Impl);
   this->BuildTime.Modified();
 }
diff --git a/Common/DataModel/vtkStaticCellLinksTemplate.h b/Common/DataModel/vtkStaticCellLinksTemplate.h
index 813032d5766b3c265622fe327211714237877c49..adbe026658e9f4fa45598012a9146082169ed3ae 100644
--- a/Common/DataModel/vtkStaticCellLinksTemplate.h
+++ b/Common/DataModel/vtkStaticCellLinksTemplate.h
@@ -34,7 +34,7 @@
 #define vtkStaticCellLinksTemplate_h
 
 #include "vtkABINamespace.h"
-#include "vtkDeprecation.h" // For VTK_DEPRECATED_IN_9_4_0
+#include "vtkDeprecation.h" // For VTK_DEPRECATED_IN_9_5_0
 
 #include <memory> // For shared_ptr
 #include <vector> // For vector
@@ -92,17 +92,33 @@ public:
   /**
    * Specialized methods for building links from cell array(S).
    */
+  VTK_DEPRECATED_IN_9_5_0("Use BuildLinksFromMultipleArrays instead.")
   void SerialBuildLinksFromMultipleArrays(
-    vtkIdType numPts, vtkIdType numCells, std::vector<vtkCellArray*> cellArrays);
+    vtkIdType numPts, vtkIdType numCells, std::vector<vtkCellArray*> cellArrays)
+  {
+    this->BuildLinksFromMultipleArrays(numPts, numCells, cellArrays);
+  }
+  VTK_DEPRECATED_IN_9_5_0("Use BuildLinks instead.")
   void SerialBuildLinks(vtkIdType numPts, vtkIdType numCells, vtkCellArray* cellArray)
   {
-    this->SerialBuildLinksFromMultipleArrays(numPts, numCells, { cellArray });
+    this->BuildLinksFromMultipleArrays(numPts, numCells, { cellArray });
   }
+  VTK_DEPRECATED_IN_9_5_0("Use BuildLinksFromMultipleArrays instead.")
   void ThreadedBuildLinksFromMultipleArrays(
-    vtkIdType numPts, vtkIdType numCells, std::vector<vtkCellArray*> cellArrays);
+    vtkIdType numPts, vtkIdType numCells, std::vector<vtkCellArray*> cellArrays)
+  {
+    this->BuildLinksFromMultipleArrays(numPts, numCells, cellArrays);
+  }
+  VTK_DEPRECATED_IN_9_5_0("Use BuildLinks instead.")
   void ThreadedBuildLinks(vtkIdType numPts, vtkIdType numCells, vtkCellArray* cellArray)
   {
-    this->ThreadedBuildLinksFromMultipleArrays(numPts, numCells, { cellArray });
+    this->BuildLinksFromMultipleArrays(numPts, numCells, { cellArray });
+  }
+  void BuildLinksFromMultipleArrays(
+    vtkIdType numPts, vtkIdType numCells, std::vector<vtkCellArray*> cellArrays);
+  void BuildLinks(vtkIdType numPts, vtkIdType numCells, vtkCellArray* cellArray)
+  {
+    this->BuildLinksFromMultipleArrays(numPts, numCells, { cellArray });
   }
   ///@}
 
@@ -149,7 +165,7 @@ public:
    * Support vtkAbstractCellLinks API.
    */
   unsigned long GetActualMemorySize();
-  VTK_DEPRECATED_IN_9_4_0("Use DeepCopy(vtkStaticCellLinksTemplate instead.")
+  VTK_DEPRECATED_IN_9_5_0("Use DeepCopy(vtkStaticCellLinksTemplate instead.")
   void DeepCopy(vtkAbstractCellLinks*) {}
   void DeepCopy(vtkStaticCellLinksTemplate* src);
   void ShallowCopy(vtkStaticCellLinksTemplate* src);
@@ -160,7 +176,9 @@ public:
   /**
    * Control whether to thread or serial process.
    */
+  VTK_DEPRECATED_IN_9_5_0("No longer used.")
   void SetSequentialProcessing(vtkTypeBool seq) { this->SequentialProcessing = seq; }
+  VTK_DEPRECATED_IN_9_5_0("No longer used.")
   vtkTypeBool GetSequentialProcessing() { return this->SequentialProcessing; }
   ///@}
 
@@ -179,6 +197,7 @@ protected:
 
   // Support for execution
   int Type;
+  // VTK_DEPRECATED_IN_9_5_0("No longer used.")
   vtkTypeBool SequentialProcessing;
 
 private:
diff --git a/Common/DataModel/vtkStaticCellLinksTemplate.txx b/Common/DataModel/vtkStaticCellLinksTemplate.txx
index 15dfb0768ff90fbbc051ea3a606b15c8af86a97a..f628f7d324534ec78153398c38c82439dd0ff196 100644
--- a/Common/DataModel/vtkStaticCellLinksTemplate.txx
+++ b/Common/DataModel/vtkStaticCellLinksTemplate.txx
@@ -12,10 +12,10 @@
 #include "vtkPolyData.h"
 #include "vtkSMPTools.h"
 #include "vtkUnstructuredGrid.h"
-#include <array>
-#include <atomic>
 
+#include <atomic>
 #include <type_traits>
+#include <vector>
 
 //----------------------------------------------------------------------------
 // Note: this class is a faster, threaded version of vtkCellLinks. It uses
@@ -110,56 +110,55 @@ void vtkStaticCellLinksTemplate<TIds>::BuildLinks(vtkDataSet* ds)
   this->NumCells = ds->GetNumberOfCells();
   this->NumPts = ds->GetNumberOfPoints();
 
-  vtkIdType npts, ptId;
-  vtkIdType cellId, j;
-  vtkIdList* cellPts = vtkIdList::New();
-
   // Traverse data to determine number of uses of each point. Also count the
   // number of links to allocate.
-  this->OffsetsSharedPtr.reset(new TIds[this->NumPts + 1], std::default_delete<TIds[]>());
-  this->Offsets = this->OffsetsSharedPtr.get();
-  vtkSMPTools::Fill(this->Offsets, this->Offsets + this->NumPts + 1, 0);
+  std::vector<TIds> counts(static_cast<size_t>(this->NumPts));
 
-  for (this->LinksSize = 0, cellId = 0; cellId < this->NumCells; cellId++)
+  vtkNew<vtkIdList> cellPts;
+  this->LinksSize = 0;
+  for (vtkIdType cellId = 0; cellId < this->NumCells; cellId++)
   {
     ds->GetCellPoints(cellId, cellPts);
-    npts = cellPts->GetNumberOfIds();
-    for (j = 0; j < npts; j++)
+    vtkIdType npts = cellPts->GetNumberOfIds();
+    for (vtkIdType j = 0; j < npts; j++)
     {
-      this->Offsets[cellPts->GetId(j)]++;
+      counts[cellPts->GetId(j)]++;
       this->LinksSize++;
     }
   }
 
-  // Allocate space for links. Perform prefix sum.
+  // Perform prefix sum to determine offsets
+  this->OffsetsSharedPtr.reset(new TIds[this->NumPts + 1], std::default_delete<TIds[]>());
+  this->Offsets = this->OffsetsSharedPtr.get();
+  this->Offsets[0] = 0;
+  for (vtkIdType ptId = 1; ptId < this->NumPts; ++ptId)
+  {
+    const TIds& nCells = counts[ptId - 1];
+    this->Offsets[ptId] = this->Offsets[ptId - 1] + nCells;
+  }
+  this->Offsets[this->NumPts] = this->LinksSize;
+
+  // Allocate links array, Extra one allocated to simplify later pointer manipulation
   this->LinkSharedPtr.reset(new TIds[this->LinksSize + 1], std::default_delete<TIds[]>());
   this->Links = this->LinkSharedPtr.get();
   this->Links[this->LinksSize] = this->NumPts;
 
-  for (ptId = 0; ptId < this->NumPts; ++ptId)
-  {
-    npts = this->Offsets[ptId + 1];
-    this->Offsets[ptId + 1] = this->Offsets[ptId] + npts;
-  }
-
   // Now build the links. The summation from the prefix sum indicates where
   // the cells are to be inserted. Each time a cell is inserted, the offset
   // is decremented. In the end, the offset array is also constructed as it
   // points to the beginning of each cell run.
-  for (cellId = 0; cellId < this->NumCells; ++cellId)
+  for (vtkIdType cellId = 0; cellId < this->NumCells; ++cellId)
   {
     ds->GetCellPoints(cellId, cellPts);
-    npts = cellPts->GetNumberOfIds();
-    for (j = 0; j < npts; ++j)
+    vtkIdType npts = cellPts->GetNumberOfIds();
+    for (vtkIdType j = 0; j < npts; ++j)
     {
-      ptId = cellPts->GetId(j);
-      this->Offsets[ptId]--;
-      this->Links[this->Offsets[ptId]] = cellId;
+      vtkIdType ptId = cellPts->GetId(j);
+      const TIds offset = this->Offsets[ptId + 1] - counts[ptId]--;
+      this->Links[offset] = cellId;
     }
   }
   this->Offsets[this->NumPts] = this->LinksSize;
-
-  cellPts->Delete();
 }
 VTK_ABI_NAMESPACE_END
 
@@ -168,26 +167,10 @@ namespace vtkSCLT_detail
 VTK_ABI_NAMESPACE_BEGIN
 
 struct CountPoints
-{
-  template <typename CellStateT, typename TIds>
-  void operator()(CellStateT& state, TIds* linkOffsets)
-  {
-    using ValueType = typename CellStateT::ValueType;
-    const auto cellConnectivity = vtk::DataArrayValueRange<1>(state.GetConnectivity());
-
-    // Count number of point uses
-    for (const ValueType ptId : cellConnectivity)
-    {
-      ++linkOffsets[ptId];
-    }
-  }
-};
-
-struct CountPointsThreaded
 {
   template <typename CellStateT, typename TIds>
   void operator()(
-    CellStateT& state, std::atomic<TIds>* linkOffsets, vtkIdType beginCellId, vtkIdType endCellId)
+    CellStateT& state, std::atomic<TIds>* counts, vtkIdType beginCellId, vtkIdType endCellId)
   {
     using ValueType = typename CellStateT::ValueType;
     const vtkIdType connBeginId = state.GetBeginOffset(beginCellId);
@@ -198,43 +181,12 @@ struct CountPointsThreaded
     for (const ValueType ptId : connRange)
     {
       // memory_order_relaxed is safe here, since we're not using the atomics for synchronization.
-      linkOffsets[ptId].fetch_add(1, std::memory_order_relaxed);
+      counts[ptId].fetch_add(1, std::memory_order_relaxed);
     }
   }
 };
 
-// Serial version:
 struct BuildLinks
-{
-  template <typename CellStateT, typename TIds>
-  void operator()(CellStateT& state, TIds* linkOffsets, TIds* links, vtkIdType idOffset = 0)
-  {
-    using ValueType = typename CellStateT::ValueType;
-
-    const vtkIdType numCells = state.GetNumberOfCells();
-
-    const auto cellConnectivity = vtk::DataArrayValueRange<1>(state.GetConnectivity());
-    const auto cellOffsets = vtk::DataArrayValueRange<1>(state.GetOffsets());
-    // Now build the links. The summation from the prefix sum indicates where
-    // the cells are to be inserted. Each time a cell is inserted, the offset
-    // is decremented. In the end, the offset array is also constructed as it
-    // points to the beginning of each cell run.
-    ValueType ptIdOffset;
-    size_t ptId;
-    for (vtkIdType cellId = 0; cellId < numCells; ++cellId)
-    {
-      for (ptIdOffset = cellOffsets[cellId]; ptIdOffset < cellOffsets[cellId + 1]; ++ptIdOffset)
-      {
-        ptId = static_cast<size_t>(cellConnectivity[ptIdOffset]);
-        --linkOffsets[ptId];
-        links[linkOffsets[ptId]] = static_cast<TIds>(idOffset + cellId);
-      }
-    }
-  }
-};
-
-// Parallel version:
-struct BuildLinksThreaded
 {
   template <typename CellStateT, typename TIds>
   void operator()(CellStateT& state, const TIds* offsets, std::atomic<TIds>* counts, TIds* links,
@@ -257,7 +209,7 @@ struct BuildLinksThreaded
       {
         ptId = static_cast<size_t>(cellConnectivity[ptIdOffset]);
         // memory_order_relaxed is safe here, since we're not using the atomics for synchronization.
-        offset = offsets[ptId] + counts[ptId].fetch_sub(1, std::memory_order_relaxed) - 1;
+        offset = offsets[ptId + 1] - counts[ptId].fetch_sub(1, std::memory_order_relaxed);
         links[offset] = idOffset + cellId;
       }
     }
@@ -267,64 +219,6 @@ struct BuildLinksThreaded
 VTK_ABI_NAMESPACE_END
 } // end namespace vtkSCLT_detail
 
-VTK_ABI_NAMESPACE_BEGIN
-//----------------------------------------------------------------------------
-// Build the link list array for unstructured grids. Note this is a serial
-// implementation: while there is another method (threaded) that is usually
-// much faster, in certain pathological situations the serial version can be
-// faster.
-template <typename TIds>
-void vtkStaticCellLinksTemplate<TIds>::SerialBuildLinksFromMultipleArrays(
-  vtkIdType numPts, vtkIdType numCells, const std::vector<vtkCellArray*> cellArrays)
-{
-  // Basic information about the grid
-  this->NumPts = numPts;
-  this->NumCells = numCells;
-
-  // compute links size
-  this->LinksSize = 0;
-  for (const vtkCellArray* cellArray : cellArrays)
-  {
-    this->LinksSize += cellArray->GetNumberOfConnectivityIds();
-  }
-  // compute offsets of number of cells
-  std::vector<vtkIdType> offsets(cellArrays.size(), 0);
-  for (size_t i = 1; i < cellArrays.size(); ++i)
-  {
-    offsets[i] = cellArrays[i - 1]->GetNumberOfCells() + offsets[i - 1];
-  }
-
-  // Extra one allocated to simplify later pointer manipulation
-  this->LinkSharedPtr.reset(new TIds[this->LinksSize + 1], std::default_delete<TIds[]>());
-  this->Links = this->LinkSharedPtr.get();
-  this->Links[this->LinksSize] = this->NumPts;
-  this->OffsetsSharedPtr.reset(new TIds[this->NumPts + 1], std::default_delete<TIds[]>());
-  this->Offsets = this->OffsetsSharedPtr.get();
-  vtkSMPTools::Fill(this->Offsets, this->Offsets + this->NumPts + 1, 0);
-
-  // Count how many cells each point appears in:
-  for (size_t i = 0; i < cellArrays.size(); ++i)
-  {
-    cellArrays[i]->Visit(vtkSCLT_detail::CountPoints{}, this->Offsets);
-  }
-
-  // Perform prefix sum (inclusive scan)
-  for (vtkIdType ptId = 0; ptId < this->NumPts; ++ptId)
-  {
-    const vtkIdType npts = this->Offsets[ptId + 1];
-    this->Offsets[ptId + 1] = this->Offsets[ptId] + npts;
-  }
-
-  // Construct the links table and finalize the offsets:
-  for (size_t i = 0; i < cellArrays.size(); ++i)
-  {
-    cellArrays[i]->Visit(vtkSCLT_detail::BuildLinks{}, this->Offsets, this->Links, offsets[i]);
-  }
-
-  this->Offsets[numPts] = this->LinksSize;
-}
-VTK_ABI_NAMESPACE_END
-
 //----------------------------------------------------------------------------
 // Threaded implementation of BuildLinks() using vtkSMPTools and std::atomic.
 
@@ -345,7 +239,7 @@ struct CountUses
 
   void operator()(vtkIdType cellId, vtkIdType endCellId)
   {
-    this->CellArray->Visit(vtkSCLT_detail::CountPointsThreaded{}, this->Counts, cellId, endCellId);
+    this->CellArray->Visit(vtkSCLT_detail::CountPoints{}, this->Counts, cellId, endCellId);
   }
 };
 
@@ -370,8 +264,36 @@ struct InsertLinks
 
   void operator()(vtkIdType cellId, vtkIdType endCellId)
   {
-    this->CellArray->Visit(vtkSCLT_detail::BuildLinksThreaded{}, this->Offsets, this->Counts,
-      this->Links, cellId, endCellId, this->IdOffset);
+    this->CellArray->Visit(vtkSCLT_detail::BuildLinks{}, this->Offsets, this->Counts, this->Links,
+      cellId, endCellId, this->IdOffset);
+  }
+};
+
+template <typename TIds>
+struct SortLinks
+{
+  const TIds* Offsets;
+  TIds* Links;
+
+  SortLinks(const TIds* offsets, TIds* links)
+    : Offsets(offsets)
+    , Links(links)
+  {
+  }
+
+  void operator()(vtkIdType beginPointId, vtkIdType endPointId)
+  {
+    for (vtkIdType pointId = beginPointId; pointId < endPointId; ++pointId)
+    {
+      // check if the links are sorted, because that's the most common case
+      const bool isSorted = std::is_sorted(
+        this->Links + this->Offsets[pointId], this->Links + this->Offsets[pointId + 1]);
+      // if the links are not sorted, we need to sort them
+      if (!isSorted)
+      {
+        std::sort(this->Links + this->Offsets[pointId], this->Links + this->Offsets[pointId + 1]);
+      }
+    }
   }
 };
 
@@ -382,7 +304,7 @@ VTK_ABI_NAMESPACE_BEGIN
 // Build the link list array for unstructured grids. Note this is a threaded
 // implementation: it uses SMPTools and atomics to prevent race situations.
 template <typename TIds>
-void vtkStaticCellLinksTemplate<TIds>::ThreadedBuildLinksFromMultipleArrays(
+void vtkStaticCellLinksTemplate<TIds>::BuildLinksFromMultipleArrays(
   vtkIdType numPts, vtkIdType numCells, const std::vector<vtkCellArray*> cellArrays)
 {
   // Basic information about the grid
@@ -402,11 +324,6 @@ void vtkStaticCellLinksTemplate<TIds>::ThreadedBuildLinksFromMultipleArrays(
     offsets[i] = cellArrays[i - 1]->GetNumberOfCells() + offsets[i - 1];
   }
 
-  // Extra one allocated to simplify later pointer manipulation
-  this->LinkSharedPtr.reset(new TIds[this->LinksSize + 1], std::default_delete<TIds[]>());
-  this->Links = this->LinkSharedPtr.get();
-  this->Links[this->LinksSize] = this->NumPts;
-
   // Create an array of atomics with initial count=0. This will keep
   // track of point uses. Count them in parallel.
   std::atomic<TIds>* counts = new std::atomic<TIds>[numPts]();
@@ -417,17 +334,21 @@ void vtkStaticCellLinksTemplate<TIds>::ThreadedBuildLinksFromMultipleArrays(
   }
 
   // Perform prefix sum to determine offsets
-  vtkIdType ptId, npts;
   this->OffsetsSharedPtr.reset(new TIds[numPts + 1], std::default_delete<TIds[]>());
   this->Offsets = this->OffsetsSharedPtr.get();
   this->Offsets[0] = 0;
-  for (ptId = 1; ptId < numPts; ++ptId)
+  for (vtkIdType ptId = 1; ptId < numPts; ++ptId)
   {
-    npts = counts[ptId - 1].load(std::memory_order_relaxed);
-    this->Offsets[ptId] = this->Offsets[ptId - 1] + npts;
+    TIds nCells = counts[ptId - 1].load(std::memory_order_relaxed);
+    this->Offsets[ptId] = this->Offsets[ptId - 1] + nCells;
   }
   this->Offsets[numPts] = this->LinksSize;
 
+  // Allocate links array, Extra one allocated to simplify later pointer manipulation
+  this->LinkSharedPtr.reset(new TIds[this->LinksSize + 1], std::default_delete<TIds[]>());
+  this->Links = this->LinkSharedPtr.get();
+  this->Links[this->LinksSize] = this->NumPts;
+
   // Now insert cell ids into cell links.
   for (size_t i = 0; i < cellArrays.size(); ++i)
   {
@@ -437,52 +358,28 @@ void vtkStaticCellLinksTemplate<TIds>::ThreadedBuildLinksFromMultipleArrays(
 
   // Clean up
   delete[] counts;
+
+  // Sort the cell links of each point (if needed) to ensure deterministic order
+  SortLinks<TIds> sortLinks(this->Offsets, this->Links);
+  vtkSMPTools::For(0, numPts, sortLinks);
 }
 
 //----------------------------------------------------------------------------
-// Build the link list array for unstructured grids
+// Build the link list array for unstructured grids.
 template <typename TIds>
 void vtkStaticCellLinksTemplate<TIds>::BuildLinks(vtkUnstructuredGrid* ugrid)
 {
-  // Basic information about the grid
-  vtkIdType numPts = ugrid->GetNumberOfPoints();
-  vtkIdType numCells = ugrid->GetNumberOfCells();
-
-  // We're going to get into the guts of the class
-  vtkCellArray* cellArray = ugrid->GetCells();
-
-  // Use serial or threaded implementations
-  if (!this->SequentialProcessing)
-  {
-    this->ThreadedBuildLinks(numPts, numCells, cellArray);
-  }
-  else
-  {
-    this->SerialBuildLinks(numPts, numCells, cellArray);
-  }
+  // Build links
+  this->BuildLinks(ugrid->GetNumberOfPoints(), ugrid->GetNumberOfCells(), ugrid->GetCells());
 }
 
 //----------------------------------------------------------------------------
-// Build the link list array for unstructured grids
+// Build the link list array for explicit structured grids.
 template <typename TIds>
 void vtkStaticCellLinksTemplate<TIds>::BuildLinks(vtkExplicitStructuredGrid* esgrid)
 {
-  // Basic information about the grid
-  vtkIdType numPts = esgrid->GetNumberOfPoints();
-  vtkIdType numCells = esgrid->GetNumberOfCells();
-
-  // We're going to get into the guts of the class
-  vtkCellArray* cellArray = esgrid->GetCells();
-
-  // Use serial or threaded implementations
-  if (!this->SequentialProcessing)
-  {
-    this->ThreadedBuildLinks(numPts, numCells, cellArray);
-  }
-  else
-  {
-    this->SerialBuildLinks(numPts, numCells, cellArray);
-  }
+  // Build links
+  this->BuildLinks(esgrid->GetNumberOfPoints(), esgrid->GetNumberOfCells(), esgrid->GetCells());
 }
 
 //----------------------------------------------------------------------------
@@ -491,22 +388,13 @@ void vtkStaticCellLinksTemplate<TIds>::BuildLinks(vtkExplicitStructuredGrid* esg
 template <typename TIds>
 void vtkStaticCellLinksTemplate<TIds>::BuildLinks(vtkPolyData* pd)
 {
-  // Basic information about the grid
-  vtkIdType numPts = pd->GetNumberOfPoints();
-  vtkIdType numCells = pd->GetNumberOfCells();
-
+  // Get cell arrays
   std::vector<vtkCellArray*> cellArrays = { pd->GetVerts(), pd->GetLines(), pd->GetPolys(),
     pd->GetStrips() };
   // Remove any null cell arrays
   cellArrays.erase(std::remove(cellArrays.begin(), cellArrays.end(), nullptr), cellArrays.end());
-  if (!this->SequentialProcessing)
-  {
-    this->ThreadedBuildLinksFromMultipleArrays(numPts, numCells, cellArrays);
-  }
-  else
-  {
-    this->SerialBuildLinksFromMultipleArrays(numPts, numCells, cellArrays);
-  }
+  // Build links
+  this->BuildLinksFromMultipleArrays(pd->GetNumberOfPoints(), pd->GetNumberOfCells(), cellArrays);
 }
 
 //----------------------------------------------------------------------------
diff --git a/Domains/ChemistryOpenGL2/Testing/Cxx/TestPDBBallAndStickTranslucent.cxx b/Domains/ChemistryOpenGL2/Testing/Cxx/TestPDBBallAndStickTranslucent.cxx
index 9f00c49b0b32955e4d92a7ea5e1151f53189f61f..aec7c53967e2cdece3319667ad94380cf0420ff1 100644
--- a/Domains/ChemistryOpenGL2/Testing/Cxx/TestPDBBallAndStickTranslucent.cxx
+++ b/Domains/ChemistryOpenGL2/Testing/Cxx/TestPDBBallAndStickTranslucent.cxx
@@ -42,7 +42,7 @@ int TestPDBBallAndStickTranslucent(int argc, char* argv[])
 
   vtkNew<vtkActor> actor;
   actor->SetMapper(molmapper);
-  actor->GetProperty()->SetOpacity(0.1);
+  actor->GetProperty()->SetOpacity(0.4);
 
   vtkNew<vtkRenderer> ren;
   vtkNew<vtkRenderWindow> win;
diff --git a/Filters/Core/vtkConstrainedSmoothingFilter.cxx b/Filters/Core/vtkConstrainedSmoothingFilter.cxx
index ba7afd4938d84dc74f6853b431a69d551213c13f..716ceb2e188c486449fae9801bf773bb1ce507a4 100644
--- a/Filters/Core/vtkConstrainedSmoothingFilter.cxx
+++ b/Filters/Core/vtkConstrainedSmoothingFilter.cxx
@@ -103,7 +103,7 @@ vtkSmartPointer<vtkCellArray> BuildStencils(vtkPointSet* input)
   // links from the points to the (line) cells using the output of
   // vtkExtractEdges.
   vtkStaticCellLinksTemplate<vtkIdType> links;
-  links.ThreadedBuildLinks(numPts, numLines, lines);
+  links.BuildLinks(numPts, numLines, lines);
   vtkIdType linksSize = links.GetLinksSize();
 
   // Building the links does most of the work. Now we transform the links
diff --git a/Filters/Core/vtkPolyDataPlaneClipper.cxx b/Filters/Core/vtkPolyDataPlaneClipper.cxx
index 6944dda2928bbc001896d96bc20ef25d68f6aedc..d37728cded5d91353f9155a56ba6883458231a37 100644
--- a/Filters/Core/vtkPolyDataPlaneClipper.cxx
+++ b/Filters/Core/vtkPolyDataPlaneClipper.cxx
@@ -709,7 +709,7 @@ void GenerateCap(vtkCellArray* lines, vtkPolyData* pd)
 
   // Prepare for processing
   vtkStaticCellLinksTemplate<vtkIdType> links;
-  links.ThreadedBuildLinks(numPts, numLines, lines);
+  links.BuildLinks(numPts, numLines, lines);
   vtkNew<vtkCellArray> polys;
   vtkNew<vtkPolygon> polygon;
   vtkIdType* lineConn =
diff --git a/Filters/General/Testing/Cxx/CMakeLists.txt b/Filters/General/Testing/Cxx/CMakeLists.txt
index cf3d1505cb63d74e06bb7fff6eb511c68809645b..cd84cfc095b567cc8eb70393ee5c04c8ef333640 100644
--- a/Filters/General/Testing/Cxx/CMakeLists.txt
+++ b/Filters/General/Testing/Cxx/CMakeLists.txt
@@ -28,7 +28,7 @@ vtk_add_test_cxx(vtkFiltersGeneralCxxTests tests
   TestDeflectNormals.cxx
   TestDeformPointSet.cxx
   TestDensifyPolyData.cxx
-  TestDistancePolyDataFilter.cxx
+  TestDistancePolyDataFilter.cxx,LOOSE_VALID
   TestDistancePolyDataFilter2.cxx
   TestExplodeDataSet.cxx,NO_VALID
   TestExtractGhostCells.cxx,NO_VALID
@@ -78,7 +78,7 @@ vtk_add_test_cxx(vtkFiltersGeneralCxxTests data_tests
   TestDataSetGradientPrecompute.cxx
   TestDateToNumeric.cxx
   TestGradientAndVorticity.cxx,NO_VALID
-  TestIconGlyphFilterGravity.cxx
+  TestIconGlyphFilterGravity.cxx,LOOSE_VALID
   TestQuadraturePoints.cxx
   TestYoungsMaterialInterface.cxx
   )
diff --git a/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter.png.sha512 b/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter.png.sha512
index 1c842ef33df381c6571a226dd0e77ae52bb3d878..498c463fbf12d89ba15f4f173448f7d19fa4cd2a 100644
--- a/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter.png.sha512
+++ b/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter.png.sha512
@@ -1 +1 @@
-35051d47e8c9b7d384924cb2b5f68a20ac5701e1513274ad78ae64130c98b1a0444b2d85ab296c5fbe39a674d5aa56be2de6b7e2738eae30153ceb6bda034a6e
+4b95525a511d11b9f677d33ed10bc3a7ce1c1e82ab1359147d67e33491edb42f307b45d653ae171a27675250e35707fd7ac2086f25d9d87b80403e5ae3797a19
diff --git a/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter3.png.sha512 b/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter3.png.sha512
index 408ff848a4ac475bdfe2a8ceef9f442d0391b2d8..51363a67ac08b4b8d4450833cdb10459fe7c9f87 100644
--- a/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter3.png.sha512
+++ b/Filters/General/Testing/Data/Baseline/TestIntersectionPolyDataFilter3.png.sha512
@@ -1 +1 @@
-312cd928a67dba024afd4184177b25d48f37604b7f261b44511d9a423e79a9430bc99e9aa7dbcfbd16b9b0c6bbe682dfa2e71583dc26d55b1c82d1d61e013cf1
+a1ebc7e518451b4b6f7975d519f3adcf333b2b7c1af73f02e6eb2578a045de6f3724a0abd65018fabf9019076d803ce31cea8fd13e3c06b5c0c73dd183ee8ac6
diff --git a/Filters/General/vtkContourTriangulator.cxx b/Filters/General/vtkContourTriangulator.cxx
index 0a4517ff8240e560fd13e62cddd6363930cd23e4..eae412e5276f8665379c3f505756e43e9b934bf3 100644
--- a/Filters/General/vtkContourTriangulator.cxx
+++ b/Filters/General/vtkContourTriangulator.cxx
@@ -470,7 +470,7 @@ int vtkCCSTriangulate(const vtkCCSPoly& poly, vtkPoints* points, const vtkCCSPol
             }
           }
 
-          foundEar &= foundNegative;
+          foundEar = foundEar && foundNegative;
         }
 
         if (!foundEar)
@@ -502,14 +502,14 @@ int vtkCCSTriangulate(const vtkCCSPoly& poly, vtkPoints* points, const vtkCCSPol
           size_t kk = (k != 0 ? k - 1 : n - 1);
           points->GetPoint(poly[verts[kk].first], point);
           double kq = vtkCCSTriangleQuality(point, ppoint, npoint, normal);
-          concave -= ((verts[k].second < 0) & (kq >= 0));
+          concave -= ((verts[k].second < 0) && (kq >= 0));
           verts[k].second = kq;
 
           // re-compute quality of next point
           size_t jj = (j + 1 != n ? j + 1 : 0);
           points->GetPoint(poly[verts[jj].first], point);
           double jq = vtkCCSTriangleQuality(ppoint, npoint, point, normal);
-          concave -= ((verts[j].second < 0) & (jq >= 0));
+          concave -= ((verts[j].second < 0) && (jq >= 0));
           verts[j].second = jq;
         }
       }
@@ -913,16 +913,16 @@ int vtkCCSSplitAtPinchPoints(std::vector<vtkCCSPoly>& polys, vtkPoints* points,
             // Make sure that splitting this poly won't create a hole poly
             double p1[3], p2[3], p3[3];
             size_t prevIdx = n + idx1 - 1;
-            size_t midIdx = idx1 + 1;
-            size_t nextIdx = idx2 + 1;
             if (prevIdx >= n)
             {
               prevIdx -= n;
             }
+            size_t midIdx = idx1 + 1;
             if (midIdx >= n)
             {
               midIdx -= n;
             }
+            size_t nextIdx = idx2 + 1;
             if (nextIdx >= n)
             {
               nextIdx -= n;
@@ -1237,9 +1237,9 @@ void vtkCCSFindTrueEdges(std::vector<vtkCCSPoly>& polys, vtkPoints* points,
         cellCount = 1;
 
         // Rotate to the next point
-        p0[0] = p2[0];
-        p0[1] = p2[1];
-        p0[2] = p2[2];
+        p0[0] = p1[0];
+        p0[1] = p1[1];
+        p0[2] = p1[2];
         p1[0] = p2[0];
         p1[1] = p2[1];
         p1[2] = p2[2];
@@ -1853,11 +1853,11 @@ int vtkCCSCheckCut(const std::vector<vtkCCSPoly>& polys, vtkPoints* points, cons
     const vtkCCSPoly& poly = polys[polyId];
     size_t n = poly.size();
     size_t prevIdx = n - polyIdx - 1;
-    size_t nextIdx = polyIdx + 1;
     if (prevIdx >= n)
     {
       prevIdx -= n;
     }
+    size_t nextIdx = polyIdx + 1;
     if (nextIdx >= n)
     {
       nextIdx -= n;
diff --git a/Filters/General/vtkRemovePolyData.cxx b/Filters/General/vtkRemovePolyData.cxx
index d6add68e1549be34a8aaf3c6ef26f48841549296..297da5a2653cd0d276d477f7b9dedef79c342608 100644
--- a/Filters/General/vtkRemovePolyData.cxx
+++ b/Filters/General/vtkRemovePolyData.cxx
@@ -274,7 +274,7 @@ struct MarkDeletedCells
     if (numInVerts > 0)
     {
       vtkStaticCellLinksTemplate<TIds> links;
-      links.ThreadedBuildLinks(numPts, numInVerts, inVerts);
+      links.BuildLinks(numPts, numInVerts, inVerts);
       MarkPointIds<TIds>::Execute(ptIds, &links, cellMap, filter);
       for (auto i = 1; i < numInputs; ++i)
       {
@@ -290,7 +290,7 @@ struct MarkDeletedCells
     if (numInLines > 0)
     {
       vtkStaticCellLinksTemplate<TIds> links;
-      links.ThreadedBuildLinks(numPts, numInLines, inLines);
+      links.BuildLinks(numPts, numInLines, inLines);
       MarkPointIds<TIds>::Execute(ptIds, &links, cellMap, filter);
       for (auto i = 1; i < numInputs; ++i)
       {
@@ -306,7 +306,7 @@ struct MarkDeletedCells
     if (numInPolys > 0)
     {
       vtkStaticCellLinksTemplate<TIds> links;
-      links.ThreadedBuildLinks(numPts, numInPolys, inPolys);
+      links.BuildLinks(numPts, numInPolys, inPolys);
       MarkPointIds<TIds>::Execute(ptIds, &links, cellMap, filter);
       for (auto i = 1; i < numInputs; ++i)
       {
@@ -322,7 +322,7 @@ struct MarkDeletedCells
     if (numInStrips > 0)
     {
       vtkStaticCellLinksTemplate<TIds> links;
-      links.ThreadedBuildLinks(numPts, numInStrips, inStrips);
+      links.BuildLinks(numPts, numInStrips, inStrips);
       MarkPointIds<TIds>::Execute(ptIds, &links, cellMap, filter);
       for (auto i = 1; i < numInputs; ++i)
       {
diff --git a/Filters/Geometry/vtkAttributeSmoothingFilter.cxx b/Filters/Geometry/vtkAttributeSmoothingFilter.cxx
index b58fe045f0265f6e1aee06dbe81e8f6c48fe623b..f4400fea1a608c7b85b473a8e3714cbf07167531 100644
--- a/Filters/Geometry/vtkAttributeSmoothingFilter.cxx
+++ b/Filters/Geometry/vtkAttributeSmoothingFilter.cxx
@@ -205,7 +205,7 @@ vtkSmartPointer<vtkCellArray> BuildStencils(vtkPolyData* edges, const unsigned c
   // links from the points to the (line) cells using the output of
   // vtkExtractEdges.
   vtkStaticCellLinksTemplate<vtkIdType> links;
-  links.ThreadedBuildLinks(numPts, numLines, lines);
+  links.BuildLinks(numPts, numLines, lines);
   vtkIdType linksSize = links.GetLinksSize();
 
   // Building the links does most of the work. Now we transform the links
diff --git a/Filters/Geometry/vtkGeometryFilter.cxx b/Filters/Geometry/vtkGeometryFilter.cxx
index aab882735a1d9dbaeaaf8804a0e3ab2d33989b68..678369e1cf6ee6fa8b3921caafb591b4e8d1f20c 100644
--- a/Filters/Geometry/vtkGeometryFilter.cxx
+++ b/Filters/Geometry/vtkGeometryFilter.cxx
@@ -2599,7 +2599,7 @@ int vtkGeometryFilter::PolyDataExecute(
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
+        exc.Links->BuildLinks(
           dataSetInput->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
@@ -2617,7 +2617,7 @@ int vtkGeometryFilter::PolyDataExecute(
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
+        exc.Links->BuildLinks(
           dataSetInput->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
@@ -3166,7 +3166,7 @@ int vtkGeometryFilter::UnstructuredGridExecute(vtkDataSet* dataSetInput, vtkPoly
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
+        exc.Links->BuildLinks(
           dataSetInput->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
@@ -3195,7 +3195,7 @@ int vtkGeometryFilter::UnstructuredGridExecute(vtkDataSet* dataSetInput, vtkPoly
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
+        exc.Links->BuildLinks(
           dataSetInput->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
@@ -3430,8 +3430,7 @@ int vtkGeometryFilter::StructuredExecute(vtkDataSet* input, vtkPolyData* output,
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
-          input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
+        exc.Links->BuildLinks(input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
     return ExecuteStructured<TInputIdType>(this, input, output, wholeExtent, &exc, extractFace);
@@ -3448,8 +3447,7 @@ int vtkGeometryFilter::StructuredExecute(vtkDataSet* input, vtkPolyData* output,
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
-          input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
+        exc.Links->BuildLinks(input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
     return ExecuteStructured<TInputIdType>(this, input, output, wholeExtent, &exc, extractFace);
@@ -3685,8 +3683,7 @@ int vtkGeometryFilter::DataSetExecute(
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
-          input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
+        exc.Links->BuildLinks(input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
     return ExecuteDataSet<TInputIdType>(this, input, output, &exc);
@@ -3702,8 +3699,7 @@ int vtkGeometryFilter::DataSetExecute(
       if (excPolys->GetNumberOfCells() > 0)
       {
         exc.Links = new vtkStaticCellLinksTemplate<TInputIdType>;
-        exc.Links->ThreadedBuildLinks(
-          input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
+        exc.Links->BuildLinks(input->GetNumberOfPoints(), excPolys->GetNumberOfCells(), excPolys);
       }
     }
     return ExecuteDataSet<TInputIdType>(this, input, output, &exc);
diff --git a/Filters/Geometry/vtkMarkBoundaryFilter.cxx b/Filters/Geometry/vtkMarkBoundaryFilter.cxx
index 6aa82c65db445ef3e1371c6cc7fb93cfb5c8bf5c..311b9193eb3a51f36708f2381dac6e18a55505e8 100644
--- a/Filters/Geometry/vtkMarkBoundaryFilter.cxx
+++ b/Filters/Geometry/vtkMarkBoundaryFilter.cxx
@@ -294,7 +294,7 @@ int PolyDataExecute(vtkDataSet* dsInput, const unsigned char* ghosts, unsigned c
     MarkCellBoundary marker(ghosts, bPoints, bCells, bFaces, self);
     auto iter = vtk::TakeSmartPointer(lines->NewIterator());
     vtkStaticCellLinksTemplate<vtkIdType> links;
-    links.ThreadedBuildLinks(numPts, numLines, lines);
+    links.BuildLinks(numPts, numLines, lines);
     for (cellId = 0; cellId < numLines; ++cellId)
     {
       iter->GetCellAtId(cellId, npts, pts);
@@ -316,7 +316,7 @@ int PolyDataExecute(vtkDataSet* dsInput, const unsigned char* ghosts, unsigned c
   if (numPolys > 0)
   {
     vtkStaticCellLinksTemplate<vtkIdType> links;
-    links.ThreadedBuildLinks(numPts, numPolys, polys);
+    links.BuildLinks(numPts, numPolys, polys);
     MarkPolys mark(
       input, ghosts, (numVerts + numLines), polys, &links, bPoints, bCells, bFaces, self);
     vtkSMPTools::For(0, numPolys, mark);
diff --git a/Filters/Sources/Testing/Data/Baseline/TestEllipseArcSource.png.sha512 b/Filters/Sources/Testing/Data/Baseline/TestEllipseArcSource.png.sha512
index b553947d6f72849d72362eafe5548e31863d5993..99cdbc8b9a6edaa45a8cbc9bb549b0f753c9a646 100644
--- a/Filters/Sources/Testing/Data/Baseline/TestEllipseArcSource.png.sha512
+++ b/Filters/Sources/Testing/Data/Baseline/TestEllipseArcSource.png.sha512
@@ -1 +1 @@
-1f5eaabb8f9b3e42b3e40dcc3a3b1a220c0f11eb05e59777f755e79c380ee51f603180c9d0bc0a3836efa1a6fa57616eb7d619c6a24621af6f865b0c3ab50eee
+a42e8be56c1c71df0c5e0e644993b324b665955323349cf5d44e0c2d313d47ed01ee78d149680e2d46b5fd367b356b5795682b003f55ae71a789f35441f20f9a
diff --git a/GUISupport/Qt/Testing/Cxx/TestQtWithDisabledInteractor.cxx b/GUISupport/Qt/Testing/Cxx/TestQtWithDisabledInteractor.cxx
index db0c7f1775ed27c816848f8519e3bde22b8ed7d3..2953211a7f90c9e381e713cc45b082c93c9c47b7 100644
--- a/GUISupport/Qt/Testing/Cxx/TestQtWithDisabledInteractor.cxx
+++ b/GUISupport/Qt/Testing/Cxx/TestQtWithDisabledInteractor.cxx
@@ -6,10 +6,10 @@
 #include "vtkActor.h"
 #include "vtkGenericOpenGLRenderWindow.h"
 #include "vtkPolyDataMapper.h"
+#include "vtkRegressionTestImage.h"
 #include "vtkRenderer.h"
 #include "vtkSmartPointer.h"
 #include "vtkSphereSource.h"
-#include "vtkTesting.h"
 
 #include <QImage>
 
@@ -76,7 +76,7 @@ int TestQtWithDisabledInteractor(int argc, char* argv[])
     return EXIT_FAILURE;
   }
 
-  int retVal = vtktesting->RegressionTest(fileName, 0.05);
+  int retVal = vtktesting->RegressionTest(fileName, vtkRegressionTester::ErrorThreshold);
   switch (retVal)
   {
     case vtkTesting::DO_INTERACTOR:
diff --git a/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader.png.sha512 b/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader.png.sha512
index a087c7eb9d0dcdd19b5a377f4f57ce91e70aef38..2e48f35976b838fdb1e453290012ac5f3cc911ae 100644
--- a/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader.png.sha512
+++ b/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader.png.sha512
@@ -1 +1 @@
-219690c832d7a673be47450a45502237c4035e99890f7bdf5bff4cb1424ed1dde91b93f2e5abe8a79899e2864e8a387b3fbbb9d08fe74b0b4a2c7771ebff7d8f
+95bbffc401661a1fe69d85317ef0a8aedf1ce7c703f4477425ab60e3bf70babed1333abc682d9797a266e4a7abca1de0c5e8cc3befd6653b94a3dd17cf85df94
diff --git a/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader_1.png.sha512 b/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader_1.png.sha512
deleted file mode 100644
index 3c57a3c556c9df7547cbac65499c140c09980483..0000000000000000000000000000000000000000
--- a/IO/Chemistry/Testing/Data/Baseline/TestVASPTessellationReader_1.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-78b33ba32ec0be9954d4abd3e231e84cae142e885d45a6143bc66762162e97cee0a5111a8ff31737134dcd5c5ebac2500f3bcd09f01a459c2bc80192ec006d28
diff --git a/IO/Image/vtkHDRReader.cxx b/IO/Image/vtkHDRReader.cxx
index 4dfae391e702d62c0bdb135617c462e3bb16a28d..f546791d231e0314af6f1f1fb55a13b161e6ae90 100644
--- a/IO/Image/vtkHDRReader.cxx
+++ b/IO/Image/vtkHDRReader.cxx
@@ -6,6 +6,7 @@
 #include "vtkImageFlip.h"
 #include "vtkImagePermute.h"
 #include "vtkLookupTable.h"
+#include "vtkMathUtilities.h"
 #include "vtkNew.h"
 #include "vtkObjectFactory.h"
 #include "vtkPointData.h"
@@ -19,7 +20,7 @@ vtkStandardNewMacro(vtkHDRReader);
 
 #define HDR_DATA_SIZE 3
 
-// Matrix to convert from XYZ into linear RGB
+// The standard XYZ to linear RGB transformation matrix (for D65 illuminant)
 const float matrixXYZ2RGB[3][3] = { { 3.2404542f, -1.5371385f, -0.4985314f },
   { -0.9692660f, 1.8760108f, 0.0415560f }, { 0.0556434f, -0.2040259f, 1.0572252f } };
 
@@ -203,7 +204,7 @@ void vtkHDRReader::ConvertAllDataFromRGBToXYZ(float* outPtr, int size)
 {
   for (int i = 0; i < size; i += HDR_DATA_SIZE)
   {
-    vtkHDRReader::XYZ2RGB(matrixXYZ2RGB, outPtr[i], outPtr[i + 1], outPtr[i + 2]);
+    vtkHDRReader::XYZ2RGB(matrixXYZ2RGB, this->Gamma, outPtr[i], outPtr[i + 1], outPtr[i + 2]);
   }
 }
 
@@ -638,12 +639,42 @@ void vtkHDRReader::RGBE2Float(unsigned char* rgbe, float& r, float& g, float& b)
 }
 
 //------------------------------------------------------------------------------
-void vtkHDRReader::XYZ2RGB(const float convertMatrix[3][3], float& r, float& g, float& b)
+void vtkHDRReader::XYZ2RGB(
+  const float convertMatrix[3][3], double gamma, float& r, float& g, float& b)
 {
   // Copy initial xyz values
   float x = r, y = g, z = b;
-  r = convertMatrix[0][0] * x + convertMatrix[0][1] * y + convertMatrix[0][2] * z;
-  g = convertMatrix[1][0] * x + convertMatrix[1][1] * y + convertMatrix[1][2] * z;
-  b = convertMatrix[2][0] * x + convertMatrix[2][1] * y + convertMatrix[2][2] * z;
+
+  // Convert XYZ to linear RGB
+  float linearR = convertMatrix[0][0] * x + convertMatrix[0][1] * y + convertMatrix[0][2] * z;
+  float linearG = convertMatrix[1][0] * x + convertMatrix[1][1] * y + convertMatrix[1][2] * z;
+  float linearB = convertMatrix[2][0] * x + convertMatrix[2][1] * y + convertMatrix[2][2] * z;
+
+  // Use sRGB transfer function if gamma is approximately 1.0 (default)
+  // Otherwise use the custom gamma from the file
+  auto gammaTransfer = [gamma](float linear) -> float
+  {
+    if (vtkMathUtilities::NearlyEqual(gamma, 1.0))
+    {
+      // Standard sRGB transfer function (IEC 61966-2-1:1999)
+      return linear <= 0.0031308f ? 12.92f * linear
+                                  : 1.055f * std::pow(linear, 1.0f / 2.4f) - 0.055f;
+    }
+    else
+    {
+      // Custom gamma correction from file
+      return std::pow(linear, 1.0f / static_cast<float>(gamma));
+    }
+  };
+
+  // Apply gamma correction and store results
+  r = gammaTransfer(linearR);
+  g = gammaTransfer(linearG);
+  b = gammaTransfer(linearB);
+
+  // Clamp values to [0,1] range
+  r = std::max(0.0f, std::min(1.0f, r));
+  g = std::max(0.0f, std::min(1.0f, g));
+  b = std::max(0.0f, std::min(1.0f, b));
 }
 VTK_ABI_NAMESPACE_END
diff --git a/IO/Image/vtkHDRReader.h b/IO/Image/vtkHDRReader.h
index 1342d7215936c694fed06bc925bbcf02fe95b49d..4ca9cb65b6b17a5a2a0a61df86d2cfed9d40cac7 100644
--- a/IO/Image/vtkHDRReader.h
+++ b/IO/Image/vtkHDRReader.h
@@ -146,7 +146,7 @@ protected:
    * Inplace version, r,g,b are in xyz color space in input, in rgb color space
    * in output
    */
-  static void XYZ2RGB(const float convertMatrix[3][3], float& r, float& g, float& b);
+  static void XYZ2RGB(const float convertMatrix[3][3], double gamma, float& r, float& g, float& b);
 
 private:
   vtkHDRReader(const vtkHDRReader&) = delete;
diff --git a/IO/Import/Testing/Data/Baseline/OBJImporter-TwoTrianglesWithNegativeIndices.png.sha512 b/IO/Import/Testing/Data/Baseline/OBJImporter-TwoTrianglesWithNegativeIndices.png.sha512
index 063e51cf5e48aede08392890c3d61447f0d3bdbb..7dcbdb5c89140aed15253900731cc234c30f3ef1 100644
--- a/IO/Import/Testing/Data/Baseline/OBJImporter-TwoTrianglesWithNegativeIndices.png.sha512
+++ b/IO/Import/Testing/Data/Baseline/OBJImporter-TwoTrianglesWithNegativeIndices.png.sha512
@@ -1 +1 @@
-453a0b9c980d30e0d32a1cd491e1199f491faa01ad3e6adb66268f1a4b00856ca87e49ea78ce37b3e920fcd776df16e88c4e05ce3bccd5927d4bc5e178e53b03
+e2a4b9607b14e6b4c542390e667d985f4be18ba350ffc5c201af64d2a4dc1b95b27345f4dcaaeb093300fc651884e24df449a8867b8d0364cbfa6e904cab42cd
diff --git a/IO/Import/Testing/Data/Baseline/TestOBJImporter-SharedMtl.png.sha512 b/IO/Import/Testing/Data/Baseline/TestOBJImporter-SharedMtl.png.sha512
index cc50979e1347b61a4ebd8bb8edb4bf55d8bbc195..dcab020f170797322380c4b66b6fcbdf10d9ce37 100644
--- a/IO/Import/Testing/Data/Baseline/TestOBJImporter-SharedMtl.png.sha512
+++ b/IO/Import/Testing/Data/Baseline/TestOBJImporter-SharedMtl.png.sha512
@@ -1 +1 @@
-c6e9845fb09d0d425fc434296bff47927eeff2720d5f6b619dcf08f4c61e496ba7e180b24561bbd0ecdfe85a61e7807e1c9e2708c07f3c1916248b7b4d266977
+bc38cab070cc4e6f66139530e0fad137a62487e2b641694bc77490ea12cebd154d7e67a70b77e6ff79c2d47e7621b7d3e4dc69fe53d54416cdd765403eff8977
diff --git a/Imaging/Core/Testing/Cxx/ImageBlend.cxx b/Imaging/Core/Testing/Cxx/ImageBlend.cxx
index e2fd1e3a6da4ccf3e4e2be7efc54633a679437bc..85f6dd3696e08a2dfa58a388afde8174bab6a802 100644
--- a/Imaging/Core/Testing/Cxx/ImageBlend.cxx
+++ b/Imaging/Core/Testing/Cxx/ImageBlend.cxx
@@ -35,18 +35,19 @@ int ImageBlend(int, char*[])
   {
     for (int y = 0; y < dims[1]; ++y)
     {
+      double val;
       if (x < dims[0] / 2)
       {
-        double val = abs((dims[0] - x - 100) * (dims[1] - y - 100));
-        imageData1->SetScalarComponentFromFloat(x, y, 0, 0, val);
-        imageData1->SetScalarComponentFromFloat(x, y, 0, 1, val);
-        imageData1->SetScalarComponentFromFloat(x, y, 0, 2, val);
-        imageData1->SetScalarComponentFromFloat(x, y, 0, 3, val);
+        val = std::abs((dims[0] - x - 100) * (dims[1] - y - 100));
       }
       else
       {
-        imageData1->SetScalarComponentFromFloat(x, y, 0, 0, 0);
+        val = 0;
       }
+      imageData1->SetScalarComponentFromFloat(x, y, 0, 0, val);
+      imageData1->SetScalarComponentFromFloat(x, y, 0, 1, val);
+      imageData1->SetScalarComponentFromFloat(x, y, 0, 2, val);
+      imageData1->SetScalarComponentFromFloat(x, y, 0, 3, val);
     }
   }
 
@@ -60,19 +61,20 @@ int ImageBlend(int, char*[])
   {
     for (int y = 0; y < dims[1]; ++y)
     {
+      double val;
       if (x > (dims[0] / 2) - 50 && x < (dims[0] / 2) + 50 && y > (dims[1] / 2) - 50 &&
         y < (dims[1] / 2) + 50)
       {
-        double val = x * y;
-        imageData2->SetScalarComponentFromFloat(x, y, 0, 0, val);
-        imageData2->SetScalarComponentFromFloat(x, y, 0, 1, val);
-        imageData2->SetScalarComponentFromFloat(x, y, 0, 2, val);
-        imageData2->SetScalarComponentFromFloat(x, y, 0, 3, val);
+        val = x * y;
       }
       else
       {
-        imageData2->SetScalarComponentFromFloat(x, y, 0, 0, 0);
+        val = 0;
       }
+      imageData2->SetScalarComponentFromFloat(x, y, 0, 0, val);
+      imageData2->SetScalarComponentFromFloat(x, y, 0, 1, val);
+      imageData2->SetScalarComponentFromFloat(x, y, 0, 2, val);
+      imageData2->SetScalarComponentFromFloat(x, y, 0, 3, val);
     }
   }
 
diff --git a/Imaging/Core/Testing/Data/Baseline/ImageBlend.png.sha512 b/Imaging/Core/Testing/Data/Baseline/ImageBlend.png.sha512
index 78443ddbb9489ba5044cc27f775c7f25dd7f7ff7..408b98184b11dc3145660e9ab71962fd5c13b342 100644
--- a/Imaging/Core/Testing/Data/Baseline/ImageBlend.png.sha512
+++ b/Imaging/Core/Testing/Data/Baseline/ImageBlend.png.sha512
@@ -1 +1 @@
-2c22167f6f465d4799f5ca96503c262fdc37b4f77c517d4048c3cb50d6525644c6132d5ff57a2dc250c658c7f6f1e3144ae480c260adeac1ac3895920d06707d
+4a0f815a6bfc9941ee3ab9eab750913ec30af053379545c274b293869bebb6b178fbfbe738891b20c4d59e41102388197ca6210264c98fe42d9b5c86bba466b4
diff --git a/Interaction/Widgets/Testing/Cxx/CMakeLists.txt b/Interaction/Widgets/Testing/Cxx/CMakeLists.txt
index f6ed8177096a4744498aabc0cb6de998e5a8fc03..86a2bbe34561b65708b40185754e4c5eb796b5c1 100644
--- a/Interaction/Widgets/Testing/Cxx/CMakeLists.txt
+++ b/Interaction/Widgets/Testing/Cxx/CMakeLists.txt
@@ -10,7 +10,7 @@ vtk_add_test_cxx(vtkInteractionWidgetsCxxTests tests
   TestAngleWidget2D.cxx
   TestAngleWidget3D.cxx
   TestBalloonWidget.cxx
-  TestBiDimensionalWidget.cxx
+  TestBiDimensionalWidget.cxx,LOOSE_VALID
   TestBorderWidget.cxx
   TestBrokenLineWidget.cxx
   TestCamera3DWidget.cxx
@@ -26,7 +26,7 @@ vtk_add_test_cxx(vtkInteractionWidgetsCxxTests tests
   TestCoordinateFrameWidget.cxx
   TestDijkstraImageGeodesicPath.cxx
   TestDisplaySizedImplicitPlaneWidget.cxx
-  TestDistanceWidget.cxx
+  TestDistanceWidget.cxx,LOOSE_VALID
   TestDistanceWidget3D.cxx
   TestFinitePlaneWidget.cxx
   TestFixedSizeHandleRepresentation3D.cxx
@@ -68,7 +68,7 @@ vtk_add_test_cxx(vtkInteractionWidgetsCxxTests tests
   TestRectilinearWipeWidget.cxx
   TestResliceCursorWidget2.cxx
   TestResliceCursorWidget3.cxx
-  TestScalarBarWidget.cxx
+  TestScalarBarWidget.cxx,LOOSE_VALID
   TestSeedWidget.cxx
   TestSeedWidget2.cxx
   TestSeedWidgetNonUniformRepresentations.cxx
diff --git a/Interaction/Widgets/Testing/Cxx/TestImplicitConeWidget.cxx b/Interaction/Widgets/Testing/Cxx/TestImplicitConeWidget.cxx
index b5703ff142a518f97edbdda19e85c906757b36eb..5227a0425a9a0ef1b6c5f0a606bbb443aa58dca9 100644
--- a/Interaction/Widgets/Testing/Cxx/TestImplicitConeWidget.cxx
+++ b/Interaction/Widgets/Testing/Cxx/TestImplicitConeWidget.cxx
@@ -863,104 +863,7 @@ const char eventLog[] = "# StreamVersion 1.2\n"
                         "MouseMoveEvent 225 133 0 0 0 0 0\n"
                         "RenderEvent 225 133 0 0 0 0 0\n"
                         "MouseMoveEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 226 133 0 0 0 0 0\n"
-                        "StartInteractionEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "TimerEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 226 133 0 0 0 0 0\n"
-                        "EndInteractionEvent 226 133 0 0 0 0 0\n"
-                        "RenderEvent 226 133 0 0 0 0 0\n"
-                        "MouseMoveEvent 225 131 0 0 0 0 0\n"
-                        "MouseMoveEvent 224 127 0 0 0 0 0\n"
-                        "MouseMoveEvent 223 124 0 0 0 0 0\n"
-                        "MouseMoveEvent 222 121 0 0 0 0 0\n"
-                        "MouseMoveEvent 220 117 0 0 0 0 0\n"
-                        "MouseMoveEvent 218 114 0 0 0 0 0\n"
-                        "MouseMoveEvent 218 111 0 0 0 0 0\n"
-                        "MouseMoveEvent 218 109 0 0 0 0 0\n"
-                        "MouseMoveEvent 217 106 0 0 0 0 0\n"
-                        "MouseMoveEvent 217 104 0 0 0 0 0\n"
-                        "MouseMoveEvent 216 101 0 0 0 0 0\n"
-                        "MouseMoveEvent 215 99 0 0 0 0 0\n"
-                        "MouseMoveEvent 213 97 0 0 0 0 0\n"
-                        "MouseMoveEvent 212 95 0 0 0 0 0\n"
-                        "MouseMoveEvent 211 93 0 0 0 0 0\n"
-                        "MouseMoveEvent 209 91 0 0 0 0 0\n"
-                        "MouseMoveEvent 208 90 0 0 0 0 0\n"
-                        "MouseMoveEvent 207 88 0 0 0 0 0\n"
-                        "MouseMoveEvent 207 87 0 0 0 0 0\n"
-                        "MouseMoveEvent 206 86 0 0 0 0 0\n"
-                        "MouseMoveEvent 205 84 0 0 0 0 0\n"
-                        "MouseMoveEvent 204 83 0 0 0 0 0\n"
-                        "MouseMoveEvent 203 82 0 0 0 0 0\n"
-                        "MouseMoveEvent 203 80 0 0 0 0 0\n"
-                        "MouseMoveEvent 202 79 0 0 0 0 0\n"
-                        "MouseMoveEvent 202 77 0 0 0 0 0\n"
-                        "MouseMoveEvent 202 76 0 0 0 0 0\n"
-                        "MouseMoveEvent 201 74 0 0 0 0 0\n"
-                        "MouseMoveEvent 201 72 0 0 0 0 0\n"
-                        "MouseMoveEvent 200 71 0 0 0 0 0\n"
-                        "MouseMoveEvent 200 70 0 0 0 0 0\n"
-                        "MouseMoveEvent 199 69 0 0 0 0 0\n"
-                        "MouseMoveEvent 199 67 0 0 0 0 0\n"
-                        "RenderEvent 199 67 0 0 0 0 0\n"
-                        "MouseMoveEvent 199 66 0 0 0 0 0\n"
-                        "RenderEvent 199 66 0 0 0 0 0\n"
-                        "MouseMoveEvent 198 65 0 0 0 0 0\n"
-                        "RenderEvent 198 65 0 0 0 0 0\n"
-                        "MouseMoveEvent 198 64 0 0 0 0 0\n"
-                        "RenderEvent 198 64 0 0 0 0 0\n"
-                        "MouseMoveEvent 198 63 0 0 0 0 0\n"
-                        "RenderEvent 198 63 0 0 0 0 0\n"
-                        "MouseMoveEvent 198 62 0 0 0 0 0\n"
-                        "RenderEvent 198 62 0 0 0 0 0\n"
-                        "MouseMoveEvent 197 58 0 0 0 0 0\n"
-                        "RenderEvent 197 58 0 0 0 0 0\n"
-                        "MouseMoveEvent 197 54 0 0 0 0 0\n"
-                        "MouseMoveEvent 196 53 0 0 0 0 0\n"
-                        "MouseMoveEvent 196 51 0 0 0 0 0\n"
-                        "RenderEvent 196 51 0 0 0 0 0\n"
-                        "MouseMoveEvent 196 49 0 0 0 0 0\n"
-                        "RenderEvent 196 49 0 0 0 0 0\n"
-                        "MouseMoveEvent 196 47 0 0 0 0 0\n"
-                        "RenderEvent 196 47 0 0 0 0 0\n";
+                        "RenderEvent 226 133 0 0 0 0 0\n";
 
 // This does the actual work: updates the vtkCone implicit function.
 // This in turn causes the pipeline to update and clip the object.
@@ -1082,6 +985,8 @@ int TestImplicitConeWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
   // render the image
   interactor->Initialize();
   renWin->Render();
+  // uncomment to see cursor position during play.
+  // recorder->ShowCursorOn();
   recorder->Play();
 
   // Remove the observers so we can go interactive. Without this the "-I"
diff --git a/Interaction/Widgets/Testing/Cxx/TestImplicitFrustumWidget.cxx b/Interaction/Widgets/Testing/Cxx/TestImplicitFrustumWidget.cxx
index 4ea578ffe7d733bb472621dab20666c881e4e993..b034c8817ae253f00764f65fc120b4122e2861f0 100644
--- a/Interaction/Widgets/Testing/Cxx/TestImplicitFrustumWidget.cxx
+++ b/Interaction/Widgets/Testing/Cxx/TestImplicitFrustumWidget.cxx
@@ -25,100 +25,716 @@ namespace
 
 const char eventLog[] = "# StreamVersion 1.2\n"
                         "ExposeEvent 0 299 0 0 0 0 0\n"
-                        "EnterEvent 287 2 0 0 0 0 0\n"
-                        "MouseMoveEvent 210 159 0 0 0 0 0\n"
-                        "RenderEvent 210 159 0 0 0 0 0\n"
-
-                        "MouseWheelBackwardEvent 210 159 0 0 0 0 0\n"
-                        "MouseWheelBackwardEvent 209 153 0 0 1 0 0\n"
-                        "MouseWheelBackwardEvent 200 147 0 0 0 0 0\n"
-                        "MouseWheelBackwardEvent 199 146 0 0 1 0 0\n"
-                        "MouseWheelBackwardEvent 199 146 0 0 0 0 0\n"
-                        "MouseWheelBackwardEvent 199 146 0 0 1 0 0\n"
-                        "MouseWheelBackwardEvent 163 262 0 0 0 0 0\n"
-                        "MouseWheelBackwardEvent 163 262 0 0 1 0 0\n"
-
-                        "MouseMoveEvent 163 262 0 0 0 0 0\n"
-                        "MiddleButtonPressEvent 163 262 0 0 0 0 0\n"
-                        "MouseMoveEvent 162 196 0 0 0 0 0\n"
-                        "MiddleButtonReleaseEvent 162 196 0 0 0 0 0\n"
-
-                        "MouseWheelBackwardEvent 162 196 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 247 259 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 247 259 0 0 0 0 0\n"
-                        "MouseMoveEvent 1 257 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 1 257 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 173 78 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 173 78 0 0 0 0 0\n"
-                        "MouseMoveEvent 157 62 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 157 62 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 140 81 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 140 81 0 0 0 0 0\n"
-                        "MouseMoveEvent 121 75 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 121 75 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 150 67 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 150 67 0 0 0 0 0\n"
-                        "MouseMoveEvent 151 67 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 151 67 0 0 0 0 0\n"
-
-                        // Removing the MoveEvents cause the interaction to be wrong.
-                        "MouseMoveEvent 151 76 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 151 76 0 0 0 0 0\n"
-                        "MouseMoveEvent 150 76 0 0 0 0 0\n"
-                        "MouseMoveEvent 149 76 0 0 0 0 0\n"
-                        "MouseMoveEvent 145 77 0 0 0 0 0\n"
-                        "MouseMoveEvent 143 78 0 0 0 0 0\n"
-                        "MouseMoveEvent 142 78 0 0 0 0 0\n"
-                        "MouseMoveEvent 141 79 0 0 0 0 0\n"
-                        "MouseMoveEvent 140 79 0 0 0 0 0\n"
-                        "MouseMoveEvent 140 80 0 0 0 0 0\n"
-                        "MouseMoveEvent 139 80 0 0 0 0 0\n"
-                        "MouseMoveEvent 138 80 0 0 0 0 0\n"
-                        "MouseMoveEvent 138 80 0 0 0 0 0\n"
-                        "MouseMoveEvent 137 80 0 0 0 0 0\n"
-                        "MouseMoveEvent 137 81 0 0 0 0 0\n"
-                        "MouseMoveEvent 136 81 0 0 0 0 0\n"
-                        "MouseMoveEvent 136 82 0 0 0 0 0\n"
-                        "MouseMoveEvent 135 82 0 0 0 0 0\n"
-                        "MouseMoveEvent 134 82 0 0 0 0 0\n"
-                        "MouseMoveEvent 133 84 0 0 0 0 0\n"
-                        "MouseMoveEvent 131 85 0 0 0 0 0\n"
-                        "MouseMoveEvent 130 86 0 0 0 0 0\n"
-                        "MouseMoveEvent 129 88 0 0 0 0 0\n"
-                        "MouseMoveEvent 128 89 0 0 0 0 0\n"
-                        "MouseMoveEvent 127 90 0 0 0 0 0\n"
-                        "MouseMoveEvent 124 92 0 0 0 0 0\n"
-                        "MouseMoveEvent 123 93 0 0 0 0 0\n"
-                        "MouseMoveEvent 122 94 0 0 0 0 0\n"
-                        "MouseMoveEvent 122 95 0 0 0 0 0\n"
-                        "MouseMoveEvent 121 97 0 0 0 0 0\n"
-                        "MouseMoveEvent 120 99 0 0 0 0 0\n"
-                        "MouseMoveEvent 119 101 0 0 0 0 0\n"
-                        "MouseMoveEvent 119 102 0 0 0 0 0\n"
-                        "MouseMoveEvent 118 104 0 0 0 0 0\n"
-                        "MouseMoveEvent 118 105 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 118 105 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 180 119 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 180 119 0 0 0 0 0\n"
-                        "MouseMoveEvent 181 128 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 181 128 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 163 268 0 0 0 0 0\n"
-                        "LeftButtonPressEvent 163 268 0 0 0 0 0\n"
-                        "MouseMoveEvent 363 129 0 0 0 0 0\n"
-                        "LeftButtonReleaseEvent 363 129 0 0 0 0 0\n"
-
-                        "MouseMoveEvent 212 149 0 0 0 0 0\n"
-                        "MiddleButtonPressEvent 212 149 0 0 0 0 0\n"
-                        "MouseMoveEvent 159 155 0 0 0 0 0\n"
-                        "MiddleButtonReleaseEvent 159 155 0 0 0 0 0\n"
-
-                        "RenderEvent 159 155 0 0 0 0 0\n";
+                        "RenderEvent 0 299 0 0 0 0 0\n"
+                        "MouseWheelBackwardEvent 176 156 0 0 0 0 0\n"
+                        "MouseWheelBackwardEvent 176 156 0 0 0 0 0\n"
+                        "MouseWheelBackwardEvent 176 156 0 0 0 0 0\n"
+                        "RenderEvent 78 109 0 0 0 0 0\n"
+                        "LeftButtonPressEvent 78 109 0 0 0 0 0\n"
+                        "RenderEvent 78 109 0 0 0 0 0\n"
+                        "MouseMoveEvent 78 109 0 0 0 0 0\n"
+                        "RenderEvent 78 109 0 0 0 0 0\n"
+                        "MouseMoveEvent 79 108 0 0 0 0 0\n"
+                        "RenderEvent 79 108 0 0 0 0 0\n"
+                        "MouseMoveEvent 84 103 0 0 0 0 0\n"
+                        "RenderEvent 84 103 0 0 0 0 0\n"
+                        "MouseMoveEvent 85 102 0 0 0 0 0\n"
+                        "RenderEvent 85 102 0 0 0 0 0\n"
+                        "MouseMoveEvent 86 101 0 0 0 0 0\n"
+                        "RenderEvent 86 101 0 0 0 0 0\n"
+                        "MouseMoveEvent 87 101 0 0 0 0 0\n"
+                        "RenderEvent 87 101 0 0 0 0 0\n"
+                        "MouseMoveEvent 87 100 0 0 0 0 0\n"
+                        "RenderEvent 87 100 0 0 0 0 0\n"
+                        "MouseMoveEvent 88 100 0 0 0 0 0\n"
+                        "RenderEvent 88 100 0 0 0 0 0\n"
+                        "MouseMoveEvent 88 99 0 0 0 0 0\n"
+                        "RenderEvent 88 99 0 0 0 0 0\n"
+                        "MouseMoveEvent 89 99 0 0 0 0 0\n"
+                        "RenderEvent 89 99 0 0 0 0 0\n"
+                        "MouseMoveEvent 90 98 0 0 0 0 0\n"
+                        "RenderEvent 90 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 90 97 0 0 0 0 0\n"
+                        "RenderEvent 90 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 91 97 0 0 0 0 0\n"
+                        "RenderEvent 91 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 92 97 0 0 0 0 0\n"
+                        "RenderEvent 92 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 92 97 0 0 0 0 0\n"
+                        "RenderEvent 92 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 93 97 0 0 0 0 0\n"
+                        "RenderEvent 93 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 93 96 0 0 0 0 0\n"
+                        "RenderEvent 93 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 95 0 0 0 0 0\n"
+                        "RenderEvent 94 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 94 0 0 0 0 0\n"
+                        "RenderEvent 94 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 94 0 0 0 0 0\n"
+                        "RenderEvent 95 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 93 0 0 0 0 0\n"
+                        "RenderEvent 95 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 94 0 0 0 0 0\n"
+                        "RenderEvent 95 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 94 0 0 0 0 0\n"
+                        "RenderEvent 95 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 95 0 0 0 0 0\n"
+                        "RenderEvent 95 95 0 0 0 0 0\n"
+                        "LeftButtonReleaseEvent 95 95 0 0 0 0 0\n"
+                        "RenderEvent 95 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 96 0 0 0 0 0\n"
+                        "RenderEvent 95 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 100 0 0 0 0 0\n"
+                        "RenderEvent 94 100 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 104 0 0 0 0 0\n"
+                        "RenderEvent 94 104 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 107 0 0 0 0 0\n"
+                        "RenderEvent 94 107 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 114 0 0 0 0 0\n"
+                        "RenderEvent 94 114 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 123 0 0 0 0 0\n"
+                        "RenderEvent 95 123 0 0 0 0 0\n"
+                        "MouseMoveEvent 102 133 0 0 0 0 0\n"
+                        "RenderEvent 102 133 0 0 0 0 0\n"
+                        "MouseMoveEvent 110 141 0 0 0 0 0\n"
+                        "RenderEvent 110 141 0 0 0 0 0\n"
+                        "MouseMoveEvent 117 150 0 0 0 0 0\n"
+                        "RenderEvent 117 150 0 0 0 0 0\n"
+                        "MouseMoveEvent 122 155 0 0 0 0 0\n"
+                        "RenderEvent 122 155 0 0 0 0 0\n"
+                        "MouseMoveEvent 128 172 0 0 0 0 0\n"
+                        "RenderEvent 128 172 0 0 0 0 0\n"
+                        "MouseMoveEvent 129 190 0 0 0 0 0\n"
+                        "RenderEvent 129 190 0 0 0 0 0\n"
+                        "MouseMoveEvent 129 207 0 0 0 0 0\n"
+                        "RenderEvent 129 207 0 0 0 0 0\n"
+                        "MouseMoveEvent 129 221 0 0 0 0 0\n"
+                        "RenderEvent 129 221 0 0 0 0 0\n"
+                        "MouseMoveEvent 129 233 0 0 0 0 0\n"
+                        "RenderEvent 129 233 0 0 0 0 0\n"
+                        "MouseMoveEvent 130 242 0 0 0 0 0\n"
+                        "RenderEvent 130 242 0 0 0 0 0\n"
+                        "MouseMoveEvent 131 248 0 0 0 0 0\n"
+                        "RenderEvent 131 248 0 0 0 0 0\n"
+                        "MouseMoveEvent 131 253 0 0 0 0 0\n"
+                        "RenderEvent 131 253 0 0 0 0 0\n"
+                        "MouseMoveEvent 131 257 0 0 0 0 0\n"
+                        "RenderEvent 131 257 0 0 0 0 0\n"
+                        "MouseMoveEvent 130 258 0 0 0 0 0\n"
+                        "RenderEvent 130 258 0 0 0 0 0\n"
+                        "MouseMoveEvent 131 257 0 0 0 0 0\n"
+                        "RenderEvent 131 257 0 0 0 0 0\n"
+                        "MouseMoveEvent 131 256 0 0 0 0 0\n"
+                        "RenderEvent 131 256 0 0 0 0 0\n"
+                        "MouseMoveEvent 132 256 0 0 0 0 0\n"
+                        "RenderEvent 132 256 0 0 0 0 0\n"
+                        "MouseMoveEvent 134 254 0 0 0 0 0\n"
+                        "RenderEvent 134 254 0 0 0 0 0\n"
+                        "MouseMoveEvent 138 250 0 0 0 0 0\n"
+                        "RenderEvent 138 250 0 0 0 0 0\n"
+                        "MouseMoveEvent 145 246 0 0 0 0 0\n"
+                        "RenderEvent 145 246 0 0 0 0 0\n"
+                        "MouseMoveEvent 154 244 0 0 0 0 0\n"
+                        "RenderEvent 154 244 0 0 0 0 0\n"
+                        "MouseMoveEvent 160 244 0 0 0 0 0\n"
+                        "RenderEvent 160 244 0 0 0 0 0\n"
+                        "MouseMoveEvent 162 244 0 0 0 0 0\n"
+                        "RenderEvent 162 244 0 0 0 0 0\n"
+                        "MouseMoveEvent 163 246 0 0 0 0 0\n"
+                        "RenderEvent 163 246 0 0 0 0 0\n"
+                        "MouseMoveEvent 164 248 0 0 0 0 0\n"
+                        "RenderEvent 164 248 0 0 0 0 0\n"
+                        "MouseMoveEvent 165 249 0 0 0 0 0\n"
+                        "RenderEvent 165 249 0 0 0 0 0\n"
+                        "MouseMoveEvent 165 250 0 0 0 0 0\n"
+                        "RenderEvent 165 250 0 0 0 0 0\n"
+                        "MouseMoveEvent 166 251 0 0 0 0 0\n"
+                        "RenderEvent 166 251 0 0 0 0 0\n"
+                        "MouseMoveEvent 167 253 0 0 0 0 0\n"
+                        "RenderEvent 167 253 0 0 0 0 0\n"
+                        "MouseMoveEvent 169 256 0 0 0 0 0\n"
+                        "RenderEvent 169 256 0 0 0 0 0\n"
+                        "MouseMoveEvent 170 259 0 0 0 0 0\n"
+                        "RenderEvent 170 259 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 262 0 0 0 0 0\n"
+                        "RenderEvent 172 262 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 263 0 0 0 0 0\n"
+                        "RenderEvent 172 263 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 265 0 0 0 0 0\n"
+                        "RenderEvent 172 265 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 265 0 0 0 0 0\n"
+                        "RenderEvent 172 265 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 266 0 0 0 0 0\n"
+                        "RenderEvent 172 266 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 267 0 0 0 0 0\n"
+                        "RenderEvent 172 267 0 0 0 0 0\n"
+                        "MouseMoveEvent 173 266 0 0 0 0 0\n"
+                        "RenderEvent 173 266 0 0 0 0 0\n"
+                        "MouseMoveEvent 173 266 0 0 0 0 0\n"
+                        "RenderEvent 173 266 0 0 0 0 0\n"
+                        "MouseMoveEvent 173 265 0 0 0 0 0\n"
+                        "RenderEvent 173 265 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 264 0 0 0 0 0\n"
+                        "RenderEvent 174 264 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 262 0 0 0 0 0\n"
+                        "RenderEvent 174 262 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 261 0 0 0 0 0\n"
+                        "RenderEvent 174 261 0 0 0 0 0\n"
+                        "LeftButtonPressEvent 174 261 0 0 0 0 0\n"
+                        "RenderEvent 174 261 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 261 0 0 0 0 0\n"
+                        "RenderEvent 174 261 0 0 0 0 0\n"
+                        "MouseMoveEvent 176 258 0 0 0 0 0\n"
+                        "RenderEvent 176 258 0 0 0 0 0\n"
+                        "MouseMoveEvent 179 256 0 0 0 0 0\n"
+                        "RenderEvent 179 256 0 0 0 0 0\n"
+                        "MouseMoveEvent 181 254 0 0 0 0 0\n"
+                        "RenderEvent 181 254 0 0 0 0 0\n"
+                        "MouseMoveEvent 183 252 0 0 0 0 0\n"
+                        "RenderEvent 183 252 0 0 0 0 0\n"
+                        "MouseMoveEvent 184 251 0 0 0 0 0\n"
+                        "RenderEvent 184 251 0 0 0 0 0\n"
+                        "MouseMoveEvent 186 249 0 0 0 0 0\n"
+                        "RenderEvent 186 249 0 0 0 0 0\n"
+                        "MouseMoveEvent 188 248 0 0 0 0 0\n"
+                        "RenderEvent 188 248 0 0 0 0 0\n"
+                        "MouseMoveEvent 189 246 0 0 0 0 0\n"
+                        "RenderEvent 189 246 0 0 0 0 0\n"
+                        "MouseMoveEvent 192 243 0 0 0 0 0\n"
+                        "RenderEvent 192 243 0 0 0 0 0\n"
+                        "MouseMoveEvent 194 241 0 0 0 0 0\n"
+                        "RenderEvent 194 241 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 240 0 0 0 0 0\n"
+                        "RenderEvent 195 240 0 0 0 0 0\n"
+                        "MouseMoveEvent 196 239 0 0 0 0 0\n"
+                        "RenderEvent 196 239 0 0 0 0 0\n"
+                        "MouseMoveEvent 196 240 0 0 0 0 0\n"
+                        "RenderEvent 196 240 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 242 0 0 0 0 0\n"
+                        "RenderEvent 195 242 0 0 0 0 0\n"
+                        "LeftButtonReleaseEvent 195 242 0 0 0 0 0\n"
+                        "RenderEvent 195 242 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 241 0 0 0 0 0\n"
+                        "RenderEvent 195 241 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 240 0 0 0 0 0\n"
+                        "RenderEvent 195 240 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 240 0 0 0 0 0\n"
+                        "RenderEvent 195 240 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 239 0 0 0 0 0\n"
+                        "RenderEvent 195 239 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 238 0 0 0 0 0\n"
+                        "RenderEvent 195 238 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 237 0 0 0 0 0\n"
+                        "RenderEvent 195 237 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 236 0 0 0 0 0\n"
+                        "RenderEvent 195 236 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 236 0 0 0 0 0\n"
+                        "RenderEvent 195 236 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 235 0 0 0 0 0\n"
+                        "RenderEvent 195 235 0 0 0 0 0\n"
+                        "MouseMoveEvent 194 234 0 0 0 0 0\n"
+                        "RenderEvent 194 234 0 0 0 0 0\n"
+                        "MouseMoveEvent 191 231 0 0 0 0 0\n"
+                        "RenderEvent 191 231 0 0 0 0 0\n"
+                        "MouseMoveEvent 188 229 0 0 0 0 0\n"
+                        "RenderEvent 188 229 0 0 0 0 0\n"
+                        "MouseMoveEvent 180 222 0 0 0 0 0\n"
+                        "RenderEvent 180 222 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 218 0 0 0 0 0\n"
+                        "RenderEvent 174 218 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 215 0 0 0 0 0\n"
+                        "RenderEvent 172 215 0 0 0 0 0\n"
+                        "MouseMoveEvent 168 212 0 0 0 0 0\n"
+                        "RenderEvent 168 212 0 0 0 0 0\n"
+                        "MouseMoveEvent 166 211 0 0 0 0 0\n"
+                        "RenderEvent 166 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 165 211 0 0 0 0 0\n"
+                        "RenderEvent 165 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 164 211 0 0 0 0 0\n"
+                        "RenderEvent 164 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 211 0 0 0 0 0\n"
+                        "RenderEvent 161 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 160 211 0 0 0 0 0\n"
+                        "RenderEvent 160 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 211 0 0 0 0 0\n"
+                        "RenderEvent 159 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 158 211 0 0 0 0 0\n"
+                        "RenderEvent 158 211 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 212 0 0 0 0 0\n"
+                        "RenderEvent 157 212 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 212 0 0 0 0 0\n"
+                        "RenderEvent 157 212 0 0 0 0 0\n"
+                        "MouseMoveEvent 155 212 0 0 0 0 0\n"
+                        "RenderEvent 155 212 0 0 0 0 0\n"
+                        "MouseMoveEvent 154 213 0 0 0 0 0\n"
+                        "RenderEvent 154 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 153 213 0 0 0 0 0\n"
+                        "RenderEvent 153 213 0 0 0 0 0\n"
+                        "LeftButtonPressEvent 153 213 0 0 0 0 0\n"
+                        "RenderEvent 153 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 154 213 0 0 0 0 0\n"
+                        "RenderEvent 154 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 154 213 0 0 0 0 0\n"
+                        "RenderEvent 154 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 155 213 0 0 0 0 0\n"
+                        "RenderEvent 155 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 156 213 0 0 0 0 0\n"
+                        "RenderEvent 156 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 213 0 0 0 0 0\n"
+                        "RenderEvent 157 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 213 0 0 0 0 0\n"
+                        "RenderEvent 159 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 165 213 0 0 0 0 0\n"
+                        "RenderEvent 165 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 167 213 0 0 0 0 0\n"
+                        "RenderEvent 167 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 169 213 0 0 0 0 0\n"
+                        "RenderEvent 169 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 171 213 0 0 0 0 0\n"
+                        "RenderEvent 171 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 172 213 0 0 0 0 0\n"
+                        "RenderEvent 172 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 173 213 0 0 0 0 0\n"
+                        "RenderEvent 173 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 213 0 0 0 0 0\n"
+                        "RenderEvent 174 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 174 213 0 0 0 0 0\n"
+                        "RenderEvent 174 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 175 213 0 0 0 0 0\n"
+                        "RenderEvent 175 213 0 0 0 0 0\n"
+                        "MouseMoveEvent 178 210 0 0 0 0 0\n"
+                        "RenderEvent 178 210 0 0 0 0 0\n"
+                        "MouseMoveEvent 179 209 0 0 0 0 0\n"
+                        "RenderEvent 179 209 0 0 0 0 0\n"
+                        "MouseMoveEvent 179 208 0 0 0 0 0\n"
+                        "RenderEvent 179 208 0 0 0 0 0\n"
+                        "MouseMoveEvent 180 207 0 0 0 0 0\n"
+                        "RenderEvent 180 207 0 0 0 0 0\n"
+                        "MouseMoveEvent 181 206 0 0 0 0 0\n"
+                        "RenderEvent 181 206 0 0 0 0 0\n"
+                        "MouseMoveEvent 182 205 0 0 0 0 0\n"
+                        "RenderEvent 182 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 185 202 0 0 0 0 0\n"
+                        "RenderEvent 185 202 0 0 0 0 0\n"
+                        "MouseMoveEvent 187 201 0 0 0 0 0\n"
+                        "RenderEvent 187 201 0 0 0 0 0\n"
+                        "MouseMoveEvent 188 200 0 0 0 0 0\n"
+                        "RenderEvent 188 200 0 0 0 0 0\n"
+                        "MouseMoveEvent 189 198 0 0 0 0 0\n"
+                        "RenderEvent 189 198 0 0 0 0 0\n"
+                        "MouseMoveEvent 190 196 0 0 0 0 0\n"
+                        "RenderEvent 190 196 0 0 0 0 0\n"
+                        "MouseMoveEvent 192 195 0 0 0 0 0\n"
+                        "RenderEvent 192 195 0 0 0 0 0\n"
+                        "MouseMoveEvent 193 195 0 0 0 0 0\n"
+                        "RenderEvent 193 195 0 0 0 0 0\n"
+                        "MouseMoveEvent 193 195 0 0 0 0 0\n"
+                        "RenderEvent 193 195 0 0 0 0 0\n"
+                        "MouseMoveEvent 190 196 0 0 0 0 0\n"
+                        "RenderEvent 190 196 0 0 0 0 0\n"
+                        "MouseMoveEvent 184 197 0 0 0 0 0\n"
+                        "RenderEvent 184 197 0 0 0 0 0\n"
+                        "MouseMoveEvent 180 197 0 0 0 0 0\n"
+                        "RenderEvent 180 197 0 0 0 0 0\n"
+                        "MouseMoveEvent 178 197 0 0 0 0 0\n"
+                        "RenderEvent 178 197 0 0 0 0 0\n"
+                        "MouseMoveEvent 176 197 0 0 0 0 0\n"
+                        "RenderEvent 176 197 0 0 0 0 0\n"
+                        "MouseMoveEvent 173 198 0 0 0 0 0\n"
+                        "RenderEvent 173 198 0 0 0 0 0\n"
+                        "MouseMoveEvent 169 198 0 0 0 0 0\n"
+                        "RenderEvent 169 198 0 0 0 0 0\n"
+                        "MouseMoveEvent 167 199 0 0 0 0 0\n"
+                        "RenderEvent 167 199 0 0 0 0 0\n"
+                        "MouseMoveEvent 165 200 0 0 0 0 0\n"
+                        "RenderEvent 165 200 0 0 0 0 0\n"
+                        "MouseMoveEvent 163 200 0 0 0 0 0\n"
+                        "RenderEvent 163 200 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 200 0 0 0 0 0\n"
+                        "RenderEvent 161 200 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 201 0 0 0 0 0\n"
+                        "RenderEvent 159 201 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 202 0 0 0 0 0\n"
+                        "RenderEvent 157 202 0 0 0 0 0\n"
+                        "MouseMoveEvent 153 202 0 0 0 0 0\n"
+                        "RenderEvent 153 202 0 0 0 0 0\n"
+                        "MouseMoveEvent 148 203 0 0 0 0 0\n"
+                        "RenderEvent 148 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 145 203 0 0 0 0 0\n"
+                        "RenderEvent 145 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 143 203 0 0 0 0 0\n"
+                        "RenderEvent 143 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 141 203 0 0 0 0 0\n"
+                        "RenderEvent 141 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 140 203 0 0 0 0 0\n"
+                        "RenderEvent 140 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 139 203 0 0 0 0 0\n"
+                        "RenderEvent 139 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 137 203 0 0 0 0 0\n"
+                        "RenderEvent 137 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 135 203 0 0 0 0 0\n"
+                        "RenderEvent 135 203 0 0 0 0 0\n"
+                        "MouseMoveEvent 134 204 0 0 0 0 0\n"
+                        "RenderEvent 134 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 132 204 0 0 0 0 0\n"
+                        "RenderEvent 132 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 131 204 0 0 0 0 0\n"
+                        "RenderEvent 131 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 130 204 0 0 0 0 0\n"
+                        "RenderEvent 130 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 129 204 0 0 0 0 0\n"
+                        "RenderEvent 129 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 128 204 0 0 0 0 0\n"
+                        "RenderEvent 128 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 128 205 0 0 0 0 0\n"
+                        "RenderEvent 128 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 127 205 0 0 0 0 0\n"
+                        "RenderEvent 127 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 127 205 0 0 0 0 0\n"
+                        "RenderEvent 127 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 126 205 0 0 0 0 0\n"
+                        "RenderEvent 126 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 126 205 0 0 0 0 0\n"
+                        "RenderEvent 126 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 125 205 0 0 0 0 0\n"
+                        "RenderEvent 125 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 123 205 0 0 0 0 0\n"
+                        "RenderEvent 123 205 0 0 0 0 0\n"
+                        "MouseMoveEvent 122 204 0 0 0 0 0\n"
+                        "RenderEvent 122 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 121 204 0 0 0 0 0\n"
+                        "RenderEvent 121 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 120 204 0 0 0 0 0\n"
+                        "RenderEvent 120 204 0 0 0 0 0\n"
+                        "LeftButtonReleaseEvent 120 204 0 0 0 0 0\n"
+                        "RenderEvent 120 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 120 204 0 0 0 0 0\n"
+                        "RenderEvent 120 204 0 0 0 0 0\n"
+                        "MouseMoveEvent 120 202 0 0 0 0 0\n"
+                        "RenderEvent 120 202 0 0 0 0 0\n"
+                        "MouseMoveEvent 119 196 0 0 0 0 0\n"
+                        "RenderEvent 119 196 0 0 0 0 0\n"
+                        "MouseMoveEvent 118 191 0 0 0 0 0\n"
+                        "MouseMoveEvent 116 185 0 0 0 0 0\n"
+                        "MouseMoveEvent 114 179 0 0 0 0 0\n"
+                        "MouseMoveEvent 113 174 0 0 0 0 0\n"
+                        "MouseMoveEvent 111 169 0 0 0 0 0\n"
+                        "MouseMoveEvent 108 161 0 0 0 0 0\n"
+                        "MouseMoveEvent 107 156 0 0 0 0 0\n"
+                        "MouseMoveEvent 105 150 0 0 0 0 0\n"
+                        "MouseMoveEvent 103 145 0 0 0 0 0\n"
+                        "MouseMoveEvent 102 142 0 0 0 0 0\n"
+                        "MouseMoveEvent 101 137 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 134 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 131 0 0 0 0 0\n"
+                        "RenderEvent 99 131 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 125 0 0 0 0 0\n"
+                        "RenderEvent 99 125 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 124 0 0 0 0 0\n"
+                        "RenderEvent 99 124 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 123 0 0 0 0 0\n"
+                        "RenderEvent 99 123 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 122 0 0 0 0 0\n"
+                        "RenderEvent 99 122 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 122 0 0 0 0 0\n"
+                        "RenderEvent 99 122 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 118 0 0 0 0 0\n"
+                        "RenderEvent 99 118 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 115 0 0 0 0 0\n"
+                        "RenderEvent 100 115 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 111 0 0 0 0 0\n"
+                        "RenderEvent 100 111 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 107 0 0 0 0 0\n"
+                        "RenderEvent 100 107 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 103 0 0 0 0 0\n"
+                        "RenderEvent 100 103 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 99 0 0 0 0 0\n"
+                        "RenderEvent 100 99 0 0 0 0 0\n"
+                        "MouseMoveEvent 101 97 0 0 0 0 0\n"
+                        "RenderEvent 101 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 101 96 0 0 0 0 0\n"
+                        "RenderEvent 101 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 102 96 0 0 0 0 0\n"
+                        "RenderEvent 102 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 102 95 0 0 0 0 0\n"
+                        "RenderEvent 102 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 102 94 0 0 0 0 0\n"
+                        "RenderEvent 102 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 101 94 0 0 0 0 0\n"
+                        "RenderEvent 101 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 94 0 0 0 0 0\n"
+                        "RenderEvent 100 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 93 0 0 0 0 0\n"
+                        "RenderEvent 100 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 100 93 0 0 0 0 0\n"
+                        "RenderEvent 100 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 93 0 0 0 0 0\n"
+                        "RenderEvent 99 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 93 0 0 0 0 0\n"
+                        "RenderEvent 99 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 99 94 0 0 0 0 0\n"
+                        "RenderEvent 99 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 98 94 0 0 0 0 0\n"
+                        "RenderEvent 98 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 97 94 0 0 0 0 0\n"
+                        "RenderEvent 97 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 96 95 0 0 0 0 0\n"
+                        "RenderEvent 96 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 96 0 0 0 0 0\n"
+                        "RenderEvent 95 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 97 0 0 0 0 0\n"
+                        "RenderEvent 95 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 97 0 0 0 0 0\n"
+                        "RenderEvent 95 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 96 0 0 0 0 0\n"
+                        "RenderEvent 95 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 95 95 0 0 0 0 0\n"
+                        "RenderEvent 95 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 94 95 0 0 0 0 0\n"
+                        "RenderEvent 94 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 93 95 0 0 0 0 0\n"
+                        "RenderEvent 93 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 92 95 0 0 0 0 0\n"
+                        "RenderEvent 92 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 92 96 0 0 0 0 0\n"
+                        "RenderEvent 92 96 0 0 0 0 0\n"
+                        "LeftButtonPressEvent 92 96 0 0 0 0 0\n"
+                        "RenderEvent 92 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 93 96 0 0 0 0 0\n"
+                        "RenderEvent 93 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 101 95 0 0 0 0 0\n"
+                        "RenderEvent 101 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 104 95 0 0 0 0 0\n"
+                        "RenderEvent 104 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 105 95 0 0 0 0 0\n"
+                        "RenderEvent 105 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 106 95 0 0 0 0 0\n"
+                        "RenderEvent 106 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 110 95 0 0 0 0 0\n"
+                        "RenderEvent 110 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 115 96 0 0 0 0 0\n"
+                        "RenderEvent 115 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 119 97 0 0 0 0 0\n"
+                        "RenderEvent 119 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 122 98 0 0 0 0 0\n"
+                        "RenderEvent 122 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 123 98 0 0 0 0 0\n"
+                        "RenderEvent 123 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 124 98 0 0 0 0 0\n"
+                        "RenderEvent 124 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 125 98 0 0 0 0 0\n"
+                        "RenderEvent 125 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 126 98 0 0 0 0 0\n"
+                        "RenderEvent 126 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 128 98 0 0 0 0 0\n"
+                        "RenderEvent 128 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 130 98 0 0 0 0 0\n"
+                        "RenderEvent 130 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 132 98 0 0 0 0 0\n"
+                        "RenderEvent 132 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 134 97 0 0 0 0 0\n"
+                        "RenderEvent 134 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 138 96 0 0 0 0 0\n"
+                        "RenderEvent 138 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 140 95 0 0 0 0 0\n"
+                        "RenderEvent 140 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 141 95 0 0 0 0 0\n"
+                        "RenderEvent 141 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 143 94 0 0 0 0 0\n"
+                        "RenderEvent 143 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 145 94 0 0 0 0 0\n"
+                        "RenderEvent 145 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 146 94 0 0 0 0 0\n"
+                        "RenderEvent 146 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 146 93 0 0 0 0 0\n"
+                        "RenderEvent 146 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 147 93 0 0 0 0 0\n"
+                        "RenderEvent 147 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 147 92 0 0 0 0 0\n"
+                        "RenderEvent 147 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 148 92 0 0 0 0 0\n"
+                        "RenderEvent 148 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 147 92 0 0 0 0 0\n"
+                        "RenderEvent 147 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 147 92 0 0 0 0 0\n"
+                        "RenderEvent 147 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 146 92 0 0 0 0 0\n"
+                        "RenderEvent 146 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 145 92 0 0 0 0 0\n"
+                        "RenderEvent 145 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 144 92 0 0 0 0 0\n"
+                        "RenderEvent 144 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 145 92 0 0 0 0 0\n"
+                        "RenderEvent 145 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 147 92 0 0 0 0 0\n"
+                        "RenderEvent 147 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 151 92 0 0 0 0 0\n"
+                        "RenderEvent 151 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 153 92 0 0 0 0 0\n"
+                        "RenderEvent 153 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 155 92 0 0 0 0 0\n"
+                        "RenderEvent 155 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 156 92 0 0 0 0 0\n"
+                        "RenderEvent 156 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 156 92 0 0 0 0 0\n"
+                        "RenderEvent 156 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 92 0 0 0 0 0\n"
+                        "RenderEvent 157 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 158 92 0 0 0 0 0\n"
+                        "RenderEvent 158 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 92 0 0 0 0 0\n"
+                        "RenderEvent 159 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 91 0 0 0 0 0\n"
+                        "RenderEvent 159 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 91 0 0 0 0 0\n"
+                        "RenderEvent 159 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 91 0 0 0 0 0\n"
+                        "RenderEvent 157 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 154 91 0 0 0 0 0\n"
+                        "RenderEvent 154 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 151 91 0 0 0 0 0\n"
+                        "RenderEvent 151 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 150 91 0 0 0 0 0\n"
+                        "RenderEvent 150 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 150 91 0 0 0 0 0\n"
+                        "RenderEvent 150 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 145 91 0 0 0 0 0\n"
+                        "RenderEvent 145 91 0 0 0 0 0\n"
+                        "MouseMoveEvent 142 92 0 0 0 0 0\n"
+                        "RenderEvent 142 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 140 92 0 0 0 0 0\n"
+                        "RenderEvent 140 92 0 0 0 0 0\n"
+                        "MouseMoveEvent 140 93 0 0 0 0 0\n"
+                        "RenderEvent 140 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 139 93 0 0 0 0 0\n"
+                        "RenderEvent 139 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 139 93 0 0 0 0 0\n"
+                        "RenderEvent 139 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 138 93 0 0 0 0 0\n"
+                        "RenderEvent 138 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 137 93 0 0 0 0 0\n"
+                        "RenderEvent 137 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 136 93 0 0 0 0 0\n"
+                        "RenderEvent 136 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 136 93 0 0 0 0 0\n"
+                        "RenderEvent 136 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 135 93 0 0 0 0 0\n"
+                        "RenderEvent 135 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 134 93 0 0 0 0 0\n"
+                        "RenderEvent 134 93 0 0 0 0 0\n"
+                        "LeftButtonReleaseEvent 134 93 0 0 0 0 0\n"
+                        "RenderEvent 134 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 134 93 0 0 0 0 0\n"
+                        "RenderEvent 134 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 134 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 136 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 140 93 0 0 0 0 0\n"
+                        "RenderEvent 140 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 148 93 0 0 0 0 0\n"
+                        "RenderEvent 148 93 0 0 0 0 0\n"
+                        "MouseMoveEvent 153 94 0 0 0 0 0\n"
+                        "RenderEvent 153 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 157 94 0 0 0 0 0\n"
+                        "RenderEvent 157 94 0 0 0 0 0\n"
+                        "MouseMoveEvent 159 95 0 0 0 0 0\n"
+                        "RenderEvent 159 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 160 95 0 0 0 0 0\n"
+                        "RenderEvent 160 95 0 0 0 0 0\n"
+                        "MouseMoveEvent 160 96 0 0 0 0 0\n"
+                        "RenderEvent 160 96 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 97 0 0 0 0 0\n"
+                        "RenderEvent 161 97 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 98 0 0 0 0 0\n"
+                        "RenderEvent 161 98 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 99 0 0 0 0 0\n"
+                        "RenderEvent 161 99 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 99 0 0 0 0 0\n"
+                        "RenderEvent 161 99 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 100 0 0 0 0 0\n"
+                        "RenderEvent 161 100 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 101 0 0 0 0 0\n"
+                        "RenderEvent 161 101 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 101 0 0 0 0 0\n"
+                        "RenderEvent 161 101 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 102 0 0 0 0 0\n"
+                        "RenderEvent 161 102 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 103 0 0 0 0 0\n"
+                        "RenderEvent 161 103 0 0 0 0 0\n"
+                        "MouseMoveEvent 160 103 0 0 0 0 0\n"
+                        "RenderEvent 160 103 0 0 0 0 0\n"
+                        "MouseMoveEvent 160 104 0 0 0 0 0\n"
+                        "RenderEvent 160 104 0 0 0 0 0\n"
+                        "LeftButtonPressEvent 160 104 0 0 0 0 0\n"
+                        "RenderEvent 160 104 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 104 0 0 0 0 0\n"
+                        "RenderEvent 161 104 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 104 0 0 0 0 0\n"
+                        "RenderEvent 161 104 0 0 0 0 0\n"
+                        "MouseMoveEvent 161 105 0 0 0 0 0\n"
+                        "RenderEvent 161 105 0 0 0 0 0\n"
+                        "MouseMoveEvent 163 107 0 0 0 0 0\n"
+                        "RenderEvent 163 107 0 0 0 0 0\n"
+                        "MouseMoveEvent 165 109 0 0 0 0 0\n"
+                        "RenderEvent 165 109 0 0 0 0 0\n"
+                        "MouseMoveEvent 166 110 0 0 0 0 0\n"
+                        "RenderEvent 166 110 0 0 0 0 0\n"
+                        "MouseMoveEvent 167 110 0 0 0 0 0\n"
+                        "RenderEvent 167 110 0 0 0 0 0\n"
+                        "MouseMoveEvent 168 111 0 0 0 0 0\n"
+                        "RenderEvent 168 111 0 0 0 0 0\n"
+                        "MouseMoveEvent 169 112 0 0 0 0 0\n"
+                        "RenderEvent 169 112 0 0 0 0 0\n"
+                        "MouseMoveEvent 171 113 0 0 0 0 0\n"
+                        "RenderEvent 171 113 0 0 0 0 0\n"
+                        "MouseMoveEvent 178 115 0 0 0 0 0\n"
+                        "RenderEvent 178 115 0 0 0 0 0\n"
+                        "MouseMoveEvent 183 116 0 0 0 0 0\n"
+                        "RenderEvent 183 116 0 0 0 0 0\n"
+                        "MouseMoveEvent 187 118 0 0 0 0 0\n"
+                        "RenderEvent 187 118 0 0 0 0 0\n"
+                        "MouseMoveEvent 188 120 0 0 0 0 0\n"
+                        "RenderEvent 188 120 0 0 0 0 0\n"
+                        "MouseMoveEvent 189 121 0 0 0 0 0\n"
+                        "RenderEvent 189 121 0 0 0 0 0\n"
+                        "MouseMoveEvent 190 122 0 0 0 0 0\n"
+                        "RenderEvent 190 122 0 0 0 0 0\n"
+                        "MouseMoveEvent 190 122 0 0 0 0 0\n"
+                        "RenderEvent 190 122 0 0 0 0 0\n"
+                        "MouseMoveEvent 190 123 0 0 0 0 0\n"
+                        "RenderEvent 190 123 0 0 0 0 0\n"
+                        "MouseMoveEvent 191 124 0 0 0 0 0\n"
+                        "RenderEvent 191 124 0 0 0 0 0\n"
+                        "MouseMoveEvent 191 125 0 0 0 0 0\n"
+                        "RenderEvent 191 125 0 0 0 0 0\n"
+                        "MouseMoveEvent 192 125 0 0 0 0 0\n"
+                        "RenderEvent 192 125 0 0 0 0 0\n"
+                        "MouseMoveEvent 192 126 0 0 0 0 0\n"
+                        "RenderEvent 192 126 0 0 0 0 0\n"
+                        "MouseMoveEvent 192 127 0 0 0 0 0\n"
+                        "RenderEvent 192 127 0 0 0 0 0\n"
+                        "MouseMoveEvent 193 128 0 0 0 0 0\n"
+                        "RenderEvent 193 128 0 0 0 0 0\n"
+                        "MouseMoveEvent 194 128 0 0 0 0 0\n"
+                        "RenderEvent 194 128 0 0 0 0 0\n"
+                        "MouseMoveEvent 194 128 0 0 0 0 0\n"
+                        "RenderEvent 194 128 0 0 0 0 0\n"
+                        "MouseMoveEvent 194 128 0 0 0 0 0\n"
+                        "RenderEvent 194 128 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 128 0 0 0 0 0\n"
+                        "RenderEvent 195 128 0 0 0 0 0\n"
+                        "MouseMoveEvent 195 129 0 0 0 0 0\n"
+                        "RenderEvent 195 129 0 0 0 0 0\n"
+                        "MouseMoveEvent 196 129 0 0 0 0 0\n"
+                        "RenderEvent 196 129 0 0 0 0 0\n"
+                        "MouseMoveEvent 196 129 0 0 0 0 0\n"
+                        "RenderEvent 196 129 0 0 0 0 0\n"
+                        "MouseMoveEvent 196 130 0 0 0 0 0\n"
+                        "RenderEvent 196 130 0 0 0 0 0\n"
+                        "MouseMoveEvent 197 130 0 0 0 0 0\n"
+                        "RenderEvent 197 130 0 0 0 0 0\n"
+                        "LeftButtonReleaseEvent 197 130 0 0 0 0 0\n"
+                        "RenderEvent 197 130 0 0 0 0 0\n";
 
 // This does the actual work: updates the vtkFrustum implicit function.
 // This in turn causes the pipeline to update and clip the object.
@@ -176,6 +792,7 @@ int TestImplicitFrustumWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
   vtkNew<vtkClipPolyData> clipper;
   clipper->SetInputConnection(apd->GetOutputPort());
   clipper->SetClipFunction(frustum);
+  clipper->InsideOutOn();
 
   vtkNew<vtkPolyDataMapper> selectMapper;
   selectMapper->SetInputConnection(clipper->GetOutputPort());
@@ -200,6 +817,9 @@ int TestImplicitFrustumWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
   vtkNew<vtkRenderWindowInteractor> interactor;
   renWin->SetInteractor(interactor);
 
+  renWin->Render();
+  renderer->ResetCamera();
+
   // The SetInteractor method is how 3D widgets are associated with the render
   // window interactor. Internally, SetInteractor sets up a bunch of callbacks
   // using the Command/Observer mechanism (AddObserver()).
@@ -210,6 +830,9 @@ int TestImplicitFrustumWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
   vtkNew<vtkImplicitFrustumRepresentation> rep;
   rep->SetPlaceFactor(1.25);
   rep->PlaceWidget(glyph->GetOutput()->GetBounds());
+  // position origin outside of displayed geometry, for easier interactions
+  rep->SetOrigin(-0.8, -0.8, 0);
+  rep->SetOrientation(0, 0, -45);
 
   vtkNew<vtkImplicitFrustumWidget> frustumWidget;
   frustumWidget->SetInteractor(interactor);
@@ -225,7 +848,6 @@ int TestImplicitFrustumWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
   recorder->Record();
 
   interactor->Initialize();
-  renWin->Render();
   recorder->On();
 
   interactor->Start();
@@ -238,6 +860,8 @@ int TestImplicitFrustumWidget(int vtkNotUsed(argc), char* vtkNotUsed(argv)[])
   // render the image
   interactor->Initialize();
   renWin->Render();
+  // uncomment to see cursor
+  // recorder->ShowCursorOn();
   recorder->Play();
 
   // Remove the observers so we can go interactive. Without this the "-I"
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestHandleWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestHandleWidget.png.sha512
index 5dd756a84b62ea15ffa5d2848b8031b1e3e07651..5628108698849660c0734a6737074092fd3882ba 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestHandleWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestHandleWidget.png.sha512
@@ -1 +1 @@
-23ecbcc685e765cd2c069e1880548f6dc95f426884cb2cc408ec1f9fb365211a546a79c34a8362f33ecd1f063ccd839bed7abb17749ccddcd471e51c2ba7fb45
+711643268ba8489d39a295623f21d57baf84d91389b4dea2a43e2d3c40b07b27b0ac760c224ae958592a6cf5d480be6e5410cf252d42b6251dc8d7f34d17cac9
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitAnnulusWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitAnnulusWidget.png.sha512
index c2d97cf22a76fc76e24ade2d7136e3523433204f..285d85c0181342624049e17e4653088ddc4d7e1f 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitAnnulusWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitAnnulusWidget.png.sha512
@@ -1 +1 @@
-d08529a11ab5a873120a9a09b93708821b54b315160f969fb98a78f63bea656556425efd311a583de35989350866f70f4c52d594dae3983f3c7ac30a65551613
+aee3084a490c54c62946717dfb98de553ef8d1a955881de67481845f50a6b91d2e57eecbfc7d4f952cc58e71dd1d73823fee260c3db33b2d0f1453c7e52e7eb0
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitConeWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitConeWidget.png.sha512
index 007badb037b14a869736d966f89ab5f4156cd9fe..cbc93003712ac629cca6f43a08e349d80eb0c55b 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitConeWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitConeWidget.png.sha512
@@ -1 +1 @@
-8a038446462fa9dc1cf8e5cd0aabbc423c746786e84dbb279c6bf1e29ea96105910b07230bba08628d73af52b4347d5b16ba1d9e6a8b801195240968eea8662d
+33e39faa6c4272218e6f71a01f6e5d6256430131c5099e929c63a701ae745e9b18d6a4a7313d080f5a37c5d2e8a9cd2e0b0a473b034e459fb1ef710d934b46d1
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitCylinderWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitCylinderWidget.png.sha512
index 783f1911d91ad00ffd7ee46528ff2534d6efcdbe..f53f20224b219dadbd21ab885917a147fb3925ad 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitCylinderWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitCylinderWidget.png.sha512
@@ -1 +1 @@
-c0882bb540b371ddaf85bba704df834c165770ab43ea2bd9073a2c6d0f41cc6e0d9d8944ca4d2cd8883a1e4a8e9dad7733dc591a0a160a13ac769b40f3d499e5
+716430f3245a8696d1c85cd54d322dce51d6e74424aac10f6ee5c4806366277b87dd60e3b96f1c76cd597cedf73f43c32422dafe8dd429eeeaa052aa194768d8
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitFrustumWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitFrustumWidget.png.sha512
index 4b3e9e7bdfd415c0660a76e461eb54f54c4fc12b..e20787b0171b58c3117a4fd13bbfe7fb2dbd7030 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitFrustumWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitFrustumWidget.png.sha512
@@ -1 +1 @@
-6ea0d749d77449e61e6dbfd3d1a5a78f9b89429ca014dbf5cd789873870fec0876b8e5cbf34a002483820d43cd5cd9a0f98252feaa4f2c9265b487f5664924b6
+85f5bcc6b046e215922d151bbd463f4bfe7ff73e5692ec99e56275c24de933f4ee7d90225f572833fc6086f8150ab7c9cd50c035bbe2bb6fcc844de5f11d7ec4
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b.png.sha512
index 595819f07e1a4a431b5627ea761fd0d58bdf832e..1c13e7a8659f6730cad038778c2ba1aab9a3a05c 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b.png.sha512
@@ -1 +1 @@
-e99d8e60135832acaa5bbb5ef2d76655ec1278bc44589a707f1f7fb623359de2be13b5a7e2752a9c0b778acbd00951aecac3c2c84bb7a3febe57d2e5ee794d94
+d11b06f262aebf7c291fd1076e9d49161f498524bdd1b1984e6497e4a31d16690a16b5873d240e6565f56652fea0045fbd6723058af8502f5c3508e863185b9b
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b_1.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b_1.png.sha512
deleted file mode 100644
index 70b2537ac6404b010adc227c851e26cdee07d423..0000000000000000000000000000000000000000
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b_1.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-ce2bf45a73f8db2badfa109e0f4fa093ed75fb336ebbf8aee1d8c26c0086a4431194c6dd6576fb7d14e29b6e000450de90ca277d36bd6d3aefa250da8ba88db6
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b_2.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b_2.png.sha512
deleted file mode 100644
index 4165b80fff5b0d9766b71bc215ceedae5fd98149..0000000000000000000000000000000000000000
--- a/Interaction/Widgets/Testing/Data/Baseline/TestImplicitPlaneWidget2b_2.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-4f2b31591f5d76336990aee75629875b397422683a15eadfd5ac91e1976f7d7277b6ab0b50fa409d3b6cd5ae3a9f20315e52a92a9bf814a63b90f3808f64ff53
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestPickingManagerSeedWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestPickingManagerSeedWidget.png.sha512
index 6c5ef5bc54a024092ee2b46077c5ff4f74acca02..f45f7e3084f16ee7a5908e690979cf2d947a1989 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestPickingManagerSeedWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestPickingManagerSeedWidget.png.sha512
@@ -1 +1 @@
-9edf4fbdd04b3b9369eb69f3924ee814d607551eef8b085a7e5e3588851fe743578916c06acf5b12559b13d700675a3ef528677990e4618d4facc88c169d6e1d
+be7528a79ebcc8e327821ee133b06d27e8a232bd0fc2109f36c3d18a1d4e674732586af1a33da9096b55258244fec181c6c4596455d58f202d6a4badc658991c
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget.png.sha512
index 74c4ff1ffd0e155a8834241c836ecca15cc2b1a7..d36fe84d29554e468a5aa337576ea97e44081778 100644
--- a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget.png.sha512
+++ b/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget.png.sha512
@@ -1 +1 @@
-d885b2142e3c71478dcca62f6f53dd6580dfd1186829512c2f91d0835358b5b56d57c2fe3aedda3e94003a6c18a0817461d59c2e34fe02b3621f83f62a413a30
+95d92543131a296e15235031c4c74bcfa116fe9a143066e8ff2913fe82b24dcd6fe1bbc013fee8d57221b14705e33922762cdef78c27ccbe82d7c4c3c2537a98
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_1.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_1.png.sha512
deleted file mode 100644
index 6ca42290c1cc73b21da8aac8202b967c7f5cf5ad..0000000000000000000000000000000000000000
--- a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_1.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-f82b55c992faca4b7b1080d4a0523418223382de63f8d18b4288c131bd3c8b59c7cb3380c0cdbcdad42a212bd7403a3150fbf7a9278e124637e2750ed60b76e2
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_2.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_2.png.sha512
deleted file mode 100644
index 3d38023f5d341655a13dded33569e81035b0de9b..0000000000000000000000000000000000000000
--- a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_2.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-f5e521851867c56bcf565595177c2ccc386e814e4d8e9f570fb6edafc85d2aa0706cd1254eeee02c93a3b75df6d999749e6c8911e75f81cd71cfc9e64685cff5
diff --git a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_3.png.sha512 b/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_3.png.sha512
deleted file mode 100644
index 6f71c806eb47957e94391d3e929232087bb4805e..0000000000000000000000000000000000000000
--- a/Interaction/Widgets/Testing/Data/Baseline/TestProgressBarWidget_3.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-a8af43d36e57bb197097987127a39c4f7fdfb0ef0b75bd7d8a8420944cea127a70dbbcbf8d5f1dbd0a73457e713fa1ab77ff3df9f6281886b8f8890506df02d9
diff --git a/Interaction/Widgets/vtkBoundedWidgetRepresentation.cxx b/Interaction/Widgets/vtkBoundedWidgetRepresentation.cxx
index 0e1b552a237732b91fc478d75db247c660a719a2..009e77a29db31c2ce80d4616e59e410a8da7a792 100644
--- a/Interaction/Widgets/vtkBoundedWidgetRepresentation.cxx
+++ b/Interaction/Widgets/vtkBoundedWidgetRepresentation.cxx
@@ -107,9 +107,13 @@ void vtkBoundedWidgetRepresentation::UpdateCenterAndBounds(double center[6])
 
     if (this->GetConstrainToWidgetBounds())
     {
-      // make sure that widget bounds still englobe center.
-      vtkBoundingBox centerBox(center, std::numeric_limits<double>::epsilon());
-      widgetBox.AddBox(centerBox);
+      // move box to still contains center.
+      if (!widgetBox.ContainsPoint(center))
+      {
+        double distance[3];
+        widgetBox.GetDistance(center, distance);
+        widgetBox.Translate(distance);
+      }
     }
   }
 
diff --git a/Interaction/Widgets/vtkImplicitFrustumRepresentation.cxx b/Interaction/Widgets/vtkImplicitFrustumRepresentation.cxx
index 3ec7f36c610e9471472f36c88b83eccd06e8dbc9..6531166da38d564d7b1b38fcdcc71266d73e6542 100644
--- a/Interaction/Widgets/vtkImplicitFrustumRepresentation.cxx
+++ b/Interaction/Widgets/vtkImplicitFrustumRepresentation.cxx
@@ -27,6 +27,7 @@
 #include "vtkTransform.h"
 #include "vtkTubeFilter.h"
 #include "vtkVector.h"
+#include <cmath>
 
 VTK_ABI_NAMESPACE_BEGIN
 vtkStandardNewMacro(vtkImplicitFrustumRepresentation);
@@ -805,65 +806,30 @@ void vtkImplicitFrustumRepresentation::UpdateFrustumTransform()
 
 //------------------------------------------------------------------------------
 void vtkImplicitFrustumRepresentation::AdjustHorizontalAngle(
-  const vtkVector3d& p1, const vtkVector3d& p2)
+  const vtkVector3d& vtkNotUsed(previous), const vtkVector3d& current)
 {
-  vtkVector3d delta = p2 - p1;
-  double dot = delta.Dot(this->GetRightAxis());
+  vtkVector3d edge = current - this->Origin;
+  double horizontalDistance = edge.Dot(this->GetRightAxis());
+  horizontalDistance = std::fabs(horizontalDistance);
+  const double length = edge.Norm();
 
-  /// @note: This uses a heuristic and takes into account the widget length to achieve similar
-  // results independently of the data bounds
-  // A better approach would involve calculating the angle so that the edge handle spaps to the
-  // mouse position
-  const double angleManipulationFactor = 8.;
-  double deltaAngle = delta.Norm() * angleManipulationFactor / this->Length;
+  double angle = std::asin(horizontalDistance / length);
 
-  if (dot == 0.)
-  {
-    return;
-  }
-
-  if (dot < 0.)
-  {
-    deltaAngle = -deltaAngle;
-  }
-
-  if (this->ActiveEdgeHandle == FrustumFace::Left)
-  {
-    deltaAngle = -deltaAngle;
-  }
-
-  double currentAngle = this->Frustum->GetHorizontalAngle();
-  this->Frustum->SetHorizontalAngle(currentAngle + deltaAngle);
+  this->SetHorizontalAngle(vtkMath::DegreesFromRadians(angle));
 }
 
 //------------------------------------------------------------------------------
 void vtkImplicitFrustumRepresentation::AdjustVerticalAngle(
-  const vtkVector3d& p1, const vtkVector3d& p2)
+  const vtkVector3d& vtkNotUsed(p1), const vtkVector3d& current)
 {
+  vtkVector3d edge = current - this->Origin;
+  double verticalDistance = edge.Dot(this->GetUpAxis());
+  verticalDistance = std::fabs(verticalDistance);
+  const double length = edge.Norm();
 
-  vtkVector3d delta = p2 - p1;
-  double dot = delta.Dot(this->GetUpAxis());
-
-  const double angleManipulationFactor = 8.;
-  double deltaAngle = delta.Norm() * angleManipulationFactor / this->Length;
-
-  if (dot == 0.)
-  {
-    return;
-  }
-
-  if (dot < 0.)
-  {
-    deltaAngle = -deltaAngle;
-  }
-
-  if (this->ActiveEdgeHandle == FrustumFace::Bottom)
-  {
-    deltaAngle = -deltaAngle;
-  }
+  double angle = std::asin(verticalDistance / length);
 
-  double currentAngle = this->Frustum->GetVerticalAngle();
-  this->Frustum->SetVerticalAngle(currentAngle + deltaAngle);
+  this->SetVerticalAngle(vtkMath::DegreesFromRadians(angle));
 }
 
 //------------------------------------------------------------------------------
diff --git a/Rendering/Annotation/Testing/Cxx/CMakeLists.txt b/Rendering/Annotation/Testing/Cxx/CMakeLists.txt
index 2cc3da3683e0969f843eb2e826c6c6d538ba079f..5f76033aac10f1b7a9e37b23ea41dbd3a1d051e9 100644
--- a/Rendering/Annotation/Testing/Cxx/CMakeLists.txt
+++ b/Rendering/Annotation/Testing/Cxx/CMakeLists.txt
@@ -37,7 +37,7 @@ vtk_add_test_cxx(vtkRenderingAnnotationCxxTests tests
   TestPolarAxes.cxx
   TestPolarAxes2D.cxx
   TestPolarAxes2DDefault.cxx
-  TestRadialGrid2D.cxx
+  TestRadialGrid2D.cxx,LOOSE_VALID
   TestScalarBar.cxx
   TestScalarBarAboveBelow.cxx
   TestSpiderPlotActor.cxx
diff --git a/Rendering/Annotation/Testing/Data/Baseline/TestRadialGrid2D.png.sha512 b/Rendering/Annotation/Testing/Data/Baseline/TestRadialGrid2D.png.sha512
index e7bed99e5117966c2e5b4351ed4485bb7e4aa790..34bcae120e3ae21f78a8c9af865d2a8b131617b6 100644
--- a/Rendering/Annotation/Testing/Data/Baseline/TestRadialGrid2D.png.sha512
+++ b/Rendering/Annotation/Testing/Data/Baseline/TestRadialGrid2D.png.sha512
@@ -1 +1 @@
-10f045ff77101fdd404165b7f9986693b8ef7d7027a09260fb49ff5213388113e6a428b5f3eb37fe532797f4dc59870521759542542bec0a9f1b84c7f60be951
+32fb27a36317ffa2d56617978064c6a1c4b18412cc91de3fe2967bad9d09e3c82f52cca372966f592e1c7064d947f933f731db995d224fcb0a092b6daab63188
diff --git a/Rendering/Core/vtkInteractorEventRecorder.cxx b/Rendering/Core/vtkInteractorEventRecorder.cxx
index 3062d3016f2e370a609281f15bb1adb437aab0ed..869e36d6ca63778bffad2eb1bffd769dece18c83 100644
--- a/Rendering/Core/vtkInteractorEventRecorder.cxx
+++ b/Rendering/Core/vtkInteractorEventRecorder.cxx
@@ -2,9 +2,14 @@
 // SPDX-License-Identifier: BSD-3-Clause
 #include "vtkInteractorEventRecorder.h"
 
+#include "vtkActor2D.h"
 #include "vtkCallbackCommand.h"
 #include "vtkObjectFactory.h"
+#include "vtkPolyDataMapper2D.h"
+#include "vtkRegularPolygonSource.h"
+#include "vtkRenderWindow.h"
 #include "vtkRenderWindowInteractor.h"
+#include "vtkRendererCollection.h"
 #include "vtkStringArray.h"
 
 #include <algorithm>
@@ -42,6 +47,12 @@ vtkInteractorEventRecorder::vtkInteractorEventRecorder()
 
   this->ReadFromInputString = 0;
   this->InputString = nullptr;
+
+  vtkNew<vtkRegularPolygonSource> disk;
+  disk->SetRadius(5);
+  vtkNew<vtkPolyDataMapper2D> mapper;
+  mapper->SetInputConnection(disk->GetOutputPort());
+  this->CursorActor->SetMapper(mapper);
 }
 
 //------------------------------------------------------------------------------
@@ -190,6 +201,14 @@ void vtkInteractorEventRecorder::Play()
       }
     }
 
+    if (this->ShowCursor)
+    {
+      vtkRenderWindow* win = this->Interactor->GetRenderWindow();
+      vtkRendererCollection* collec = win->GetRenderers();
+      vtkRenderer* ren = collec->GetFirstRenderer();
+      ren->AddActor(this->CursorActor);
+    }
+
     vtkDebugMacro(<< "Playing");
     this->State = vtkInteractorEventRecorder::Playing;
 
@@ -199,6 +218,14 @@ void vtkInteractorEventRecorder::Play()
     {
       this->ReadEvent(line);
     }
+
+    if (this->ShowCursor)
+    {
+      vtkRenderWindow* win = this->Interactor->GetRenderWindow();
+      vtkRendererCollection* collec = win->GetRenderers();
+      vtkRenderer* ren = collec->GetFirstRenderer();
+      ren->RemoveActor(this->CursorActor);
+    }
   }
 
   this->State = vtkInteractorEventRecorder::Start;
@@ -475,6 +502,11 @@ void vtkInteractorEventRecorder::ReadEvent(const std::string& line)
         }
       }
 
+      if (this->ShowCursor)
+      {
+        this->CursorActor->SetPosition(pos[0], pos[1]);
+      }
+
       this->Interactor->SetEventPosition(pos);
       this->Interactor->SetControlKey(ctrlKey);
       this->Interactor->SetShiftKey(shiftKey);
diff --git a/Rendering/Core/vtkInteractorEventRecorder.h b/Rendering/Core/vtkInteractorEventRecorder.h
index 83fbbc4608840ba329d18087d94ede60c288fdb8..38287ba0e4e5537fe791ba88df6077d40ef90634 100644
--- a/Rendering/Core/vtkInteractorEventRecorder.h
+++ b/Rendering/Core/vtkInteractorEventRecorder.h
@@ -32,7 +32,11 @@
 #include "vtkInteractorObserver.h"
 #include "vtkRenderingCoreModule.h" // For export macro
 
+#include "vtkNew.h" // vtkNew
+
 VTK_ABI_NAMESPACE_BEGIN
+
+class vtkActor2D;
 class vtkStringArray;
 
 // The superclass that all commands should be subclasses of
@@ -111,6 +115,19 @@ public:
   vtkGetStringMacro(InputString);
   ///@}
 
+  ///@{
+  /**
+   * Enable the display of a cursor at the played event position
+   * during `Play()` method.
+   * Cursor is hidden again at the end of the `Play()`, so last render
+   * is not impacted (baselines are preserved).
+   * Default is Off.
+   */
+  vtkSetMacro(ShowCursor, bool);
+  vtkGetMacro(ShowCursor, bool);
+  vtkBooleanMacro(ShowCursor, bool);
+  ///@}
+
 protected:
   vtkInteractorEventRecorder();
   ~vtkInteractorEventRecorder() override;
@@ -168,6 +185,9 @@ protected:
 private:
   vtkInteractorEventRecorder(const vtkInteractorEventRecorder&) = delete;
   void operator=(const vtkInteractorEventRecorder&) = delete;
+
+  bool ShowCursor = false;
+  vtkNew<vtkActor2D> CursorActor;
 };
 
 VTK_ABI_NAMESPACE_END
diff --git a/Rendering/FreeType/Testing/Cxx/CMakeLists.txt b/Rendering/FreeType/Testing/Cxx/CMakeLists.txt
index ec747014351e7b9cf708d2afe406c7b2e07bfe66..c2835464d47b41739eb1ab02ddadf4c1e0ef0501 100644
--- a/Rendering/FreeType/Testing/Cxx/CMakeLists.txt
+++ b/Rendering/FreeType/Testing/Cxx/CMakeLists.txt
@@ -4,13 +4,13 @@ set(TestMathTextFreeTypeTextRendererNoMath_ARGS
   DATA{../Data/Fonts/DejaVuSans.ttf}
 )
 vtk_add_test_cxx(vtkRenderingFreeTypeCxxTests tests
-  TestBillboardTextActor3D.cxx
+  TestBillboardTextActor3D.cxx,LOOSE_VALID
   TestFTStringToPath.cxx
   TestFlagpoleLabel.cxx
   TestFreeTypeTextMapperNoMath.cxx
   TestFreeTypeTools.cxx,NO_VALID
   TestMathTextFreeTypeTextRendererNoMath.cxx
-  TestTextActor.cxx
+  TestTextActor.cxx,LOOSE_VALID
   TestTextActorTileScaling.cxx
   TestTextActor3D.cxx,LOOSE_VALID
   TestTextActorAlphaBlending.cxx,LOOSE_VALID
@@ -18,7 +18,7 @@ vtk_add_test_cxx(vtkRenderingFreeTypeCxxTests tests
   TestTextActor3DAlphaBlending.cxx
   TestTextActor3DDepthPeeling.cxx
   TestTextActorScaleModeProp.cxx
-  TestTextMapper.cxx
+  TestTextMapper.cxx,LOOSE_VALID
   TestTextOpaquePass.cxx
   )
 
diff --git a/Rendering/FreeType/Testing/Data/Baseline/TestFTStringToPath.png.sha512 b/Rendering/FreeType/Testing/Data/Baseline/TestFTStringToPath.png.sha512
index 775c69a5b288759a9af0aba15a8867d6ee38351e..6d39bfa254b5635b633e39f1c83418361bfe1385 100644
--- a/Rendering/FreeType/Testing/Data/Baseline/TestFTStringToPath.png.sha512
+++ b/Rendering/FreeType/Testing/Data/Baseline/TestFTStringToPath.png.sha512
@@ -1 +1 @@
-5887ec8b032d7187bffbcdd82f0f90b69377865da695c7194e8e1458be8bcbfdd32bcc9a40724c05f3d05bbbdc9728f7e329d87437c4ece5dce1558523ebf517
+daaf486f5f37f349816b5d019673b235842721421007e7e1c4fc624091f6a652d686e0a07050e8bf44a590f281b0091acffd620c8abce5f7a95d3bc0f0427594
diff --git a/Rendering/Matplotlib/Testing/Cxx/CMakeLists.txt b/Rendering/Matplotlib/Testing/Cxx/CMakeLists.txt
index 9858bd35ad4855a6931575006fa2ca326ace8b54..3d072f5a6c8182b66b54e95feec4a8e5b0010888 100644
--- a/Rendering/Matplotlib/Testing/Cxx/CMakeLists.txt
+++ b/Rendering/Matplotlib/Testing/Cxx/CMakeLists.txt
@@ -12,7 +12,7 @@ if(MATPLOTLIB_FOUND)
     TestMathTextActor3D.cxx
     TestRenderString.cxx
     TestStringToPath.cxx
-    TestIndexedLookupScalarBar.cxx
+    TestIndexedLookupScalarBar.cxx,LOOSE_VALID
     TestScalarBarCombinatorics.cxx
     )
 
diff --git a/Rendering/OpenGL2/Testing/Data/Baseline/TestPBRIrradianceHDR.png.sha512 b/Rendering/OpenGL2/Testing/Data/Baseline/TestPBRIrradianceHDR.png.sha512
index 3d73766b783ac465b3f26842da52d1500a8718b4..56ee2e08c64e1dfec8e3b5b3bfa808a2c9d31e84 100644
--- a/Rendering/OpenGL2/Testing/Data/Baseline/TestPBRIrradianceHDR.png.sha512
+++ b/Rendering/OpenGL2/Testing/Data/Baseline/TestPBRIrradianceHDR.png.sha512
@@ -1 +1 @@
-5205c0355c973d52f90e5a28f53aaa9284896c87272d46f65337398559cd8e6b4b67a3d20d85f1a52259a6c822edd3f76c1b6d49ee4e395849e71df30416a24b
+8e3116a176b37f4dd421b631505d69654fabf64e58efcecb815d27ba7d882b1765ea5b9360088823d766fa931d5c24a595c265342af9971f2f67329a2603f1cc
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestCategoricalMultiBlock.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestCategoricalMultiBlock.png.sha512
index d89f161599e1ede5c38d46f35990cc3f1cf6a9c1..8431e969d02cd66f4e859f89416670b786701274 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestCategoricalMultiBlock.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestCategoricalMultiBlock.png.sha512
@@ -1 +1 @@
-b5b0a5d2970fe1914063a6b71a8b3e3b47b0a8c7c91d87c530c4fa59123eccd29dd457ed6389f3cbe4f8c90058e8e41093ff559d83f5af7d134b4228cfd892b4
+f82ed88a6f3aa28573ef175aaf656cdbfccffe2ca1801b50e718eacb5a69c71537bb48cd174262a2100646d24a796cea9e44f324e9fb12ddbb4da433af2d0111
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestGPUVolumeRayCastMapper.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestGPUVolumeRayCastMapper.png.sha512
index 3343e099c1fd45da685ab14f75d7c5fb101508a4..6d59f7bcb5eee6e391227e615ae3a1fa09746bdb 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestGPUVolumeRayCastMapper.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestGPUVolumeRayCastMapper.png.sha512
@@ -1 +1 @@
-e9bc8f1efd66a9abb45a365fe59d8734100c55abdd2c056051312959f17ca27369bb9dae816803d83d23b5f9b0c7b424e3e1516977a846504746307c924951d8
+d8b9d09c16e515cde0c6837d536e0cae94449ebe2d39d03e646cec2374dde8b5295b539b97630a64ae93c30122902a805b52505e47634a90224bbbfd2e614fd3
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayAmbient.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayAmbient.png.sha512
index 2787adfcb724739899819fcdc321c307de14e811..27108fe19a791aa6f481a47eca4288f5e05dd087 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayAmbient.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayAmbient.png.sha512
@@ -1 +1 @@
-3aa82be296aeb59198ced95daab459ff6df167253ad80ba1be71536f369ea5102ba3f0d60b72f499a8e1bf68ab73ef23fb27f842c922dc30f537d75dd2d40368
+e15e18e6ddd7a2d7aa524c1519cc25d789d98e67a8c123167fdedb95d483ceb01ae9195f1a04adf348d25fd130d2feb7a326c3dcca33db99e6705596dd21e1ae
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayCompositePolyDataMapper2.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayCompositePolyDataMapper2.png.sha512
index 81468664ee938c131903d930a8cf3b2f60bdcce9..3329d5e652db406548aaca8a09df4d6730906acb 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayCompositePolyDataMapper2.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayCompositePolyDataMapper2.png.sha512
@@ -1 +1 @@
-7912761e1f1d7fcf9eb80cdfa41c865b7b0765be7277ef6ae5b194ee9007cc684a84ebe56918d76fcfdb86e96cf6aaff5d451a6534b9c8bfea81e6bf6e34f48c
+60a61aab93d3d333a0e43b5f19532c82da65dd23e3f906c436aeedad32e50425547ed85c526c75f5c43d8707349804e7fb5717a9df3a7642934f8c08cbd6cb07
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayImplicits.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayImplicits.png.sha512
index e5bc85e1ce3c774b86d657d8107ed367d20ebdc9..839bb003d49830e3a62d9797045dcd80e0342e4c 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayImplicits.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayImplicits.png.sha512
@@ -1 +1 @@
-dbb841b05546fe97f504e38f4c78b56a1688a2dbf71f169707f70bcc9def9bf4757ec587ec7c0db8e3b98e176798c1d5ee7196d88944d5c0c2f111738c683f84
+9d1d6a6531356ba9e953bf23477403c9f5c9dfb8189b9b6250753a97c95b8deb90953f97b9889a51d7390def5948d4b811617eb504eec315911193635f80fc07
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayIsosurface.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayIsosurface.png.sha512
index 08e4550f3c3199cba43062a8467c96d206b2f3c8..14ef054417b347ef4721cd4f6fe283084a9ce70f 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayIsosurface.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayIsosurface.png.sha512
@@ -1 +1 @@
-fbe8a5dab65f39bd982cd1fc5cdc525b356f787d4bb0b61c0ccb8214fa0a2ded91bbd6c669431a866987e8e03b16a955b95afad335e3d5467b4e36ab4462829c
+ef77dd550682bd533e6f7e759f16660378562a5959822e6272b8cd36194402e4493cdc9dc7b992e69e28ed52a1d6ca329f2c5bb34296f9658532f9eb5714cfab
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayLights.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayLights.png.sha512
index 981d4b64c0872362889d444c040d5e5db9d85f31..62913c1763aad37a94ff6dce68edc366a85fa5f1 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayLights.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayLights.png.sha512
@@ -1 +1 @@
-d4d1bc4217e554da3ae3116772574d34e9d717bb1c068198729ebd971ba81eca4132ef819f44db17a790630afbafb0a5d4fb1d6033e7698c0ecd77f82932f0ab
+a78a8e508ab22a8ff69ec27549b25d84d7625ced1ccdcf19510a825962a200d2841671b07e19629dca1035c63e2ac7d0ea19521de4c912cbfdae88a5e1ccaa0e
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayTiling.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayTiling.png.sha512
index e35e1225300d22d5fe1cbea3c3154ec28781e0fe..b2774ca5146560def9aa5c2c649e4b217fc07787 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayTiling.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestOSPRayTiling.png.sha512
@@ -1 +1 @@
-e7ed435445e9c6c8c55bc411027261b493994a9795a61dee45f4a9622516565d89c982f41fd89adee0dca975cdde6d020601a1a8b8c76e77d5e49844332e2a44
+62aee5252c1c8cfab150764afae90c6351a3a2543f80275d9b914083e4bbeb26af43a094e756df5c4d09c6517c17ca70de3506594941dac84d90c75645125b62
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerBackground.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerBackground.png.sha512
index e9839b5173b3fc41bffe08cfeb694000d031f6ba..4cbd51bc856ba34748ea8f83bf3eb5c35e8d8e27 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerBackground.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerBackground.png.sha512
@@ -1 +1 @@
-24040ea56d54348dae46b3fc018ab41d81168edb29f21e4a43571ee5902c4f9cf3de649c4168b092830abdb8869e4cc108910a31dd4c88c0ed6b84ea528c6513
+1e9cd93ed121903dcf6c8837d15d9da1efeb58948376b625e2fe7e9a65c72e635b5a184e524fd5e88743ead7de672929f09505aa74e7d27ec1d5733ff9a6e029
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerShadows.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerShadows.png.sha512
index c523c67265926d6995ff8ebbef736421e79e6d3e..030d75fe159bc22a327ec679968d1790d58c591f 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerShadows.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestPathTracerShadows.png.sha512
@@ -1 +1 @@
-4daa84ea4b987b3bb04672222c8d48a99da1f0ae1baf54f789e1d5c04aa2476a1a9d00916ac9adbbcaf620e5f42085516a967550e01938dbd0d2e860bddaab99
+ff29c29891eb05f679960ae7ca3324e287808f85f4786fac4f182dae2491b071c563298c58f919de67538b1b00a7d577c9957a24c2a558fbb9b4ddc0cb1a9fd4
diff --git a/Rendering/RayTracing/Testing/Data/Baseline/TestRayTracedMolecules.png.sha512 b/Rendering/RayTracing/Testing/Data/Baseline/TestRayTracedMolecules.png.sha512
index 13f8ff6907352a37de2bbb1017587047b62c350a..52342f22f8f93d7a41c2f8f798be42859f23224c 100644
--- a/Rendering/RayTracing/Testing/Data/Baseline/TestRayTracedMolecules.png.sha512
+++ b/Rendering/RayTracing/Testing/Data/Baseline/TestRayTracedMolecules.png.sha512
@@ -1 +1 @@
-63e62f0a4103b31ebd06e667a60ae53857dee55ef26e5cbe0db43d89ec627211f9d6638662406c8a86e2ba9c32ce6032f6680aa99c1f88ac6b6b37a45b552455
+29548b7ba264a0e846a0362ff64d4026f6f2f28cf0147ce8e78ce1f6bd819316cec023c305e6fdc9c8c1913afdfbb13abb812c660ca14d6e9fb4cdfcfe2f18a5
diff --git a/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate.png.sha512 b/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate.png.sha512
index a0513c1f8706ae21183e7314b9f94daf64efffbb..df2b458d3365f69ba19795463e1ec42c6524b614 100644
--- a/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate.png.sha512
+++ b/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate.png.sha512
@@ -1 +1 @@
-e0712eb78a4fd0351fbb922a67b4125f5d8339be88530ccadfd9c5f3e48ecac0bc6e5672d980932fe6c8dd014581196cd9c95d6aa999ec5811a296e7d415f09c
+d9664d87f42045ac782710efc00e805eac28066cee00fc821538b92d2e8d2f374e2c9b7ae830979295fc568092e17a177278fd3ce9bcefa5a796d628bfa21f93
diff --git a/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate_1.png.sha512 b/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate_1.png.sha512
deleted file mode 100644
index 987432286fd6ce81cc0363c7b7a8150fa829fb5d..0000000000000000000000000000000000000000
--- a/Rendering/Volume/Testing/Data/Baseline/TestGPURayCastVolumeUpdate_1.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-08f9a9750f89d245aaa25ee9536b0b7a38feafd2f4da6e207e15b67d452a21619ac83a80247b4eeebb36b7dbc0e4dcc348fd169d5dd107d86ab5756224f9382d
diff --git a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering.png.sha512 b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering.png.sha512
index 0e5885fd6b3b7ec7d6e824a529fca9c0b64b93bf..2f443f95b008f3bc041bfb5e8d510005bcfc38fc 100644
--- a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering.png.sha512
+++ b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering.png.sha512
@@ -1 +1 @@
-30f0f805435ab24890ba2f4231e7d29d74f07db4f71c963e609dd85dbf86c173dce066827339b2e77cd95266657cdf824d45c53ecab2d7180a6e634209cf5d9a
+e229112e8e40ce7514bfbdf34367c5a32cf85c539ec9e643ad3700cdb806471136b8a73d3e3ffdd330dd7051743f58a4dd1b72da738b2e74e0c9c79ee8f782e2
diff --git a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_1.png.sha512 b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_1.png.sha512
deleted file mode 100644
index 1599bcbe06267b34df0c9dc4220b78d6968feccb..0000000000000000000000000000000000000000
--- a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_1.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-c37b139a4cc989e22ee7c7933e9ec34021cef496ffb8ddbad7ed46a68ff4b8e50402160148393628b039d2297defa98fec4a54b85f1714e0abca90e42059bc70
diff --git a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_2.png.sha512 b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_2.png.sha512
deleted file mode 100644
index 609413bbe908616fffabcd0041e6eac1ca9f4671..0000000000000000000000000000000000000000
--- a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_2.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-10664834a98d12cab003927f1047e6602f15d5a0d6d9befec844dfd9f0e73a16e66c07a5de57071936abe4acac627b8786f9207c1f2cea2734db003e3c154a63
diff --git a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_3.png.sha512 b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_3.png.sha512
deleted file mode 100644
index 537cfadc051207d02c38575ba1cf1adc266fe993..0000000000000000000000000000000000000000
--- a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_3.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-0abcd32f303e476a24fc1589f31548ab17f4381f76a7e7fde23108234d422975e96e39f71b64fbd6728586d8821cc65fa75aee4baa65fd1211c8a1be6d451f0e
diff --git a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_4.png.sha512 b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_4.png.sha512
deleted file mode 100644
index 1ae3971ef3315ae079974d56dd4e7c4c691db370..0000000000000000000000000000000000000000
--- a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastJittering_4.png.sha512
+++ /dev/null
@@ -1 +0,0 @@
-07a0e460154e43611a86a5e36f53afd87507a14fa9550273a34255f93cc7bcd5e94d2168de608ac6f2f8e3f15ad44c3134e92a75d46d515b66f12990fab928c0
diff --git a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastToggleJittering.png.sha512 b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastToggleJittering.png.sha512
index b2cfdbad9f9bdc336720cf6378f0486b2403b08d..44287f0e4bee9fe7d0030858311fd4e0ccaa373f 100644
--- a/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastToggleJittering.png.sha512
+++ b/Rendering/VolumeOpenGL2/Testing/Data/Baseline/TestGPURayCastToggleJittering.png.sha512
@@ -1 +1 @@
-f44a41afa3714c819f194b211c65cd491bf3cb36f0943989c9bcee8cbe0dcb6b7567e53605e392347f820c458321ca89b5899e73fc30decfd24d62202f5aec44
+21d288e74e70d66308295bf965e5d794e6c4a55fbe7faff65c3df454e83b40c77fd6300fa07013ce1d70ad477a853d521c4b7d77215c6f6aaef07e52bc255a89
diff --git a/Testing/Rendering/vtkRegressionTestImage.h b/Testing/Rendering/vtkRegressionTestImage.h
index ae7c178d1c57db70ff48c530a4c24dd633947027..a81271ff04f6a737b4cae4adb2c5c546a182eb4d 100644
--- a/Testing/Rendering/vtkRegressionTestImage.h
+++ b/Testing/Rendering/vtkRegressionTestImage.h
@@ -12,6 +12,12 @@
 VTK_ABI_NAMESPACE_BEGIN
 class vtkRegressionTester : public vtkTesting
 {
+public:
+  // 0.05 threshold is arbitrary but found to
+  // allow most graphics system variances to pass
+  // when they should and fail when they should
+  static constexpr double ErrorThreshold = 0.05;
+
 protected:
   vtkRegressionTester() = default;
   ~vtkRegressionTester() override = default;
@@ -21,10 +27,8 @@ private:
   void operator=(const vtkRegressionTester&) = delete;
 };
 
-// 0.05 threshold is arbitrary but found to
-// allow most graphics system variances to pass
-// when they should and fail when they should
-#define vtkRegressionTestImage(rw) vtkTesting::Test(argc, argv, rw, 0.05)
+#define vtkRegressionTestImage(rw)                                                                 \
+  vtkTesting::Test(argc, argv, rw, vtkRegressionTester::ErrorThreshold)
 
 #define vtkRegressionTestImageThreshold(rw, t) vtkTesting::Test(argc, argv, rw, t)
 
diff --git a/Testing/Rendering/vtkTestingInteractor.cxx b/Testing/Rendering/vtkTestingInteractor.cxx
index 454e15f5a1731b3564525b86303688e8a152863d..46e5701c373e4697dba97fb2df5270cae3cac542 100644
--- a/Testing/Rendering/vtkTestingInteractor.cxx
+++ b/Testing/Rendering/vtkTestingInteractor.cxx
@@ -1,8 +1,10 @@
 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
 // SPDX-License-Identifier: BSD-3-Clause
 #include "vtkTestingInteractor.h"
+
 #include "vtkMultiProcessController.h"
 #include "vtkObjectFactory.h"
+#include "vtkRegressionTestImage.h"
 #include "vtkRenderWindow.h"
 #include "vtkSmartPointer.h"
 #include "vtkTesting.h"
@@ -17,7 +19,7 @@ vtkStandardNewMacro(vtkTestingInteractor);
 vtkCxxSetSmartPointerMacro(vtkTestingInteractor, Controller, vtkMultiProcessController);
 
 int vtkTestingInteractor::TestReturnStatus = -1;
-double vtkTestingInteractor::ErrorThreshold = 10.0;
+double vtkTestingInteractor::ErrorThreshold = vtkRegressionTester::ErrorThreshold;
 std::string vtkTestingInteractor::ValidBaseline;
 std::string vtkTestingInteractor::TempDirectory;
 std::string vtkTestingInteractor::DataDirectory;
diff --git a/Views/Infovis/Testing/Cxx/CMakeLists.txt b/Views/Infovis/Testing/Cxx/CMakeLists.txt
index eb97e8b6a30543ecd0afd2a2b21083ac4bf93193..8ed53f377c155e4fc87a44067521726ad446fb58 100644
--- a/Views/Infovis/Testing/Cxx/CMakeLists.txt
+++ b/Views/Infovis/Testing/Cxx/CMakeLists.txt
@@ -12,7 +12,7 @@ vtk_add_test_cxx(vtkViewsInfovisCxxTests tests
   TestIconGlyphFilter.cxx
   TestInteractorStyleTreeMapHover.cxx
   TestNetworkViews.cxx
-  TestParallelCoordinatesView.cxx
+  TestParallelCoordinatesView.cxx,LOOSE_VALID
   TestRenderView.cxx
   TestSpanTreeLayoutStrategy.cxx
   TestTanglegramItem.cxx
diff --git a/Views/Infovis/Testing/Data/Baseline/TestParallelCoordinatesView.png.sha512 b/Views/Infovis/Testing/Data/Baseline/TestParallelCoordinatesView.png.sha512
index 4b33fbbfb3d1f6fa9a7313359efd2828dcb803c0..375d2edaf4a4a61f922e279c805d47ba97b6690d 100644
--- a/Views/Infovis/Testing/Data/Baseline/TestParallelCoordinatesView.png.sha512
+++ b/Views/Infovis/Testing/Data/Baseline/TestParallelCoordinatesView.png.sha512
@@ -1 +1 @@
-4cd09236f9ff1dc760e29656151e14b3353bde3afa6c4a2e7a7d117fa600d4c89aa29097b402f48f69940bec699ac0ff951ea7a838c7d1c13274fb226cd8ec28
+92ddb2a953d8c0fb53fba231e40a25dc655b739b0a5256e9df17fb78a04a6cd58e9db66b4dda2c6c4cecf14e78ea9260ed1f2e97471591382dd0768e51a1ecd5
diff --git a/Views/Infovis/vtkParallelCoordinatesRepresentation.cxx b/Views/Infovis/vtkParallelCoordinatesRepresentation.cxx
index cdf57af1b4303837372726a46185b4039b39f2fa..b8e403277c5880a645a4a80f4120151652dbd44f 100644
--- a/Views/Infovis/vtkParallelCoordinatesRepresentation.cxx
+++ b/Views/Infovis/vtkParallelCoordinatesRepresentation.cxx
@@ -788,8 +788,7 @@ int vtkParallelCoordinatesRepresentation::UpdatePlotProperties(vtkStringArray* i
     this->Axes[i]->SetLabelFactor(0.5);
     this->Axes[i]->TickVisibilityOff();
     this->Axes[i]->SetNumberOfLabels(this->NumberOfAxisLabels);
-    this->Axes[i]->SetTitlePosition(-.05);
-    this->Axes[i]->GetTitleTextProperty()->SetJustificationToRight();
+    this->Axes[i]->SetTitlePosition(0);
     this->Axes[i]->GetTitleTextProperty()->ItalicOff();
     this->Axes[i]->GetTitleTextProperty()->BoldOff();
     this->Axes[i]->GetLabelTextProperty()->ItalicOff();