diff --git a/etc/config.sh/parMetis b/etc/config.sh/parMetis
new file mode 100644
index 0000000000..000835f947
--- /dev/null
+++ b/etc/config.sh/parMetis
@@ -0,0 +1,40 @@
+#----------------------------------*-sh-*--------------------------------------
+# ========= |
+# \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+# \\ / O peration | Website: https://openfoam.org
+# \\ / A nd | Copyright (C) 2024 OpenFOAM Foundation
+# \\/ M anipulation |
+#------------------------------------------------------------------------------
+# License
+# This file is part of OpenFOAM.
+#
+# OpenFOAM is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with OpenFOAM. If not, see .
+#
+# File
+# etc/config.sh/parMetis
+#
+# Description
+# Setup file for parMetis include/libraries.
+# Sourced during wmake process only.
+#
+# Note
+# A csh version is not needed, since the values here are only sourced
+# during the wmake process
+#
+#------------------------------------------------------------------------------
+
+export PARMETIS_VERSION=parmetis-4.0.3
+export PARMETIS_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER$WM_PRECISION_OPTION$WM_LABEL_OPTION/$PARMETIS_VERSION
+
+#------------------------------------------------------------------------------
diff --git a/src/parallel/decompose/parMetis/Allwclean b/src/parallel/decompose/parMetis/Allwclean
new file mode 100755
index 0000000000..9907fc0c20
--- /dev/null
+++ b/src/parallel/decompose/parMetis/Allwclean
@@ -0,0 +1,18 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # Run from this directory
+
+. $WM_PROJECT_DIR/wmake/scripts/AllwmakeMpiLib
+
+# Get PARMETIS_VERSION, PARMETIS_ARCH_PATH
+if settings=`$WM_PROJECT_DIR/bin/foamEtcFile config.sh/parMetis`
+then
+ . $settings
+ echo " using PARMETIS_ARCH_PATH=$PARMETIS_ARCH_PATH"
+ wcleanMpiLib $PARMETIS_VERSION parMetisDecomp
+else
+ echo
+ echo " Error: no config.sh/parMetis settings"
+ echo
+fi
+
+#------------------------------------------------------------------------------
diff --git a/src/parallel/decompose/parMetis/Allwmake b/src/parallel/decompose/parMetis/Allwmake
new file mode 100755
index 0000000000..f91c8f3fc0
--- /dev/null
+++ b/src/parallel/decompose/parMetis/Allwmake
@@ -0,0 +1,24 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # Run from this directory
+
+# Parse arguments for library compilation
+. $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
+
+. $WM_PROJECT_DIR/wmake/scripts/AllwmakeMpiLib
+
+# get PARMETIS_VERSION, PARMETIS_ARCH_PATH
+if settings=`$WM_PROJECT_DIR/bin/foamEtcFile config.sh/parMetis`
+then
+ . $settings
+ echo " using PARMETIS_ARCH_PATH=$PARMETIS_ARCH_PATH"
+ if [ -r $PARMETIS_ARCH_PATH/lib/libparmetis.so ]
+ then
+ wmakeMpiLib $PARMETIS_VERSION
+ fi
+else
+ echo
+ echo " Error: no config.sh/parMetis settings"
+ echo
+fi
+
+#------------------------------------------------------------------------------
diff --git a/src/parallel/decompose/parMetis/Make/files b/src/parallel/decompose/parMetis/Make/files
new file mode 100644
index 0000000000..3d70ac1174
--- /dev/null
+++ b/src/parallel/decompose/parMetis/Make/files
@@ -0,0 +1,3 @@
+parMetis.C
+
+LIB = $(FOAM_LIBBIN)/$(FOAM_MPI)/libparMetisDecomp
diff --git a/src/parallel/decompose/parMetis/Make/options b/src/parallel/decompose/parMetis/Make/options
new file mode 100644
index 0000000000..fd73f69fc1
--- /dev/null
+++ b/src/parallel/decompose/parMetis/Make/options
@@ -0,0 +1,10 @@
+-include $(GENERAL_RULES)/mplibType
+
+EXE_INC = \
+ $(PFLAGS) $(PINC) \
+ -I$(FOAM_SRC)/Pstream/mpi/lnInclude \
+ -I$(PARMETIS_ARCH_PATH)/include \
+ -I../decompositionMethods/lnInclude
+
+LIB_LIBS = \
+ -L$(PARMETIS_ARCH_PATH)/lib -lparmetis
diff --git a/src/parallel/decompose/parMetis/parMetis.C b/src/parallel/decompose/parMetis/parMetis.C
new file mode 100644
index 0000000000..ea56e82075
--- /dev/null
+++ b/src/parallel/decompose/parMetis/parMetis.C
@@ -0,0 +1,433 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2024 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "parMetis.H"
+#include "Time.H"
+#include "globalIndex.H"
+#include "labelIOField.H"
+#include "addToRunTimeSelectionTable.H"
+
+extern "C"
+{
+ #include "parmetis.h"
+}
+
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace decompositionMethods
+{
+ defineTypeNameAndDebug(parMetis, 0);
+
+ addToRunTimeSelectionTable
+ (
+ decompositionMethod,
+ parMetis,
+ distributor
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+Foam::label Foam::decompositionMethods::parMetis::decompose
+(
+ const labelList& xadj,
+ const labelList& adjncy,
+ const pointField& cellCentres,
+ const labelList& cellWeights,
+ const labelList& faceWeights,
+ labelList& decomp
+)
+{
+ // C style numbering
+ label numFlag = 0;
+
+ // Number of weights or balance constraints
+ label nWeights = cellWeights.size()/cellCentres.size();
+
+ scalarList processorWeights;
+
+ if (processorWeights_.size())
+ {
+ if (processorWeights_.size() != nWeights*nProcessors_)
+ {
+ FatalErrorInFunction
+ << "Number of processor weights specified in parMetisCoeffs "
+ << processorWeights_.size()
+ << " does not equal number of constraints * number of domains "
+ << nWeights*nProcessors_
+ << exit(FatalError);
+ }
+
+ processorWeights = processorWeights_;
+ }
+ else
+ {
+ processorWeights.setSize(nWeights*nProcessors_, 1.0/nProcessors_);
+ }
+
+ // Imbalance tolerance
+ Field ubvec(nWeights, 1.02);
+
+ // If only one processor there is no imbalance
+ if (nProcessors_ == 1)
+ {
+ ubvec[0] = 1;
+ }
+
+ // Distribute to all processors the number of cells on each processor
+ globalIndex globalMap(cellCentres.size());
+
+ // Get the processor-cell offset table
+ labelList cellOffsets(globalMap.offsets());
+
+ // Weight info
+ label wgtFlag = 0;
+ const label* vwgtPtr = nullptr;
+ const label* adjwgtPtr = nullptr;
+
+ // Weights on vertices of graph (cells)
+ if (cellWeights.size())
+ {
+ vwgtPtr = cellWeights.begin();
+ wgtFlag += 2;
+ }
+
+ // Weights on edges of graph (faces)
+ if (faceWeights.size())
+ {
+ adjwgtPtr = faceWeights.begin();
+ wgtFlag += 1;
+ }
+
+ MPI_Comm comm = MPI_COMM_WORLD;
+
+ // Output: cell -> processor addressing
+ decomp.setSize(cellCentres.size());
+
+ // Output: the number of edges that are cut by the partitioning
+ label edgeCut = 0;
+
+ if (method_ == "kWay")
+ {
+ ParMETIS_V3_PartKway
+ (
+ cellOffsets.begin(),
+ const_cast