diff --git a/specific/configuration/flexible_acquisition.cpp b/specific/configuration/flexible_acquisition.cpp
index b16a83972e6a2c533218213d7ec8364a06748a8b..21911ec32085ad7dac30f50f31de8b8ae6f2166c 100644
--- a/specific/configuration/flexible_acquisition.cpp
+++ b/specific/configuration/flexible_acquisition.cpp
@@ -67,21 +67,26 @@ namespace flexible_acquisition
        // TODO: actual data mesh!
         _data_omega = Domain("supersurface") | Domain("subsurface");
 
+        _subsurface[Support::BLK] = Domain("subsurface");
+        _subsurface[Support::BND] = Domain("subsurface_bnd");
+        _supersurface[Support::BLK] = Domain("supersurface");
+        _supersurface[Support::BND] = Domain("supersurface_bnd");
 
+        // TODO: define as supersurface and subsurface
         std::string unknownRegion = "subsurface";
         gmshFem.userDefinedParameter(unknownRegion, "unknown");
         if (unknownRegion == "subsurface")
         {
-          _model_known[Support::BLK] = Domain("supersurface");
-          _model_known[Support::BND] = Domain("supersurface_bnd");
+          _model_known[Support::BLK] = _supersurface[Support::BLK];
+          _model_known[Support::BND] = _supersurface[Support::BND];
 
-          _model_unknown[Support::BLK] = Domain("subsurface");
-          _model_unknown[Support::BND] = Domain("subsurface_bnd");
+          _model_unknown[Support::BLK] = _subsurface[Support::BLK];
+          _model_unknown[Support::BND] = _subsurface[Support::BND];
         }
         else if (unknownRegion == "none")
         {
-          _model_known[Support::BLK] = Domain("supersurface") | Domain("subsurface");
-          _model_known[Support::BND] = Domain("supersurface_bnd") | Domain("subsurface_bnd");
+          _model_known[Support::BLK] = _supersurface[Support::BLK] | _subsurface[Support::BLK];
+          _model_known[Support::BND] = _supersurface[Support::BND] | _subsurface[Support::BND];
         }
         else {
             throw Exception("Invalid unknown region type: " + unknownRegion);
@@ -96,6 +101,10 @@ namespace flexible_acquisition
         /*
          * Reference model function
          */
+        // TODO: remove debugging stuff
+        setupInitialModel(parametrization, gmshFem);
+        gmshfem::post::save(_m0[0], _model_known[Support::BLK], "model_known");
+        gmshfem::post::save(_m0[0], _model_unknown[Support::BLK], "model_unknown");
 
         /*
         _m_super.resize(model_size());
@@ -436,6 +445,108 @@ namespace flexible_acquisition
         */
     }
 
