diff --git a/dumux/freeflow/navierstokes/model.hh b/dumux/freeflow/navierstokes/model.hh
index 417604bddb29d945a44864ee461483b5e4fe9257..912a3d242aa9977823c5cbaae954a8df1ef2f611 100644
--- a/dumux/freeflow/navierstokes/model.hh
+++ b/dumux/freeflow/navierstokes/model.hh
@@ -104,10 +104,16 @@ struct NavierStokesModelTraits
     //! the indices
     using Indices = NavierStokesIndices<dim()>;
 
-    //! return the name of the primary variables
-    static std::string primaryVariableName(int pvIdx, int state = 0)
+    //! return the names of the primary variables in cells
+    static std::string primaryVariableNameCell(int pvIdx = 0, int state = 0)
     {
-        return pvIdx == 0 ? "p" : "faceVelocity";
+        return "p";
+    }
+
+    //! return the names of the primary variables on faces
+    static std::string primaryVariableNameFace(int pvIdx = 0, int state = 0)
+    {
+        return "v";
     }
 };
 
diff --git a/dumux/io/loadsolution.hh b/dumux/io/loadsolution.hh
index 1043b8ce4ae813f446d21d1b896a4150c9ad8839..dad597320e522a9b75baf42bdd391bcdaf65abae 100644
--- a/dumux/io/loadsolution.hh
+++ b/dumux/io/loadsolution.hh
@@ -123,77 +123,42 @@ auto loadSolutionFromVtkFile(const std::string fileName,
 
 /*!
  * \ingroup InputOutput
- * \brief helper function to read from a file into a solution vector
- */
-template <class SolutionVector, class PvNamesFunc>
-auto loadSolutionFromVtkFile(const std::string fileName,
-                             const VTKReader::DataType& dataType,
-                             PvNamesFunc&& pvNamesFunc,
-                             SolutionVector& sol)
--> typename std::enable_if_t<decltype(isMultiTypeBlockVector<SolutionVector>())::value, void>
-{}
-
-/*!
- * \ingroup InputOutput
- * \brief helper function to read from two files into a staggered solution vector
- */
-template <class SolutionVector, class PvNamesFunc>
-auto loadStaggeredSolutionFromVtkFiles(const std::string baseFileName,
-                                       PvNamesFunc&& pvNamesFunc,
-                                       SolutionVector& sol)
--> typename std::enable_if_t<!decltype(isMultiTypeBlockVector<SolutionVector>())::value, void>
-{}
-
-/*!
- * \ingroup InputOutput
- * \brief helper function to read from two files into a staggered solution vector
+ * \brief helper function to determine the primary variable names of a model with privar state
  */
-template <class SolutionVector, class PvNamesFunc>
-auto loadStaggeredSolutionFromVtkFiles(const std::string baseFileName,
-                                       PvNamesFunc&& pvNamesFunc,
-                                       SolutionVector& sol)
--> typename std::enable_if_t<decltype(isMultiTypeBlockVector<SolutionVector>())::value, void>
+template<class ModelTraits, class FluidSystem>
+std::string primaryVariableName(int pvIdx, int state)
 {
+    static auto numStates = (1 << ModelTraits::numPhases()) - 1;
+    const auto paramNameWithState = "LoadSolution.PriVarNamesState" + std::to_string(state);
 
-    // assume that the first component contains the cell data
-    auto& cellSol = sol[Dune::index_constant<0>{}];
-    using CellPrimaryVariables = typename std::decay_t<decltype(cellSol)>::block_type;
-    using Scalar = typename CellPrimaryVariables::field_type;
-    VTKReader cellVtk(baseFileName + ".vtu");
-    for (size_t pvIdx = 0; pvIdx < CellPrimaryVariables::dimension; ++pvIdx)
+    if (hasParam("LoadSolution.PriVarNames") && !hasParam(paramNameWithState))
     {
-        const auto vec = cellVtk.readData<std::vector<Scalar>>(pvNamesFunc(pvIdx),
-                                                               VTKReader::DataType::cellData);
-        for (size_t i = 0; i < cellSol.size(); ++i)
-            cellSol[i][pvIdx] = vec[i];
+        DUNE_THROW(Dune::NotImplemented, "please provide LoadSolution.PriVarNamesState1..." << numStates
+                   << " or remove LoadSolution.PriVarNames to use default names");
     }
-
-    // assume that the second component contains the face data
-    auto& faceSol = sol[Dune::index_constant<1>{}];
-    using FacePrimaryVariables = typename std::decay_t<decltype(faceSol)>::block_type;
-    auto nameSize = baseFileName.size();
-    // assume that baseFileName contains numbers like '-000123' in the end
-    VTKReader faceVtk(baseFileName.substr(0, nameSize - 6) + "-face" + baseFileName.substr(nameSize - 6) + ".vtp");
-    const auto vec = faceVtk.readData<std::vector<Scalar>>(pvNamesFunc(CellPrimaryVariables::dimension),
-                                                           VTKReader::DataType::pointData);
-    for (size_t i = 0; i < faceSol.size(); ++i)
-        faceSol[i][0] = std::accumulate(&vec[3*i], &vec[3*(i+1)], 0.0);
+    else if (hasParam(paramNameWithState))
+    {
+        const auto pvNames = getParam<std::vector<std::string>>(paramNameWithState);
+        return pvNames[pvIdx];
+    }
+    else
+        return ModelTraits::template primaryVariableName<FluidSystem>(pvIdx, state);
 }
 
 /*!
  * \ingroup InputOutput
- * \brief helper function to determine the primray variable names of a model with privar state
+ * \brief helper function to determine the cell primary variable names of a staggered model with privar state
  */
 template<class ModelTraits, class FluidSystem>
-std::string primaryVariableName(int pvIdx, int state)
+std::string primaryVariableNameCell(int pvIdx, int state)
 {
     static auto numStates = (1 << ModelTraits::numPhases()) - 1;
-    const auto paramNameWithState = "LoadSolution.PriVarNamesState" + std::to_string(state);
+    const auto paramNameWithState = "LoadSolution.PriVarNamesCellState" + std::to_string(state);
 
-    if (hasParam("LoadSolution.PriVarNames") && !hasParam(paramNameWithState))
+    if (hasParam("LoadSolution.PriVarNamesCell") && !hasParam(paramNameWithState))
     {
-        DUNE_THROW(Dune::NotImplemented, "please provide LoadSolution.PriVarNamesState1..." << numStates
-                   << " or remove LoadSolution.PriVarNames to use default names");
+        DUNE_THROW(Dune::NotImplemented, "please provide LoadSolution.PriVarNamesCellState1..." << numStates
+                   << " or remove LoadSolution.PriVarNamesCell to use default names");
     }
     else if (hasParam(paramNameWithState))
     {
@@ -201,12 +166,12 @@ std::string primaryVariableName(int pvIdx, int state)
         return pvNames[pvIdx];
     }
     else
-        return ModelTraits::template primaryVariableName<FluidSystem>(pvIdx, state);
+        return ModelTraits::template primaryVariableNameCell<FluidSystem>(pvIdx, state);
 }
 
 /*!
  * \ingroup InputOutput
- * \brief helper function to determine the primray variable names of a model
+ * \brief helper function to determine the primary variable names of a model
  */
 template<class ModelTraits>
 std::string primaryVariableName(int pvIdx)
@@ -220,6 +185,38 @@ std::string primaryVariableName(int pvIdx)
         return ModelTraits::primaryVariableName(pvIdx);
 }
 
