diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
index ad9505d1ccac9df46547d39419065c76b98eb110..1aaa26808a81a59220d34249c6d59803a7e6f595 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.cpp
@@ -373,7 +373,7 @@ void NodeWiseMeshPartitioner::writeNodePropertiesBinary(
     if (property_names.empty())
         return;
 
-    std::size_t number_of_properties(property_names.size());
+    std::size_t const number_of_properties(property_names.size());
 
     const std::string fname_cfg = file_name_base +
                                   "_partitioned_node_properties_cfg" +
@@ -385,7 +385,7 @@ void NodeWiseMeshPartitioner::writeNodePropertiesBinary(
                                   std::to_string(_npartitions) + ".bin";
     std::ofstream out_val(fname_val.c_str(), std::ios::binary | std::ios::out);
 
-    out.write(reinterpret_cast<char*>(&number_of_properties),
+    out.write(reinterpret_cast<const char*>(&number_of_properties),
               sizeof(number_of_properties));
     for (auto const& name : property_names)
     {
@@ -403,21 +403,77 @@ void NodeWiseMeshPartitioner::writeNodePropertiesBinary(
                 "'%s'.",
                 name.c_str());
     }
+    out_val.close();
     unsigned long offset = 0;
     for (const auto& partition : _partitions)
     {
         MeshLib::IO::PropertyVectorPartitionMetaData pvpmd;
         pvpmd.offset = offset;
         pvpmd.number_of_tuples = partition.nodes.size();
-        INFO(
-            "Write meta data for PropertyVector: global offset %d, number "
-            "of tuples %d",
+        DBUG(
+            "Write meta data for node-based PropertyVector: global offset %d, "
+            "number of tuples %d",
             pvpmd.offset, pvpmd.number_of_tuples);
         MeshLib::IO::writePropertyVectorPartitionMetaData(out, pvpmd);
         offset += pvpmd.number_of_tuples;
     }
     out.close();
+}
+
+void NodeWiseMeshPartitioner::writeCellPropertiesBinary(
+    const std::string& file_name_base) const
+{
+    auto const& property_names(_partitioned_properties.getPropertyVectorNames(
+        MeshLib::MeshItemType::Cell));
+    if (property_names.empty())
+        return;
+
+    std::size_t const number_of_properties(property_names.size());
+
+    const std::string fname_cfg = file_name_base +
+                                  "_partitioned_cell_properties_cfg" +
+                                  std::to_string(_npartitions) + ".bin";
+    std::ofstream out(fname_cfg.c_str(), std::ios::binary | std::ios::out);
+
+    const std::string fname_val = file_name_base +
+                                  "_partitioned_cell_properties_val" +
+                                  std::to_string(_npartitions) + ".bin";
+    std::ofstream out_val(fname_val.c_str(), std::ios::binary | std::ios::out);
+
+    out.write(reinterpret_cast<const char*>(&number_of_properties),
+              sizeof(number_of_properties));
+    for (auto const& name : property_names)
+    {
+        bool success =
+            writePropertyVectorBinary<double>(name, out_val, out) ||
+            writePropertyVectorBinary<float>(name, out_val, out) ||
+            writePropertyVectorBinary<int>(name, out_val, out) ||
+            writePropertyVectorBinary<long>(name, out_val, out) ||
+            writePropertyVectorBinary<unsigned>(name, out_val, out) ||
+            writePropertyVectorBinary<unsigned long>(name, out_val, out) ||
+            writePropertyVectorBinary<std::size_t>(name, out_val, out);
+        if (!success)
+            OGS_FATAL(
+                "writeCellPropertiesBinary: Could not write PropertyVector "
+                "'%s'.",
+                name.c_str());
+    }
     out_val.close();
+    unsigned long offset = 0;
+    for (const auto& partition : _partitions)
+    {
+        MeshLib::IO::PropertyVectorPartitionMetaData pvpmd;
+        pvpmd.offset = offset;
+        pvpmd.number_of_tuples =
+            partition.regular_elements.size() + partition.ghost_elements.size();
+        DBUG(
+            "Write meta data for cell-based PropertyVector: global offset %d, "
+            "number of tuples %d",
+            pvpmd.offset, pvpmd.number_of_tuples);
+        MeshLib::IO::writePropertyVectorPartitionMetaData(out, pvpmd);
+        offset += pvpmd.number_of_tuples;
+    }
+    out.close();
 }
 
 std::tuple<std::vector<NodeWiseMeshPartitioner::IntegerType>,
@@ -575,6 +631,7 @@ void NodeWiseMeshPartitioner::writeNodesBinary(const std::string& file_name_base
 void NodeWiseMeshPartitioner::writeBinary(const std::string& file_name_base)
 {
     writeNodePropertiesBinary(file_name_base);
+    writeCellPropertiesBinary(file_name_base);
     const auto elem_integers = writeConfigDataBinary(file_name_base);
 
     const std::vector<IntegerType>& num_elem_integers
diff --git a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
index 2006aeba409747d7e1d9452927c4b492b92e5170..5b5f8fbe0ba4197fb373f25e7823e295cc09824a 100644
--- a/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
+++ b/Applications/Utils/ModelPreparation/PartitionMesh/NodeWiseMeshPartitioner.h
@@ -132,6 +132,7 @@ private:
                                     IntegerType& counter);
 
     void writeNodePropertiesBinary(std::string const& file_name_base) const;
+    void writeCellPropertiesBinary(std::string const& file_name_base) const;
 
     /// 1 copy pointers to nodes belonging to the partition part_id
     /// 2 collect non-linear element nodes belonging to the partition part_id in