+    void Configuration::setupInitialModel(const ParametrizationInterface* const parametrization, const GmshFem& gmshFem) {
+        /*
+         * Reference model function
+         */
+        _m_super.resize(model_size());
+        _m_sub.resize(model_size());
+        for (unsigned int c = 0; c < model_size(); c++)
+        {
+            ScalarPiecewiseFunction<std::complex<double>> m0;
+            std::string suffix = "c" + std::to_string(c);
+            double Rem_super, Imm_super, Rem_sub, Imm_sub;
+            if (!(
+                    gmshFem.userDefinedParameter(Rem_super, "Re(m_super" + suffix + ")") && gmshFem.userDefinedParameter(Imm_super, "Im(m_super" + suffix + ")") &&
+                    gmshFem.userDefinedParameter(Rem_sub, "Re(m_sub" + suffix + ")") && gmshFem.userDefinedParameter(Imm_sub, "Im(m_sub" + suffix + ")")))
+            {
+                throw common::Exception("A model component " + suffix + " could not be found.");
+            }
+            _m_super[c] = Rem_super + im * Imm_super;
+            _m_sub[c] = Rem_sub + im * Imm_sub;
+            _mc[c] = _m_sub[c];
+
+            m0.addFunction(_m_super[c], _supersurface[Support::BLK] | _supersurface[Support::BND] | _points);
+
+            std::string m0_type;
+            if (!gmshFem.userDefinedParameter(m0_type, "m0_type" + suffix))
+            {
+                throw Exception("Reference model type could not be found.");
+            }
+
+            if (m0_type == "file")
+            {
+                std::string path = "";
+                if (!gmshFem.userDefinedParameter(path, "m0_path" + suffix))
+                {
+                    throw common::Exception("Path to subsurface data could not be found.");
+                }
+                m0.addFunction(bilinearInterpolation(path), _subsurface[Support::BLK] | _subsurface[Support::BND]);
+            }
+            else if (m0_type == "file.pos")
+            {
+                std::string path = "";
+                if (!gmshFem.userDefinedParameter(path, "m0_path" + suffix))
+                {
+                    throw common::Exception("Path to subsurface data could not be found.");
+                }
+
+                gmsh::merge(path + suffix + ".pos");
+                ScalarFunction<std::complex<double>> mpos = probeScalarView<std::complex<double>>(c);
+
+                m0.addFunction(mpos, _subsurface[Support::BLK] | _subsurface[Support::BND]);
+            }
+            /*
+            else if (m0_type == "inverse_linear_squared")
+            {
+                double Rea_0, Ima_0;
+                if (!(
+                        gmshFem.userDefinedParameter(Rea_0, "Re(a0" + suffix + ")") && gmshFem.userDefinedParameter(Ima_0, "Im(a0" + suffix + ")")))
+                {
+                    throw common::Exception("Initial model parameter (a0) could not be found.");
+                }
+
+                double Rea_H, Ima_H;
+                if (!(
+                        gmshFem.userDefinedParameter(Rea_H, "Re(aH" + suffix + ")") && gmshFem.userDefinedParameter(Ima_H, "Im(aH" + suffix + ")")))
+                {
+                    throw common::Exception("Initial model parameter (aH) could not be found.");
+                }
+
+                ScalarFunction<std::complex<double>> num = (Rea_0 + im * Ima_0) - ((Rea_H + im * Ima_H) - (Rea_0 + im * Ima_0)) / H() * y<std::complex<double>>();
+                m0.addFunction(1. / pow(num, 2), _subsurface[Support::BLK] | _subsurface[Support::BND]);
+            }
+            else if (m0_type == "linear")
+            {
+                double Rea_0, Ima_0;
+                if (!(
+                        gmshFem.userDefinedParameter(Rea_0, "Re(a0" + suffix + ")") && gmshFem.userDefinedParameter(Ima_0, "Im(a0" + suffix + ")")))
+                {
+                    throw common::Exception("Initial model parameter (a0) could not be found.");
+                }
+
+                double Rea_H, Ima_H;
+                if (!(
+                        gmshFem.userDefinedParameter(Rea_H, "Re(aH" + suffix + ")") && gmshFem.userDefinedParameter(Ima_H, "Im(aH" + suffix + ")")))
+                {
+                    throw common::Exception("Initial model parameter (aH) could not be found.");
+                }
+
+                ScalarFunction<std::complex<double>> lin = (Rea_0 + im * Ima_0) - ((Rea_H + im * Ima_H) - (Rea_0 + im * Ima_0)) / H() * (y<std::complex<double>>() + _ymin);
+                m0.addFunction(lin, _subsurface[Support::BLK] | _subsurface[Support::BND]);
+            }*/
+            else if (m0_type == "constant")
+            {
+                m0.addFunction(_m_sub[c], _subsurface[Support::BLK] | _subsurface[Support::BND]);
+            }
+            else
+            {
+                throw common::Exception("Initial model type (" + suffix + ") " + m0_type + " is unknown.");
+            }
+            _m0.push_back(m0);
+        }
+    }
+
     std::array<unsigned int,2> Configuration::data_coordinate_to_index(double xs, double xr) const
     {
         throw Exception("Unimplemented Configuration::data_coordinate_to_index");
diff --git a/specific/configuration/flexible_acquisition.h b/specific/configuration/flexible_acquisition.h
index b8c40af0747f84092c65397cda5bc16ebea0a8cb..608b9e903ccfcd602714a9e29a12b0e78e874de7 100644
--- a/specific/configuration/flexible_acquisition.h
+++ b/specific/configuration/flexible_acquisition.h
@@ -77,10 +77,17 @@ namespace flexible_acquisition
         std::vector<std::vector<std::complex<double>>> _mi;
 */
 
+        std::array<gmshfem::domain::Domain, 2> _subsurface;
+        std::array<gmshfem::domain::Domain, 2> _supersurface;
 
+        std::vector<std::complex<double>> _m_super;
+        std::vector<std::complex<double>> _m_sub;
 
         virtual void wave_mesh() const;
         virtual void data_mesh() const;
+
+
+        void setupInitialModel(const ParametrizationInterface* const parametrization, const gmshfem::common::GmshFem& gmshFem);
     public:
         Configuration(std::string name, const ParametrizationInterface* const parametrization, const gmshfem::common::GmshFem& gmshFem);