+/*!
+ * \ingroup InputOutput
+ * \brief helper function to determine the cell primary variable names of a staggered model
+ */
+template<class ModelTraits>
+std::string primaryVariableNameCell(int pvIdx)
+{
+    if (hasParam("LoadSolution.PriVarNamesCell"))
+    {
+        static auto pvNames = getParam<std::vector<std::string>>("LoadSolution.PriVarNamesCell");
+        return pvNames[pvIdx];
+    }
+    else
+        return ModelTraits::primaryVariableNameCell(pvIdx);
+}
+
+/*!
+ * \ingroup InputOutput
+ * \brief helper function to determine the face primary variable names of a staggered model
+ */
+template<class ModelTraits>
+std::string primaryVariableNameFace(int pvIdx)
+{
+    if (hasParam("LoadSolution.PriVarNamesFace"))
+    {
+        static auto pvNames = getParam<std::vector<std::string>>("LoadSolution.PriVarNamesFace");
+        return pvNames[pvIdx];
+    }
+    else
+        return ModelTraits::primaryVariableNameFace(pvIdx);
+}
+
 
 /*!
  * \ingroup InputOutput
@@ -236,12 +233,13 @@ void loadSolution(const std::string& fileName,
 
     if (extension == "vtu" || extension == "vtp")
     {
-        const auto dataType = discMethod == DiscretizationMethod::box
-                              ? VTKReader::DataType::pointData : VTKReader::DataType::cellData;
+        auto dataType = discMethod == DiscretizationMethod::box ?
+                        VTKReader::DataType::pointData : VTKReader::DataType::cellData;
+        if (discMethod == DiscretizationMethod::staggered && extension == "vtp")
+            dataType = VTKReader::DataType::pointData;
+
         loadSolutionFromVtkFile(fileName, dataType, pvNamesFunc, sol);
     }
-    else if (extension == fileName && discMethod == DiscretizationMethod::staggered)
-        loadStaggeredSolutionFromVtkFiles(fileName, pvNamesFunc, sol);
     else
         DUNE_THROW(Dune::NotImplemented, "loadSolution for extension " << extension);
 }
diff --git a/test/freeflow/navierstokes/CMakeLists.txt b/test/freeflow/navierstokes/CMakeLists.txt
index cdcf5b0a93347c16868bda28471c476ae417aad9..ebdd77f2bc083cdc70a6139adc19d998a3fe603f 100644
--- a/test/freeflow/navierstokes/CMakeLists.txt
+++ b/test/freeflow/navierstokes/CMakeLists.txt
@@ -80,7 +80,7 @@ dune_add_test(NAME test_channel_navierstokes_restart
               CMD_ARGS       --script fuzzy
                              --files ${CMAKE_SOURCE_DIR}/test/references/channel-navierstokes-reference.vtu
                                      ${CMAKE_CURRENT_BINARY_DIR}/test_channel_navierstokes_restart-00001.vtu
-                             --command "${CMAKE_CURRENT_BINARY_DIR}/test_channel_navierstokes -Vtk.WriteFaceData 1 -TimeLoop.DtInitial 1 -Restart.Time 1 -Restart.File test_channel_navierstokes-00001 -Problem.Name test_channel_navierstokes_restart")
+                             --command "${CMAKE_CURRENT_BINARY_DIR}/test_channel_navierstokes -Vtk.WriteFaceData 1 -TimeLoop.DtInitial 1 -Restart.Time 1 -Restart.FileCell test_channel_navierstokes-00001.vtu -Restart.FileFace test_channel_navierstokes-face-00001.vtp  -Problem.Name test_channel_navierstokes_restart")
 
 # the restart test has to run after the test that produces the corresponding vtu file
 set_tests_properties(test_channel_navierstokes_restart PROPERTIES DEPENDS test_channel_navierstokes)
diff --git a/test/freeflow/navierstokes/test_channel.cc b/test/freeflow/navierstokes/test_channel.cc
index 57d5345763ac9c51745d83b45aebe62ea1951220..7350a12d50c31c77f124801b788c1b191ae3870c 100644
--- a/test/freeflow/navierstokes/test_channel.cc
+++ b/test/freeflow/navierstokes/test_channel.cc
@@ -142,8 +142,14 @@ int main(int argc, char** argv) try
     if (restartTime > 0)
     {
         using ModelTraits = typename GET_PROP_TYPE(TypeTag, ModelTraits);
-        auto fileName = getParam<std::string>("Restart.File");
-        loadSolution(fileName, FVGridGeometry::discMethod, primaryVariableName<ModelTraits>, x);
+
+        auto fileNameCell = getParam<std::string>("Restart.FileCell");
+        loadSolution(fileNameCell, FVGridGeometry::discMethod,
+                     primaryVariableNameCell<ModelTraits>, x[Dune::index_constant<0>{}]);
+
+        auto fileNameFace = getParam<std::string>("Restart.FileFace");
+        loadSolution(fileNameFace, FVGridGeometry::discMethod,
+                     primaryVariableNameFace<ModelTraits>, x[Dune::index_constant<1>{}]);
     }
     else
         problem->applyInitialSolution(x);