diff --git a/ProcessLib/HC/HCFEM.h b/ProcessLib/HC/HCFEM.h
index 11c2c65aa7c5cf366b21b4cdc5728aecc34ba008..7e8a10f813da2aa11355988f65a533c5e9f673f7 100644
--- a/ProcessLib/HC/HCFEM.h
+++ b/ProcessLib/HC/HCFEM.h
@@ -257,6 +257,58 @@ public:
         }
     }
 
+    void computeSecondaryVariableConcrete(
+        double const t, std::vector<double> const& local_x) override
+    {
+        SpatialPosition pos;
+        pos.setElementID(_element.getID());
+
+        auto const& K =
+            _process_data.porous_media_properties.getIntrinsicPermeability(t,
+                                                                           pos);
+        MaterialLib::Fluid::FluidProperty::ArrayType vars;
+
+        auto const mu = _process_data.viscosity_model->getValue(vars);
+        GlobalDimMatrixType const K_over_mu = K / mu;
+
+        unsigned const n_integration_points =
+            _integration_method.getNumberOfPoints();
+
+        auto const p_nodal_values = Eigen::Map<const NodalVectorType>(
+            &local_x[ShapeFunction::NPOINTS], ShapeFunction::NPOINTS);
+
+        for (unsigned ip = 0; ip < n_integration_points; ++ip)
+        {
+            auto const& ip_data = _ip_data[ip];
+            auto const& N = ip_data.N;
+            auto const& dNdx = ip_data.dNdx;
+
+            GlobalDimVectorType velocity = -K_over_mu * dNdx * p_nodal_values;
+            if (_process_data.has_gravity)
+            {
+                double C_int_pt = 0.0;
+                double p_int_pt = 0.0;
+                NumLib::shapeFunctionInterpolate(local_x, N, C_int_pt,
+                                                 p_int_pt);
+                vars[static_cast<int>(
+                    MaterialLib::Fluid::PropertyVariableType::C)] = C_int_pt;
+                vars[static_cast<int>(
+                    MaterialLib::Fluid::PropertyVariableType::p)] = p_int_pt;
+
+                auto const rho_w = _process_data.fluid_density->getValue(vars);
+                auto const b = _process_data.specific_body_force;
+                // here it is assumed that the vector b is directed 'downwards'
+                velocity += K_over_mu * rho_w * b;
+            }
+
+            for (unsigned d = 0; d < GlobalDim; ++d)
+            {
+                _darcy_velocities[d][ip] = velocity[d];
+            }
+        }
+    }
+
+
     Eigen::Map<const Eigen::RowVectorXd> getShapeMatrix(
         const unsigned integration_point) const override
     {
diff --git a/ProcessLib/HC/HCProcess.cpp b/ProcessLib/HC/HCProcess.cpp
index cb84dc12efb98e9b73314e6a59775b9f5947d1bf..ded20583b71d74b0c015c5a9982a69e45087cb0d 100644
--- a/ProcessLib/HC/HCProcess.cpp
+++ b/ProcessLib/HC/HCProcess.cpp
@@ -98,6 +98,16 @@ void HCProcess::assembleWithJacobianConcreteProcess(
         dx_dx, M, K, b, Jac, coupling_term);
 }
 
+void HCProcess::computeSecondaryVariableConcrete(
+    double const t, GlobalVector const& x,
+    StaggeredCouplingTerm const& coupling_term)
+{
+    DBUG("Compute the Darcy velocity for HCProcess.");
+    GlobalExecutor::executeMemberOnDereferenced(
+        &HCLocalAssemblerInterface::computeSecondaryVariable,
+        _local_assemblers, *_local_to_global_index_map, t, x, coupling_term);
+}
+
 }  // namespace HC
 }  // namespace ProcessLib
 
diff --git a/ProcessLib/HC/HCProcess.h b/ProcessLib/HC/HCProcess.h
index 4e72ad050a5fd968e384a7658c997293ac3d2ddc..1addab3e2d1828151b7f944a25cdc2af4333ba8e 100644
--- a/ProcessLib/HC/HCProcess.h
+++ b/ProcessLib/HC/HCProcess.h
@@ -57,6 +57,10 @@ public:
     bool isLinear() const override { return false; }
     //! @}
 
+    void computeSecondaryVariableConcrete(
+        double const t, GlobalVector const& x,
+        StaggeredCouplingTerm const& coupling_term) override;
+
 private:
     void initializeConcreteProcess(
         NumLib::LocalToGlobalIndexMap const& dof_table,