diff --git a/CMakeLists.txt b/CMakeLists.txt
index d46985f36c1dee7ad01b648804f570ca12f0e1b0..5ce86aefbbe5d8604550599ca069ad3515e0af1e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -320,4 +320,4 @@ install (
     FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config_install.cmake
     DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/${PROJECT_NAME}"
     RENAME ${PROJECT_NAME}Config.cmake
-    )
+    )
\ No newline at end of file
diff --git a/optimizer/Expression/Parser/evaluator.hpp b/optimizer/Expression/Parser/evaluator.hpp
index 62c579ff6e005570a2150b27d475cd6f3329d829..79274a27f6e81135315363f6d356f8836976624f 100644
--- a/optimizer/Expression/Parser/evaluator.hpp
+++ b/optimizer/Expression/Parser/evaluator.hpp
@@ -14,9 +14,9 @@
 #include <boost/assert.hpp>
 #include <boost/variant/get.hpp>
 #include <boost/variant/variant.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_function.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/phoenix/operator.hpp>
 
 #include "ast.hpp"
 #include "function.hpp"
diff --git a/optimizer/Expression/Parser/expression_def.hpp b/optimizer/Expression/Parser/expression_def.hpp
index e2f78bf5dffa58b7df69fe411355adda738e05ee..f0e984d7aa3cd578c39d4ab647237f0b41c663ef 100644
--- a/optimizer/Expression/Parser/expression_def.hpp
+++ b/optimizer/Expression/Parser/expression_def.hpp
@@ -7,8 +7,8 @@
 #include "expression.hpp"
 #include "error_handler.hpp"
 #include "annotation.hpp"
-#include <boost/spirit/include/phoenix_function.hpp>
-#include <boost/spirit/include/phoenix.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/phoenix.hpp>
 #include <boost/fusion/adapted.hpp>
 //#include <boost/spirit/include/qi_lit.hpp>
 
@@ -190,4 +190,4 @@ namespace client { namespace parser
         on_success(primary_expr,
             annotation_function(error_handler.iters)(_val, _1));
     }
-}}
\ No newline at end of file
+}}
diff --git a/optimizer/Expression/Parser/requirements.hpp b/optimizer/Expression/Parser/requirements.hpp
index 78c5d0f41ba92458b6e619fc87b3e522116e23cb..ed2bc611549b199aee239241a86dc705b3e792b2 100644
--- a/optimizer/Expression/Parser/requirements.hpp
+++ b/optimizer/Expression/Parser/requirements.hpp
@@ -12,9 +12,9 @@
 #include <set>
 #include <boost/function.hpp>
 #include <boost/shared_ptr.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_function.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/function.hpp>
+#include <boost/phoenix/operator.hpp>
 
 namespace client { namespace code_gen
 {
diff --git a/optimizer/Util/SDDSParser/array_def.hpp b/optimizer/Util/SDDSParser/array_def.hpp
index 3bf586e992ada591d81b0b0aabb55436da1cb91a..3b2301780b829d517ba044e487c05d3ee5e43468 100644
--- a/optimizer/Util/SDDSParser/array_def.hpp
+++ b/optimizer/Util/SDDSParser/array_def.hpp
@@ -19,10 +19,10 @@
 
 #include "array.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/associate.hpp b/optimizer/Util/SDDSParser/associate.hpp
index 1cd05f1829a4272aa2e75c7737f050225e3fbcb5..e4eabb22b98348d1cf6a3061db27c10531f2bd4e 100644
--- a/optimizer/Util/SDDSParser/associate.hpp
+++ b/optimizer/Util/SDDSParser/associate.hpp
@@ -23,10 +23,10 @@
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 #include <boost/fusion/include/adapt_struct.hpp>
 
 #include <list>
diff --git a/optimizer/Util/SDDSParser/associate_def.hpp b/optimizer/Util/SDDSParser/associate_def.hpp
index 6ce7d39896764e4debe227449cae18f5491b1941..01d0bb72bc9aed4ef64e748ad7f85f8347532d52 100644
--- a/optimizer/Util/SDDSParser/associate_def.hpp
+++ b/optimizer/Util/SDDSParser/associate_def.hpp
@@ -19,10 +19,10 @@
 
 #include "associate.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/column_def.hpp b/optimizer/Util/SDDSParser/column_def.hpp
index d309a27d28d643a05ce33f64520890607a80a8e3..a664943ee419524211810b4ed5588457bf892ddb 100644
--- a/optimizer/Util/SDDSParser/column_def.hpp
+++ b/optimizer/Util/SDDSParser/column_def.hpp
@@ -19,11 +19,11 @@
 
 #include "column.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_object.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/object.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/data_def.hpp b/optimizer/Util/SDDSParser/data_def.hpp
index bb3c09da4d6c0592f8fe825ba56e96629ebfd51f..c226565a67da00ba1ed71f0ca889be114394e293 100644
--- a/optimizer/Util/SDDSParser/data_def.hpp
+++ b/optimizer/Util/SDDSParser/data_def.hpp
@@ -19,10 +19,10 @@
 
 #include "data.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/description_def.hpp b/optimizer/Util/SDDSParser/description_def.hpp
index 68e1e7dca4f2adab81eaa006af671dd0733a252e..8edcb3b710da272daa78d4df417791f46bfbfb8e 100644
--- a/optimizer/Util/SDDSParser/description_def.hpp
+++ b/optimizer/Util/SDDSParser/description_def.hpp
@@ -19,10 +19,10 @@
 
 #include "description.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/file_def.hpp b/optimizer/Util/SDDSParser/file_def.hpp
index d18482961b66b75f8682f975df92ce7a78133e5c..e3255074e35208e38590b3b81d160cf4390836ce 100644
--- a/optimizer/Util/SDDSParser/file_def.hpp
+++ b/optimizer/Util/SDDSParser/file_def.hpp
@@ -19,12 +19,12 @@
 
 #include "file.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_stl.hpp>
-#include <boost/spirit/include/phoenix_object.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/stl.hpp>
+#include <boost/phoenix/object.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/include.hpp b/optimizer/Util/SDDSParser/include.hpp
index 1350f0372ba4abc63e9d90ee33d2c62ef02a3dea..385d1590d457c03e33ea552c877068f38a350b14 100644
--- a/optimizer/Util/SDDSParser/include.hpp
+++ b/optimizer/Util/SDDSParser/include.hpp
@@ -23,10 +23,10 @@
 
 #include <boost/config/warning_disable.hpp>
 #include <boost/spirit/include/qi.hpp>
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 #include <boost/fusion/include/adapt_struct.hpp>
 
 #include <list>
diff --git a/optimizer/Util/SDDSParser/include_def.hpp b/optimizer/Util/SDDSParser/include_def.hpp
index 287fcabe4fd61c631e8b47e4131a7e2051b6a67a..d8adf3f923f9277658b287de97a3a6d26961cbc8 100644
--- a/optimizer/Util/SDDSParser/include_def.hpp
+++ b/optimizer/Util/SDDSParser/include_def.hpp
@@ -19,10 +19,10 @@
 
 #include "include.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/parameter_def.hpp b/optimizer/Util/SDDSParser/parameter_def.hpp
index 70caf5944778a45c99984c44f725b8c625a4cba5..da5cea71e33eb77cd585f05b8d15c379faf3a017 100644
--- a/optimizer/Util/SDDSParser/parameter_def.hpp
+++ b/optimizer/Util/SDDSParser/parameter_def.hpp
@@ -19,11 +19,11 @@
 
 #include "parameter.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_object.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/object.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/optimizer/Util/SDDSParser/version_def.hpp b/optimizer/Util/SDDSParser/version_def.hpp
index 8a1b91079fbf6217d191bc3206925150bc946928..6b543826da913eef5d0d827cda54f513bb31a751 100644
--- a/optimizer/Util/SDDSParser/version_def.hpp
+++ b/optimizer/Util/SDDSParser/version_def.hpp
@@ -19,10 +19,10 @@
 
 #include "version.hpp"
 
-#include <boost/spirit/include/phoenix_core.hpp>
-#include <boost/spirit/include/phoenix_operator.hpp>
-#include <boost/spirit/include/phoenix_fusion.hpp>
-#include <boost/spirit/include/phoenix_bind.hpp>
+#include <boost/phoenix/core.hpp>
+#include <boost/phoenix/operator.hpp>
+#include <boost/phoenix/fusion.hpp>
+#include <boost/phoenix/bind.hpp>
 
 namespace SDDS { namespace parser
 {
diff --git a/src/Classic/AbsBeamline/Bend2D.cpp b/src/Classic/AbsBeamline/Bend2D.cpp
index 2de908f43d80f10777368f17bd49fcd3e701bf8f..e6aae5b38918ca2c75fd57c718fcbf6b5b29b664 100644
--- a/src/Classic/AbsBeamline/Bend2D.cpp
+++ b/src/Classic/AbsBeamline/Bend2D.cpp
@@ -781,7 +781,7 @@ bool Bend2D::findIdealBendParameters(double chordLength) {
 
 bool Bend2D::initializeFieldMap() {
 
-    fieldmap_m = Fieldmap::getFieldmap(fileName_m, fast_m);
+    fieldmap_m = _Fieldmap::getFieldmap(fileName_m, fast_m);
 
     if (fieldmap_m != nullptr) {
         if (fileName_m != "1DPROFILE1-DEFAULT")
@@ -947,7 +947,7 @@ void Bend2D::readFieldMap(Inform &msg) {
     msg << level2 << getName() << " using file ";
     fieldmap_m->getInfo(&msg);
 
-    Fieldmap::readMap(fileName_m);
+    _Fieldmap::readMap(fileName_m);
     fieldmap_m->get1DProfile1EntranceParam(entranceParameter1_m,
                                            entranceParameter2_m,
                                            entranceParameter3_m);
diff --git a/src/Classic/AbsBeamline/BendBase.h b/src/Classic/AbsBeamline/BendBase.h
index 9e5d8d0a9a3c4c8158d107c207f03e2c2fff26d6..16fff1a7538f5b226066d47bf13056295842582e 100644
--- a/src/Classic/AbsBeamline/BendBase.h
+++ b/src/Classic/AbsBeamline/BendBase.h
@@ -2,11 +2,11 @@
 #define CLASSIC_BENDBASE_H
 
 #include "AbsBeamline/Component.h"
+#include "Fields/Definitions.h"
 
 #include <vector>
 #include <string>
 
-class Fieldmap;
 
 class BendBase: public Component {
 public:
@@ -53,7 +53,7 @@ protected:
     double angle_m;         ///< Bend angle
     double entranceAngle_m; ///< Angle between incoming reference trajectory
                             ///< and the entrance face of the magnet (radians).
-    Fieldmap *fieldmap_m;      ///< Magnet field map.
+    Fieldmap fieldmap_m;      ///< Magnet field map.
     const bool fast_m = false; ///< Flag to turn on fast field calculation.
 
     double gap_m; ///< Full vertical gap of the magnets.
@@ -144,4 +144,4 @@ std::string BendBase::getFieldMapFN() const {
 }
 
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/Classic/AbsBeamline/CCollimator.cpp b/src/Classic/AbsBeamline/CCollimator.cpp
index 9932b6bf605806990a88748ab58dd703a64ff4fd..dd96626abcfae960c17904d51a06d2f5b17b2070 100644
--- a/src/Classic/AbsBeamline/CCollimator.cpp
+++ b/src/Classic/AbsBeamline/CCollimator.cpp
@@ -153,7 +153,7 @@ void CCollimator::doFinalise() {
 void CCollimator::print() {
     if (RefPartBunch_m == nullptr) {
         if (!informed_m) {
-            std::string errormsg = Fieldmap::typeset_msg("BUNCH SIZE NOT SET", "warning");
+            std::string errormsg = _Fieldmap::typeset_msg("BUNCH SIZE NOT SET", "warning");
             ERRORMSG(errormsg << endl);
             if (Ippl::myNode() == 0) {
                 std::ofstream omsg("errormsg.txt", std::ios_base::app);
diff --git a/src/Classic/AbsBeamline/Cyclotron.cpp b/src/Classic/AbsBeamline/Cyclotron.cpp
index f59cbe8df81b0d6cd8178f37fc44201c7dc1cb77..7ac45c785d0f6b843b8f4c0e5301eac877f17389 100644
--- a/src/Classic/AbsBeamline/Cyclotron.cpp
+++ b/src/Classic/AbsBeamline/Cyclotron.cpp
@@ -477,7 +477,7 @@ bool Cyclotron::apply(const Vector_t& R, const Vector_t& /*P*/,
     }
 
     //The RF field is supposed to be sampled on a cartesian grid
-    std::vector<Fieldmap *>::const_iterator fi  = RFfields_m.begin();
+    std::vector<Fieldmap>::const_iterator fi  = RFfields_m.begin();
     std::vector<double>::const_iterator rffi    = rffrequ_m.begin();
     std::vector<double>::const_iterator rfphii  = rfphi_m.begin();
     std::vector<double>::const_iterator escali  = escale_m.begin();
@@ -1404,7 +1404,7 @@ void Cyclotron::getFieldFromFile_BandRF(const double& scaleFactor) {
     // read 3D E&B field data file
     // loop over all field maps and superpose fields
     for (auto& fm: RFfilename_m) {
-        Fieldmap *f = Fieldmap::getFieldmap(fm, false);
+        Fieldmap f = _Fieldmap::getFieldmap(fm, false);
         *gmsg << "* Reading '" << fm << "'" << endl;
         f->readMap();
         RFfields_m.push_back(f);
@@ -1431,7 +1431,7 @@ void Cyclotron::getFieldFromFile_Synchrocyclotron(const double& scaleFactor) {
     *gmsg << "* ------------------------------------------------------------" << endl;
 
     for (; fm != RFfilename_m.end(); ++fm, ++rffcfni, ++rfvcfni, ++fcount) {
-        Fieldmap *f = Fieldmap::getFieldmap(*fm, false);
+        Fieldmap f = _Fieldmap::getFieldmap(*fm, false);
         f->readMap();
         // if (IPPL::Comm->getOutputLevel() != 0) f->getInfo(gmsg);
         RFfields_m.push_back(f);
diff --git a/src/Classic/AbsBeamline/Cyclotron.h b/src/Classic/AbsBeamline/Cyclotron.h
index 5690f2460232ea139971ca99fff1f9b65271e966..156388a325544fc7c465f203a26cdaed23c4fafd 100644
--- a/src/Classic/AbsBeamline/Cyclotron.h
+++ b/src/Classic/AbsBeamline/Cyclotron.h
@@ -27,11 +27,11 @@
 #define CLASSIC_Cyclotron_HH
 
 #include "AbsBeamline/Component.h"
+#include "Fields/Definitions.h"
 
 #include <string>
 #include <vector>
 
-class Fieldmap;
 class LossDataSink;
 class TrimCoil;
 
@@ -283,8 +283,8 @@ private:
     void operator=(const Cyclotron &) = delete;
 
     // RF field map handler
-    //    Fieldmap *RFfield;
-    std::vector<Fieldmap*> RFfields_m;
+    //    Fieldmap RFfield;
+    std::vector<Fieldmap> RFfields_m;
     std::vector<std::string> RFfilename_m;
     std::vector<std::string> RFFCoeff_fn_m;
     std::vector<std::string> RFVCoeff_fn_m;
@@ -302,4 +302,4 @@ protected:
     BPositions BP_m;
 };
 
-#endif // CLASSIC_Cyclotron_HH
+#endif // CLASSIC_Cyclotron_HH
\ No newline at end of file
diff --git a/src/Classic/AbsBeamline/FlexibleCollimator.cpp b/src/Classic/AbsBeamline/FlexibleCollimator.cpp
index bb9d451196263cfe22ba2ce3fb1559ad1fd7b345..0cc38c1ef3b665e2a4f1cca14d89902174d3fc45 100644
--- a/src/Classic/AbsBeamline/FlexibleCollimator.cpp
+++ b/src/Classic/AbsBeamline/FlexibleCollimator.cpp
@@ -172,7 +172,7 @@ void FlexibleCollimator::goOnline(const double&) {
 void FlexibleCollimator::print() {
     if (RefPartBunch_m == nullptr) {
         if (!informed_m) {
-            std::string errormsg = Fieldmap::typeset_msg("BUNCH SIZE NOT SET", "warning");
+            std::string errormsg = _Fieldmap::typeset_msg("BUNCH SIZE NOT SET", "warning");
             ERRORMSG(errormsg << endl);
             if (Ippl::myNode() == 0) {
                 std::ofstream omsg("errormsg.txt", std::ios_base::app);
diff --git a/src/Classic/AbsBeamline/Multipole.h b/src/Classic/AbsBeamline/Multipole.h
index 4fe440f728a17797567f3c48d0ce74e75142023f..c1a2b86a121dc9b21ca25cab054653d9a8da96aa 100644
--- a/src/Classic/AbsBeamline/Multipole.h
+++ b/src/Classic/AbsBeamline/Multipole.h
@@ -22,10 +22,10 @@
 #include "AbsBeamline/Component.h"
 #include "BeamlineGeometry/StraightGeometry.h"
 #include "Fields/BMultipoleField.h"
+#include "Fields/Definitions.h"
 
 template <class T, unsigned Dim>
 class PartBunchBase;
-class Fieldmap;
 
 // Class Multipole
 // ------------------------------------------------------------------------
diff --git a/src/Classic/AbsBeamline/RBend3D.cpp b/src/Classic/AbsBeamline/RBend3D.cpp
index 663af4682a6b6f485e4e921d0ee2ce065b17841c..afea627b06f45b6e1b7e826e47b76b44d4141f9b 100644
--- a/src/Classic/AbsBeamline/RBend3D.cpp
+++ b/src/Classic/AbsBeamline/RBend3D.cpp
@@ -95,7 +95,7 @@ void RBend3D::initialise(PartBunchBase<double, 3> *bunch, double &startField, do
 
     RefPartBunch_m = bunch;
 
-    fieldmap_m = Fieldmap::getFieldmap(fileName_m, fast_m);
+    fieldmap_m = _Fieldmap::getFieldmap(fileName_m, fast_m);
     if(fieldmap_m != nullptr) {
         msg << level2 << getName() << " using file ";
         fieldmap_m->getInfo(&msg);
@@ -189,12 +189,12 @@ void RBend3D::finalise()
 {}
 
 void RBend3D::goOnline(const double &) {
-    Fieldmap::readMap(fileName_m);
+    _Fieldmap::readMap(fileName_m);
     online_m = true;
 }
 
 void RBend3D::goOffline() {
-    Fieldmap::freeMap(fileName_m);
+    _Fieldmap::freeMap(fileName_m);
     online_m = false;
 }
 
diff --git a/src/Classic/AbsBeamline/RBend3D.h b/src/Classic/AbsBeamline/RBend3D.h
index ef1904dcbb487d6cbea419bc4b054bf5291724f3..ba0003eae00a06775f76984ec4cdbfadbd47b8a2 100644
--- a/src/Classic/AbsBeamline/RBend3D.h
+++ b/src/Classic/AbsBeamline/RBend3D.h
@@ -24,10 +24,10 @@
 #include "AbsBeamline/BendBase.h"
 #include "BeamlineGeometry/StraightGeometry.h"
 #include "Fields/BMultipoleField.h"
+#include "Fields/Definitions.h"
 
 template <class T, unsigned Dim>
 class PartBunchBase;
-class Fieldmap;
 class MeshData;
 
 // Class RBend3D
@@ -109,4 +109,4 @@ double RBend3D::getExitAngle() const {
     return getBendAngle() - getEntranceAngle();
 }
 
-#endif // CLASSIC_RBend3D_HH
+#endif // CLASSIC_RBend3D_HH
\ No newline at end of file
diff --git a/src/Classic/AbsBeamline/RFCavity.cpp b/src/Classic/AbsBeamline/RFCavity.cpp
index 7db8e49819c9eaee96db88b83886f0c4e53f6905..da8249adcf335ab18466de14b0f5816eb898ff7f 100644
--- a/src/Classic/AbsBeamline/RFCavity.cpp
+++ b/src/Classic/AbsBeamline/RFCavity.cpp
@@ -178,7 +178,7 @@ void RFCavity::initialise(PartBunchBase<double, 3>* bunch, double& startField, d
     std::stringstream errormsg;
     RefPartBunch_m = bunch;
 
-    fieldmap_m = Fieldmap::getFieldmap(filename_m, fast_m);
+    fieldmap_m = _Fieldmap::getFieldmap(filename_m, fast_m);
     fieldmap_m->getFieldDimensions(startField_m, endField);
     if (endField <= startField_m) {
         throw GeneralClassicException("RFCavity::initialise",
@@ -191,7 +191,7 @@ void RFCavity::initialise(PartBunchBase<double, 3>* bunch, double& startField, d
         errormsg << "FREQUENCY IN INPUT FILE DIFFERENT THAN IN FIELD MAP '" << filename_m << "';\n"
                  << frequency_m / Physics::two_pi * Units::Hz2MHz << " MHz <> "
                  << fieldmap_m->getFrequency() / Physics::two_pi * Units::Hz2MHz << " MHz; TAKE ON THE LATTER";
-        std::string errormsg_str = Fieldmap::typeset_msg(errormsg.str(), "warning");
+        std::string errormsg_str = _Fieldmap::typeset_msg(errormsg.str(), "warning");
         ERRORMSG(errormsg_str << "\n" << endl);
         if (Ippl::myNode() == 0) {
             std::ofstream omsg("errormsg.txt", std::ios_base::app);
@@ -252,13 +252,13 @@ bool RFCavity::bends() const {
 }
 
 void RFCavity::goOnline(const double&) {
-    Fieldmap::readMap(filename_m);
+    _Fieldmap::readMap(filename_m);
 
     online_m = true;
 }
 
 void RFCavity::goOffline() {
-    Fieldmap::freeMap(filename_m);
+    _Fieldmap::freeMap(filename_m);
 
     online_m = false;
 }
diff --git a/src/Classic/AbsBeamline/RFCavity.h b/src/Classic/AbsBeamline/RFCavity.h
index d082ab5ee9706a6bd8fba7c570d6865b183ef9ad..30f1b408c25f577d70f602ecd5d31736b1b96a61 100644
--- a/src/Classic/AbsBeamline/RFCavity.h
+++ b/src/Classic/AbsBeamline/RFCavity.h
@@ -21,14 +21,13 @@
 #include "AbsBeamline/Component.h"
 #include "Algorithms/AbstractTimeDependence.h"
 #include "Physics/Physics.h"
+#include "Fields/Definitions.h"
 
 #include <boost/bimap.hpp>
 
 #include <cmath>
 #include <string>
 
-class Fieldmap;
-
 enum class CavityType: unsigned short {
     SW,
     SGSW
@@ -215,7 +214,7 @@ protected:
 
     double designEnergy_m;
 
-    Fieldmap* fieldmap_m;
+    Fieldmap fieldmap_m;
     double startField_m;         /**< starting point of field(m)*/
 
 private:
@@ -495,4 +494,4 @@ CoordinateSystemTrafo RFCavity::getEdgeToEnd() const {
     return ret;
 }
 
-#endif // CLASSIC_RFCavity_HH
+#endif // CLASSIC_RFCavity_HH
\ No newline at end of file
diff --git a/src/Classic/AbsBeamline/Solenoid.cpp b/src/Classic/AbsBeamline/Solenoid.cpp
index c4a94ecb7b85cb71fe33df5e715d33bc770bd6b3..3da9169dc8f1da7188de79658699d200204796bf 100644
--- a/src/Classic/AbsBeamline/Solenoid.cpp
+++ b/src/Classic/AbsBeamline/Solenoid.cpp
@@ -60,7 +60,7 @@ Solenoid::Solenoid(const std::string &name):
 
 
 Solenoid::~Solenoid() {
-    //    Fieldmap::deleteFieldmap(filename_m);
+    //    _Fieldmap::deleteFieldmap(filename_m);
 }
 
 
@@ -121,7 +121,7 @@ void Solenoid::initialise(PartBunchBase<double, 3> *bunch, double &startField, d
 
     RefPartBunch_m = bunch;
 
-    myFieldmap_m = Fieldmap::getFieldmap(filename_m, fast_m);
+    myFieldmap_m = _Fieldmap::getFieldmap(filename_m, fast_m);
 
     if(myFieldmap_m != nullptr) {
         msg << level2 << getName() << " using file ";
@@ -147,12 +147,12 @@ bool Solenoid::bends() const {
 
 
 void Solenoid::goOnline(const double &) {
-    Fieldmap::readMap(filename_m);
+    _Fieldmap::readMap(filename_m);
     online_m = true;
 }
 
 void Solenoid::goOffline() {
-    Fieldmap::freeMap(filename_m);
+    _Fieldmap::freeMap(filename_m);
     online_m = false;
 }
 
diff --git a/src/Classic/AbsBeamline/Solenoid.h b/src/Classic/AbsBeamline/Solenoid.h
index e0a72a6332eda60da1f3904402de16e9d21d1827..6281ac33ce77276320cb44c5744366a71c2782e8 100644
--- a/src/Classic/AbsBeamline/Solenoid.h
+++ b/src/Classic/AbsBeamline/Solenoid.h
@@ -22,10 +22,10 @@
 // ------------------------------------------------------------------------
 
 #include "AbsBeamline/Component.h"
+#include "Fields/Definitions.h"
 
 template <class T, unsigned Dim>
 class PartBunchBase;
-class Fieldmap;
 
 // Class Solenoid
 // ------------------------------------------------------------------------
@@ -91,7 +91,7 @@ private:
 
     //  std::string name;                   /**< The name of the object*/
     std::string filename_m;               /**< The name of the inputfile*/
-    Fieldmap *myFieldmap_m;
+    Fieldmap myFieldmap_m;
     double scale_m;                /**< scale multiplier*/
     double scaleError_m;                /**< scale multiplier error*/
 
@@ -121,4 +121,4 @@ CoordinateSystemTrafo Solenoid::getEdgeToEnd() const
 
     return ret;
 }
-#endif // CLASSIC_Solenoid_HH
\ No newline at end of file
+#endif // CLASSIC_Solenoid_HH
diff --git a/src/Classic/AbsBeamline/TravelingWave.cpp b/src/Classic/AbsBeamline/TravelingWave.cpp
index 0f3ba3307a3aeab7eeb9e97e049e25f394a1ece6..ee58fac91f3d93cf55db55f92792180117a760d1 100644
--- a/src/Classic/AbsBeamline/TravelingWave.cpp
+++ b/src/Classic/AbsBeamline/TravelingWave.cpp
@@ -237,12 +237,12 @@ bool TravelingWave::bends() const {
 }
 
 void TravelingWave::goOnline(const double&) {
-    Fieldmap::readMap(filename_m);
+    _Fieldmap::readMap(filename_m);
     online_m = true;
 }
 
 void TravelingWave::goOffline() {
-    Fieldmap::freeMap(filename_m);
+    _Fieldmap::freeMap(filename_m);
 }
 
 void TravelingWave::getDimensions(double& zBegin, double& zEnd) const {
diff --git a/src/Classic/AbsBeamline/TravelingWave.h b/src/Classic/AbsBeamline/TravelingWave.h
index 4e68b69c88269abbaf0d6221e5a60a0d14a1a1ee..a3096afcec8cb735eb730d5f318b7cd0f6d91d34 100644
--- a/src/Classic/AbsBeamline/TravelingWave.h
+++ b/src/Classic/AbsBeamline/TravelingWave.h
@@ -20,11 +20,10 @@
 
 #include "AbsBeamline/RFCavity.h"
 #include "Physics/Physics.h"
+#include "Fields/Definitions.h"
 
 #include <cmath>
 
-class Fieldmap;
-
 class TravelingWave: public RFCavity {
 
 public:
@@ -220,4 +219,4 @@ CoordinateSystemTrafo TravelingWave::getEdgeToEnd() const {
     return ret;
 }
 
-#endif // CLASSIC_TravelingWave_HH
+#endif // CLASSIC_TravelingWave_HH
\ No newline at end of file
diff --git a/src/Classic/AbsBeamline/VariableRFCavity.h b/src/Classic/AbsBeamline/VariableRFCavity.h
index e9f85284b782f9a272b95633616a1ebb153c563c..12753d0a699d244cbed5043d7e7c9d9a75e18b2d 100644
--- a/src/Classic/AbsBeamline/VariableRFCavity.h
+++ b/src/Classic/AbsBeamline/VariableRFCavity.h
@@ -32,8 +32,8 @@
 #include "Fields/EMField.h"
 #include "BeamlineGeometry/StraightGeometry.h"
 #include "AbsBeamline/Component.h"
+#include "Fields/Definitions.h"
 
-class Fieldmap;
 
 /** @class VariableRFCavity
  *
@@ -261,4 +261,4 @@ void VariableRFCavity::setWidth(double fullWidth) {
 
 
 
-#endif // CLASSIC_VirtualRFCavity_HH
+#endif // CLASSIC_VirtualRFCavity_HH
\ No newline at end of file
diff --git a/src/Classic/AbsBeamline/VariableRFCavityFringeField.h b/src/Classic/AbsBeamline/VariableRFCavityFringeField.h
index 9d2ceb29f67b98f8c8b2b060ceff0214688ceda2..ae848c0a8682172c2a57bd362c4d2cde7bb35829 100644
--- a/src/Classic/AbsBeamline/VariableRFCavityFringeField.h
+++ b/src/Classic/AbsBeamline/VariableRFCavityFringeField.h
@@ -30,8 +30,8 @@
 
 #include <iostream>
 #include "AbsBeamline/VariableRFCavity.h"
+#include "Fields/Definitions.h"
 
-class Fieldmap;
 namespace endfieldmodel {
     class EndFieldModel;
 }
@@ -52,7 +52,7 @@ namespace endfieldmodel {
  *  VariableRFCavity.
  *
  *  Set/get methods use metres; but internally we store as mm (for tracking)
- * 
+ *
  *  Field units are kG and GV/mm
  */
 class VariableRFCavityFringeField : public VariableRFCavity {
@@ -66,7 +66,7 @@ class VariableRFCavityFringeField : public VariableRFCavity {
     /** Assignment operator; performs deepcopy on time-dependence models*/
     VariableRFCavityFringeField& operator=(const VariableRFCavityFringeField &);
     /** Destructor does nothing
-     * 
+     *
      * The shared_ptrs will self-destruct when reference count goes to 0
      */
     virtual ~VariableRFCavityFringeField();
@@ -81,7 +81,7 @@ class VariableRFCavityFringeField : public VariableRFCavity {
     /** Inheritable deepcopy method */
     virtual ElementBase* clone() const override;
 
-    /** Calculate the field at the position of the i^th particle 
+    /** Calculate the field at the position of the i^th particle
      *
      *  @param i indexes the particle whose field we need
      *  @param t the time at which the field is calculated
@@ -126,7 +126,7 @@ class VariableRFCavityFringeField : public VariableRFCavity {
                        (std::shared_ptr<endfieldmodel::EndFieldModel> endField);
 
     /** Get the endFieldModel
-     * 
+     *
      *  @returns the endFieldModel; VariableRFCavityFringe retains ownership of
      *  the memory allocated to the endFieldModel.
      */
@@ -134,7 +134,7 @@ class VariableRFCavityFringeField : public VariableRFCavity {
                                                             getEndField() const;
 
     /** Initialise ready for tracking
-     * 
+     *
      *  Does any setup on VirtualRFCavity and sets field expansion coefficients
      */
     virtual void initialise(PartBunchBase<double, 3> *bunch,
@@ -207,4 +207,4 @@ std::vector<std::vector<double> >
     return h_m;
 }
 
-#endif // #ifdef CLASSIC_VirtualRFCavityFringeField_HH
+#endif // #ifdef CLASSIC_VirtualRFCavityFringeField_HH
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DDynamic.cpp b/src/Classic/Fields/Astra1DDynamic.cpp
index 607995e96ed17dae32becf6f31ad310d42e91bb6..61690ad841ca25f18a7ad4a0d41603ae721546e1 100644
--- a/src/Classic/Fields/Astra1DDynamic.cpp
+++ b/src/Classic/Fields/Astra1DDynamic.cpp
@@ -13,8 +13,8 @@
 #include <ios>
 
 
-Astra1DDynamic::Astra1DDynamic(std::string aFilename):
-    Fieldmap(aFilename),
+_Astra1DDynamic::_Astra1DDynamic(const std::string& filename):
+    _Fieldmap(filename),
     FourCoefs_m(nullptr) {
 
     std::ifstream file;
@@ -41,7 +41,7 @@ Astra1DDynamic::Astra1DDynamic(std::string aFilename):
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("Astra1DDynamic::Astra1DDynamic",
+                throw GeneralClassicException("_Astra1DDynamic::_Astra1DDynamic",
                                               "The third string on the first line of 1D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -69,7 +69,7 @@ Astra1DDynamic::Astra1DDynamic(std::string aFilename):
         if (!parsing_passed && !file.eof()) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("Astra1DDynamic::Astra1DDynamic",
+            throw GeneralClassicException("_Astra1DDynamic::_Astra1DDynamic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         } else {
             // conversion from MHz to Hz and from frequency to angular frequency
@@ -85,11 +85,16 @@ Astra1DDynamic::Astra1DDynamic(std::string aFilename):
     }
 }
 
-Astra1DDynamic::~Astra1DDynamic() {
+_Astra1DDynamic::~_Astra1DDynamic() {
     freeMap();
 }
 
-void Astra1DDynamic::readMap() {
+Astra1DDynamic _Astra1DDynamic::create(const std::string& filename)
+{
+    return Astra1DDynamic(new _Astra1DDynamic(filename));
+}
+
+void _Astra1DDynamic::readMap() {
     if (FourCoefs_m == nullptr) {
         // declare variables and allocate memory
     	std::ifstream in;
@@ -173,16 +178,14 @@ void Astra1DDynamic::readMap() {
     }
 }
 
-void Astra1DDynamic::freeMap() {
+void _Astra1DDynamic::freeMap() {
     if (FourCoefs_m != nullptr) {
         delete[] FourCoefs_m;
         FourCoefs_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << endl);
     }
 }
 
-bool Astra1DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
+bool _Astra1DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
     // do fourier interpolation in z-direction
     const double RR2 = R(0) * R(0) + R(1) * R(1);
 
@@ -223,7 +226,7 @@ bool Astra1DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &
     return false;
 }
 
-bool Astra1DDynamic::getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _Astra1DDynamic::getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     const double kz = Physics::two_pi * (R(2) - zbegin_m) / length_m + Physics::pi;
     double ezp = 0.0;
 
@@ -236,29 +239,29 @@ bool Astra1DDynamic::getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t
     return false;
 }
 
-void Astra1DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _Astra1DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
 
-void Astra1DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _Astra1DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void Astra1DDynamic::swap()
+void _Astra1DDynamic::swap()
 { }
 
-void Astra1DDynamic::getInfo(Inform *msg) {
+void _Astra1DDynamic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D dynamic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double Astra1DDynamic::getFrequency() const {
+double _Astra1DDynamic::getFrequency() const {
     return frequency_m;
 }
 
-void Astra1DDynamic::setFrequency(double freq) {
+void _Astra1DDynamic::setFrequency(double freq) {
     frequency_m = freq;
 }
 
-void Astra1DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
+void _Astra1DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
     double Ez_max = 0.0;
     double tmpDouble;
     int tmpInt;
diff --git a/src/Classic/Fields/Astra1DDynamic.h b/src/Classic/Fields/Astra1DDynamic.h
index 89d661a3a1f6a7e95ab42546d7e3b844f7a86077..583a40628e8a7a8317d0774f1ec07e53a6a41923 100644
--- a/src/Classic/Fields/Astra1DDynamic.h
+++ b/src/Classic/Fields/Astra1DDynamic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class Astra1DDynamic: public Fieldmap {
+class _Astra1DDynamic: public _Fieldmap {
 
 public:
+    virtual ~_Astra1DDynamic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
@@ -18,8 +20,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    Astra1DDynamic(std::string aFilename);
-    ~Astra1DDynamic();
+    _Astra1DDynamic(const std::string& filename);
+
+    static Astra1DDynamic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -36,12 +39,14 @@ private:
     int accuracy_m;
     int num_gridpz_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool Astra1DDynamic::isInside(const Vector_t &r) const
+inline bool _Astra1DDynamic::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m;
 }
 
-#endif
+using Astra1DDynamic = std::shared_ptr<_Astra1DDynamic>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DDynamic_fast.cpp b/src/Classic/Fields/Astra1DDynamic_fast.cpp
index ac32f8ac3d16fae2023128f6ea8a537f83d861eb..32c0c686b26f261ea29ff34493672129126daffc 100644
--- a/src/Classic/Fields/Astra1DDynamic_fast.cpp
+++ b/src/Classic/Fields/Astra1DDynamic_fast.cpp
@@ -1,5 +1,5 @@
 //
-// Class Astra1DDynamic_fast
+// Class _Astra1DDynamic_fast
 //
 // This class provides a reader for Astra style field maps. It pre-computes the field
 // on a lattice to increase the performance during simulation.
@@ -29,8 +29,8 @@
 #include <fstream>
 #include <ios>
 
-Astra1DDynamic_fast::Astra1DDynamic_fast(std::string aFilename):
-    Astra1D_fast(aFilename)
+_Astra1DDynamic_fast::_Astra1DDynamic_fast(const std::string& filename):
+    _Astra1D_fast(filename)
 {
     numHeaderLines_m = 3;
 
@@ -55,7 +55,7 @@ Astra1DDynamic_fast::Astra1DDynamic_fast(std::string aFilename):
     if(!parsing_passed) {
         disableFieldmapWarning();
         zend_m = zbegin_m - 1e-3;
-        throw GeneralClassicException("Astra1DDynamic_fast::Astra1DDynamic_fast",
+        throw GeneralClassicException("_Astra1DDynamic_fast::_Astra1DDynamic_fast",
                                       "An error occured when reading the fieldmap '" + Filename_m + "'");
     }
 
@@ -67,11 +67,16 @@ Astra1DDynamic_fast::Astra1DDynamic_fast(std::string aFilename):
     length_m = 2.0 * num_gridpz_m * hz_m;
 }
 
-Astra1DDynamic_fast::~Astra1DDynamic_fast() {
+_Astra1DDynamic_fast::~_Astra1DDynamic_fast() {
     freeMap();
 }
 
-void Astra1DDynamic_fast::readMap() {
+Astra1DDynamic_fast _Astra1DDynamic_fast::create(const std::string& filename)
+{
+    return Astra1DDynamic_fast(new _Astra1DDynamic_fast(filename));
+}
+
+void _Astra1DDynamic_fast::readMap() {
     if(onAxisField_m == nullptr) {
         std::ifstream file(Filename_m.c_str());
 
@@ -101,7 +106,7 @@ void Astra1DDynamic_fast::readMap() {
     }
 }
 
-bool Astra1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
+bool _Astra1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
     // do fourier interpolation in z-direction
     const double RR2 = R(0) * R(0) + R(1) * R(1);
 
@@ -112,7 +117,7 @@ bool Astra1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E, Vecto
         ezpp = gsl_spline_eval(onAxisInterpolants_m[2], R(2) - zbegin_m, onAxisAccel_m[2]);
         ezppp = gsl_spline_eval(onAxisInterpolants_m[3], R(2) - zbegin_m, onAxisAccel_m[3]);
     } catch (OpalException const& e) {
-        throw OpalException("Astra1DDynamic_fast::getFieldstrength",
+        throw OpalException("_Astra1DDynamic_fast::getFieldstrength",
                             "The requested interpolation point, " + std::to_string(R(2)) + " is out of range");
     }
     // expand the field off-axis
@@ -131,7 +136,7 @@ bool Astra1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E, Vecto
     return false;
 }
 
-bool Astra1DDynamic_fast::getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _Astra1DDynamic_fast::getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     double ezp = gsl_spline_eval(onAxisInterpolants_m[1], R(2) - zbegin_m, onAxisAccel_m[1]);
 
     E(2) +=  ezp;
@@ -139,29 +144,29 @@ bool Astra1DDynamic_fast::getFieldDerivative(const Vector_t &R, Vector_t &E, Vec
     return false;
 }
 
-void Astra1DDynamic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _Astra1DDynamic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
 
-void Astra1DDynamic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _Astra1DDynamic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void Astra1DDynamic_fast::swap()
+void _Astra1DDynamic_fast::swap()
 { }
 
-void Astra1DDynamic_fast::getInfo(Inform *msg) {
+void _Astra1DDynamic_fast::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D dynamic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double Astra1DDynamic_fast::getFrequency() const {
+double _Astra1DDynamic_fast::getFrequency() const {
     return frequency_m;
 }
 
-void Astra1DDynamic_fast::setFrequency(double freq) {
+void _Astra1DDynamic_fast::setFrequency(double freq) {
     frequency_m = freq;
 }
 
-void Astra1DDynamic_fast::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
+void _Astra1DDynamic_fast::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
     F.resize(num_gridpz_m);
     if(onAxisField_m == nullptr) {
         double Ez_max = 0.0;
@@ -195,7 +200,7 @@ void Astra1DDynamic_fast::getOnaxisEz(std::vector<std::pair<double, double> > &
     }
 }
 
-bool Astra1DDynamic_fast::readFileHeader(std::ifstream &file) {
+bool _Astra1DDynamic_fast::readFileHeader(std::ifstream &file) {
     std::string tmpString;
     int tmpInt;
     bool passed = true;
@@ -208,7 +213,7 @@ bool Astra1DDynamic_fast::readFileHeader(std::ifstream &file) {
         tmpString = Util::toUpper(tmpString);
         if (tmpString != "TRUE" &&
             tmpString != "FALSE")
-            throw GeneralClassicException("Astra1DDynamic_fast::readFileHeader",
+            throw GeneralClassicException("_Astra1DDynamic_fast::readFileHeader",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -220,7 +225,7 @@ bool Astra1DDynamic_fast::readFileHeader(std::ifstream &file) {
     return passed;
 }
 
-int Astra1DDynamic_fast::stripFileHeader(std::ifstream &file) {
+int _Astra1DDynamic_fast::stripFileHeader(std::ifstream &file) {
     std::string tmpString;
     double tmpDouble;
     int accuracy;
@@ -234,4 +239,4 @@ int Astra1DDynamic_fast::stripFileHeader(std::ifstream &file) {
     interpretLine<double>(file, tmpDouble);
 
     return accuracy;
-}
+}
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DDynamic_fast.h b/src/Classic/Fields/Astra1DDynamic_fast.h
index c00fed089cc792cbba4516a021728273442a6b71..90c37b920362057a4376a1e682df4d558aac5aa4 100644
--- a/src/Classic/Fields/Astra1DDynamic_fast.h
+++ b/src/Classic/Fields/Astra1DDynamic_fast.h
@@ -24,9 +24,11 @@
 
 #include "Fields/Astra1D_fast.h"
 
-class Astra1DDynamic_fast: public Astra1D_fast {
+class _Astra1DDynamic_fast: public _Astra1D_fast {
 
 public:
+    virtual ~_Astra1DDynamic_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
@@ -38,8 +40,9 @@ public:
     virtual void getOnaxisEz(std::vector<std::pair<double, double> > & F);
 
 private:
-    Astra1DDynamic_fast(std::string aFilename);
-    virtual ~Astra1DDynamic_fast();
+    _Astra1DDynamic_fast(const std::string& filename);
+
+    static Astra1DDynamic_fast create(const std::string& filename);
 
     virtual void readMap();
 
@@ -49,7 +52,8 @@ private:
     double frequency_m;
     double xlrep_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
+using Astra1DDynamic_fast = std::shared_ptr<_Astra1DDynamic_fast>;
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DElectroStatic.cpp b/src/Classic/Fields/Astra1DElectroStatic.cpp
index e15a758459a1249e835cc20248aa23fd70fcc417..1b2c1f761b9e5115ae5305e08b44c210a04a9f53 100644
--- a/src/Classic/Fields/Astra1DElectroStatic.cpp
+++ b/src/Classic/Fields/Astra1DElectroStatic.cpp
@@ -12,8 +12,8 @@
 #include <fstream>
 #include <ios>
 
-Astra1DElectroStatic::Astra1DElectroStatic(std::string aFilename)
-    : Fieldmap(aFilename),
+_Astra1DElectroStatic::_Astra1DElectroStatic(const std::string& filename)
+    : _Fieldmap(filename),
       FourCoefs_m(nullptr) {
 
     std::ifstream file;
@@ -38,7 +38,7 @@ Astra1DElectroStatic::Astra1DElectroStatic(std::string aFilename)
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("Astra1DElectroStatic::Astra1DElectroStatic",
+                throw GeneralClassicException("_Astra1DElectroStatic::_Astra1DElectroStatic",
                                               "The third string on the first line of 1D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -64,7 +64,7 @@ Astra1DElectroStatic::Astra1DElectroStatic(std::string aFilename)
         if (!parsing_passed && !file.eof()) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("Astra1DElectroStatic::Astra1DElectroStatic",
+            throw GeneralClassicException("_Astra1DElectroStatic::_Astra1DElectroStatic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         }
         length_m = 2.0 * num_gridpz_m * (zend_m - zbegin_m) / (num_gridpz_m - 1);
@@ -76,11 +76,16 @@ Astra1DElectroStatic::Astra1DElectroStatic(std::string aFilename)
     }
 }
 
-Astra1DElectroStatic::~Astra1DElectroStatic() {
+_Astra1DElectroStatic::~_Astra1DElectroStatic() {
     freeMap();
 }
 
-void Astra1DElectroStatic::readMap() {
+Astra1DElectroStatic _Astra1DElectroStatic::create(const std::string& filename)
+{
+    return Astra1DElectroStatic(new _Astra1DElectroStatic(filename));
+}
+
+void _Astra1DElectroStatic::readMap() {
     if (FourCoefs_m == nullptr) {
         // declare variables and allocate memory
 
@@ -167,17 +172,15 @@ void Astra1DElectroStatic::readMap() {
     }
 }
 
-void Astra1DElectroStatic::freeMap() {
+void _Astra1DElectroStatic::freeMap() {
     if (FourCoefs_m != nullptr) {
 
         delete[] FourCoefs_m;
         FourCoefs_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << endl);
     }
 }
 
-bool Astra1DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &/*B*/) const {
+bool _Astra1DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &/*B*/) const {
     // do fourier interpolation in z-direction
     const double RR2 = R(0) * R(0) + R(1) * R(1);
 
@@ -212,27 +215,27 @@ bool Astra1DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E, Vect
     return false;
 }
 
-bool Astra1DElectroStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _Astra1DElectroStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void Astra1DElectroStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _Astra1DElectroStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
 
-void Astra1DElectroStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _Astra1DElectroStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void Astra1DElectroStatic::swap()
+void _Astra1DElectroStatic::swap()
 { }
 
-void Astra1DElectroStatic::getInfo(Inform *msg) {
+void _Astra1DElectroStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D electrostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double Astra1DElectroStatic::getFrequency() const {
+double _Astra1DElectroStatic::getFrequency() const {
     return 0.0;
 }
 
-void Astra1DElectroStatic::setFrequency(double /*freq*/)
+void _Astra1DElectroStatic::setFrequency(double /*freq*/)
 { }
diff --git a/src/Classic/Fields/Astra1DElectroStatic.h b/src/Classic/Fields/Astra1DElectroStatic.h
index 1c1b8c5274ccd1a2f17d6becdc455976786029c3..eddfa40b25d6397b9bf969e8fcf226cd68c77bf9 100644
--- a/src/Classic/Fields/Astra1DElectroStatic.h
+++ b/src/Classic/Fields/Astra1DElectroStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class Astra1DElectroStatic: public Fieldmap {
+class _Astra1DElectroStatic: public _Fieldmap {
 
 public:
+    virtual ~_Astra1DElectroStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -17,8 +19,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    Astra1DElectroStatic(std::string aFilename);
-    ~Astra1DElectroStatic();
+    _Astra1DElectroStatic(const std::string& filename);
+
+    static Astra1DElectroStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -32,12 +35,14 @@ private:
     int accuracy_m;
     int num_gridpz_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool Astra1DElectroStatic::isInside(const Vector_t &r) const
+inline bool _Astra1DElectroStatic::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m;
 }
 
+using Astra1DElectroStatic = std::shared_ptr<_Astra1DElectroStatic>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DElectroStatic_fast.cpp b/src/Classic/Fields/Astra1DElectroStatic_fast.cpp
index 60e95f0e6ff9b5da613457ea29ae50684bbdb8a2..0fc642cb3a59e2e581ecb186b40301b4d15fc323 100644
--- a/src/Classic/Fields/Astra1DElectroStatic_fast.cpp
+++ b/src/Classic/Fields/Astra1DElectroStatic_fast.cpp
@@ -7,8 +7,8 @@
 #include <fstream>
 #include <ios>
 
-Astra1DElectroStatic_fast::Astra1DElectroStatic_fast(std::string aFilename):
-    Astra1D_fast(aFilename) {
+_Astra1DElectroStatic_fast::_Astra1DElectroStatic_fast(const std::string& filename):
+    _Astra1D_fast(filename) {
     numHeaderLines_m = 2;
 
     onAxisField_m = nullptr;
@@ -30,18 +30,23 @@ Astra1DElectroStatic_fast::Astra1DElectroStatic_fast(std::string aFilename):
     if(!parsing_passed && !file.eof()) {
         disableFieldmapWarning();
         zend_m = zbegin_m - 1e-3;
-        throw GeneralClassicException("Astra1DElectroStatic_fast::Astra1DElectroStatic_fast",
+        throw GeneralClassicException("_Astra1DElectroStatic_fast::_Astra1DElectroStatic_fast",
                                       "An error occured when reading the fieldmap '" + Filename_m + "'");
     }
     hz_m = (zend_m - zbegin_m) / (num_gridpz_m - 1);
     length_m = 2.0 * num_gridpz_m * hz_m;
 }
 
-Astra1DElectroStatic_fast::~Astra1DElectroStatic_fast() {
+_Astra1DElectroStatic_fast::~_Astra1DElectroStatic_fast() {
     freeMap();
 }
 
-void Astra1DElectroStatic_fast::readMap() {
+Astra1DElectroStatic_fast _Astra1DElectroStatic_fast::create(const std::string& filename)
+{
+    return Astra1DElectroStatic_fast(new _Astra1DElectroStatic_fast(filename));
+}
+
+void _Astra1DElectroStatic_fast::readMap() {
     if(onAxisField_m == nullptr) {
         // declare variables and allocate memory
 
@@ -73,7 +78,7 @@ void Astra1DElectroStatic_fast::readMap() {
     }
 }
 
-bool Astra1DElectroStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &/*B*/) const {
+bool _Astra1DElectroStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &/*B*/) const {
     // do fourier interpolation in z-direction
     const double RR2 = R(0) * R(0) + R(1) * R(1);
 
@@ -91,31 +96,31 @@ bool Astra1DElectroStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
     return false;
 }
 
-bool Astra1DElectroStatic_fast::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _Astra1DElectroStatic_fast::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void Astra1DElectroStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _Astra1DElectroStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
-void Astra1DElectroStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _Astra1DElectroStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void Astra1DElectroStatic_fast::swap()
+void _Astra1DElectroStatic_fast::swap()
 { }
 
-void Astra1DElectroStatic_fast::getInfo(Inform *msg) {
+void _Astra1DElectroStatic_fast::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D electrostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double Astra1DElectroStatic_fast::getFrequency() const {
+double _Astra1DElectroStatic_fast::getFrequency() const {
     return 0.0;
 }
 
-void Astra1DElectroStatic_fast::setFrequency(double /*freq*/)
+void _Astra1DElectroStatic_fast::setFrequency(double /*freq*/)
 { }
 
-bool Astra1DElectroStatic_fast::readFileHeader(std::ifstream &file) {
+bool _Astra1DElectroStatic_fast::readFileHeader(std::ifstream &file) {
     std::string tmpString;
     int tmpInt;
 
@@ -138,7 +143,7 @@ bool Astra1DElectroStatic_fast::readFileHeader(std::ifstream &file) {
     return passed;
 }
 
-int Astra1DElectroStatic_fast::stripFileHeader(std::ifstream &file) {
+int _Astra1DElectroStatic_fast::stripFileHeader(std::ifstream &file) {
     std::string tmpString;
     int accuracy;
 
@@ -149,5 +154,4 @@ int Astra1DElectroStatic_fast::stripFileHeader(std::ifstream &file) {
     }
 
     return accuracy;
-}
-
+}
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DElectroStatic_fast.h b/src/Classic/Fields/Astra1DElectroStatic_fast.h
index ae76f4677b6aec45e0ee0c243af6d0bcd0a8a667..73c42d5d7b551175f6bb60129c58cd561a8f5be4 100644
--- a/src/Classic/Fields/Astra1DElectroStatic_fast.h
+++ b/src/Classic/Fields/Astra1DElectroStatic_fast.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Astra1D_fast.h"
 
-class Astra1DElectroStatic_fast: public Astra1D_fast {
+class _Astra1DElectroStatic_fast: public _Astra1D_fast {
 
 public:
+    virtual ~_Astra1DElectroStatic_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -16,15 +18,18 @@ public:
     virtual void setFrequency(double freq);
 
 private:
-    Astra1DElectroStatic_fast(std::string aFilename);
-    ~Astra1DElectroStatic_fast();
+    _Astra1DElectroStatic_fast(const std::string& filename);
+
+    static Astra1DElectroStatic_fast create(const std::string& filename);
 
     virtual void readMap();
 
     bool readFileHeader(std::ifstream &file);
     int stripFileHeader(std::ifstream &file);
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
+using Astra1DElectroStatic_fast = std::shared_ptr<_Astra1DElectroStatic_fast>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DMagnetoStatic.cpp b/src/Classic/Fields/Astra1DMagnetoStatic.cpp
index f6071b4056ef1f608e2b194abb847b4961ce080a..e9eb7ee916de7d0fc806edf32a17343dd37f8ae8 100644
--- a/src/Classic/Fields/Astra1DMagnetoStatic.cpp
+++ b/src/Classic/Fields/Astra1DMagnetoStatic.cpp
@@ -12,8 +12,8 @@
 #include <ios>
 
 
-Astra1DMagnetoStatic::Astra1DMagnetoStatic(std::string aFilename)
-    : Fieldmap(aFilename),
+_Astra1DMagnetoStatic::_Astra1DMagnetoStatic(const std::string& filename)
+    : _Fieldmap(filename),
       FourCoefs_m(nullptr) {
     std::ifstream file;
     int skippedValues = 0;
@@ -34,7 +34,7 @@ Astra1DMagnetoStatic::Astra1DMagnetoStatic(std::string aFilename)
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("Astra1DMagnetoStatic::Astra1DMagnetoStatic",
+                throw GeneralClassicException("_Astra1DMagnetoStatic::_Astra1DMagnetoStatic",
                                               "The third string on the first line of 1D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -60,7 +60,7 @@ Astra1DMagnetoStatic::Astra1DMagnetoStatic(std::string aFilename)
         if (!parsing_passed && !file.eof()) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("Astra1DMagnetoStatic::Astra1DMagnetoStatic",
+            throw GeneralClassicException("_Astra1DMagnetoStatic::_Astra1DMagnetoStatic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         }
         length_m = 2.0 * num_gridpz_m * (zend_m - zbegin_m) / (num_gridpz_m - 1);
@@ -71,11 +71,16 @@ Astra1DMagnetoStatic::Astra1DMagnetoStatic(std::string aFilename)
     }
 }
 
-Astra1DMagnetoStatic::~Astra1DMagnetoStatic() {
+_Astra1DMagnetoStatic::~_Astra1DMagnetoStatic() {
     freeMap();
 }
 
-void Astra1DMagnetoStatic::readMap() {
+Astra1DMagnetoStatic _Astra1DMagnetoStatic::create(const std::string& filename)
+{
+    return Astra1DMagnetoStatic(new _Astra1DMagnetoStatic(filename));
+}
+
+void _Astra1DMagnetoStatic::readMap() {
     if (FourCoefs_m == nullptr) {
         // declare variables and allocate memory
     	std::ifstream in;
@@ -157,17 +162,15 @@ void Astra1DMagnetoStatic::readMap() {
     }
 }
 
-void Astra1DMagnetoStatic::freeMap() {
+void _Astra1DMagnetoStatic::freeMap() {
     if (FourCoefs_m != nullptr) {
 
         delete[] FourCoefs_m;
         FourCoefs_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << endl);
     }
 }
 
-bool Astra1DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
+bool _Astra1DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
     // do fourier interpolation in z-direction
     const double RR2 = R(0) * R(0) + R(1) * R(1);
 
@@ -202,26 +205,26 @@ bool Astra1DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/,
     return false;
 }
 
-bool Astra1DMagnetoStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _Astra1DMagnetoStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void Astra1DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _Astra1DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
-void Astra1DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _Astra1DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void Astra1DMagnetoStatic::swap()
+void _Astra1DMagnetoStatic::swap()
 { }
 
-void Astra1DMagnetoStatic::getInfo(Inform *msg) {
+void _Astra1DMagnetoStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D magnetostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double Astra1DMagnetoStatic::getFrequency() const {
+double _Astra1DMagnetoStatic::getFrequency() const {
     return 0.0;
 }
 
-void Astra1DMagnetoStatic::setFrequency(double /*freq*/)
+void _Astra1DMagnetoStatic::setFrequency(double /*freq*/)
 { }
diff --git a/src/Classic/Fields/Astra1DMagnetoStatic.h b/src/Classic/Fields/Astra1DMagnetoStatic.h
index 6da6d1a80476e4cc19b7f669e909980405901481..7a7a9d41c4227a59877b0ef171af9e9ffb1b72a6 100644
--- a/src/Classic/Fields/Astra1DMagnetoStatic.h
+++ b/src/Classic/Fields/Astra1DMagnetoStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class Astra1DMagnetoStatic: public Fieldmap {
+class _Astra1DMagnetoStatic: public _Fieldmap {
 
 public:
+    virtual ~_Astra1DMagnetoStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -17,8 +19,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    Astra1DMagnetoStatic(std::string aFilename);
-    ~Astra1DMagnetoStatic();
+    _Astra1DMagnetoStatic(const std::string& filename);
+
+    static Astra1DMagnetoStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -32,12 +35,14 @@ private:
     int accuracy_m;
     int num_gridpz_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool Astra1DMagnetoStatic::isInside(const Vector_t &r) const
+inline bool _Astra1DMagnetoStatic::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m;
 }
 
+using Astra1DMagnetoStatic = std::shared_ptr<_Astra1DMagnetoStatic>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DMagnetoStatic_fast.cpp b/src/Classic/Fields/Astra1DMagnetoStatic_fast.cpp
index 7a41e46d58e52e1f293ad96989dbe2abe213b325..2c076c7e58319aaebe46dadca38e22af762ccd06 100644
--- a/src/Classic/Fields/Astra1DMagnetoStatic_fast.cpp
+++ b/src/Classic/Fields/Astra1DMagnetoStatic_fast.cpp
@@ -6,8 +6,8 @@
 #include <fstream>
 #include <ios>
 
-Astra1DMagnetoStatic_fast::Astra1DMagnetoStatic_fast(std::string aFilename):
-    Astra1D_fast(aFilename)
+_Astra1DMagnetoStatic_fast::_Astra1DMagnetoStatic_fast(const std::string& filename):
+    _Astra1D_fast(filename)
 {
     numHeaderLines_m = 2;
 
@@ -31,18 +31,23 @@ Astra1DMagnetoStatic_fast::Astra1DMagnetoStatic_fast(std::string aFilename):
     if(!parsing_passed) {
         disableFieldmapWarning();
         zend_m = zbegin_m - 1e-3;
-        throw GeneralClassicException("Astra1DMagnetoStatic_fast::Astra1DMagnetoStatic_fast",
+        throw GeneralClassicException("_Astra1DMagnetoStatic_fast::_Astra1DMagnetoStatic_fast",
                                       "An error occured when reading the fieldmap '" + Filename_m + "'");
     }
     hz_m = (zend_m - zbegin_m) / (num_gridpz_m - 1);
     length_m = 2.0 * num_gridpz_m * hz_m;
 }
 
-Astra1DMagnetoStatic_fast::~Astra1DMagnetoStatic_fast() {
+_Astra1DMagnetoStatic_fast::~_Astra1DMagnetoStatic_fast() {
     freeMap();
 }
 
-void Astra1DMagnetoStatic_fast::readMap() {
+Astra1DMagnetoStatic_fast _Astra1DMagnetoStatic_fast::create(const std::string& filename)
+{
+    return Astra1DMagnetoStatic_fast(new _Astra1DMagnetoStatic_fast(filename));
+}
+
+void _Astra1DMagnetoStatic_fast::readMap() {
     if(onAxisField_m == nullptr) {
         onAxisField_m = new double[num_gridpz_m];
         zvals_m = new double[num_gridpz_m];
@@ -72,7 +77,7 @@ void Astra1DMagnetoStatic_fast::readMap() {
     }
 }
 
-bool Astra1DMagnetoStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
+bool _Astra1DMagnetoStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
     // do fourier interpolation in z-direction
     const double RR2 = R(0) * R(0) + R(1) * R(1);
 
@@ -90,32 +95,32 @@ bool Astra1DMagnetoStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &/*
     return false;
 }
 
-bool Astra1DMagnetoStatic_fast::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _Astra1DMagnetoStatic_fast::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void Astra1DMagnetoStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _Astra1DMagnetoStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
 
-void Astra1DMagnetoStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _Astra1DMagnetoStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void Astra1DMagnetoStatic_fast::swap()
+void _Astra1DMagnetoStatic_fast::swap()
 { }
 
-void Astra1DMagnetoStatic_fast::getInfo(Inform *msg) {
+void _Astra1DMagnetoStatic_fast::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D magnetostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double Astra1DMagnetoStatic_fast::getFrequency() const {
+double _Astra1DMagnetoStatic_fast::getFrequency() const {
     return 0.0;
 }
 
-void Astra1DMagnetoStatic_fast::setFrequency(double /*freq*/)
+void _Astra1DMagnetoStatic_fast::setFrequency(double /*freq*/)
 { }
 
-bool Astra1DMagnetoStatic_fast::readFileHeader(std::ifstream &file) {
+bool _Astra1DMagnetoStatic_fast::readFileHeader(std::ifstream &file) {
     std::string tmpString;
     int tmpInt;
 
@@ -138,7 +143,7 @@ bool Astra1DMagnetoStatic_fast::readFileHeader(std::ifstream &file) {
     return passed;
 }
 
-int Astra1DMagnetoStatic_fast::stripFileHeader(std::ifstream &file) {
+int _Astra1DMagnetoStatic_fast::stripFileHeader(std::ifstream &file) {
     std::string tmpString;
     int accuracy;
 
@@ -149,5 +154,4 @@ int Astra1DMagnetoStatic_fast::stripFileHeader(std::ifstream &file) {
     }
 
     return accuracy;
-}
-
+}
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1DMagnetoStatic_fast.h b/src/Classic/Fields/Astra1DMagnetoStatic_fast.h
index 9420b38f6364cc1dd94921e29f4e6109a66a43ff..60d1f687a26be00e929151ed3fcebed078be6668 100644
--- a/src/Classic/Fields/Astra1DMagnetoStatic_fast.h
+++ b/src/Classic/Fields/Astra1DMagnetoStatic_fast.h
@@ -2,10 +2,13 @@
 #define CLASSIC_AstraFIELDMAP1DMAGNETOSTATICFAST_HH
 
 #include "Fields/Astra1D_fast.h"
+#include "Fields/Definitions.h"
 
-class Astra1DMagnetoStatic_fast: public Astra1D_fast {
+class _Astra1DMagnetoStatic_fast: public _Astra1D_fast {
 
 public:
+    virtual ~_Astra1DMagnetoStatic_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -16,15 +19,18 @@ public:
     virtual void setFrequency(double freq);
 
 private:
-    Astra1DMagnetoStatic_fast(std::string aFilename);
-    virtual ~Astra1DMagnetoStatic_fast();
+    _Astra1DMagnetoStatic_fast(const std::string& filename);
+
+    static Astra1DMagnetoStatic_fast create(const std::string& filename);
 
     virtual void readMap();
 
     bool readFileHeader(std::ifstream &file);
     int stripFileHeader(std::ifstream &file);
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
+using Astra1DMagnetoStatic_fast = std::shared_ptr<_Astra1DMagnetoStatic_fast>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1D_fast.cpp b/src/Classic/Fields/Astra1D_fast.cpp
index 3f965450829d5324d40a4f3395b1fd14f03eb3d3..4e8ba0331b53c8686abd25fa315383ce1bb65a11 100644
--- a/src/Classic/Fields/Astra1D_fast.cpp
+++ b/src/Classic/Fields/Astra1D_fast.cpp
@@ -1,3 +1,4 @@
+
 #include "Fields/Astra1D_fast.h"
 #include "Fields/Fieldmap.hpp"
 #include "Physics/Physics.h"
@@ -6,19 +7,19 @@
 #include <fstream>
 #include <ios>
 
-Astra1D_fast::Astra1D_fast(std::string aFilename):
-    Fieldmap(aFilename) {
+_Astra1D_fast::_Astra1D_fast(const std::string& filename):
+    _Fieldmap(filename) {
     normalize_m = true;
 }
 
-Astra1D_fast::~Astra1D_fast() {
+_Astra1D_fast::~_Astra1D_fast() {
     freeMap();
 }
 
-void Astra1D_fast::readMap()
+void _Astra1D_fast::readMap()
 { }
 
-void Astra1D_fast::freeMap() {
+void _Astra1D_fast::freeMap() {
     if(onAxisField_m != nullptr) {
         for(int i = 0; i < 4; ++i) {
             gsl_spline_free(onAxisInterpolants_m[i]);
@@ -29,15 +30,13 @@ void Astra1D_fast::freeMap() {
         onAxisField_m = nullptr;
         delete[] zvals_m;
         zvals_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << endl);
     }
 }
 
-void Astra1D_fast::getOnaxisEz(std::vector<std::pair<double, double> > & /*F*/)
+void _Astra1D_fast::getOnaxisEz(std::vector<std::pair<double, double> > & /*F*/)
 { }
 
-bool Astra1D_fast::determineNumSamplingPoints(std::ifstream &file) {
+bool _Astra1D_fast::determineNumSamplingPoints(std::ifstream &file) {
     double tmpDouble, tmpDouble2;
     unsigned int skippedValues = 0;
     bool passed = interpretLine<double, double>(file, zbegin_m, tmpDouble);
@@ -58,7 +57,7 @@ bool Astra1D_fast::determineNumSamplingPoints(std::ifstream &file) {
     return passed || file.eof();
 }
 
-double Astra1D_fast::readFieldData(std::ifstream &file) {
+double _Astra1D_fast::readFieldData(std::ifstream &file) {
     double tmpDouble = zbegin_m - hz_m;
     double maxValue = 0;
     int nsp;
@@ -82,7 +81,7 @@ double Astra1D_fast::readFieldData(std::ifstream &file) {
     return maxValue;
 }
 
-void Astra1D_fast::normalizeFieldData(double maxValue) {
+void _Astra1D_fast::normalizeFieldData(double maxValue) {
     int ii = num_gridpz_m - 1;
     for(int i = 0; i < num_gridpz_m; ++ i, -- ii) {
         onAxisField_m[i] /= maxValue;
@@ -90,7 +89,7 @@ void Astra1D_fast::normalizeFieldData(double maxValue) {
     }
 }
 
-std::vector<double> Astra1D_fast::getEvenlyDistributedSamplingPoints() {
+std::vector<double> _Astra1D_fast::getEvenlyDistributedSamplingPoints() {
     std::vector<double> zvals(num_gridpz_m, 0.0);
 
     for(int i = 1; i < num_gridpz_m - 1; ++ i) {
@@ -101,7 +100,7 @@ std::vector<double> Astra1D_fast::getEvenlyDistributedSamplingPoints() {
     return zvals;
 }
 
-std::vector<double> Astra1D_fast::interpolateFieldData(std::vector<double> &samplingPoints) {
+std::vector<double> _Astra1D_fast::interpolateFieldData(std::vector<double> &samplingPoints) {
     std::vector<double> realValues(num_gridpz_m);
 
     onAxisInterpolants_m[0] = gsl_spline_alloc(gsl_interp_cspline, num_gridpz_m);
@@ -117,7 +116,7 @@ std::vector<double> Astra1D_fast::interpolateFieldData(std::vector<double> &samp
     return realValues;
 }
 
-std::vector<double> Astra1D_fast::computeFourierCoefficients(int accuracy,
+std::vector<double> _Astra1D_fast::computeFourierCoefficients(int accuracy,
                                                                     std::vector<double> &evenFieldSampling) {
     std::vector<double> fourierCoefficients(2 * accuracy - 1);
     std::vector<double> RealValues(2 * num_gridpz_m, 0.0);
@@ -145,7 +144,7 @@ std::vector<double> Astra1D_fast::computeFourierCoefficients(int accuracy,
     return fourierCoefficients;
 }
 
-void Astra1D_fast::computeFieldDerivatives(std::vector<double> & fourierComponents, int accuracy) {
+void _Astra1D_fast::computeFieldDerivatives(std::vector<double> & fourierComponents, int accuracy) {
     double interiorDerivative, base;
     double coskzl, sinkzl, z = 0.0;
     std::vector<double> zvals(num_gridpz_m);
@@ -181,5 +180,4 @@ void Astra1D_fast::computeFieldDerivatives(std::vector<double> & fourierComponen
         onAxisAccel_m[i] = gsl_interp_accel_alloc();
         gsl_spline_init(onAxisInterpolants_m[i], &zvals[0], &higherDerivatives[i - 1][0], num_gridpz_m);
     }
-}
-
+}
\ No newline at end of file
diff --git a/src/Classic/Fields/Astra1D_fast.h b/src/Classic/Fields/Astra1D_fast.h
index 157d4037deb1c5c382cc7a6753ca2cdb3a982ff0..81eb86fccadc4f7aaf27d03f4d4eab320481eaf1 100644
--- a/src/Classic/Fields/Astra1D_fast.h
+++ b/src/Classic/Fields/Astra1D_fast.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class Astra1D_fast: public Fieldmap {
+class _Astra1D_fast: public _Fieldmap {
 
 public:
+    virtual ~_Astra1D_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const = 0;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const = 0;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const = 0;
@@ -18,8 +20,7 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 protected:
-    Astra1D_fast(std::string aFilename);
-    virtual ~Astra1D_fast();
+    _Astra1D_fast(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -47,12 +48,14 @@ protected:
     int num_gridpz_m;
     int numHeaderLines_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool Astra1D_fast::isInside(const Vector_t &r) const
+inline bool _Astra1D_fast::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m;
 }
 
+using Astra1D_fast = std::shared_ptr<_Astra1D_fast>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/CMakeLists.txt b/src/Classic/Fields/CMakeLists.txt
index 8e695d304c8dd8ea85c356ddb08b622074064ee3..43a9fdbe0be33204baf92fbb8ddeadeb6ea2c038 100644
--- a/src/Classic/Fields/CMakeLists.txt
+++ b/src/Classic/Fields/CMakeLists.txt
@@ -1,42 +1,41 @@
 set (_SRCS
+    Astra1DDynamic.cpp
+    Astra1DDynamic_fast.cpp
+    Astra1DElectroStatic.cpp
+    Astra1DElectroStatic_fast.cpp
+    Astra1DMagnetoStatic.cpp
+    Astra1DMagnetoStatic_fast.cpp
+    Astra1D_fast.cpp
     BDipoleField.cpp
     BMultipoleField.cpp
     ConstBField.cpp
     ConstBzField.cpp
     ConstEzField.cpp
     EMField.cpp
-    NullField.cpp
-    StaticElectricField.cpp
-    StaticMagneticField.cpp
-    Fieldmap.cpp
-    FM3DH5BlockBase.cpp
-    FM3DH5Block.cpp
-    FM3DH5Block_nonscale.cpp
-    FM3DMagnetoStaticH5Block.cpp
-    FM3DMagnetoStatic.cpp
-    FM3DMagnetoStaticExtended.cpp
-    FM3DDynamic.cpp
-    FM2DElectroStatic.cpp
-    FM2DMagnetoStatic.cpp
-    FM2DDynamic.cpp
     FM1DDynamic.cpp
     FM1DDynamic_fast.cpp
-    Astra1D_fast.cpp
-    Astra1DDynamic.cpp
-    Astra1DDynamic_fast.cpp
     FM1DElectroStatic.cpp
     FM1DElectroStatic_fast.cpp
-    Astra1DElectroStatic.cpp
-    Astra1DElectroStatic_fast.cpp
     FM1DMagnetoStatic.cpp
     FM1DMagnetoStatic_fast.cpp
-    Astra1DMagnetoStatic.cpp
-    Astra1DMagnetoStatic_fast.cpp
     FM1DProfile1.cpp
     FM1DProfile2.cpp
-    FMDummy.cpp
-    SectorMagneticFieldMap.cpp
+    FM2DDynamic.cpp
+    FM2DElectroStatic.cpp
+    FM2DMagnetoStatic.cpp
+    FM3DDynamic.cpp
+    FM3DH5Block.cpp
+    FM3DH5BlockBase.cpp
+    FM3DH5Block_nonscale.cpp
+    FM3DMagnetoStatic.cpp
+    FM3DMagnetoStaticExtended.cpp
+    FM3DMagnetoStaticH5Block.cpp
+    Fieldmap.cpp
+    NullField.cpp
     SectorField.cpp
+    SectorMagneticFieldMap.cpp
+    StaticElectricField.cpp
+    StaticMagneticField.cpp
     )
 
 include_directories (
@@ -50,13 +49,13 @@ add_opal_sources (${_SRCS})
 
 set (HDRS
     AcceleratingField.h
-    Astra1DDynamic_fast.h
     Astra1DDynamic.h
-    Astra1DElectroStatic_fast.h
+    Astra1DDynamic_fast.h
     Astra1DElectroStatic.h
-    Astra1D_fast.h
-    Astra1DMagnetoStatic_fast.h
+    Astra1DElectroStatic_fast.h
     Astra1DMagnetoStatic.h
+    Astra1DMagnetoStatic_fast.h
+    Astra1D_fast.h
     BDipoleField.h
     BMultipoleField.h
     BSingleMultipoleField.h
@@ -64,27 +63,26 @@ set (HDRS
     ConstBzField.h
     ConstEzField.h
     EMField.h
-    Fieldmap.h
-    Fieldmap.hpp
-    FM1DDynamic_fast.h
     FM1DDynamic.h
-    FM1DElectroStatic_fast.h
+    FM1DDynamic_fast.h
     FM1DElectroStatic.h
-    FM1DMagnetoStatic_fast.h
+    FM1DElectroStatic_fast.h
     FM1DMagnetoStatic.h
+    FM1DMagnetoStatic_fast.h
     FM1DProfile1.h
     FM1DProfile2.h
     FM2DDynamic.h
     FM2DElectroStatic.h
     FM2DMagnetoStatic.h
     FM3DDynamic.h
-    FM3DH5BlockBase.h
     FM3DH5Block.h
+    FM3DH5BlockBase.h
     FM3DH5Block_nonscale.h
-    FM3DMagnetoStaticH5Block.h
     FM3DMagnetoStatic.h
     FM3DMagnetoStaticExtended.h
-    FMDummy.h
+    FM3DMagnetoStaticH5Block.h
+    Fieldmap.h
+    Fieldmap.hpp
     NullField.h
     OscillatingField.h
     SectorField.h
@@ -93,4 +91,4 @@ set (HDRS
     StaticMagneticField.h
     )
 
-install (FILES ${HDRS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include/Fields")
+install (FILES ${HDRS} DESTINATION "${CMAKE_INSTALL_PREFIX}/include/Fields")
\ No newline at end of file
diff --git a/src/Classic/Fields/Definitions.h b/src/Classic/Fields/Definitions.h
new file mode 100644
index 0000000000000000000000000000000000000000..fc4a3cb864fd32e42533429b84f55be3b45bff54
--- /dev/null
+++ b/src/Classic/Fields/Definitions.h
@@ -0,0 +1,75 @@
+#pragma once
+
+#include <memory>
+
+class _Astra1DDynamic;
+using Astra1DDynamic = std::shared_ptr<_Astra1DDynamic>;
+
+class _Astra1DDynamic_fast;
+using Astra1DDynamic_fast = std::shared_ptr<_Astra1DDynamic_fast>;
+
+class _Astra1DElectroStatic;
+using Astra1DElectroStatic = std::shared_ptr<_Astra1DElectroStatic>;
+
+class _Astra1DElectroStatic_fast;
+using Astra1DElectroStatic_fast = std::shared_ptr<_Astra1DElectroStatic_fast>;
+
+class _Astra1DMagnetoStatic;
+using Astra1DMagnetoStatic = std::shared_ptr<_Astra1DMagnetoStatic>;
+
+class _Astra1DMagnetoStatic_fast;
+using Astra1DMagnetoStatic_fast = std::shared_ptr<_Astra1DMagnetoStatic_fast>;
+
+class _Fieldmap;
+using Fieldmap = std::shared_ptr<_Fieldmap>;
+
+class _FM1DDynamic;
+using FM1DDynamic = std::shared_ptr<_FM1DDynamic>;
+
+class _FM1DDynamic_fast;
+using FM1DDynamic_fast = std::shared_ptr<_FM1DDynamic_fast>;
+
+class _FM1DElectroStatic;
+using FM1DElectroStatic = std::shared_ptr<_FM1DElectroStatic>;
+
+class _FM1DElectroStatic_fast;
+using FM1DElectroStatic_fast = std::shared_ptr<_FM1DElectroStatic_fast>;
+
+class _FM1DMagnetoStatic;
+using FM1DMagnetoStatic = std::shared_ptr<_FM1DMagnetoStatic>;
+
+class _FM1DMagnetoStatic_fast;
+using FM1DMagnetoStatic_fast = std::shared_ptr<_FM1DMagnetoStatic_fast>;
+
+class _FM1DProfile1;
+using FM1DProfile1 = std::shared_ptr<_FM1DProfile1>;
+
+class _FM1DProfile2;
+using FM1DProfile2 = std::shared_ptr<_FM1DProfile2>;
+
+class _FM2DDynamic;
+using FM2DDynamic = std::shared_ptr<_FM2DDynamic>;
+
+class _FM2DElectroStatic;
+using FM2DElectroStatic = std::shared_ptr<_FM2DElectroStatic>;
+
+class _FM2DMagnetoStatic;
+using FM2DMagnetoStatic = std::shared_ptr<_FM2DMagnetoStatic>;
+
+class _FM3DDynamic;
+using FM3DDynamic = std::shared_ptr<_FM3DDynamic>;
+
+class _FM3DH5Block;
+using FM3DH5Block = std::shared_ptr<_FM3DH5Block>;
+
+class _FM3DH5Block_nonscale;
+using FM3DH5Block_nonscale = std::shared_ptr<_FM3DH5Block_nonscale>;
+
+class _FM3DMagnetoStatic;
+using FM3DMagnetoStatic = std::shared_ptr<_FM3DMagnetoStatic>;
+
+class _FM3DMagnetoStaticExtended;
+using FM3DMagnetoStaticExtended = std::shared_ptr<_FM3DMagnetoStaticExtended>;
+
+class _FM3DMagnetoStaticH5Block;
+using FM3DMagnetoStaticH5Block = std::shared_ptr<_FM3DMagnetoStaticH5Block>;
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DDynamic.cpp b/src/Classic/Fields/FM1DDynamic.cpp
index a226c4cd41749638c6b1e693d69b70b76173a99f..9b350566e13366d6cd64064ae578509a9b362a5f 100644
--- a/src/Classic/Fields/FM1DDynamic.cpp
+++ b/src/Classic/Fields/FM1DDynamic.cpp
@@ -10,8 +10,8 @@
 #include <fstream>
 #include <iostream>
 
-FM1DDynamic::FM1DDynamic(std::string aFilename):
-    Fieldmap(aFilename) {
+_FM1DDynamic::_FM1DDynamic(const std::string& filename):
+    _Fieldmap(filename) {
 
     Type = T1DDynamic;
 
@@ -38,11 +38,15 @@ FM1DDynamic::FM1DDynamic(std::string aFilename):
     }
 }
 
-FM1DDynamic::~FM1DDynamic() {
+_FM1DDynamic::~_FM1DDynamic() {
     freeMap();
 }
 
-void FM1DDynamic::readMap() {
+FM1DDynamic _FM1DDynamic::create(const std::string& filename) {
+    return FM1DDynamic(new _FM1DDynamic(filename));
+}
+
+void _FM1DDynamic::readMap() {
 
     if(fourierCoefs_m.empty()) {
 
@@ -59,17 +63,14 @@ void FM1DDynamic::readMap() {
     }
 }
 
-void FM1DDynamic::freeMap() {
+void _FM1DDynamic::freeMap() {
 
     if(!fourierCoefs_m.empty()) {
         fourierCoefs_m.clear();
-
-        INFOMSG(typeset_msg("Freed field map '" + Filename_m  + "'", "info")
-                << endl);
     }
 }
 
-bool FM1DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E,
+bool _FM1DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E,
                                    Vector_t &B) const {
 
     std::vector<double> fieldComponents;
@@ -79,7 +80,7 @@ bool FM1DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E,
     return false;
 }
 
-bool FM1DDynamic::getFieldDerivative(const Vector_t &R,
+bool _FM1DDynamic::getFieldDerivative(const Vector_t &R,
                                      Vector_t &E,
                                      Vector_t &/*B*/,
                                      const DiffDirection &/*dir*/) const {
@@ -102,35 +103,35 @@ bool FM1DDynamic::getFieldDerivative(const Vector_t &R,
     return false;
 }
 
-void FM1DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zBegin_m;
     zEnd = zEnd_m;
 }
 
-void FM1DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
+void _FM1DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
                                      double &/*yIni*/, double &/*yFinal*/,
                                      double &/*zIni*/, double &/*zFinal*/) const {
 }
 
-void FM1DDynamic::swap()
+void _FM1DDynamic::swap()
 { }
 
-void FM1DDynamic::getInfo(Inform *msg) {
+void _FM1DDynamic::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D dynamic); zini= "
            << zBegin_m << " m; zfinal= "
            << zEnd_m << " m;" << endl;
 }
 
-double FM1DDynamic::getFrequency() const {
+double _FM1DDynamic::getFrequency() const {
     return frequency_m;
 }
 
-void FM1DDynamic::setFrequency(double frequency) {
+void _FM1DDynamic::setFrequency(double frequency) {
     frequency_m = frequency;
 }
 
-void FM1DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > &eZ) {
+void _FM1DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > &eZ) {
 
     eZ.resize(numberOfGridPoints_m);
     std::ifstream fieldFile(Filename_m.c_str());
@@ -141,7 +142,7 @@ void FM1DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > &eZ) {
 
 }
 
-bool FM1DDynamic::checkFileData(std::ifstream &fieldFile, bool parsingPassed) {
+bool _FM1DDynamic::checkFileData(std::ifstream &fieldFile, bool parsingPassed) {
 
     double tempDouble;
     for(int dataIndex = 0; dataIndex < numberOfGridPoints_m; ++ dataIndex)
@@ -152,7 +153,7 @@ bool FM1DDynamic::checkFileData(std::ifstream &fieldFile, bool parsingPassed) {
 
 }
 
-void FM1DDynamic::computeFieldOffAxis(const Vector_t &R,
+void _FM1DDynamic::computeFieldOffAxis(const Vector_t &R,
                                       Vector_t &E,
                                       Vector_t &B,
                                       std::vector<double> fieldComponents) const {
@@ -177,7 +178,7 @@ void FM1DDynamic::computeFieldOffAxis(const Vector_t &R,
 
 }
 
-void FM1DDynamic::computeFieldOnAxis(double z,
+void _FM1DDynamic::computeFieldOnAxis(double z,
                                      std::vector<double> &fieldComponents) const {
 
     double kz = Physics::two_pi * z / length_m + Physics::pi;
@@ -210,7 +211,7 @@ void FM1DDynamic::computeFieldOnAxis(double z,
     }
 }
 
-void FM1DDynamic::computeFourierCoefficients(double maxEz, double fieldData[]) {
+void _FM1DDynamic::computeFourierCoefficients(double maxEz, double fieldData[]) {
     const unsigned int totalSize = 2 * numberOfGridPoints_m - 1;
     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
     gsl_fft_real_workspace *workSpace = gsl_fft_real_workspace_alloc(totalSize);
@@ -231,7 +232,7 @@ void FM1DDynamic::computeFourierCoefficients(double maxEz, double fieldData[]) {
 
 }
 
-void FM1DDynamic::convertHeaderData() {
+void _FM1DDynamic::convertHeaderData() {
 
     // Convert to angular frequency in Hz.
     frequency_m *= Physics::two_pi * Units::MHz2Hz;
@@ -245,7 +246,7 @@ void FM1DDynamic::convertHeaderData() {
     twoPiOverLambdaSq_m = pow(frequency_m / Physics::c, 2.0);
 }
 
-double FM1DDynamic::readFileData(std::ifstream &fieldFile, double fieldData[]) {
+double _FM1DDynamic::readFileData(std::ifstream &fieldFile, double fieldData[]) {
 
     double maxEz = 0.0;
     for(int dataIndex = 0; dataIndex < numberOfGridPoints_m; ++ dataIndex) {
@@ -269,7 +270,7 @@ double FM1DDynamic::readFileData(std::ifstream &fieldFile, double fieldData[]) {
     return maxEz;
 }
 
-double FM1DDynamic::readFileData(std::ifstream &fieldFile,
+double _FM1DDynamic::readFileData(std::ifstream &fieldFile,
                                  std::vector<std::pair<double, double>> &eZ) {
 
     double maxEz = 0.0;
@@ -287,7 +288,7 @@ double FM1DDynamic::readFileData(std::ifstream &fieldFile,
     return maxEz;
 }
 
-bool FM1DDynamic::readFileHeader(std::ifstream &fieldFile) {
+bool _FM1DDynamic::readFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
     int tempInt;
@@ -306,7 +307,7 @@ bool FM1DDynamic::readFileHeader(std::ifstream &fieldFile) {
         tempString = Util::toUpper(tempString);
         if (tempString != "TRUE" &&
             tempString != "FALSE")
-            throw GeneralClassicException("FM1DDynamic::FM1DDynamic",
+            throw GeneralClassicException("_FM1DDynamic::_FM1DDynamic",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -334,12 +335,12 @@ bool FM1DDynamic::readFileHeader(std::ifstream &fieldFile) {
     return parsingPassed;
 }
 
-void FM1DDynamic::scaleField(double maxEz, std::vector<std::pair<double, double>> &eZ) {
+void _FM1DDynamic::scaleField(double maxEz, std::vector<std::pair<double, double>> &eZ) {
     for(int dataIndex = 0; dataIndex < numberOfGridPoints_m; ++ dataIndex)
         eZ.at(dataIndex).second /= maxEz;
 }
 
-void FM1DDynamic::stripFileHeader(std::ifstream &fieldFile) {
+void _FM1DDynamic::stripFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
 
@@ -347,4 +348,4 @@ void FM1DDynamic::stripFileHeader(std::ifstream &fieldFile) {
     getLine(fieldFile, tempString);
     getLine(fieldFile, tempString);
     getLine(fieldFile, tempString);
-}
\ No newline at end of file
+}
diff --git a/src/Classic/Fields/FM1DDynamic.h b/src/Classic/Fields/FM1DDynamic.h
index 29e15f0ef3f6be8be974ad8ed07aa13a6a415ce8..6415e8ee926954f71d6b98a688f529b797c4a63c 100644
--- a/src/Classic/Fields/FM1DDynamic.h
+++ b/src/Classic/Fields/FM1DDynamic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DDynamic: public Fieldmap {
+class _FM1DDynamic: public _Fieldmap {
 
 public:
+    virtual ~_FM1DDynamic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E,
                                     Vector_t &B, const DiffDirection &dir) const;
@@ -21,9 +23,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM1DDynamic(std::string aFilename);
-    ~FM1DDynamic();
+    _FM1DDynamic(const std::string& filename);
 
+    static FM1DDynamic create(const std::string& filename);
     virtual void readMap();
     virtual void freeMap();
 
@@ -54,12 +56,14 @@ private:
     int accuracy_m;                         /// Number of Fourier coefficients to use reconstructing field.
     std::vector<double> fourierCoefs_m;     /// Fourier coefficients derived from field map.
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM1DDynamic::isInside(const Vector_t &r) const
+inline bool _FM1DDynamic::isInside(const Vector_t &r) const
 {
     return r(2) >= zBegin_m && r(2) < zEnd_m;
 }
 
-#endif
+using FM1DDynamic = std::shared_ptr<_FM1DDynamic>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DDynamic_fast.cpp b/src/Classic/Fields/FM1DDynamic_fast.cpp
index b34ad643a945c554f66bf02470232fc0d1fa9bcd..8e1668537df5bf12e69ce7e5fea72958052fb613 100644
--- a/src/Classic/Fields/FM1DDynamic_fast.cpp
+++ b/src/Classic/Fields/FM1DDynamic_fast.cpp
@@ -10,8 +10,8 @@
 #include <fstream>
 #include <ios>
 
-FM1DDynamic_fast::FM1DDynamic_fast(std::string aFilename):
-    Fieldmap(aFilename),
+_FM1DDynamic_fast::_FM1DDynamic_fast(const std::string& filename):
+    _Fieldmap(filename),
     accuracy_m(0)
 {
 
@@ -41,11 +41,15 @@ FM1DDynamic_fast::FM1DDynamic_fast(std::string aFilename):
     }
 }
 
-FM1DDynamic_fast::~FM1DDynamic_fast() {
+_FM1DDynamic_fast::~_FM1DDynamic_fast() {
     freeMap();
 }
 
-void FM1DDynamic_fast::readMap() {
+FM1DDynamic_fast _FM1DDynamic_fast::create(const std::string& filename) {
+    return FM1DDynamic_fast(new _FM1DDynamic_fast(filename));
+}
+
+void _FM1DDynamic_fast::readMap() {
 
     if (onAxisField_m == nullptr) {
 
@@ -78,7 +82,7 @@ void FM1DDynamic_fast::readMap() {
     }
 }
 
-void FM1DDynamic_fast::freeMap() {
+void _FM1DDynamic_fast::freeMap() {
     if (onAxisField_m != nullptr) {
         delete [] onAxisField_m;
         onAxisField_m = nullptr;
@@ -91,13 +95,10 @@ void FM1DDynamic_fast::freeMap() {
         gsl_interp_accel_free(onAxisFieldPAccel_m);
         gsl_interp_accel_free(onAxisFieldPPAccel_m);
         gsl_interp_accel_free(onAxisFieldPPPAccel_m);
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info")
-                << endl);
     }
 }
 
-bool FM1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
+bool _FM1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
                                         Vector_t &B) const {
 
     std::vector<double> fieldComponents;
@@ -107,7 +108,7 @@ bool FM1DDynamic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
     return false;
 }
 
-bool FM1DDynamic_fast::getFieldDerivative(const Vector_t &R,
+bool _FM1DDynamic_fast::getFieldDerivative(const Vector_t &R,
                                           Vector_t &E,
                                           Vector_t &/*B*/,
                                           const DiffDirection &/*dir*/) const {
@@ -118,34 +119,34 @@ bool FM1DDynamic_fast::getFieldDerivative(const Vector_t &R,
     return false;
 }
 
-void FM1DDynamic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DDynamic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zBegin_m;
     zEnd = zEnd_m;
 }
 
-void FM1DDynamic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
+void _FM1DDynamic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
                                           double &/*yIni*/, double &/*yFinal*/,
                                           double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM1DDynamic_fast::swap()
+void _FM1DDynamic_fast::swap()
 { }
 
-void FM1DDynamic_fast::getInfo(Inform *msg) {
+void _FM1DDynamic_fast::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D dynamic); zini= "
            << zBegin_m << " m; zfinal= "
            << zEnd_m << " m;" << endl;
 }
 
-double FM1DDynamic_fast::getFrequency() const {
+double _FM1DDynamic_fast::getFrequency() const {
     return frequency_m;
 }
 
-void FM1DDynamic_fast::setFrequency(double freq) {
+void _FM1DDynamic_fast::setFrequency(double freq) {
     frequency_m = freq;
 }
 
-void FM1DDynamic_fast::getOnaxisEz(std::vector<std::pair<double, double>> &eZ) {
+void _FM1DDynamic_fast::getOnaxisEz(std::vector<std::pair<double, double>> &eZ) {
 
     eZ.resize(numberOfGridPoints_m);
     std::ifstream fieldFile(Filename_m.c_str());
@@ -156,7 +157,7 @@ void FM1DDynamic_fast::getOnaxisEz(std::vector<std::pair<double, double>> &eZ) {
 
 }
 
-bool FM1DDynamic_fast::checkFileData(std::ifstream &fieldFile,
+bool _FM1DDynamic_fast::checkFileData(std::ifstream &fieldFile,
                                      bool parsingPassed) {
 
     double tempDouble;
@@ -168,7 +169,7 @@ bool FM1DDynamic_fast::checkFileData(std::ifstream &fieldFile,
 
 }
 
-void FM1DDynamic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
+void _FM1DDynamic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
                                                double onAxisFieldP[],
                                                double onAxisFieldPP[],
                                                double onAxisFieldPPP[]) {
@@ -204,7 +205,7 @@ void FM1DDynamic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
 
 }
 
-void FM1DDynamic_fast::computeFieldOffAxis(const Vector_t &R,
+void _FM1DDynamic_fast::computeFieldOffAxis(const Vector_t &R,
                                            Vector_t &E,
                                            Vector_t &B,
                                            std::vector<double> fieldComponents) const {
@@ -228,7 +229,7 @@ void FM1DDynamic_fast::computeFieldOffAxis(const Vector_t &R,
 
 }
 
-void FM1DDynamic_fast::computeFieldOnAxis(double z,
+void _FM1DDynamic_fast::computeFieldOnAxis(double z,
                                           std::vector<double> &fieldComponents)
     const {
 
@@ -242,7 +243,7 @@ void FM1DDynamic_fast::computeFieldOnAxis(double z,
                                               z, onAxisFieldPPPAccel_m));
 }
 
-std::vector<double> FM1DDynamic_fast::computeFourierCoefficients(double fieldData[]) {
+std::vector<double> _FM1DDynamic_fast::computeFourierCoefficients(double fieldData[]) {
     const unsigned int totalSize = 2 * numberOfGridPoints_m - 1;
     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
     gsl_fft_real_workspace *workSpace = gsl_fft_real_workspace_alloc(totalSize);
@@ -274,7 +275,7 @@ std::vector<double> FM1DDynamic_fast::computeFourierCoefficients(double fieldDat
 
 }
 
-void FM1DDynamic_fast::computeInterpolationVectors(double onAxisFieldP[],
+void _FM1DDynamic_fast::computeInterpolationVectors(double onAxisFieldP[],
                                                    double onAxisFieldPP[],
                                                    double onAxisFieldPPP[]) {
 
@@ -307,7 +308,7 @@ void FM1DDynamic_fast::computeInterpolationVectors(double onAxisFieldP[],
     delete [] z;
 }
 
-void FM1DDynamic_fast::convertHeaderData() {
+void _FM1DDynamic_fast::convertHeaderData() {
 
     // Convert to angular frequency in Hz.
     frequency_m *= Physics::two_pi * Units::MHz2Hz;
@@ -321,7 +322,7 @@ void FM1DDynamic_fast::convertHeaderData() {
     twoPiOverLambdaSq_m = pow(frequency_m / Physics::c, 2.0);
 }
 
-void FM1DDynamic_fast::normalizeField(double maxEz,
+void _FM1DDynamic_fast::normalizeField(double maxEz,
                                       std::vector<double> &fourierCoefs) {
 
     for (unsigned int dataIndex = 0; dataIndex < numberOfGridPoints_m; ++ dataIndex)
@@ -333,7 +334,7 @@ void FM1DDynamic_fast::normalizeField(double maxEz,
 
 }
 
-double FM1DDynamic_fast::readFileData(std::ifstream &fieldFile,
+double _FM1DDynamic_fast::readFileData(std::ifstream &fieldFile,
                                       double fieldData[]) {
 
     double maxEz = 0.0;
@@ -349,7 +350,7 @@ double FM1DDynamic_fast::readFileData(std::ifstream &fieldFile,
     return maxEz;
 }
 
-double FM1DDynamic_fast::readFileData(std::ifstream &fieldFile,
+double _FM1DDynamic_fast::readFileData(std::ifstream &fieldFile,
                                       std::vector<std::pair<double, double>> &eZ) {
 
     double maxEz = 0.0;
@@ -367,7 +368,7 @@ double FM1DDynamic_fast::readFileData(std::ifstream &fieldFile,
     return maxEz;
 }
 
-bool FM1DDynamic_fast::readFileHeader(std::ifstream &fieldFile) {
+bool _FM1DDynamic_fast::readFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
     int tempInt;
@@ -386,7 +387,7 @@ bool FM1DDynamic_fast::readFileHeader(std::ifstream &fieldFile) {
         tempString = Util::toUpper(tempString);
         if (tempString != "TRUE" &&
             tempString != "FALSE")
-            throw GeneralClassicException("FM1DDynamic_fast::readFileHeader",
+            throw GeneralClassicException("_FM1DDynamic_fast::readFileHeader",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -413,7 +414,7 @@ bool FM1DDynamic_fast::readFileHeader(std::ifstream &fieldFile) {
     return parsingPassed;
 }
 
-void FM1DDynamic_fast::scaleField(double maxEz,
+void _FM1DDynamic_fast::scaleField(double maxEz,
                                   std::vector<std::pair<double, double>> &eZ) {
     if (!normalize_m) return;
 
@@ -421,7 +422,7 @@ void FM1DDynamic_fast::scaleField(double maxEz,
         eZ.at(dataIndex).second /= maxEz;
 }
 
-void FM1DDynamic_fast::stripFileHeader(std::ifstream &fieldFile) {
+void _FM1DDynamic_fast::stripFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
 
@@ -431,7 +432,7 @@ void FM1DDynamic_fast::stripFileHeader(std::ifstream &fieldFile) {
     getLine(fieldFile, tempString);
 }
 
-void FM1DDynamic_fast::prepareForMapCheck(std::vector<double> &fourierCoefs) {
+void _FM1DDynamic_fast::prepareForMapCheck(std::vector<double> &fourierCoefs) {
     std::vector<double> zSampling(numberOfGridPoints_m);
     for (unsigned int zStepIndex = 0; zStepIndex < numberOfGridPoints_m; ++ zStepIndex)
         zSampling[zStepIndex] = deltaZ_m * zStepIndex;
diff --git a/src/Classic/Fields/FM1DDynamic_fast.h b/src/Classic/Fields/FM1DDynamic_fast.h
index da5db0e11767cd1779b63c4d81538ab4b82985ee..baa286c7c4546e074871e9cf4c659d0769a898e5 100644
--- a/src/Classic/Fields/FM1DDynamic_fast.h
+++ b/src/Classic/Fields/FM1DDynamic_fast.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DDynamic_fast: public Fieldmap {
+class _FM1DDynamic_fast: public _Fieldmap {
 
 public:
+    virtual ~_FM1DDynamic_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E,
                                     Vector_t &B, const DiffDirection &dir) const;
@@ -21,8 +23,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM1DDynamic_fast(std::string aFilename);
-    ~FM1DDynamic_fast();
+    _FM1DDynamic_fast(const std::string& filename);
+
+    static FM1DDynamic_fast create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -73,12 +76,14 @@ private:
     gsl_interp_accel *onAxisFieldPPAccel_m;
     gsl_interp_accel *onAxisFieldPPPAccel_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM1DDynamic_fast::isInside(const Vector_t &r) const
+inline bool _FM1DDynamic_fast::isInside(const Vector_t &r) const
 {
     return r(2) >= zBegin_m && r(2) < zEnd_m;
 }
 
-#endif
+using FM1DDynamic_fast = std::shared_ptr<_FM1DDynamic_fast>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DElectroStatic.cpp b/src/Classic/Fields/FM1DElectroStatic.cpp
index ee3bf09642abb0f3c13c602fe427697a425e575b..04d8e5db2dc87d0d4de84d819b733909eed544f6 100644
--- a/src/Classic/Fields/FM1DElectroStatic.cpp
+++ b/src/Classic/Fields/FM1DElectroStatic.cpp
@@ -10,8 +10,8 @@
 #include <fstream>
 #include <ios>
 
-FM1DElectroStatic::FM1DElectroStatic(std::string aFilename):
-    Fieldmap(aFilename) {
+_FM1DElectroStatic::_FM1DElectroStatic(const std::string& filename):
+    _Fieldmap(filename) {
 
     Type = T1DElectroStatic;
 
@@ -37,11 +37,16 @@ FM1DElectroStatic::FM1DElectroStatic(std::string aFilename):
     }
 }
 
-FM1DElectroStatic::~FM1DElectroStatic() {
+_FM1DElectroStatic::~_FM1DElectroStatic() {
     freeMap();
 }
 
-void FM1DElectroStatic::readMap() {
+FM1DElectroStatic _FM1DElectroStatic::create(const std::string& filename)
+{
+    return FM1DElectroStatic(new _FM1DElectroStatic(filename));
+}
+
+void _FM1DElectroStatic::readMap() {
 
     if (fourierCoefs_m.empty()) {
 
@@ -59,17 +64,14 @@ void FM1DElectroStatic::readMap() {
     }
 }
 
-void FM1DElectroStatic::freeMap() {
+void _FM1DElectroStatic::freeMap() {
 
     if (!fourierCoefs_m.empty()) {
         fourierCoefs_m.clear();
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info")
-                << endl);
     }
 }
 
-bool FM1DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E,
+bool _FM1DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E,
                                          Vector_t &B) const {
 
     std::vector<double> fieldComponents;
@@ -79,7 +81,7 @@ bool FM1DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E,
     return false;
 }
 
-bool FM1DElectroStatic::getFieldDerivative(const Vector_t &R,
+bool _FM1DElectroStatic::getFieldDerivative(const Vector_t &R,
                                            Vector_t &E,
                                            Vector_t &/*B*/,
                                            const DiffDirection &/*dir*/) const {
@@ -102,32 +104,32 @@ bool FM1DElectroStatic::getFieldDerivative(const Vector_t &R,
     return false;
 }
 
-void FM1DElectroStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DElectroStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zBegin_m;
     zEnd = zEnd_m;
 }
-void FM1DElectroStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
+void _FM1DElectroStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
                                            double &/*yIni*/, double &/*yFinal*/,
                                            double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM1DElectroStatic::swap()
+void _FM1DElectroStatic::swap()
 { }
 
-void FM1DElectroStatic::getInfo(Inform *msg) {
+void _FM1DElectroStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D electrostatic); zini= "
            << zBegin_m << " m; zfinal= "
            << zEnd_m << " m;" << endl;
 }
 
-double FM1DElectroStatic::getFrequency() const {
+double _FM1DElectroStatic::getFrequency() const {
     return 0.0;
 }
 
-void FM1DElectroStatic::setFrequency(double /*freq*/)
+void _FM1DElectroStatic::setFrequency(double /*freq*/)
 { }
 
-bool FM1DElectroStatic::checkFileData(std::ifstream &fieldFile,
+bool _FM1DElectroStatic::checkFileData(std::ifstream &fieldFile,
                                       bool parsingPassed) {
 
     double tempDouble;
@@ -139,7 +141,7 @@ bool FM1DElectroStatic::checkFileData(std::ifstream &fieldFile,
 
 }
 
-void FM1DElectroStatic::computeFieldOffAxis(const Vector_t &R,
+void _FM1DElectroStatic::computeFieldOffAxis(const Vector_t &R,
                                             Vector_t &E,
                                             Vector_t &/*B*/,
                                             std::vector<double> fieldComponents) const {
@@ -154,7 +156,7 @@ void FM1DElectroStatic::computeFieldOffAxis(const Vector_t &R,
 
 }
 
-void FM1DElectroStatic::computeFieldOnAxis(double z,
+void _FM1DElectroStatic::computeFieldOnAxis(double z,
                                            std::vector<double> &fieldComponents) const {
 
     double kz = Physics::two_pi * z / length_m + Physics::pi;
@@ -187,7 +189,7 @@ void FM1DElectroStatic::computeFieldOnAxis(double z,
     }
 }
 
-void FM1DElectroStatic::computeFourierCoefficients(double maxEz,
+void _FM1DElectroStatic::computeFourierCoefficients(double maxEz,
                                                    double fieldData[]) {
     const unsigned int totalSize = 2 * numberOfGridPoints_m - 1;
     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
@@ -209,7 +211,7 @@ void FM1DElectroStatic::computeFourierCoefficients(double maxEz,
 
 }
 
-void FM1DElectroStatic::convertHeaderData() {
+void _FM1DElectroStatic::convertHeaderData() {
 
     // Convert to m.
     rBegin_m *= Units::cm2m;
@@ -218,7 +220,7 @@ void FM1DElectroStatic::convertHeaderData() {
     zEnd_m *= Units::cm2m;
 }
 
-double FM1DElectroStatic::readFileData(std::ifstream &fieldFile,
+double _FM1DElectroStatic::readFileData(std::ifstream &fieldFile,
                                        double fieldData[]) {
 
     double maxEz = 0.0;
@@ -243,7 +245,7 @@ double FM1DElectroStatic::readFileData(std::ifstream &fieldFile,
     return maxEz;
 }
 
-bool FM1DElectroStatic::readFileHeader(std::ifstream &fieldFile) {
+bool _FM1DElectroStatic::readFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
     int tempInt;
@@ -262,7 +264,7 @@ bool FM1DElectroStatic::readFileHeader(std::ifstream &fieldFile) {
         tempString = Util::toUpper(tempString);
         if (tempString != "TRUE" &&
             tempString != "FALSE")
-            throw GeneralClassicException("FM1DElectroStatic::readFileHeader",
+            throw GeneralClassicException("_FM1DElectroStatic::readFileHeader",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -286,11 +288,11 @@ bool FM1DElectroStatic::readFileHeader(std::ifstream &fieldFile) {
     return parsingPassed;
 }
 
-void FM1DElectroStatic::stripFileHeader(std::ifstream &fieldFile) {
+void _FM1DElectroStatic::stripFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
 
     getLine(fieldFile, tempString);
     getLine(fieldFile, tempString);
     getLine(fieldFile, tempString);
-}
\ No newline at end of file
+}
diff --git a/src/Classic/Fields/FM1DElectroStatic.h b/src/Classic/Fields/FM1DElectroStatic.h
index d67ce07fca153bbc2623e0b854b21748d7152756..173a9c6f7d25eb9538d56e85348e1e791c5811c3 100644
--- a/src/Classic/Fields/FM1DElectroStatic.h
+++ b/src/Classic/Fields/FM1DElectroStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DElectroStatic: public Fieldmap {
+class _FM1DElectroStatic: public _Fieldmap {
 
 public:
+    virtual ~_FM1DElectroStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal,
@@ -20,8 +22,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM1DElectroStatic(std::string aFilename);
-    ~FM1DElectroStatic();
+    _FM1DElectroStatic(const std::string& filename);
+
+    static FM1DElectroStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -47,12 +50,14 @@ private:
     int accuracy_m;                         /// Number of Fourier coefficients to use reconstructing field.
     std::vector<double> fourierCoefs_m;     /// Fourier coefficients derived from field map.
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM1DElectroStatic::isInside(const Vector_t &r) const
+inline bool _FM1DElectroStatic::isInside(const Vector_t &r) const
 {
     return r(2) >= zBegin_m && r(2) < zEnd_m;
 }
 
-#endif
+using FM1DElectroStatic = std::shared_ptr<_FM1DElectroStatic>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DElectroStatic_fast.cpp b/src/Classic/Fields/FM1DElectroStatic_fast.cpp
index 111dc102b90aa43257e835182353e75fae6991cc..cbc591ca23df6faffee027fb6d893dfc72c59a1d 100644
--- a/src/Classic/Fields/FM1DElectroStatic_fast.cpp
+++ b/src/Classic/Fields/FM1DElectroStatic_fast.cpp
@@ -10,8 +10,8 @@
 #include <fstream>
 #include <ios>
 
-FM1DElectroStatic_fast::FM1DElectroStatic_fast(std::string aFilename):
-    Fieldmap(aFilename),
+_FM1DElectroStatic_fast::_FM1DElectroStatic_fast(const std::string& filename):
+    _Fieldmap(filename),
     accuracy_m(0)
 {
 
@@ -41,11 +41,16 @@ FM1DElectroStatic_fast::FM1DElectroStatic_fast(std::string aFilename):
     }
 }
 
-FM1DElectroStatic_fast::~FM1DElectroStatic_fast() {
+_FM1DElectroStatic_fast::~_FM1DElectroStatic_fast() {
     freeMap();
 }
 
-void FM1DElectroStatic_fast::readMap() {
+FM1DElectroStatic_fast _FM1DElectroStatic_fast::create(const std::string& filename)
+{
+    return FM1DElectroStatic_fast(new _FM1DElectroStatic_fast(filename));
+}
+
+void _FM1DElectroStatic_fast::readMap() {
     if (onAxisField_m == nullptr) {
 
         std::ifstream fieldFile(Filename_m.c_str());
@@ -78,7 +83,7 @@ void FM1DElectroStatic_fast::readMap() {
     }
 }
 
-void FM1DElectroStatic_fast::freeMap() {
+void _FM1DElectroStatic_fast::freeMap() {
     if (onAxisField_m != nullptr) {
         delete [] onAxisField_m;
         onAxisField_m = nullptr;
@@ -91,13 +96,10 @@ void FM1DElectroStatic_fast::freeMap() {
         gsl_interp_accel_free(onAxisFieldPAccel_m);
         gsl_interp_accel_free(onAxisFieldPPAccel_m);
         gsl_interp_accel_free(onAxisFieldPPPAccel_m);
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info")
-                << endl);
     }
 }
 
-bool FM1DElectroStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
+bool _FM1DElectroStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
                                               Vector_t &B) const {
 
     std::vector<double> fieldComponents;
@@ -108,7 +110,7 @@ bool FM1DElectroStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
 
 }
 
-bool FM1DElectroStatic_fast::getFieldDerivative(const Vector_t &R,
+bool _FM1DElectroStatic_fast::getFieldDerivative(const Vector_t &R,
                                                 Vector_t &E,
                                                 Vector_t &/*B*/,
                                                 const DiffDirection &/*dir*/) const {
@@ -120,32 +122,32 @@ bool FM1DElectroStatic_fast::getFieldDerivative(const Vector_t &R,
 
 }
 
-void FM1DElectroStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DElectroStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zBegin_m;
     zEnd = zEnd_m;
 }
-void FM1DElectroStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
+void _FM1DElectroStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
                                                 double &/*yIni*/, double &/*yFinal*/,
                                                 double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM1DElectroStatic_fast::swap()
+void _FM1DElectroStatic_fast::swap()
 { }
 
-void FM1DElectroStatic_fast::getInfo(Inform *msg) {
+void _FM1DElectroStatic_fast::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D electrotostatic); zini= "
            << zBegin_m << " m; zfinal= "
            << zEnd_m << " m;" << endl;
 }
 
-double FM1DElectroStatic_fast::getFrequency() const {
+double _FM1DElectroStatic_fast::getFrequency() const {
     return 0.0;
 }
 
-void FM1DElectroStatic_fast::setFrequency(double /*freq*/)
+void _FM1DElectroStatic_fast::setFrequency(double /*freq*/)
 { }
 
-bool FM1DElectroStatic_fast::checkFileData(std::ifstream &fieldFile,
+bool _FM1DElectroStatic_fast::checkFileData(std::ifstream &fieldFile,
                                            bool parsingPassed) {
 
     double tempDouble;
@@ -157,7 +159,7 @@ bool FM1DElectroStatic_fast::checkFileData(std::ifstream &fieldFile,
 
 }
 
-void FM1DElectroStatic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
+void _FM1DElectroStatic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
                                                      double onAxisFieldP[],
                                                      double onAxisFieldPP[],
                                                      double onAxisFieldPPP[]) {
@@ -192,7 +194,7 @@ void FM1DElectroStatic_fast::computeFieldDerivatives(std::vector<double> fourier
     }
 }
 
-void FM1DElectroStatic_fast::computeFieldOffAxis(const Vector_t &R, Vector_t &E, Vector_t &/*B*/,
+void _FM1DElectroStatic_fast::computeFieldOffAxis(const Vector_t &R, Vector_t &E, Vector_t &/*B*/,
                                                  std::vector<double> fieldComponents) const {
 
     double radiusSq = pow(R(0), 2.0) + pow(R(1), 2.0);
@@ -205,7 +207,7 @@ void FM1DElectroStatic_fast::computeFieldOffAxis(const Vector_t &R, Vector_t &E,
 
 }
 
-void FM1DElectroStatic_fast::computeFieldOnAxis(double z,
+void _FM1DElectroStatic_fast::computeFieldOnAxis(double z,
                                                 std::vector<double> &fieldComponents) const {
 
     fieldComponents.push_back(gsl_spline_eval(onAxisFieldInterpolants_m,
@@ -218,7 +220,7 @@ void FM1DElectroStatic_fast::computeFieldOnAxis(double z,
                                               z, onAxisFieldPPPAccel_m));
 }
 
-std::vector<double> FM1DElectroStatic_fast::computeFourierCoefficients(double fieldData[]) {
+std::vector<double> _FM1DElectroStatic_fast::computeFourierCoefficients(double fieldData[]) {
 
     const unsigned int totalSize = 2 * numberOfGridPoints_m - 1;
     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
@@ -250,7 +252,7 @@ std::vector<double> FM1DElectroStatic_fast::computeFourierCoefficients(double fi
 
 }
 
-void FM1DElectroStatic_fast::computeInterpolationVectors(double onAxisFieldP[],
+void _FM1DElectroStatic_fast::computeInterpolationVectors(double onAxisFieldP[],
                                                          double onAxisFieldPP[],
                                                          double onAxisFieldPPP[]) {
 
@@ -284,7 +286,7 @@ void FM1DElectroStatic_fast::computeInterpolationVectors(double onAxisFieldP[],
     delete [] z;
 }
 
-void FM1DElectroStatic_fast::convertHeaderData() {
+void _FM1DElectroStatic_fast::convertHeaderData() {
 
     // Convert to m.
     rBegin_m *= Units::cm2m;
@@ -294,7 +296,7 @@ void FM1DElectroStatic_fast::convertHeaderData() {
 
 }
 
-void FM1DElectroStatic_fast::normalizeField(double maxEz, std::vector<double> &fourierCoefs) {
+void _FM1DElectroStatic_fast::normalizeField(double maxEz, std::vector<double> &fourierCoefs) {
 
     for (unsigned int dataIndex = 0; dataIndex < numberOfGridPoints_m; ++ dataIndex)
         onAxisField_m[dataIndex] /= (maxEz * Units::Vpm2MVpm);
@@ -304,7 +306,7 @@ void FM1DElectroStatic_fast::normalizeField(double maxEz, std::vector<double> &f
 
 }
 
-double FM1DElectroStatic_fast::readFileData(std::ifstream &fieldFile,
+double _FM1DElectroStatic_fast::readFileData(std::ifstream &fieldFile,
                                             double fieldData[]) {
 
     double maxEz = 0.0;
@@ -320,7 +322,7 @@ double FM1DElectroStatic_fast::readFileData(std::ifstream &fieldFile,
     return maxEz;
 }
 
-bool FM1DElectroStatic_fast::readFileHeader(std::ifstream &fieldFile) {
+bool _FM1DElectroStatic_fast::readFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
     int tempInt;
@@ -339,7 +341,7 @@ bool FM1DElectroStatic_fast::readFileHeader(std::ifstream &fieldFile) {
         tempString = Util::toUpper(tempString);
         if (tempString != "TRUE" &&
             tempString != "FALSE")
-            throw GeneralClassicException("FM1DElectroStatic_fast::readFileHeader",
+            throw GeneralClassicException("_FM1DElectroStatic_fast::readFileHeader",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -363,7 +365,7 @@ bool FM1DElectroStatic_fast::readFileHeader(std::ifstream &fieldFile) {
     return parsingPassed;
 }
 
-void FM1DElectroStatic_fast::stripFileHeader(std::ifstream &fieldFile) {
+void _FM1DElectroStatic_fast::stripFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
 
@@ -372,7 +374,7 @@ void FM1DElectroStatic_fast::stripFileHeader(std::ifstream &fieldFile) {
     getLine(fieldFile, tempString);
 }
 
-void FM1DElectroStatic_fast::prepareForMapCheck(std::vector<double> &fourierCoefs) {
+void _FM1DElectroStatic_fast::prepareForMapCheck(std::vector<double> &fourierCoefs) {
     std::vector<double> zSampling(numberOfGridPoints_m);
     for (unsigned int zStepIndex = 0; zStepIndex < numberOfGridPoints_m; ++ zStepIndex)
         zSampling[zStepIndex] = deltaZ_m * zStepIndex;
diff --git a/src/Classic/Fields/FM1DElectroStatic_fast.h b/src/Classic/Fields/FM1DElectroStatic_fast.h
index 4861c52dbfb86bdf175e984478f3ebd2015fe6c4..edfc41524ca97844aab7b6112481bc9fa44fd927 100644
--- a/src/Classic/Fields/FM1DElectroStatic_fast.h
+++ b/src/Classic/Fields/FM1DElectroStatic_fast.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DElectroStatic_fast: public Fieldmap {
+class _FM1DElectroStatic_fast: public _Fieldmap {
 
 public:
+    virtual ~_FM1DElectroStatic_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal,
@@ -20,8 +22,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM1DElectroStatic_fast(std::string aFilename);
-    ~FM1DElectroStatic_fast();
+    _FM1DElectroStatic_fast(const std::string& filename);
+
+    static FM1DElectroStatic_fast create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -67,12 +70,14 @@ private:
     gsl_interp_accel *onAxisFieldPPAccel_m;
     gsl_interp_accel *onAxisFieldPPPAccel_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM1DElectroStatic_fast::isInside(const Vector_t &r) const
+inline bool _FM1DElectroStatic_fast::isInside(const Vector_t &r) const
 {
     return r(2) >= zBegin_m && r(2) < zEnd_m;
 }
 
-#endif
+using FM1DElectroStatic_fast = std::shared_ptr<_FM1DElectroStatic_fast>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DMagnetoStatic.cpp b/src/Classic/Fields/FM1DMagnetoStatic.cpp
index 955543e487557032621531478386f822ccc8d405..5ac020752d3159b059a1691cd6db72ef4e84daa4 100644
--- a/src/Classic/Fields/FM1DMagnetoStatic.cpp
+++ b/src/Classic/Fields/FM1DMagnetoStatic.cpp
@@ -10,8 +10,8 @@
 #include <fstream>
 #include <ios>
 
-FM1DMagnetoStatic::FM1DMagnetoStatic(std::string aFilename)
-    : Fieldmap(aFilename) {
+_FM1DMagnetoStatic::_FM1DMagnetoStatic(const std::string& filename)
+    : _Fieldmap(filename) {
 
     Type = T1DMagnetoStatic;
 
@@ -37,11 +37,16 @@ FM1DMagnetoStatic::FM1DMagnetoStatic(std::string aFilename)
     }
 }
 
-FM1DMagnetoStatic::~FM1DMagnetoStatic() {
+_FM1DMagnetoStatic::~_FM1DMagnetoStatic() {
     freeMap();
 }
 
-void FM1DMagnetoStatic::readMap() {
+FM1DMagnetoStatic _FM1DMagnetoStatic::create(const std::string& filename)
+{
+    return FM1DMagnetoStatic(new _FM1DMagnetoStatic(filename));
+}
+
+void _FM1DMagnetoStatic::readMap() {
 
     if(fourierCoefs_m.empty()) {
 
@@ -59,17 +64,14 @@ void FM1DMagnetoStatic::readMap() {
     }
 }
 
-void FM1DMagnetoStatic::freeMap() {
+void _FM1DMagnetoStatic::freeMap() {
 
     if(!fourierCoefs_m.empty()) {
         fourierCoefs_m.clear();
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info")
-                << endl);
     }
 }
 
-bool FM1DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &E,
+bool _FM1DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &E,
         Vector_t &B) const {
 
     std::vector<double> fieldComponents;
@@ -79,7 +81,7 @@ bool FM1DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &E,
     return false;
 }
 
-bool FM1DMagnetoStatic::getFieldDerivative(const Vector_t &R,
+bool _FM1DMagnetoStatic::getFieldDerivative(const Vector_t &R,
         Vector_t &/*E*/,
         Vector_t &B,
         const DiffDirection &/*dir*/) const {
@@ -102,33 +104,33 @@ bool FM1DMagnetoStatic::getFieldDerivative(const Vector_t &R,
     return false;
 }
 
-void FM1DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zBegin_m;
     zEnd = zEnd_m;
 }
-void FM1DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
+void _FM1DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
                                            double &/*yIni*/, double &/*yFinal*/,
                                            double &/*zIni*/, double &/*zFinal*/) const {
 }
 
-void FM1DMagnetoStatic::swap()
+void _FM1DMagnetoStatic::swap()
 { }
 
-void FM1DMagnetoStatic::getInfo(Inform *msg) {
+void _FM1DMagnetoStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D magnetostatic); zini= "
            << zBegin_m << " m; zfinal= "
            << zEnd_m << " m;" << endl;
 }
 
-double FM1DMagnetoStatic::getFrequency() const {
+double _FM1DMagnetoStatic::getFrequency() const {
     return 0.0;
 }
 
-void FM1DMagnetoStatic::setFrequency(double /*freq*/)
+void _FM1DMagnetoStatic::setFrequency(double /*freq*/)
 { }
 
-bool FM1DMagnetoStatic::checkFileData(std::ifstream &fieldFile,
+bool _FM1DMagnetoStatic::checkFileData(std::ifstream &fieldFile,
                                       bool parsingPassed) {
 
     double tempDouble;
@@ -140,7 +142,7 @@ bool FM1DMagnetoStatic::checkFileData(std::ifstream &fieldFile,
 
 }
 
-void FM1DMagnetoStatic::computeFieldOffAxis(const Vector_t &R,
+void _FM1DMagnetoStatic::computeFieldOffAxis(const Vector_t &R,
                                             Vector_t &/*E*/,
         Vector_t &B,
         std::vector<double> fieldComponents) const {
@@ -155,7 +157,7 @@ void FM1DMagnetoStatic::computeFieldOffAxis(const Vector_t &R,
 
 }
 
-void FM1DMagnetoStatic::computeFieldOnAxis(double z,
+void _FM1DMagnetoStatic::computeFieldOnAxis(double z,
         std::vector<double> &fieldComponents) const {
 
     double kz = Physics::two_pi * z / length_m + Physics::pi;
@@ -188,7 +190,7 @@ void FM1DMagnetoStatic::computeFieldOnAxis(double z,
     }
 }
 
-void FM1DMagnetoStatic::computeFourierCoefficients(double maxBz,
+void _FM1DMagnetoStatic::computeFourierCoefficients(double maxBz,
                                                    double fieldData[]) {
     const unsigned int totalSize = 2 * numberOfGridPoints_m - 1;
     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
@@ -210,7 +212,7 @@ void FM1DMagnetoStatic::computeFourierCoefficients(double maxBz,
 
 }
 
-void FM1DMagnetoStatic::convertHeaderData() {
+void _FM1DMagnetoStatic::convertHeaderData() {
 
     // Convert to m.
     rBegin_m *= Units::cm2m;
@@ -219,7 +221,7 @@ void FM1DMagnetoStatic::convertHeaderData() {
     zEnd_m *= Units::cm2m;
 }
 
-double FM1DMagnetoStatic::readFileData(std::ifstream &fieldFile,
+double _FM1DMagnetoStatic::readFileData(std::ifstream &fieldFile,
                                        double fieldData[]) {
 
     double maxBz = 0.0;
@@ -244,7 +246,7 @@ double FM1DMagnetoStatic::readFileData(std::ifstream &fieldFile,
     return maxBz;
 }
 
-bool FM1DMagnetoStatic::readFileHeader(std::ifstream &fieldFile) {
+bool _FM1DMagnetoStatic::readFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
     int tempInt;
@@ -263,7 +265,7 @@ bool FM1DMagnetoStatic::readFileHeader(std::ifstream &fieldFile) {
         tempString = Util::toUpper(tempString);
         if (tempString != "TRUE" &&
             tempString != "FALSE")
-            throw GeneralClassicException("FM1DMagnetoStatic::readFileHeader",
+            throw GeneralClassicException("_FM1DMagnetoStatic::readFileHeader",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -285,11 +287,11 @@ bool FM1DMagnetoStatic::readFileHeader(std::ifstream &fieldFile) {
     return parsingPassed;
 }
 
-void FM1DMagnetoStatic::stripFileHeader(std::ifstream &fieldFile) {
+void _FM1DMagnetoStatic::stripFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
 
     getLine(fieldFile, tempString);
     getLine(fieldFile, tempString);
     getLine(fieldFile, tempString);
-}
\ No newline at end of file
+}
diff --git a/src/Classic/Fields/FM1DMagnetoStatic.h b/src/Classic/Fields/FM1DMagnetoStatic.h
index 8873f279db92ae77b3f3472ef176121bae92fbe7..896645083cbc146c2628e66045da38ec90365de6 100644
--- a/src/Classic/Fields/FM1DMagnetoStatic.h
+++ b/src/Classic/Fields/FM1DMagnetoStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DMagnetoStatic: public Fieldmap {
+class _FM1DMagnetoStatic: public _Fieldmap {
 
 public:
+    virtual ~_FM1DMagnetoStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal,
@@ -20,8 +22,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM1DMagnetoStatic(std::string aFilename);
-    ~FM1DMagnetoStatic();
+    _FM1DMagnetoStatic(const std::string& filename);
+
+    static FM1DMagnetoStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -47,12 +50,14 @@ private:
     int accuracy_m;                         /// Number of Fourier coefficients to use reconstructing field.
     std::vector<double> fourierCoefs_m;     /// Fourier coefficients derived from field map.
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM1DMagnetoStatic::isInside(const Vector_t &r) const
+inline bool _FM1DMagnetoStatic::isInside(const Vector_t &r) const
 {
     return r(2) >= zBegin_m && r(2) < zEnd_m;
 }
 
-#endif
+using FM1DMagnetoStatic = std::shared_ptr<_FM1DMagnetoStatic>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DMagnetoStatic_fast.cpp b/src/Classic/Fields/FM1DMagnetoStatic_fast.cpp
index a3bc45846db9768268b538a53036ebef4e5637f6..ef98c972ee4c259ea41632ac9d70213bdd4170f0 100644
--- a/src/Classic/Fields/FM1DMagnetoStatic_fast.cpp
+++ b/src/Classic/Fields/FM1DMagnetoStatic_fast.cpp
@@ -10,8 +10,8 @@
 #include <fstream>
 #include <ios>
 
-FM1DMagnetoStatic_fast::FM1DMagnetoStatic_fast(std::string aFilename):
-    Fieldmap(aFilename) {
+_FM1DMagnetoStatic_fast::_FM1DMagnetoStatic_fast(const std::string& filename):
+    _Fieldmap(filename) {
 
     Type = T1DMagnetoStatic;
     onAxisField_m = nullptr;
@@ -39,11 +39,16 @@ FM1DMagnetoStatic_fast::FM1DMagnetoStatic_fast(std::string aFilename):
     }
 }
 
-FM1DMagnetoStatic_fast::~FM1DMagnetoStatic_fast() {
+_FM1DMagnetoStatic_fast::~_FM1DMagnetoStatic_fast() {
     freeMap();
 }
 
-void FM1DMagnetoStatic_fast::readMap() {
+FM1DMagnetoStatic_fast _FM1DMagnetoStatic_fast::create(const std::string& filename)
+{
+    return FM1DMagnetoStatic_fast(new _FM1DMagnetoStatic_fast(filename));
+}
+
+void _FM1DMagnetoStatic_fast::readMap() {
 
     if(onAxisField_m == nullptr) {
 
@@ -77,7 +82,7 @@ void FM1DMagnetoStatic_fast::readMap() {
     }
 }
 
-void FM1DMagnetoStatic_fast::freeMap() {
+void _FM1DMagnetoStatic_fast::freeMap() {
     if(onAxisField_m != nullptr) {
         delete [] onAxisField_m;
         onAxisField_m = nullptr;
@@ -90,13 +95,10 @@ void FM1DMagnetoStatic_fast::freeMap() {
         gsl_interp_accel_free(onAxisFieldPAccel_m);
         gsl_interp_accel_free(onAxisFieldPPAccel_m);
         gsl_interp_accel_free(onAxisFieldPPPAccel_m);
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info")
-                << endl);
     }
 }
 
-bool FM1DMagnetoStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
+bool _FM1DMagnetoStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
                                               Vector_t &B) const {
 
     std::vector<double> fieldComponents;
@@ -107,7 +109,7 @@ bool FM1DMagnetoStatic_fast::getFieldstrength(const Vector_t &R, Vector_t &E,
 
 }
 
-bool FM1DMagnetoStatic_fast::getFieldDerivative(const Vector_t &R,
+bool _FM1DMagnetoStatic_fast::getFieldDerivative(const Vector_t &R,
                                                 Vector_t &/*E*/,
                                                 Vector_t &B,
                                                 const DiffDirection &/*dir*/) const {
@@ -119,33 +121,33 @@ bool FM1DMagnetoStatic_fast::getFieldDerivative(const Vector_t &R,
 
 }
 
-void FM1DMagnetoStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DMagnetoStatic_fast::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zBegin_m;
     zEnd = zEnd_m;
 }
 
-void FM1DMagnetoStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
+void _FM1DMagnetoStatic_fast::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/,
                                                 double &/*yIni*/, double &/*yFinal*/,
                                                 double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM1DMagnetoStatic_fast::swap()
+void _FM1DMagnetoStatic_fast::swap()
 { }
 
-void FM1DMagnetoStatic_fast::getInfo(Inform *msg) {
+void _FM1DMagnetoStatic_fast::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D magnetostatic); zini= "
            << zBegin_m << " m; zfinal= "
            << zEnd_m << " m;" << endl;
 }
 
-double FM1DMagnetoStatic_fast::getFrequency() const {
+double _FM1DMagnetoStatic_fast::getFrequency() const {
     return 0.0;
 }
 
-void FM1DMagnetoStatic_fast::setFrequency(double /*freq*/)
+void _FM1DMagnetoStatic_fast::setFrequency(double /*freq*/)
 { }
 
-bool FM1DMagnetoStatic_fast::checkFileData(std::ifstream &fieldFile,
+bool _FM1DMagnetoStatic_fast::checkFileData(std::ifstream &fieldFile,
                                            bool parsingPassed) {
 
     double tempDouble;
@@ -157,7 +159,7 @@ bool FM1DMagnetoStatic_fast::checkFileData(std::ifstream &fieldFile,
 
 }
 
-void FM1DMagnetoStatic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
+void _FM1DMagnetoStatic_fast::computeFieldDerivatives(std::vector<double> fourierCoefs,
                                                      double onAxisFieldP[],
                                                      double onAxisFieldPP[],
                                                      double onAxisFieldPPP[]) {
@@ -192,7 +194,7 @@ void FM1DMagnetoStatic_fast::computeFieldDerivatives(std::vector<double> fourier
     }
 }
 
-void FM1DMagnetoStatic_fast::computeFieldOffAxis(const Vector_t &R,
+void _FM1DMagnetoStatic_fast::computeFieldOffAxis(const Vector_t &R,
                                                  Vector_t &/*E*/,
                                                  Vector_t &B,
                                                  std::vector<double> fieldComponents) const {
@@ -207,7 +209,7 @@ void FM1DMagnetoStatic_fast::computeFieldOffAxis(const Vector_t &R,
 
 }
 
-void FM1DMagnetoStatic_fast::computeFieldOnAxis(double z,
+void _FM1DMagnetoStatic_fast::computeFieldOnAxis(double z,
                                                 std::vector<double> &fieldComponents) const {
 
     fieldComponents.push_back(gsl_spline_eval(onAxisFieldInterpolants_m,
@@ -220,7 +222,7 @@ void FM1DMagnetoStatic_fast::computeFieldOnAxis(double z,
                                               z, onAxisFieldPPPAccel_m));
 }
 
-std::vector<double> FM1DMagnetoStatic_fast::computeFourierCoefficients(double fieldData[]) {
+std::vector<double> _FM1DMagnetoStatic_fast::computeFourierCoefficients(double fieldData[]) {
 
     const unsigned int totalSize = 2 * numberOfGridPoints_m - 1;
     gsl_fft_real_wavetable *waveTable = gsl_fft_real_wavetable_alloc(totalSize);
@@ -251,7 +253,7 @@ std::vector<double> FM1DMagnetoStatic_fast::computeFourierCoefficients(double fi
 
 }
 
-void FM1DMagnetoStatic_fast::computeInterpolationVectors(double onAxisFieldP[],
+void _FM1DMagnetoStatic_fast::computeInterpolationVectors(double onAxisFieldP[],
                                                          double onAxisFieldPP[],
                                                          double onAxisFieldPPP[]) {
 
@@ -285,7 +287,7 @@ void FM1DMagnetoStatic_fast::computeInterpolationVectors(double onAxisFieldP[],
     delete [] z;
 }
 
-void FM1DMagnetoStatic_fast::convertHeaderData() {
+void _FM1DMagnetoStatic_fast::convertHeaderData() {
 
     // Convert to m.
     rBegin_m *= Units::cm2m;
@@ -294,7 +296,7 @@ void FM1DMagnetoStatic_fast::convertHeaderData() {
     zEnd_m *= Units::cm2m;
 }
 
-void FM1DMagnetoStatic_fast::normalizeField(double maxBz, std::vector<double> &fourierCoefs) {
+void _FM1DMagnetoStatic_fast::normalizeField(double maxBz, std::vector<double> &fourierCoefs) {
     if (!normalize_m) return;
 
     for (unsigned int dataIndex = 0; dataIndex < numberOfGridPoints_m; ++ dataIndex)
@@ -306,7 +308,7 @@ void FM1DMagnetoStatic_fast::normalizeField(double maxBz, std::vector<double> &f
 
 }
 
-double FM1DMagnetoStatic_fast::readFileData(std::ifstream &fieldFile,
+double _FM1DMagnetoStatic_fast::readFileData(std::ifstream &fieldFile,
                                             double fieldData[]) {
 
     double maxBz = 0.0;
@@ -319,7 +321,7 @@ double FM1DMagnetoStatic_fast::readFileData(std::ifstream &fieldFile,
     return maxBz;
 }
 
-bool FM1DMagnetoStatic_fast::readFileHeader(std::ifstream &fieldFile) {
+bool _FM1DMagnetoStatic_fast::readFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
     int tempInt;
@@ -339,7 +341,7 @@ bool FM1DMagnetoStatic_fast::readFileHeader(std::ifstream &fieldFile) {
         tempString = Util::toUpper(tempString);
         if (tempString != "TRUE" &&
             tempString != "FALSE")
-            throw GeneralClassicException("FM1DMagnetoStatic_fast::readFileHeader",
+            throw GeneralClassicException("_FM1DMagnetoStatic_fast::readFileHeader",
                                           "The third string on the first line of 1D field "
                                           "maps has to be either TRUE or FALSE");
 
@@ -365,7 +367,7 @@ bool FM1DMagnetoStatic_fast::readFileHeader(std::ifstream &fieldFile) {
     return parsingPassed;
 }
 
-void FM1DMagnetoStatic_fast::stripFileHeader(std::ifstream &fieldFile) {
+void _FM1DMagnetoStatic_fast::stripFileHeader(std::ifstream &fieldFile) {
 
     std::string tempString;
 
@@ -374,7 +376,7 @@ void FM1DMagnetoStatic_fast::stripFileHeader(std::ifstream &fieldFile) {
     getLine(fieldFile, tempString);
 }
 
-void FM1DMagnetoStatic_fast::prepareForMapCheck(std::vector<double> &fourierCoefs) {
+void _FM1DMagnetoStatic_fast::prepareForMapCheck(std::vector<double> &fourierCoefs) {
     std::vector<double> zSampling(numberOfGridPoints_m);
     for (unsigned int zStepIndex = 0; zStepIndex < numberOfGridPoints_m; ++ zStepIndex)
         zSampling[zStepIndex] = deltaZ_m * zStepIndex;
diff --git a/src/Classic/Fields/FM1DMagnetoStatic_fast.h b/src/Classic/Fields/FM1DMagnetoStatic_fast.h
index 431481c008ec0d86f559dd4919aeabfcddaeb742..118a0dd2953274d7f0b9eae22def69a2699b8f4b 100644
--- a/src/Classic/Fields/FM1DMagnetoStatic_fast.h
+++ b/src/Classic/Fields/FM1DMagnetoStatic_fast.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DMagnetoStatic_fast: public Fieldmap {
+class _FM1DMagnetoStatic_fast: public _Fieldmap {
 
 public:
+    virtual ~_FM1DMagnetoStatic_fast();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal,
@@ -20,8 +22,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM1DMagnetoStatic_fast(std::string aFilename);
-    ~FM1DMagnetoStatic_fast();
+    _FM1DMagnetoStatic_fast(const std::string& filename);
+
+    static FM1DMagnetoStatic_fast create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -68,12 +71,14 @@ private:
     gsl_interp_accel *onAxisFieldPPAccel_m;
     gsl_interp_accel *onAxisFieldPPPAccel_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM1DMagnetoStatic_fast::isInside(const Vector_t &r) const
+inline bool _FM1DMagnetoStatic_fast::isInside(const Vector_t &r) const
 {
     return r(2) >= zBegin_m && r(2) < zEnd_m;
 }
 
-#endif
+using FM1DMagnetoStatic_fast = std::shared_ptr<_FM1DMagnetoStatic_fast>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DProfile1.cpp b/src/Classic/Fields/FM1DProfile1.cpp
index 2e388b5bee355b3f091b7ffb19d104ab6983a023..1f4955bf7c4d2cbf6d0b0baba3719ac3928d528a 100644
--- a/src/Classic/Fields/FM1DProfile1.cpp
+++ b/src/Classic/Fields/FM1DProfile1.cpp
@@ -7,8 +7,8 @@
 #include <fstream>
 #include <ios>
 
-FM1DProfile1::FM1DProfile1(std::string aFilename):
-    Fieldmap(aFilename),
+_FM1DProfile1::_FM1DProfile1(const std::string& filename):
+    _Fieldmap(filename),
     entranceParameter1_m(0.0),
     entranceParameter2_m(0.0),
     entranceParameter3_m(0.0),
@@ -123,10 +123,15 @@ FM1DProfile1::FM1DProfile1(std::string aFilename):
     }
 }
 
-FM1DProfile1::~FM1DProfile1() {
+_FM1DProfile1::~_FM1DProfile1() {
 }
 
-void FM1DProfile1::readMap() {
+FM1DProfile1 _FM1DProfile1::create(const std::string& filename)
+{
+    return FM1DProfile1(new _FM1DProfile1(filename));
+}
+
+void _FM1DProfile1::readMap() {
 
     if(!engeCoeffsEntry_m.empty())
         engeCoeffsEntry_m.clear();
@@ -206,10 +211,10 @@ void FM1DProfile1::readMap() {
     }
 }
 
-void FM1DProfile1::freeMap() {
+void _FM1DProfile1::freeMap() {
 }
 
-bool FM1DProfile1::getFieldstrength(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/) const {
+bool _FM1DProfile1::getFieldstrength(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/) const {
 
     /*
      * For this type of field map, the elements who use it calculate the field
@@ -219,19 +224,19 @@ bool FM1DProfile1::getFieldstrength(const Vector_t &/*R*/, Vector_t &/*E*/, Vect
 
 }
 
-bool FM1DProfile1::getFieldDerivative(const Vector_t &/*R*/,
+bool _FM1DProfile1::getFieldDerivative(const Vector_t &/*R*/,
                                       Vector_t &/*E*/,
                                       Vector_t &/*B*/,
                                       const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM1DProfile1::getFieldDimensions(double &sBegin,
+void _FM1DProfile1::getFieldDimensions(double &sBegin,
                                       double &sEnd) const {
     sBegin = sBegin_m;
     sEnd = sEnd_m;
 }
-void FM1DProfile1::getFieldDimensions(double &/*xIni*/,
+void _FM1DProfile1::getFieldDimensions(double &/*xIni*/,
                                       double &/*xFinal*/,
                                       double &/*yIni*/,
                                       double &/*yFinal*/,
@@ -240,30 +245,30 @@ void FM1DProfile1::getFieldDimensions(double &/*xIni*/,
 
 }
 
-void FM1DProfile1::swap()
+void _FM1DProfile1::swap()
 {}
 
-void FM1DProfile1::getInfo(Inform *msg) {
+void _FM1DProfile1::getInfo(Inform *msg) {
     (*msg) << Filename_m
            << " (1D Profile type 1)"
            << endl;
 }
 
-double FM1DProfile1::getFrequency() const {
+double _FM1DProfile1::getFrequency() const {
     return 0.0;
 }
 
-void FM1DProfile1::setFrequency(double /*freq*/)
+void _FM1DProfile1::setFrequency(double /*freq*/)
 {}
 
-void FM1DProfile1::get1DProfile1EngeCoeffs(std::vector<double> &engeCoeffsEntry,
+void _FM1DProfile1::get1DProfile1EngeCoeffs(std::vector<double> &engeCoeffsEntry,
         std::vector<double> &engeCoeffsExit) {
     engeCoeffsEntry = engeCoeffsEntry_m;
     engeCoeffsExit = engeCoeffsExit_m;
 
 }
 
-void FM1DProfile1::get1DProfile1EntranceParam(double &entranceParameter1,
+void _FM1DProfile1::get1DProfile1EntranceParam(double &entranceParameter1,
         double &entranceParameter2,
         double &entranceParameter3) {
     entranceParameter1 = entranceParameter1_m;
@@ -271,7 +276,7 @@ void FM1DProfile1::get1DProfile1EntranceParam(double &entranceParameter1,
     entranceParameter3 = entranceParameter3_m;
 }
 
-void FM1DProfile1::get1DProfile1ExitParam(double &exitParameter1,
+void _FM1DProfile1::get1DProfile1ExitParam(double &exitParameter1,
         double &exitParameter2,
         double &exitParameter3) {
     exitParameter1 = exitParameter1_m;
@@ -279,24 +284,24 @@ void FM1DProfile1::get1DProfile1ExitParam(double &exitParameter1,
     exitParameter3 = exitParameter3_m;
 }
 
-double FM1DProfile1::getFieldGap() {
+double _FM1DProfile1::getFieldGap() {
     return gapHeight_m;
 }
-void FM1DProfile1::setFieldGap(double gap) {
+void _FM1DProfile1::setFieldGap(double gap) {
 
     gapHeight_m = gap;
 
 }
 
-double FM1DProfile1::computeEntranceFringe(double z) const {
+double _FM1DProfile1::computeEntranceFringe(double z) const {
     return computeFringe(engeCoeffsEntry_m, z / gapHeight_m);
 }
 
-double FM1DProfile1::computeExitFringe(double z) const {
+double _FM1DProfile1::computeExitFringe(double z) const {
     return computeFringe(engeCoeffsExit_m, z / gapHeight_m);
 }
 
-double FM1DProfile1::computeFringe(const std::vector<double> &coefs, double z) const {
+double _FM1DProfile1::computeFringe(const std::vector<double> &coefs, double z) const {
 
     const size_t N = coefs.size();
     double expSum = coefs.at(0);
@@ -306,4 +311,4 @@ double FM1DProfile1::computeFringe(const std::vector<double> &coefs, double z) c
     }
 
     return 1.0 / (1.0 + exp(expSum));
-}
+}
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DProfile1.h b/src/Classic/Fields/FM1DProfile1.h
index c92484e2b6566da48b7543026e073571c3b3c39b..10a48b8cf3023a4d9c360eefa0554f2084e3a379 100644
--- a/src/Classic/Fields/FM1DProfile1.h
+++ b/src/Classic/Fields/FM1DProfile1.h
@@ -11,9 +11,10 @@
  * Class FM1DProfile1 defines a 1D field map for us in bending magnets.
  */
 
-class FM1DProfile1: public Fieldmap {
+class _FM1DProfile1: public _Fieldmap {
 
 public:
+    virtual ~_FM1DProfile1();
 
     virtual bool getFieldDerivative(const Vector_t &X,
                                     Vector_t &E,
@@ -49,9 +50,9 @@ public:
 private:
 
     /// Constructor with field map file name.
-    FM1DProfile1(std::string Filename);
+    _FM1DProfile1(const std::string& filename);
 
-    virtual ~FM1DProfile1();
+    static FM1DProfile1 create(const std::string& filename);
 
     virtual void freeMap();
     virtual void readMap();
@@ -84,7 +85,9 @@ private:
      double sBegin_m;                /// Start of field map in s coordinates (m).
      double sEnd_m;                  /// End of field map in s coordinates (m).
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
+using FM1DProfile1 = std::shared_ptr<_FM1DProfile1>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM1DProfile2.cpp b/src/Classic/Fields/FM1DProfile2.cpp
index 839e2a7dd94ce709b5145cd53e7bb2bc66206dab..f293b158750cc97e92473c5488fdd936135b6181 100644
--- a/src/Classic/Fields/FM1DProfile2.cpp
+++ b/src/Classic/Fields/FM1DProfile2.cpp
@@ -7,8 +7,8 @@
 #include <ios>
 #include <cmath>
 
-FM1DProfile2::FM1DProfile2(std::string aFilename)
-    : Fieldmap(aFilename),
+_FM1DProfile2::_FM1DProfile2(const std::string& filename)
+    : _Fieldmap(filename),
       EngeCoefs_entry_m(nullptr),
       EngeCoefs_exit_m(nullptr),
       exit_slope_m(0.0),
@@ -80,14 +80,19 @@ FM1DProfile2::FM1DProfile2(std::string aFilename)
     }
 }
 
-FM1DProfile2::~FM1DProfile2() {
+_FM1DProfile2::~_FM1DProfile2() {
     if (EngeCoefs_entry_m != nullptr) {
         delete[] EngeCoefs_entry_m;
         delete[] EngeCoefs_exit_m;
     }
 }
 
-void FM1DProfile2::readMap() {
+FM1DProfile2 _FM1DProfile2::create(const std::string& filename)
+{
+    return FM1DProfile2(new _FM1DProfile2(filename));
+}
+
+void _FM1DProfile2::readMap() {
     if (EngeCoefs_entry_m == nullptr) {
         double tolerance = 1e-8;
 
@@ -192,19 +197,15 @@ void FM1DProfile2::readMap() {
     }
 }
 
-void FM1DProfile2::freeMap() {
+void _FM1DProfile2::freeMap() {
     if (EngeCoefs_entry_m != nullptr) {
 
         delete[] EngeCoefs_entry_m;
         delete[] EngeCoefs_exit_m;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << "\n"
-                << endl);
-
     }
 }
 
-bool FM1DProfile2::getFieldstrength(const Vector_t &R, Vector_t &strength, Vector_t &info) const {
+bool _FM1DProfile2::getFieldstrength(const Vector_t &R, Vector_t &strength, Vector_t &info) const {
 
     info = Vector_t(0.0);
 
@@ -323,35 +324,35 @@ bool FM1DProfile2::getFieldstrength(const Vector_t &R, Vector_t &strength, Vecto
 
 }
 
-bool FM1DProfile2::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _FM1DProfile2::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM1DProfile2::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM1DProfile2::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_entry_m;
     zEnd = zend_exit_m;
 }
-void FM1DProfile2::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _FM1DProfile2::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM1DProfile2::swap()
+void _FM1DProfile2::swap()
 {}
 
-void FM1DProfile2::getInfo(Inform *msg) {
+void _FM1DProfile2::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (1D Profile type 2); zini= " << zbegin_entry_m << " m; zfinal= " << zend_exit_m << " m;" << endl;
 }
 
-double FM1DProfile2::getFrequency() const {
+double _FM1DProfile2::getFrequency() const {
     return 0.0;
 }
 
-void FM1DProfile2::setFrequency(double /*freq*/)
+void _FM1DProfile2::setFrequency(double /*freq*/)
 {}
 
-void FM1DProfile2::setExitFaceSlope(const double &m) {
+void _FM1DProfile2::setExitFaceSlope(const double &m) {
     exit_slope_m = m;
 }
 
-void FM1DProfile2::setEdgeConstants(const double &bendAngle, const double &entranceAngle, const double &exitAngle) {
+void _FM1DProfile2::setEdgeConstants(const double &bendAngle, const double &entranceAngle, const double &exitAngle) {
 
     double deltaZ = polynomialOrigin_exit_m - polynomialOrigin_entry_m;
 
diff --git a/src/Classic/Fields/FM1DProfile2.h b/src/Classic/Fields/FM1DProfile2.h
index 11cb508bfc0d09b5136c70963593a25405f1f23a..a399f93052e47cd6cb56c8628a95629365249c25 100644
--- a/src/Classic/Fields/FM1DProfile2.h
+++ b/src/Classic/Fields/FM1DProfile2.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM1DProfile2: public Fieldmap {
+class _FM1DProfile2: public _Fieldmap {
 
 public:
+    virtual ~_FM1DProfile2();
+
     virtual bool getFieldstrength(const Vector_t &X, Vector_t &strength, Vector_t &info) const;
     virtual bool getFieldDerivative(const Vector_t &X, Vector_t &E, Vector_t &B, const DiffDirection &dir) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
@@ -18,8 +20,9 @@ public:
     virtual void setEdgeConstants(const double &bendAngle, const double &entranceAngle, const double &exitAngle);
 
 private:
-    FM1DProfile2(std::string aFilename);
-    ~FM1DProfile2();
+    _FM1DProfile2(const std::string& filename);
+
+    static FM1DProfile2 create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -55,11 +58,13 @@ private:
     double cosExitRotation_m;
     double sinExitRotation_m;
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
 namespace QRDecomposition {
     void solve(double *Matrix, double *Solution, double *rightHandSide, const int &M, const int &N);
 }
 
-#endif
+using FM1DProfile2 = std::shared_ptr<_FM1DProfile2>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM2DDynamic.cpp b/src/Classic/Fields/FM2DDynamic.cpp
index 167180cbba366802cc3e6190cd5756bde092e1d3..6fe4a60c41db170e3ae47ed1fba42ba1d3ace3b7 100644
--- a/src/Classic/Fields/FM2DDynamic.cpp
+++ b/src/Classic/Fields/FM2DDynamic.cpp
@@ -10,8 +10,8 @@
 #include <cmath>
 
 
-FM2DDynamic::FM2DDynamic(std::string aFilename)
-    : Fieldmap(aFilename),
+_FM2DDynamic::_FM2DDynamic(const std::string& filename)
+    : _Fieldmap(filename),
       FieldstrengthEz_m(nullptr),
       FieldstrengthEr_m(nullptr),
       FieldstrengthBt_m(nullptr) {
@@ -33,7 +33,7 @@ FM2DDynamic::FM2DDynamic(std::string aFilename)
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("FM2DDynamic::FM2DDynamic",
+                throw GeneralClassicException("_FM2DDynamic::_FM2DDynamic",
                                               "The third string on the first line of 2D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -76,7 +76,7 @@ FM2DDynamic::FM2DDynamic(std::string aFilename)
         if(!parsing_passed) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("FM2DDynamic::FM2DDynamic",
+            throw GeneralClassicException("_FM2DDynamic::_FM2DDynamic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         } else {
             // convert MHz to Hz and frequency to angular frequency
@@ -103,11 +103,16 @@ FM2DDynamic::FM2DDynamic(std::string aFilename)
 }
 
 
-FM2DDynamic::~FM2DDynamic() {
+_FM2DDynamic::~_FM2DDynamic() {
     freeMap();
 }
 
-void FM2DDynamic::readMap() {
+FM2DDynamic _FM2DDynamic::create(const std::string& filename)
+{
+    return FM2DDynamic(new _FM2DDynamic(filename));
+}
+
+void _FM2DDynamic::readMap() {
     if(FieldstrengthEz_m == nullptr) {
         // declare variables and allocate memory
         std::ifstream in;
@@ -172,7 +177,7 @@ void FM2DDynamic::readMap() {
     }
 }
 
-void FM2DDynamic::freeMap() {
+void _FM2DDynamic::freeMap() {
     if(FieldstrengthEz_m != nullptr) {
         delete[] FieldstrengthEz_m;
         FieldstrengthEz_m = nullptr;
@@ -180,13 +185,10 @@ void FM2DDynamic::freeMap() {
         FieldstrengthEr_m = nullptr;
         delete[] FieldstrengthBt_m;
         FieldstrengthBt_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m + "'", "info") << "\n"
-                << endl);
     }
 }
 
-bool FM2DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
+bool _FM2DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
     // do bi-linear interpolation
     const double RR = std::sqrt(R(0) * R(0) + R(1) * R(1));
 
@@ -230,34 +232,34 @@ bool FM2DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B)
     return false;
 }
 
-bool FM2DDynamic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _FM2DDynamic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM2DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM2DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
-void FM2DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _FM2DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM2DDynamic::swap() {
+void _FM2DDynamic::swap() {
     if(swap_m) swap_m = false;
     else swap_m = true;
 }
 
-void FM2DDynamic::getInfo(Inform *msg) {
+void _FM2DDynamic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (2D dynamic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double FM2DDynamic::getFrequency() const {
+double _FM2DDynamic::getFrequency() const {
     return frequency_m;
 }
 
-void FM2DDynamic::setFrequency(double freq) {
+void _FM2DDynamic::setFrequency(double freq) {
     frequency_m = freq;
 }
 
-void FM2DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
+void _FM2DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
     double dz = (zend_m - zbegin_m) / (num_gridpz_m - 1);
     F.resize(num_gridpz_m);
 
diff --git a/src/Classic/Fields/FM2DDynamic.h b/src/Classic/Fields/FM2DDynamic.h
index 5d53aa707db35127dad3a00fb5031e948983a0c1..8c36afe045532ae248d3620b88e3f1044048378b 100644
--- a/src/Classic/Fields/FM2DDynamic.h
+++ b/src/Classic/Fields/FM2DDynamic.h
@@ -5,9 +5,11 @@
 #include "gsl/gsl_spline.h"
 #include "Fields/Fieldmap.h"
 
-class FM2DDynamic: public Fieldmap {
+class _FM2DDynamic: public _Fieldmap {
 
 public:
+    virtual ~_FM2DDynamic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -20,8 +22,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM2DDynamic(std::string aFilename);
-    ~FM2DDynamic();
+    _FM2DDynamic(const std::string& filename);
+
+    static FM2DDynamic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -42,12 +45,14 @@ private:
     int num_gridpz_m;              /**< Read in number of points after 0(not counted here) in grid, z-direction*/
 
     bool swap_m;
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM2DDynamic::isInside(const Vector_t &r) const
+inline bool _FM2DDynamic::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m && std::sqrt(r(0)*r(0) + r(1)*r(1)) < rend_m;
 }
 
+using FM2DDynamic = std::shared_ptr<_FM2DDynamic>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM2DElectroStatic.cpp b/src/Classic/Fields/FM2DElectroStatic.cpp
index e040b75a12471661c09797b3c37594d8d97dd7dc..49868c3577c186a0e56132ccfbbcfa99149a1e50 100644
--- a/src/Classic/Fields/FM2DElectroStatic.cpp
+++ b/src/Classic/Fields/FM2DElectroStatic.cpp
@@ -8,8 +8,8 @@
 #include <ios>
 #include <cmath>
 
-FM2DElectroStatic::FM2DElectroStatic(std::string aFilename)
-    : Fieldmap(aFilename),
+_FM2DElectroStatic::_FM2DElectroStatic(const std::string& filename)
+    : _Fieldmap(filename),
       FieldstrengthEz_m(nullptr),
       FieldstrengthEr_m(nullptr) {
     std::ifstream file;
@@ -33,7 +33,7 @@ FM2DElectroStatic::FM2DElectroStatic(std::string aFilename)
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("FM2DElectroStatic::FM2DElectroStatic",
+                throw GeneralClassicException("_FM2DElectroStatic::_FM2DElectroStatic",
                                               "The third string on the first line of 2D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -70,7 +70,7 @@ FM2DElectroStatic::FM2DElectroStatic(std::string aFilename)
         if (!parsing_passed) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("FM2DElectroStatic::FM2DElectroStatic",
+            throw GeneralClassicException("_FM2DElectroStatic::_FM2DElectroStatic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         } else {
             // conversion from cm to m
@@ -93,11 +93,16 @@ FM2DElectroStatic::FM2DElectroStatic(std::string aFilename)
     }
 }
 
-FM2DElectroStatic::~FM2DElectroStatic() {
+_FM2DElectroStatic::~_FM2DElectroStatic() {
     freeMap();
 }
 
-void FM2DElectroStatic::readMap() {
+FM2DElectroStatic _FM2DElectroStatic::create(const std::string& filename)
+{
+    return FM2DElectroStatic(new _FM2DElectroStatic(filename));
+}
+
+void _FM2DElectroStatic::readMap() {
     if (FieldstrengthEz_m == nullptr) {
         // declare variables and allocate memory
     	std::ifstream in;
@@ -153,19 +158,16 @@ void FM2DElectroStatic::readMap() {
     }
 }
 
-void FM2DElectroStatic::freeMap() {
+void _FM2DElectroStatic::freeMap() {
     if (FieldstrengthEz_m != nullptr) {
         delete[] FieldstrengthEz_m;
         FieldstrengthEz_m = nullptr;
         delete[] FieldstrengthEr_m;
         FieldstrengthEr_m = nullptr;
-
-        INFOMSG(typeset_msg("freed field map '" + Filename_m + "'", "info") << "\n"
-                << endl)
     }
 }
 
-bool FM2DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &/*B*/) const {
+bool _FM2DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &/*B*/) const {
     // do bi-linear interpolation
     const double RR = std::sqrt(R(0) * R(0) + R(1) * R(1));
 
@@ -200,28 +202,28 @@ bool FM2DElectroStatic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_
     return false;
 }
 
-bool FM2DElectroStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _FM2DElectroStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM2DElectroStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM2DElectroStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
-void FM2DElectroStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _FM2DElectroStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM2DElectroStatic::swap() {
+void _FM2DElectroStatic::swap() {
     if (swap_m) swap_m = false;
     else swap_m = true;
 }
 
-void FM2DElectroStatic::getInfo(Inform *msg) {
+void _FM2DElectroStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (2D electrostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double FM2DElectroStatic::getFrequency() const {
+double _FM2DElectroStatic::getFrequency() const {
     return 0.0;
 }
 
-void FM2DElectroStatic::setFrequency(double /*freq*/)
+void _FM2DElectroStatic::setFrequency(double /*freq*/)
 { ;}
diff --git a/src/Classic/Fields/FM2DElectroStatic.h b/src/Classic/Fields/FM2DElectroStatic.h
index bc7f4b5490258da61b28cb2e72acd2f5933f6d5b..69cfa6823598479afb8f09311111a1c9a357fe02 100644
--- a/src/Classic/Fields/FM2DElectroStatic.h
+++ b/src/Classic/Fields/FM2DElectroStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM2DElectroStatic: public Fieldmap {
+class _FM2DElectroStatic: public _Fieldmap {
 
 public:
+    virtual ~_FM2DElectroStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -17,8 +19,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM2DElectroStatic(std::string aFilename);
-    ~FM2DElectroStatic();
+    _FM2DElectroStatic(const std::string& filename);
+
+    static FM2DElectroStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -36,12 +39,14 @@ private:
     int num_gridpz_m;              /**< Read in number of points after 0(not counted here) in grid, z-direction*/
 
     bool swap_m;
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM2DElectroStatic::isInside(const Vector_t &r) const
+inline bool _FM2DElectroStatic::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m && std::sqrt(r(0)*r(0) + r(1)*r(1)) < rend_m;
 }
 
+using FM2DElectroStatic = std::shared_ptr<_FM2DElectroStatic>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM2DMagnetoStatic.cpp b/src/Classic/Fields/FM2DMagnetoStatic.cpp
index 9fb6e2b0661541c4254078ef1962091a35cbc03c..9d31408c36b836c98aa7bd58662a614377a0ad81 100644
--- a/src/Classic/Fields/FM2DMagnetoStatic.cpp
+++ b/src/Classic/Fields/FM2DMagnetoStatic.cpp
@@ -8,8 +8,8 @@
 #include <ios>
 #include <cmath>
 
-FM2DMagnetoStatic::FM2DMagnetoStatic(std::string aFilename):
-    Fieldmap(aFilename),
+_FM2DMagnetoStatic::_FM2DMagnetoStatic(const std::string& filename):
+    _Fieldmap(filename),
     FieldstrengthBz_m(nullptr),
     FieldstrengthBr_m(nullptr) {
     std::ifstream file;
@@ -35,7 +35,7 @@ FM2DMagnetoStatic::FM2DMagnetoStatic(std::string aFilename):
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("FM2DMagnetoStatic::FM2DMagnetoStatic",
+                throw GeneralClassicException("_FM2DMagnetoStatic::_FM2DMagnetoStatic",
                                               "The third string on the first line of 2D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -72,7 +72,7 @@ FM2DMagnetoStatic::FM2DMagnetoStatic(std::string aFilename):
         if(!parsing_passed) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("FM2DMagnetoStatic::FM2DMagnetoStatic",
+            throw GeneralClassicException("_FM2DMagnetoStatic::_FM2DMagnetoStatic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         } else {
             // conversion from cm to m
@@ -95,11 +95,16 @@ FM2DMagnetoStatic::FM2DMagnetoStatic(std::string aFilename):
     }
 }
 
-FM2DMagnetoStatic::~FM2DMagnetoStatic() {
+_FM2DMagnetoStatic::~_FM2DMagnetoStatic() {
     freeMap();
 }
 
-void FM2DMagnetoStatic::readMap() {
+FM2DMagnetoStatic _FM2DMagnetoStatic::create(const std::string& filename)
+{
+    return FM2DMagnetoStatic(new _FM2DMagnetoStatic(filename));
+}
+
+void _FM2DMagnetoStatic::readMap() {
     if(FieldstrengthBz_m == nullptr) {
         // declare variables and allocate memory
         std::ifstream in;
@@ -153,19 +158,17 @@ void FM2DMagnetoStatic::readMap() {
     }
 }
 
-void FM2DMagnetoStatic::freeMap() {
+void _FM2DMagnetoStatic::freeMap() {
     if(FieldstrengthBz_m != nullptr) {
         delete[] FieldstrengthBz_m;
         delete[] FieldstrengthBr_m;
 
         FieldstrengthBz_m = nullptr;
         FieldstrengthBr_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << endl);
     }
 }
 
-bool FM2DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
+bool _FM2DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
     // do bi-linear interpolation
     const double RR = std::sqrt(R(0) * R(0) + R(1) * R(1));
 
@@ -201,7 +204,7 @@ bool FM2DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vec
     return false;
 }
 
-bool FM2DMagnetoStatic::getFieldDerivative(const Vector_t &R, Vector_t &/*E*/, Vector_t &B, const DiffDirection &dir) const {
+bool _FM2DMagnetoStatic::getFieldDerivative(const Vector_t &R, Vector_t &/*E*/, Vector_t &B, const DiffDirection &dir) const {
 
     double BfieldR, BfieldZ;
 
@@ -303,25 +306,25 @@ bool FM2DMagnetoStatic::getFieldDerivative(const Vector_t &R, Vector_t &/*E*/, V
     return false;
 }
 
-void FM2DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM2DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
 
-void FM2DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _FM2DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM2DMagnetoStatic::swap() {
+void _FM2DMagnetoStatic::swap() {
     if(swap_m) swap_m = false;
     else swap_m = true;
 }
 
-void FM2DMagnetoStatic::getInfo(Inform *msg) {
+void _FM2DMagnetoStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (2D magnetostatic); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double FM2DMagnetoStatic::getFrequency() const {
+double _FM2DMagnetoStatic::getFrequency() const {
     return 0.0;
 }
 
-void FM2DMagnetoStatic::setFrequency(double /*freq*/)
+void _FM2DMagnetoStatic::setFrequency(double /*freq*/)
 { ;}
diff --git a/src/Classic/Fields/FM2DMagnetoStatic.h b/src/Classic/Fields/FM2DMagnetoStatic.h
index b87db9325867761e9cf3420c522bb68690205d05..e61f45fcfc72d083e538eab5a13b6251e4826963 100644
--- a/src/Classic/Fields/FM2DMagnetoStatic.h
+++ b/src/Classic/Fields/FM2DMagnetoStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM2DMagnetoStatic: public Fieldmap {
+class _FM2DMagnetoStatic: public _Fieldmap {
 
 public:
+    virtual ~_FM2DMagnetoStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
@@ -17,8 +19,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM2DMagnetoStatic(std::string aFilename);
-    ~FM2DMagnetoStatic();
+    _FM2DMagnetoStatic(const std::string& filename);
+
+    static FM2DMagnetoStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -36,12 +39,14 @@ private:
     int num_gridpz_m;              /**< Read in number of points after 0(not counted here) in grid, z-direction*/
 
     bool swap_m;
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM2DMagnetoStatic::isInside(const Vector_t &r) const
+inline bool _FM2DMagnetoStatic::isInside(const Vector_t &r) const
 {
     return r(2) >= zbegin_m && r(2) < zend_m && std::sqrt(r(0)*r(0) + r(1)*r(1)) < rend_m;
 }
 
+using FM2DMagnetoStatic = std::shared_ptr<_FM2DMagnetoStatic>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DDynamic.cpp b/src/Classic/Fields/FM3DDynamic.cpp
index 279bb2c79c4625f5457f90dd58c76bd250ec299f..2dcb5f28f80f3c5f397c57e811cfa35438b3b4cf 100644
--- a/src/Classic/Fields/FM3DDynamic.cpp
+++ b/src/Classic/Fields/FM3DDynamic.cpp
@@ -12,8 +12,8 @@
 #include <ios>
 
 
-FM3DDynamic::FM3DDynamic(std::string aFilename):
-    Fieldmap(aFilename),
+_FM3DDynamic::_FM3DDynamic(const std::string& filename):
+    _Fieldmap(filename),
     FieldstrengthEz_m(nullptr),
     FieldstrengthEx_m(nullptr),
     FieldstrengthEy_m(nullptr),
@@ -38,7 +38,7 @@ FM3DDynamic::FM3DDynamic(std::string aFilename):
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("FM3DDynamic::FM3DDynamic",
+                throw GeneralClassicException("_FM3DDynamic::_FM3DDynamic",
                                               "The second string on the first line of 3D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -73,7 +73,7 @@ FM3DDynamic::FM3DDynamic(std::string aFilename):
         if(!parsing_passed) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("FM3DDynamic::FM3DDynamic",
+            throw GeneralClassicException("_FM3DDynamic::_FM3DDynamic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         } else {
             frequency_m *= Physics::two_pi * Units::MHz2Hz;
@@ -102,11 +102,16 @@ FM3DDynamic::FM3DDynamic(std::string aFilename):
 }
 
 
-FM3DDynamic::~FM3DDynamic() {
+_FM3DDynamic::~_FM3DDynamic() {
     freeMap();
 }
 
-void FM3DDynamic::readMap() {
+FM3DDynamic _FM3DDynamic::create(const std::string& filename)
+{
+    return FM3DDynamic(new _FM3DDynamic(filename));
+}
+
+void _FM3DDynamic::readMap() {
     if(FieldstrengthEz_m == nullptr) {
 
     	std::ifstream in(Filename_m.c_str());
@@ -217,7 +222,7 @@ void FM3DDynamic::readMap() {
     }
 }
 
-void FM3DDynamic::freeMap() {
+void _FM3DDynamic::freeMap() {
     if(FieldstrengthEz_m != nullptr) {
         delete[] FieldstrengthEz_m;
         delete[] FieldstrengthEx_m;
@@ -232,13 +237,10 @@ void FM3DDynamic::freeMap() {
         FieldstrengthBz_m = nullptr;
         FieldstrengthBx_m = nullptr;
         FieldstrengthBy_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m + "'", "info") << "\n"
-                << endl);
     }
 }
 
-bool FM3DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
+bool _FM3DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const {
     const unsigned int index_x = static_cast<int>(std::floor((R(0) - xbegin_m) / hx_m));
     const double lever_x = (R(0) - xbegin_m) / hx_m - index_x;
 
@@ -318,34 +320,34 @@ bool FM3DDynamic::getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B)
     return false;
 }
 
-bool FM3DDynamic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _FM3DDynamic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM3DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM3DDynamic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
-void FM3DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _FM3DDynamic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM3DDynamic::swap() {}
+void _FM3DDynamic::swap() {}
 
-void FM3DDynamic::getInfo(Inform *msg) {
+void _FM3DDynamic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (3D dynamic) "
            << " xini= " << xbegin_m << " xfinal= " << xend_m
            << " yini= " << ybegin_m << " yfinal= " << yend_m
            << " zini= " << zbegin_m << " zfinal= " << zend_m << " (m) " << endl;
 }
 
-double FM3DDynamic::getFrequency() const {
+double _FM3DDynamic::getFrequency() const {
     return frequency_m;
 }
 
-void FM3DDynamic::setFrequency(double freq) {
+void _FM3DDynamic::setFrequency(double freq) {
     frequency_m = freq;
 }
 
-void FM3DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
+void _FM3DDynamic::getOnaxisEz(std::vector<std::pair<double, double> > & F) {
     F.resize(num_gridpz_m);
 
     int index_x = static_cast<int>(ceil(-xbegin_m / hx_m));
diff --git a/src/Classic/Fields/FM3DDynamic.h b/src/Classic/Fields/FM3DDynamic.h
index f5ab1575e28bd3668c6e261f36d206c16d8fff61..7b90c2316119920ec07f884032a483d1585846cb 100644
--- a/src/Classic/Fields/FM3DDynamic.h
+++ b/src/Classic/Fields/FM3DDynamic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM3DDynamic: public Fieldmap {
+class _FM3DDynamic: public _Fieldmap {
 
 public:
+    virtual ~_FM3DDynamic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -18,8 +20,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM3DDynamic(std::string aFilename);
-    ~FM3DDynamic();
+    _FM3DDynamic(const std::string& filename);
+
+    static FM3DDynamic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -50,14 +53,16 @@ private:
     unsigned int num_gridpz_m;              /**< Read in number of points after 0(not counted here) in grid, z-direction*/
 
     bool normalize_m;
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-inline bool FM3DDynamic::isInside(const Vector_t &r) const
+inline bool _FM3DDynamic::isInside(const Vector_t &r) const
 {
     return ((r(0) >= xbegin_m && r(0) < xend_m) &&
             (r(1) >= ybegin_m && r(1) < yend_m) &&
             (r(2) >= zbegin_m && r(2) < zend_m));
 }
 
+using FM3DDynamic = std::shared_ptr<_FM3DDynamic>;
+
 #endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DH5Block.cpp b/src/Classic/Fields/FM3DH5Block.cpp
index daa99860816b956fa494ca8f8ecef68126de510c..bd6a8897f62947c9c231abc20c6705bcc9c5f261 100644
--- a/src/Classic/Fields/FM3DH5Block.cpp
+++ b/src/Classic/Fields/FM3DH5Block.cpp
@@ -1,5 +1,5 @@
 //
-// Class FM3DH5Block
+// Class _FM3DH5Block
 //   Class for dynamic 3D field-maps stored in H5hut files.
 //
 // Copyright (c) 2020, Achim Gsell, Paul Scherrer Institut, Villigen PSI, Switzerland
@@ -18,25 +18,30 @@
 
 #include "Fields/FM3DH5Block.h"
 
-FM3DH5Block::FM3DH5Block (
-    std::string aFilename
-    ) : Fieldmap (
-        aFilename
+_FM3DH5Block::_FM3DH5Block (
+    const std::string& filename
+    ) : _Fieldmap(
+        filename
         ) {
         Type = T3DDynamicH5Block;
 
-        openFileMPIOCollective (aFilename);
+        openFileMPIOCollective (filename);
         getFieldInfo ("Efield");
         getResonanceFrequency ();
         closeFile ();
 }
 
-FM3DH5Block::~FM3DH5Block (
+_FM3DH5Block::~_FM3DH5Block (
     ) {
     freeMap ();
 }
 
-void FM3DH5Block::readMap (
+FM3DH5Block _FM3DH5Block::create(const std::string& filename)
+{
+    return FM3DH5Block(new _FM3DH5Block(filename));
+}
+
+void _FM3DH5Block::readMap (
     ) {
     if (!FieldstrengthEz_m.empty()) {
         return;
@@ -71,7 +76,7 @@ void FM3DH5Block::readMap (
              << endl);
 }
 
-void FM3DH5Block::freeMap (
+void _FM3DH5Block::freeMap (
     ) {
     if(FieldstrengthEz_m.empty ()) {
         return;
@@ -82,13 +87,9 @@ void FM3DH5Block::freeMap (
     FieldstrengthHx_m.clear ();
     FieldstrengthHy_m.clear ();
     FieldstrengthHz_m.clear ();
-
-    INFOMSG (level3
-             << typeset_msg ("freed fieldmap '" + Filename_m + "'", "info")
-             << endl);
 }
 
-bool FM3DH5Block::getFieldstrength (
+bool _FM3DH5Block::getFieldstrength (
     const Vector_t& R,
     Vector_t& E,
     Vector_t& B
diff --git a/src/Classic/Fields/FM3DH5Block.h b/src/Classic/Fields/FM3DH5Block.h
index 366402aa86e68194412d1abd04dcea24eb462182..4b57c904dfe5303101bb11d94363e8542f3929a2 100644
--- a/src/Classic/Fields/FM3DH5Block.h
+++ b/src/Classic/Fields/FM3DH5Block.h
@@ -23,19 +23,21 @@
 
 #include <vector>
 
-class FM3DH5Block: public FM3DH5BlockBase {
+class _FM3DH5Block: public _FM3DH5BlockBase {
 
 public:
     virtual bool getFieldstrength (
         const Vector_t &R, Vector_t &E, Vector_t &B) const;
-    
-private:
-    FM3DH5Block (
-        std::string aFilename);
 
-    virtual ~FM3DH5Block (
+    virtual ~_FM3DH5Block (
         );
 
+private:
+    _FM3DH5Block (
+        const std::string& filename);
+
+    static FM3DH5Block create(const std::string& filename);
+
     virtual void readMap (
         );
 
@@ -46,8 +48,10 @@ private:
     std::vector<double> FieldstrengthHx_m;    /**< 3D array with Hx */
     std::vector<double> FieldstrengthHy_m;    /**< 3D array with Hy */
 
-    friend class Fieldmap;
-    friend class FM3DH5BlockBase;
+    friend class _Fieldmap;
+    friend class _FM3DH5BlockBase;
 };
 
-#endif
+using FM3DH5Block = std::shared_ptr<_FM3DH5Block>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DH5BlockBase.cpp b/src/Classic/Fields/FM3DH5BlockBase.cpp
index 3f0aa0549a20aae12c18fbe9ef44ca728fc6c527..6ef68ffda6f2a901309c7a2eefbe234206960694 100644
--- a/src/Classic/Fields/FM3DH5BlockBase.cpp
+++ b/src/Classic/Fields/FM3DH5BlockBase.cpp
@@ -21,51 +21,51 @@
 #include "Physics/Physics.h"
 #include "Utilities/GeneralClassicException.h"
 
-void FM3DH5BlockBase::openFileMPIOCollective (
-    const std::string aFilename
+void _FM3DH5BlockBase::openFileMPIOCollective (
+    const std::string& filename
     ) {
     h5_prop_t props = H5CreateFileProp ();
     MPI_Comm comm = Ippl::getComm();
     if (H5SetPropFileMPIOCollective (props, &comm) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::openFileMPIOCollective () ",
+            "_FM3DH5BlockBase::openFileMPIOCollective () ",
             "Cannot set MPIO collective!");
     }
-    file_m = H5OpenFile (aFilename.c_str(), H5_O_RDONLY, props);
+    file_m = H5OpenFile (filename.c_str(), H5_O_RDONLY, props);
     if (file_m == (h5_file_t)H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::openFileMPIOCollective () ",
-            "Cannot open file '" + aFilename + "'!");
+            "_FM3DH5BlockBase::openFileMPIOCollective () ",
+            "Cannot open file '" + filename + "'!");
     }
     H5CloseProp (props);
 }
 
-long long FM3DH5BlockBase::getNumSteps (void) {
+long long _FM3DH5BlockBase::getNumSteps (void) {
     long long num_steps = H5GetNumSteps(file_m);
     if (num_steps <= 0) {
         if (num_steps == 0) {
             throw GeneralClassicException (
-                "FM3DH5BlockBase::getNumSteps () ",
+                "_FM3DH5BlockBase::getNumSteps () ",
                 "Number of time-steps in file '" + Filename_m + "' is zero!");
         } else {
             throw GeneralClassicException (
-                "FM3DH5BlockBase::getNumSteps () ",
+                "_FM3DH5BlockBase::getNumSteps () ",
                 "Query number of time-steps in file '" + Filename_m + "' failed!");
         }
     }
     return num_steps;
 }
 
-void FM3DH5BlockBase::setStep (long long step) {
+void _FM3DH5BlockBase::setStep (long long step) {
     if (H5SetStep(file_m, step) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::setStep () ",
+            "_FM3DH5BlockBase::setStep () ",
             "Cannot set time-step to " + std::to_string (step) +
             " in file '" + Filename_m + "'!");
     }
 }
-    
-void FM3DH5BlockBase::getFieldInfo (const char* name) {
+
+void _FM3DH5BlockBase::getFieldInfo (const char* name) {
     long long last_step = getNumSteps () - 1;
     setStep (last_step);
     h5_size_t grid_rank;
@@ -77,7 +77,7 @@ void FM3DH5BlockBase::getFieldInfo (const char* name) {
                 &grid_rank, grid_dims, &field_dims, &ftype
                 ) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::GetFieldInfo () ",
+            "_FM3DH5BlockBase::GetFieldInfo () ",
             "Query of field info for " + std::string (name) +
             " in time-step " + std::to_string (last_step) +
             " in file '" + Filename_m + "' failed!");
@@ -90,16 +90,16 @@ void FM3DH5BlockBase::getFieldInfo (const char* name) {
             file_m, "Efield", &hx_m, &hy_m, &hz_m
             ) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::GetFieldInfo () ",
+            "_FM3DH5BlockBase::GetFieldInfo () ",
             "Query of field spacing"
             " in time-step " + std::to_string (last_step) +
             " in file '" + Filename_m + "' failed!");
     }
-    
+
     if (H5Block3dGetFieldOrigin(
             file_m, "Efield", &xbegin_m, &ybegin_m, &zbegin_m) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::GetFieldInfo () ",
+            "_FM3DH5BlockBase::GetFieldInfo () ",
             "Query of field origin"
             " in time-step " + std::to_string (last_step) +
             " in file '" + Filename_m + "' failed!");
@@ -109,19 +109,19 @@ void FM3DH5BlockBase::getFieldInfo (const char* name) {
     zend_m = zbegin_m + (num_gridpz_m - 1) * hz_m;
 }
 
-void FM3DH5BlockBase::getResonanceFrequency (void) {
+void _FM3DH5BlockBase::getResonanceFrequency (void) {
     if (H5ReadFileAttribFloat64 (
             file_m, "Resonance Frequency(Hz)", &frequency_m
             ) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::GetResonanceFrequency () ",
+            "_FM3DH5BlockBase::GetResonanceFrequency () ",
             "Cannot read file attribute 'Resonance Frequency(Hz)'"
             " in file '" + Filename_m + "'!");
     }
     frequency_m *= Physics::two_pi;
 }
 
-void FM3DH5BlockBase::readField (
+void _FM3DH5BlockBase::readField (
     const char* name,
     double* x,
     double* y,
@@ -132,7 +132,7 @@ void FM3DH5BlockBase::readField (
                          0, num_gridpy_m - 1,
                          0, num_gridpz_m - 1) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::ReadField () ",
+            "_FM3DH5BlockBase::ReadField () ",
             "Cannot set view "
             "0, " + std::to_string (num_gridpx_m) +
             "0, " + std::to_string (num_gridpy_m) +
@@ -144,21 +144,21 @@ void FM3DH5BlockBase::readField (
             name,
             x, y, z) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::ReadField () ",
+            "_FM3DH5BlockBase::ReadField () ",
             "Cannot read field " + std::string (name) +
             " in file '" + Filename_m + "'!");
     }
 }
 
-void FM3DH5BlockBase::closeFile (void) {
+void _FM3DH5BlockBase::closeFile (void) {
     if (H5CloseFile (file_m) == H5_ERR) {
         throw GeneralClassicException (
-            "FM3DH5BlockBase::closeFile () ",
+            "_FM3DH5BlockBase::closeFile () ",
             "Error closing file '" + Filename_m + "'!");
     }
 }
 
-double FM3DH5BlockBase::getWeightedData (
+double _FM3DH5BlockBase::getWeightedData (
     const std::vector<double>& data,
     const IndexTriplet& idx,
     unsigned short corner
@@ -175,7 +175,7 @@ double FM3DH5BlockBase::getWeightedData (
     return factorX * factorY * factorZ * data[getIndex(i, j, k)];
 }
 
-Vector_t FM3DH5BlockBase::interpolateTrilinearly (
+Vector_t _FM3DH5BlockBase::interpolateTrilinearly (
     const std::vector<double>& field_strength_x,
     const std::vector<double>& field_strength_y,
     const std::vector<double>& field_strength_z,
@@ -214,7 +214,7 @@ Vector_t FM3DH5BlockBase::interpolateTrilinearly (
     return result;
 }
 
-void FM3DH5BlockBase::getInfo (Inform* msg) {
+void _FM3DH5BlockBase::getInfo (Inform* msg) {
     (*msg) << Filename_m << " (3D dynamic) "
            << " xini= " << xbegin_m << " xfinal= " << xend_m
            << " yini= " << ybegin_m << " yfinal= " << yend_m
@@ -222,15 +222,15 @@ void FM3DH5BlockBase::getInfo (Inform* msg) {
     (*msg) << " hx= " << hx_m <<" hy= " << hy_m <<" hz= " << hz_m << " [mm] " <<endl;
 }
 
-double FM3DH5BlockBase::getFrequency () const {
+double _FM3DH5BlockBase::getFrequency () const {
     return frequency_m;
 }
 
-void FM3DH5BlockBase::setFrequency (double freq) {
+void _FM3DH5BlockBase::setFrequency (double freq) {
     frequency_m = freq;
 }
 
-void FM3DH5BlockBase::getOnaxisEz (
+void _FM3DH5BlockBase::getOnaxisEz (
     std::vector<std::pair<double, double>>& F
     ) {
     F.resize(num_gridpz_m);
@@ -259,4 +259,4 @@ void FM3DH5BlockBase::getOnaxisEz (
         }
         F[i].second /= Ez_max;
     }
-}
+}
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DH5BlockBase.h b/src/Classic/Fields/FM3DH5BlockBase.h
index 5ed65bab1a2e2a1f87c05b0d8cdde081abcf8f39..9cfd90f8312805a5bf038dd1e6623de1d3c8fdb3 100644
--- a/src/Classic/Fields/FM3DH5BlockBase.h
+++ b/src/Classic/Fields/FM3DH5BlockBase.h
@@ -28,7 +28,7 @@ static_assert (sizeof(double) == sizeof (h5_float64_t),
 static_assert (sizeof(long long) == sizeof (h5_int64_t),
                "long long and h5_int64_t are not the same type" );
 
-class FM3DH5BlockBase: virtual public Fieldmap {
+class _FM3DH5BlockBase: virtual public _Fieldmap {
 
 public:
     virtual void readMap (
@@ -71,7 +71,7 @@ public:
 
     virtual void swap(
         ) {};
-    
+
     virtual void getInfo (
         Inform *msg);
 
@@ -85,14 +85,14 @@ public:
         std::vector<std::pair<double, double> >& F);
 
 protected:
-    FM3DH5BlockBase (
+    _FM3DH5BlockBase (
         ) {};
 
-    virtual ~FM3DH5BlockBase (
+    virtual ~_FM3DH5BlockBase (
         ) {};
 
     void openFileMPIOCollective (
-        const std::string aFilename);
+        const std::string& filename);
 
     long long getNumSteps (
         void);
@@ -115,7 +115,7 @@ protected:
 
     void closeFile (
         void);
-    
+
     virtual bool isInside (
         const Vector_t &r
         ) const {
@@ -151,7 +151,7 @@ protected:
         ) const {
         unsigned long result = j + k * num_gridpy_m;
         result = i + result * num_gridpx_m;
-        
+
         return result;
     }
 
@@ -194,7 +194,7 @@ protected:
     std::vector<double> FieldstrengthEz_m;    /**< 3D array with Ez */
     std::vector<double> FieldstrengthEx_m;    /**< 3D array with Ex */
     std::vector<double> FieldstrengthEy_m;    /**< 3D array with Ey */
-    
+
     double xbegin_m;
     double xend_m;
 
@@ -215,7 +215,9 @@ protected:
     double frequency_m;
 
     bool swap_m;
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
-#endif
+using FM3DH5BlockBase = std::shared_ptr<_FM3DH5BlockBase>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DH5Block_nonscale.cpp b/src/Classic/Fields/FM3DH5Block_nonscale.cpp
index 0f1beba199a0d2e3f4b78182e4ef726c9bdb571c..fc7e538b124432c4c24a6ce65f8d017f4394e67a 100644
--- a/src/Classic/Fields/FM3DH5Block_nonscale.cpp
+++ b/src/Classic/Fields/FM3DH5Block_nonscale.cpp
@@ -21,26 +21,31 @@
 #include "Physics/Units.h"
 #include "Utilities/GeneralClassicException.h"
 
-FM3DH5Block_nonscale::FM3DH5Block_nonscale (
-    std::string aFilename
-    ) : Fieldmap (
-        aFilename),
-    FM3DH5BlockBase (
+_FM3DH5Block_nonscale::_FM3DH5Block_nonscale (
+    const std::string& filename
+    ) : _Fieldmap (
+        filename),
+    _FM3DH5BlockBase (
         ) {
         Type = T3DDynamicH5Block;
 
-        openFileMPIOCollective (aFilename);
+        openFileMPIOCollective (filename);
         getFieldInfo ("Efield");
         getResonanceFrequency ();
         closeFile ();
 }
 
-FM3DH5Block_nonscale::~FM3DH5Block_nonscale (
+_FM3DH5Block_nonscale::~_FM3DH5Block_nonscale (
     ) {
     freeMap();
 }
 
-void FM3DH5Block_nonscale::readMap (
+FM3DH5Block_nonscale _FM3DH5Block_nonscale::create(const std::string& filename)
+{
+    return FM3DH5Block_nonscale(new _FM3DH5Block_nonscale(filename));
+}
+
+void _FM3DH5Block_nonscale::readMap (
     ) {
     if (!FieldstrengthEz_m.empty()) {
         return;
@@ -84,7 +89,7 @@ void FM3DH5Block_nonscale::readMap (
              << endl);
 }
 
-void FM3DH5Block_nonscale::freeMap (
+void _FM3DH5Block_nonscale::freeMap (
     ) {
     if(FieldstrengthEz_m.empty ()) {
         return;
@@ -95,12 +100,9 @@ void FM3DH5Block_nonscale::freeMap (
     FieldstrengthHx_m.clear ();
     FieldstrengthHy_m.clear ();
     FieldstrengthHz_m.clear ();
-
-    INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m + "'", "info")
-            << endl);
 }
 
-bool FM3DH5Block_nonscale::getFieldstrength (
+bool _FM3DH5Block_nonscale::getFieldstrength (
     const Vector_t& R,
     Vector_t& E,
     Vector_t& B
@@ -114,4 +116,4 @@ bool FM3DH5Block_nonscale::getFieldstrength (
         FieldstrengthHx_m, FieldstrengthHy_m, FieldstrengthHz_m, R);
 
     return false;
-}
\ No newline at end of file
+}
diff --git a/src/Classic/Fields/FM3DH5Block_nonscale.h b/src/Classic/Fields/FM3DH5Block_nonscale.h
index 2f771484b706ae1bd580917fcfe27b1c68118eab..7f203c552e01e3754d735569fbf83e2afa0ccc52 100644
--- a/src/Classic/Fields/FM3DH5Block_nonscale.h
+++ b/src/Classic/Fields/FM3DH5Block_nonscale.h
@@ -23,19 +23,21 @@
 
 #include <vector>
 
-class FM3DH5Block_nonscale: public FM3DH5BlockBase {
+class _FM3DH5Block_nonscale: public _FM3DH5BlockBase {
 
 public:
     virtual bool getFieldstrength (
         const Vector_t &R, Vector_t &E, Vector_t &B) const;
-    
-private:
-    FM3DH5Block_nonscale (
-        std::string aFilename);
 
-    virtual ~FM3DH5Block_nonscale (
+    virtual ~_FM3DH5Block_nonscale (
         );
 
+private:
+    _FM3DH5Block_nonscale (
+        const std::string& filename);
+
+    static FM3DH5Block_nonscale create(const std::string& filename);
+
     virtual void readMap (
         );
 
@@ -46,8 +48,10 @@ private:
     std::vector<double> FieldstrengthHx_m;    /**< 3D array with Hx */
     std::vector<double> FieldstrengthHy_m;    /**< 3D array with Hy */
 
-    friend class Fieldmap;
-    friend class FM3DH5BlockBase;
+    friend class _Fieldmap;
+    friend class _FM3DH5BlockBase;
 };
 
-#endif
+using FM3DH5Block_nonscale = std::shared_ptr<_FM3DH5Block_nonscale>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DMagnetoStatic.cpp b/src/Classic/Fields/FM3DMagnetoStatic.cpp
index 88aafc8ace5041d982f5ca9dc8bd3e733da20121..10c100ab0b29c8ab0256d91c162a6d17a1cb4207 100644
--- a/src/Classic/Fields/FM3DMagnetoStatic.cpp
+++ b/src/Classic/Fields/FM3DMagnetoStatic.cpp
@@ -9,8 +9,8 @@
 #include <ios>
 
 
-FM3DMagnetoStatic::FM3DMagnetoStatic(std::string aFilename):
-    Fieldmap(aFilename),
+_FM3DMagnetoStatic::_FM3DMagnetoStatic(const std::string& filename):
+    _Fieldmap(filename),
     FieldstrengthBz_m(nullptr),
     FieldstrengthBx_m(nullptr),
     FieldstrengthBy_m(nullptr) {
@@ -31,7 +31,7 @@ FM3DMagnetoStatic::FM3DMagnetoStatic(std::string aFilename):
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("FM3DMagnetoStatic::FM3DMagnetoStatic",
+                throw GeneralClassicException("_FM3DMagnetoStatic::_FM3DMagnetoStatic",
                                               "The second string on the first line of 3D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -59,7 +59,7 @@ FM3DMagnetoStatic::FM3DMagnetoStatic(std::string aFilename):
         file.close();
 
         if(!parsing_passed) {
-            throw GeneralClassicException("FM3DMagnetoStatic::FM3DMagnetoStatic",
+            throw GeneralClassicException("_FM3DMagnetoStatic::_FM3DMagnetoStatic",
                                           "An error occured when reading the fieldmap '" + Filename_m + "'");
         } else {
             xbegin_m *= Units::cm2m;
@@ -79,17 +79,22 @@ FM3DMagnetoStatic::FM3DMagnetoStatic(std::string aFilename):
 
         }
     } else {
-        throw GeneralClassicException("FM3DMagnetoStatic::FM3DMagnetoStatic",
+        throw GeneralClassicException("_FM3DMagnetoStatic::_FM3DMagnetoStatic",
                                       "An error occured when reading the fieldmap '" + Filename_m + "'");
     }
 }
 
 
-FM3DMagnetoStatic::~FM3DMagnetoStatic() {
+_FM3DMagnetoStatic::~_FM3DMagnetoStatic() {
     freeMap();
 }
 
-void FM3DMagnetoStatic::readMap() {
+FM3DMagnetoStatic _FM3DMagnetoStatic::create(const std::string& filename)
+{
+    return FM3DMagnetoStatic(new _FM3DMagnetoStatic(filename));
+}
+
+void _FM3DMagnetoStatic::readMap() {
     if(FieldstrengthBz_m == nullptr) {
 
     	std::ifstream in(Filename_m.c_str());
@@ -144,7 +149,7 @@ void FM3DMagnetoStatic::readMap() {
     }
 }
 
-void FM3DMagnetoStatic::freeMap() {
+void _FM3DMagnetoStatic::freeMap() {
     if(FieldstrengthBz_m != nullptr) {
         delete[] FieldstrengthBz_m;
         delete[] FieldstrengthBx_m;
@@ -153,13 +158,10 @@ void FM3DMagnetoStatic::freeMap() {
         FieldstrengthBz_m = nullptr;
         FieldstrengthBx_m = nullptr;
         FieldstrengthBy_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m + "'", "info") << "\n"
-                << endl);
     }
 }
 
-bool FM3DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
+bool _FM3DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
     if (!isInside(R)) {
         return true;
     }
@@ -169,7 +171,7 @@ bool FM3DMagnetoStatic::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vec
     return false;
 }
 
-Vector_t FM3DMagnetoStatic::interpolateTrilinearly(const Vector_t &X) const {
+Vector_t _FM3DMagnetoStatic::interpolateTrilinearly(const Vector_t &X) const {
     IndexTriplet idx = getIndex(X);
     Vector_t B(0.0);
 
@@ -203,7 +205,7 @@ Vector_t FM3DMagnetoStatic::interpolateTrilinearly(const Vector_t &X) const {
     return B;
 }
 
-double FM3DMagnetoStatic::getWeightedData(double *data, const IndexTriplet &idx, unsigned short corner) const {
+double _FM3DMagnetoStatic::getWeightedData(double *data, const IndexTriplet &idx, unsigned short corner) const {
     unsigned short switchX = ((corner & HX) >> 2), switchY = ((corner & HY) >> 1), switchZ = (corner & HZ);
     double factorX = 0.5 + (1 - 2 * switchX) * (0.5 - idx.weight(0));
     double factorY = 0.5 + (1 - 2 * switchY) * (0.5 - idx.weight(1));
@@ -214,19 +216,19 @@ double FM3DMagnetoStatic::getWeightedData(double *data, const IndexTriplet &idx,
     return factorX * factorY * factorZ * data[getIndex(i, j, k)];
 }
 
-bool FM3DMagnetoStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _FM3DMagnetoStatic::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM3DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM3DMagnetoStatic::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
-void FM3DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
+void _FM3DMagnetoStatic::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
 
-void FM3DMagnetoStatic::swap() {}
+void _FM3DMagnetoStatic::swap() {}
 
-void FM3DMagnetoStatic::getInfo(Inform *msg) {
+void _FM3DMagnetoStatic::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (3D magnetostatic) "
            << " xini= " << xbegin_m << " xfinal= " << xend_m
            << " yini= " << ybegin_m << " yfinal= " << yend_m
diff --git a/src/Classic/Fields/FM3DMagnetoStatic.h b/src/Classic/Fields/FM3DMagnetoStatic.h
index ac44d0cc7d5a9fd8c2e72f02474ec7a6fb384089..d695f043518f47cbf994a93828ec5f66fa9cad65 100644
--- a/src/Classic/Fields/FM3DMagnetoStatic.h
+++ b/src/Classic/Fields/FM3DMagnetoStatic.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM3DMagnetoStatic: public Fieldmap {
+class _FM3DMagnetoStatic: public _Fieldmap {
 
 public:
+    virtual ~_FM3DMagnetoStatic();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
     virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
@@ -17,8 +19,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM3DMagnetoStatic(std::string aFilename);
-    ~FM3DMagnetoStatic();
+    _FM3DMagnetoStatic(const std::string& filename);
+
+    static FM3DMagnetoStatic create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -68,11 +71,11 @@ private:
     unsigned int num_gridpy_m;              /**< Read in number of points after 0(not counted here) in grid, r-direction*/
     unsigned int num_gridpz_m;              /**< Read in number of points after 0(not counted here) in grid, z-direction*/
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
 inline
-bool FM3DMagnetoStatic::isInside(const Vector_t &r) const
+bool _FM3DMagnetoStatic::isInside(const Vector_t &r) const
 {
     return ((r(0) >= xbegin_m && r(0) < xend_m)
             && (r(1) >= ybegin_m && r(1) < yend_m)
@@ -80,15 +83,15 @@ bool FM3DMagnetoStatic::isInside(const Vector_t &r) const
 }
 
 inline
-double FM3DMagnetoStatic::getFrequency() const {
+double _FM3DMagnetoStatic::getFrequency() const {
     return 0.0;
 }
 
 inline
-void FM3DMagnetoStatic::setFrequency(double /*freq*/) { }
+void _FM3DMagnetoStatic::setFrequency(double /*freq*/) { }
 
 inline
-unsigned long FM3DMagnetoStatic::getIndex(unsigned int i, unsigned int j, unsigned int k) const
+unsigned long _FM3DMagnetoStatic::getIndex(unsigned int i, unsigned int j, unsigned int k) const
 {
     unsigned long result = i + j * num_gridpx_m;
     result = k + result * num_gridpz_m;
@@ -97,7 +100,7 @@ unsigned long FM3DMagnetoStatic::getIndex(unsigned int i, unsigned int j, unsign
 }
 
 inline
-FM3DMagnetoStatic::IndexTriplet FM3DMagnetoStatic::getIndex(const Vector_t &X) const {
+_FM3DMagnetoStatic::IndexTriplet _FM3DMagnetoStatic::getIndex(const Vector_t &X) const {
     IndexTriplet idx;
     idx.i = std::floor((X(0) - xbegin_m) / hx_m);
     idx.j = std::floor((X(1) - ybegin_m) / hy_m);
@@ -113,4 +116,6 @@ FM3DMagnetoStatic::IndexTriplet FM3DMagnetoStatic::getIndex(const Vector_t &X) c
     return idx;
 }
 
-#endif
+using FM3DMagnetoStatic = std::shared_ptr<_FM3DMagnetoStatic>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DMagnetoStaticExtended.cpp b/src/Classic/Fields/FM3DMagnetoStaticExtended.cpp
index 85c9fde1eab0217edffacc5382b577b4e3248025..a0fee6532c494d10c244cdc8ad8b57476ab9894a 100644
--- a/src/Classic/Fields/FM3DMagnetoStaticExtended.cpp
+++ b/src/Classic/Fields/FM3DMagnetoStaticExtended.cpp
@@ -11,8 +11,8 @@
 
 extern Inform *gmsg;
 
-FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended(std::string aFilename):
-    Fieldmap(aFilename),
+_FM3DMagnetoStaticExtended::_FM3DMagnetoStaticExtended(const std::string& filename):
+    _Fieldmap(filename),
     FieldstrengthBx_m(nullptr),
     FieldstrengthBy_m(nullptr),
     FieldstrengthBz_m(nullptr) {
@@ -34,7 +34,7 @@ FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended(std::string aFilename):
             tmpString = Util::toUpper(tmpString);
             if (tmpString != "TRUE" &&
                 tmpString != "FALSE")
-                throw GeneralClassicException("FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended",
+                throw GeneralClassicException("_FM3DMagnetoStaticExtended::_FM3DMagnetoStaticExtended",
                                               "The second string on the first line of 3D field "
                                               "maps has to be either TRUE or FALSE");
 
@@ -60,7 +60,7 @@ FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended(std::string aFilename):
         if(!parsing_passed) {
             disableFieldmapWarning();
             zend_m = zbegin_m - 1e-3;
-            throw GeneralClassicException("FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended(std::string)",
+            throw GeneralClassicException("_FM3DMagnetoStaticExtended::_FM3DMagnetoStaticExtended(std::string)",
                                           "Format of fieldmap '" + Filename_m + "' didn't pass basic test");
         } else {
             // conversion from cm to m
@@ -82,16 +82,21 @@ FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended(std::string aFilename):
             num_gridpz_m++;
         }
     } else {
-        throw GeneralClassicException("FM3DMagnetoStaticExtended::FM3DMagnetoStaticExtended(std::string)",
+        throw GeneralClassicException("_FM3DMagnetoStaticExtended::_FM3DMagnetoStaticExtended(std::string)",
                                       "Couldn't read fieldmap '" + Filename_m + "'");
     }
 }
 
-FM3DMagnetoStaticExtended::~FM3DMagnetoStaticExtended() {
+_FM3DMagnetoStaticExtended::~_FM3DMagnetoStaticExtended() {
     freeMap();
 }
 
-void FM3DMagnetoStaticExtended::readMap() {
+FM3DMagnetoStaticExtended _FM3DMagnetoStaticExtended::create(const std::string& filename)
+{
+    return FM3DMagnetoStaticExtended(new _FM3DMagnetoStaticExtended(filename));
+}
+
+void _FM3DMagnetoStaticExtended::readMap() {
     if(FieldstrengthBz_m == nullptr) {
         // declare variables and allocate memory
         std::ifstream in;
@@ -155,7 +160,7 @@ void FM3DMagnetoStaticExtended::readMap() {
     }
 }
 
-void FM3DMagnetoStaticExtended::integrateBx(unsigned j) {
+void _FM3DMagnetoStaticExtended::integrateBx(unsigned j) {
     if (j == 1) {
         {
             unsigned int i = 0;
@@ -222,7 +227,7 @@ void FM3DMagnetoStaticExtended::integrateBx(unsigned j) {
     }
 }
 
-void FM3DMagnetoStaticExtended::integrateBz(unsigned j) {
+void _FM3DMagnetoStaticExtended::integrateBz(unsigned j) {
     if (j == 1) {
         // treat cells at i = 0:num_gridpx_m - 1, j = 1, k = 1:num_gridpz_m - 2;
         for(unsigned int i = 0; i < num_gridpx_m; i ++) {
@@ -280,7 +285,7 @@ void FM3DMagnetoStaticExtended::integrateBz(unsigned j) {
     }
 }
 
-void FM3DMagnetoStaticExtended::integrateBy(unsigned j) {
+void _FM3DMagnetoStaticExtended::integrateBy(unsigned j) {
     if (j == 1) {
         for (unsigned int i = 1; i < num_gridpx_m - 1; i ++) {
             { // treat cells at i = 1:num_gridpx_m - 2, j = 1, k = 0
@@ -497,7 +502,7 @@ void FM3DMagnetoStaticExtended::integrateBy(unsigned j) {
     }
 }
 
-void FM3DMagnetoStaticExtended::smoothData(double * data, unsigned j)
+void _FM3DMagnetoStaticExtended::smoothData(double * data, unsigned j)
 {
     const double offWeight = 0.1, sumWeightInv = 1.0 / (1.0 + 4 * (1 + offWeight) * offWeight);
     double *tmp = new double[num_gridpx_m * num_gridpy_m * num_gridpz_m];
@@ -602,7 +607,7 @@ void FM3DMagnetoStaticExtended::smoothData(double * data, unsigned j)
     delete[] tmp;
 }
 
-void FM3DMagnetoStaticExtended::saveField(const std::string &fname, unsigned int j) const
+void _FM3DMagnetoStaticExtended::saveField(const std::string &fname, unsigned int j) const
 {
     std::ofstream out(fname);
     out.precision(6);
@@ -624,7 +629,7 @@ void FM3DMagnetoStaticExtended::saveField(const std::string &fname, unsigned int
     out.close();
 }
 
-void FM3DMagnetoStaticExtended::freeMap() {
+void _FM3DMagnetoStaticExtended::freeMap() {
     if(FieldstrengthBz_m != nullptr) {
         delete[] FieldstrengthBx_m;
         delete[] FieldstrengthBy_m;
@@ -633,12 +638,10 @@ void FM3DMagnetoStaticExtended::freeMap() {
         FieldstrengthBx_m = nullptr;
         FieldstrengthBy_m = nullptr;
         FieldstrengthBz_m = nullptr;
-
-        INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m  + "'", "info") << endl);
     }
 }
 
-Vector_t FM3DMagnetoStaticExtended::interpolateTrilinearly(const Vector_t &X) const {
+Vector_t _FM3DMagnetoStaticExtended::interpolateTrilinearly(const Vector_t &X) const {
     IndexTriplet idx = getIndex(X);
     Vector_t B(0.0);
 
@@ -672,7 +675,7 @@ Vector_t FM3DMagnetoStaticExtended::interpolateTrilinearly(const Vector_t &X) co
     return B;
 }
 
-double FM3DMagnetoStaticExtended::getWeightedData(double *data, const IndexTriplet &idx, unsigned short corner) const {
+double _FM3DMagnetoStaticExtended::getWeightedData(double *data, const IndexTriplet &idx, unsigned short corner) const {
     unsigned short switchX = ((corner & HX) >> 2), switchY = ((corner & HY) >> 1), switchZ = (corner & HZ);
     double factorX = 0.5 + (1 - 2 * switchX) * (0.5 - idx.weight(0));
     double factorY = 0.5 + (1 - 2 * switchY) * (0.5 - idx.weight(1));
@@ -683,7 +686,7 @@ double FM3DMagnetoStaticExtended::getWeightedData(double *data, const IndexTripl
     return factorX * factorY * factorZ * data[getIndex(i, j, k)];
 }
 
-bool FM3DMagnetoStaticExtended::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
+bool _FM3DMagnetoStaticExtended::getFieldstrength(const Vector_t &R, Vector_t &/*E*/, Vector_t &B) const {
     if (isInside(R)) {
         Vector_t suppB = interpolateTrilinearly(R);
         suppB(0) *= copysign(1, R(1));
@@ -695,16 +698,16 @@ bool FM3DMagnetoStaticExtended::getFieldstrength(const Vector_t &R, Vector_t &/*
     return false;
 }
 
-bool FM3DMagnetoStaticExtended::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
+bool _FM3DMagnetoStaticExtended::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
     return false;
 }
 
-void FM3DMagnetoStaticExtended::getFieldDimensions(double &zBegin, double &zEnd) const {
+void _FM3DMagnetoStaticExtended::getFieldDimensions(double &zBegin, double &zEnd) const {
     zBegin = zbegin_m;
     zEnd = zend_m;
 }
 
-void FM3DMagnetoStaticExtended::getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const {
+void _FM3DMagnetoStaticExtended::getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const {
     xIni = xbegin_m;
     xFinal = xend_m;
     yIni = -yend_m;
@@ -713,16 +716,16 @@ void FM3DMagnetoStaticExtended::getFieldDimensions(double &xIni, double &xFinal,
     zFinal = zend_m;
 }
 
-void FM3DMagnetoStaticExtended::swap() {
+void _FM3DMagnetoStaticExtended::swap() {
 }
 
-void FM3DMagnetoStaticExtended::getInfo(Inform *msg) {
+void _FM3DMagnetoStaticExtended::getInfo(Inform *msg) {
     (*msg) << Filename_m << " (3D magnetostatic, extended); zini= " << zbegin_m << " m; zfinal= " << zend_m << " m;" << endl;
 }
 
-double FM3DMagnetoStaticExtended::getFrequency() const {
+double _FM3DMagnetoStaticExtended::getFrequency() const {
     return 0.0;
 }
 
-void FM3DMagnetoStaticExtended::setFrequency(double /*freq*/)
+void _FM3DMagnetoStaticExtended::setFrequency(double /*freq*/)
 { ;}
diff --git a/src/Classic/Fields/FM3DMagnetoStaticExtended.h b/src/Classic/Fields/FM3DMagnetoStaticExtended.h
index 25b030cbd7a1cfbd3c1a63dfdde053d07ecb7fcb..16bdb137794354f87da94fd0e3eb3555758929d7 100644
--- a/src/Classic/Fields/FM3DMagnetoStaticExtended.h
+++ b/src/Classic/Fields/FM3DMagnetoStaticExtended.h
@@ -3,9 +3,11 @@
 
 #include "Fields/Fieldmap.h"
 
-class FM3DMagnetoStaticExtended: public Fieldmap {
+class _FM3DMagnetoStaticExtended: public _Fieldmap {
 
 public:
+    virtual ~_FM3DMagnetoStaticExtended();
+
     virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
     virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const;
     virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
@@ -17,8 +19,9 @@ public:
 
     virtual bool isInside(const Vector_t &r) const;
 private:
-    FM3DMagnetoStaticExtended(std::string aFilename);
-    ~FM3DMagnetoStaticExtended();
+    _FM3DMagnetoStaticExtended(const std::string& filename);
+
+    static FM3DMagnetoStaticExtended create(const std::string& filename);
 
     virtual void readMap();
     virtual void freeMap();
@@ -74,17 +77,17 @@ private:
     unsigned int num_gridpy_m;     /**< Read in number of points after 0(not counted here) in grid, y-direction*/
     unsigned int num_gridpz_m;     /**< Read in number of points after 0(not counted here) in grid, z-direction*/
 
-    friend class Fieldmap;
+    friend class _Fieldmap;
 };
 
 inline
-bool FM3DMagnetoStaticExtended::isInside(const Vector_t &r) const
+bool _FM3DMagnetoStaticExtended::isInside(const Vector_t &r) const
 {
     return r(2) >= 0.0 && r(2) < length_m && r(0) >= xbegin_m && r(0) < xend_m && std::abs(r(1)) < yend_m;
 }
 
 inline
-unsigned long FM3DMagnetoStaticExtended::getIndex(unsigned int i, unsigned int j, unsigned int k) const
+unsigned long _FM3DMagnetoStaticExtended::getIndex(unsigned int i, unsigned int j, unsigned int k) const
 {
     unsigned long result = i + j * num_gridpx_m;
     result = k + result * num_gridpz_m;
@@ -93,7 +96,7 @@ unsigned long FM3DMagnetoStaticExtended::getIndex(unsigned int i, unsigned int j
 }
 
 inline
-FM3DMagnetoStaticExtended::IndexTriplet FM3DMagnetoStaticExtended::getIndex(const Vector_t &X) const {
+_FM3DMagnetoStaticExtended::IndexTriplet _FM3DMagnetoStaticExtended::getIndex(const Vector_t &X) const {
     IndexTriplet idx;
     idx.i = std::floor((X(0) - xbegin_m) / hx_m);
     idx.j = std::floor(std::abs(X(1)) / hy_m);
@@ -109,4 +112,6 @@ FM3DMagnetoStaticExtended::IndexTriplet FM3DMagnetoStaticExtended::getIndex(cons
     return idx;
 }
 
-#endif
+using FM3DMagnetoStaticExtended = std::shared_ptr<_FM3DMagnetoStaticExtended>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FM3DMagnetoStaticH5Block.cpp b/src/Classic/Fields/FM3DMagnetoStaticH5Block.cpp
index 46112b6f53979fff5da4983bc851a09fcb224d6d..c3fcf6a10a4dc8935e8d157d015e270cdd8705a4 100644
--- a/src/Classic/Fields/FM3DMagnetoStaticH5Block.cpp
+++ b/src/Classic/Fields/FM3DMagnetoStaticH5Block.cpp
@@ -19,26 +19,27 @@
 #include "Fields/FM3DMagnetoStaticH5Block.h"
 #include "Utilities/GeneralClassicException.h"
 
-FM3DMagnetoStaticH5Block::FM3DMagnetoStaticH5Block (
-    std::string aFilename
-    ) : Fieldmap (
-        aFilename),
-    FM3DH5BlockBase (
-        ) {
-        Type = T3DMagnetoStaticH5Block;
+_FM3DMagnetoStaticH5Block::_FM3DMagnetoStaticH5Block (const std::string& filename)
+    : _Fieldmap(filename)
+    , _FM3DH5BlockBase () {
+    Type = T3DMagnetoStaticH5Block;
 
-        openFileMPIOCollective (aFilename);
-        getFieldInfo ("Efield");
-        getResonanceFrequency ();
-        closeFile ();
+    openFileMPIOCollective (filename);
+    getFieldInfo ("Efield");
+    getResonanceFrequency ();
+    closeFile ();
 }
 
-FM3DMagnetoStaticH5Block::~FM3DMagnetoStaticH5Block (
-    ) {
+_FM3DMagnetoStaticH5Block::~_FM3DMagnetoStaticH5Block () {
     freeMap ();
 }
 
-void FM3DMagnetoStaticH5Block::readMap (
+FM3DMagnetoStaticH5Block _FM3DMagnetoStaticH5Block::create(const std::string& filename)
+{
+    return FM3DMagnetoStaticH5Block(new _FM3DMagnetoStaticH5Block(filename));
+}
+
+void _FM3DMagnetoStaticH5Block::readMap (
     ) {
     if (!FieldstrengthEz_m.empty()) {
         return;
@@ -72,7 +73,7 @@ void FM3DMagnetoStaticH5Block::readMap (
                             + Filename_m  + "' (H5hut format) read", "info")
              << endl);
 }
-void FM3DMagnetoStaticH5Block::freeMap (
+void _FM3DMagnetoStaticH5Block::freeMap (
     ) {
     if(FieldstrengthEz_m.empty()) {
         return;
@@ -83,11 +84,9 @@ void FM3DMagnetoStaticH5Block::freeMap (
     FieldstrengthBx_m.clear();
     FieldstrengthBy_m.clear();
     FieldstrengthBz_m.clear();
-    INFOMSG(level3 << typeset_msg("freed fieldmap '" + Filename_m + "'", "info")
-            << endl);
 }
 
-bool FM3DMagnetoStaticH5Block::getFieldstrength (
+bool _FM3DMagnetoStaticH5Block::getFieldstrength (
     const Vector_t& R,
     Vector_t& E,
     Vector_t& B
@@ -103,7 +102,7 @@ bool FM3DMagnetoStaticH5Block::getFieldstrength (
     return false;
 }
 
-double FM3DMagnetoStaticH5Block::getFrequency (
+double _FM3DMagnetoStaticH5Block::getFrequency (
     ) const {
     return 0.0;
 }
diff --git a/src/Classic/Fields/FM3DMagnetoStaticH5Block.h b/src/Classic/Fields/FM3DMagnetoStaticH5Block.h
index 52e1afeec9e9b0de19b2ab85493fdfc033595ce2..4258a42f9c125f079c8e8b73b252bd7d7cb2eece 100644
--- a/src/Classic/Fields/FM3DMagnetoStaticH5Block.h
+++ b/src/Classic/Fields/FM3DMagnetoStaticH5Block.h
@@ -23,19 +23,21 @@
 
 #include <vector>
 
-class FM3DMagnetoStaticH5Block: public FM3DH5BlockBase {
+class _FM3DMagnetoStaticH5Block: public _FM3DH5BlockBase {
 
 public:
     virtual bool getFieldstrength (
         const Vector_t &R, Vector_t &E, Vector_t &B) const;
-    
-private:
-    FM3DMagnetoStaticH5Block (
-        std::string aFilename);
 
-    virtual ~FM3DMagnetoStaticH5Block (
+    virtual ~_FM3DMagnetoStaticH5Block (
         );
 
+private:
+    _FM3DMagnetoStaticH5Block (
+        const std::string& filename);
+
+    static FM3DMagnetoStaticH5Block create(const std::string& filename);
+
     virtual void readMap (
         );
 
@@ -49,8 +51,10 @@ private:
     std::vector<double> FieldstrengthBx_m;    /**< 3D array with Bx */
     std::vector<double> FieldstrengthBy_m;    /**< 3D array with By */
 
-    friend class Fieldmap;
-    friend class FM3DH5BlockBase;
+    friend class _Fieldmap;
+    friend class _FM3DH5BlockBase;
 };
 
-#endif
+using FM3DMagnetoStaticH5Block = std::shared_ptr<_FM3DMagnetoStaticH5Block>;
+
+#endif
\ No newline at end of file
diff --git a/src/Classic/Fields/FMDummy.cpp b/src/Classic/Fields/FMDummy.cpp
deleted file mode 100644
index 61691be702da96407c44efa67301b53ac18eb729..0000000000000000000000000000000000000000
--- a/src/Classic/Fields/FMDummy.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#include "Fields/FMDummy.h"
-#include "Fields/Fieldmap.hpp"
-
-
-FMDummy::FMDummy(std::string aFilename):
-    Fieldmap(aFilename),
-    zbegin_m(0.0),
-    zend_m(-1e-3) {
-
-    std::stringstream errormsg;
-    errormsg << "THERE SEEMS TO BE SOMETHING WRONG WITH YOUR FIELD MAP '" << Filename_m << "'.\n"
-             << "Could not determine the file type.\n"
-             << "Please check the section about field maps in the user manual.\n";
-    std::string errormsg_str = typeset_msg(errormsg.str(), "error");
-    WARNMSG(errormsg_str << "\n" << endl);
-
-    if(Ippl::myNode() == 0) {
-    	std::ofstream omsg("errormsg.txt", std::ios_base::app);
-        omsg << errormsg_str << std::endl;
-        omsg.close();
-    }
-    disableFieldmapWarning();
-}
-
-FMDummy::~FMDummy()
-{ }
-
-void FMDummy::readMap()
-{ }
-
-void FMDummy::freeMap()
-{ }
-
-bool FMDummy::getFieldstrength(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/) const {
-    return false;
-}
-
-bool FMDummy::getFieldDerivative(const Vector_t &/*R*/, Vector_t &/*E*/, Vector_t &/*B*/, const DiffDirection &/*dir*/) const {
-    return false;
-}
-
-void FMDummy::getFieldDimensions(double &zBegin, double &zEnd) const {
-    zBegin = zbegin_m;
-    zEnd = zend_m;
-}
-void FMDummy::getFieldDimensions(double &/*xIni*/, double &/*xFinal*/, double &/*yIni*/, double &/*yFinal*/, double &/*zIni*/, double &/*zFinal*/) const {}
-
-void FMDummy::swap()
-{ }
-
-void FMDummy::getInfo(Inform */*msg*/)
-{ }
-
-double FMDummy::getFrequency() const {
-    static double dummy = 0.0;
-    return dummy;
-}
-
-void FMDummy::setFrequency(double /*freq*/)
-{ }
diff --git a/src/Classic/Fields/FMDummy.h b/src/Classic/Fields/FMDummy.h
deleted file mode 100644
index 79f40793fa4026a935c61a22c7f364572f82afbd..0000000000000000000000000000000000000000
--- a/src/Classic/Fields/FMDummy.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef CLASSIC_FIELDMAPDUMMY
-#define CLASSIC_FIELDMAPDUMMY
-
-#include "Fields/Fieldmap.h"
-
-class FMDummy: public Fieldmap {
-
-public:
-    virtual bool getFieldstrength(const Vector_t &R, Vector_t &E, Vector_t &B) const;
-    virtual bool getFieldDerivative(const Vector_t &R, Vector_t &E, Vector_t &B, const DiffDirection &dir) const;
-    virtual void getFieldDimensions(double &zBegin, double &zEnd) const;
-    virtual void getFieldDimensions(double &xIni, double &xFinal, double &yIni, double &yFinal, double &zIni, double &zFinal) const;
-    virtual void swap();
-    virtual void getInfo(Inform *);
-    virtual double getFrequency() const;
-    virtual void setFrequency(double freq);
-
-private:
-    FMDummy(std::string aFilename);
-    ~FMDummy();
-
-    virtual void readMap();
-    virtual void freeMap();
-
-    double zbegin_m;
-    double zend_m;
-
-    friend class Fieldmap;
-};
-
-#endif
diff --git a/src/Classic/Fields/Fieldmap.cpp b/src/Classic/Fields/Fieldmap.cpp
index 9fb9062ba847560f2e6687e50f8f65c978726bc5..552d9e4f9d1799bfec23a4ac4261145b4aa0dbba 100644
--- a/src/Classic/Fields/Fieldmap.cpp
+++ b/src/Classic/Fields/Fieldmap.cpp
@@ -2,36 +2,35 @@
 
 #include "Utility/PAssert.h"
 
-#include "Fields/FM3DDynamic.h"
-#include "Fields/FM3DH5BlockBase.h"
-#include "Fields/FM3DH5Block.h"
-#include "Fields/FM3DH5Block_nonscale.h"
-#include "Fields/FM3DMagnetoStaticH5Block.h"
-#include "Fields/FM3DMagnetoStatic.h"
-#include "Fields/FM3DMagnetoStaticExtended.h"
-#include "Fields/FM2DDynamic.h"
-#include "Fields/FM2DElectroStatic.h"
-#include "Fields/FM2DMagnetoStatic.h"
-#include "Fields/FM1DDynamic.h"
-#include "Fields/FM1DDynamic_fast.h"
+#include "AbstractObjects/OpalData.h"
 #include "Fields/Astra1DDynamic.h"
 #include "Fields/Astra1DDynamic_fast.h"
-#include "Fields/FM1DElectroStatic.h"
-#include "Fields/FM1DElectroStatic_fast.h"
 #include "Fields/Astra1DElectroStatic.h"
 #include "Fields/Astra1DElectroStatic_fast.h"
-#include "Fields/FM1DMagnetoStatic.h"
-#include "Fields/FM1DMagnetoStatic_fast.h"
 #include "Fields/Astra1DMagnetoStatic.h"
 #include "Fields/Astra1DMagnetoStatic_fast.h"
+#include "Fields/FM1DDynamic.h"
+#include "Fields/FM1DDynamic_fast.h"
+#include "Fields/FM1DElectroStatic.h"
+#include "Fields/FM1DElectroStatic_fast.h"
+#include "Fields/FM1DMagnetoStatic.h"
+#include "Fields/FM1DMagnetoStatic_fast.h"
 #include "Fields/FM1DProfile1.h"
 #include "Fields/FM1DProfile2.h"
-#include "Fields/FMDummy.h"
+#include "Fields/FM2DDynamic.h"
+#include "Fields/FM2DElectroStatic.h"
+#include "Fields/FM2DMagnetoStatic.h"
+#include "Fields/FM3DDynamic.h"
+#include "Fields/FM3DH5Block.h"
+#include "Fields/FM3DH5BlockBase.h"
+#include "Fields/FM3DH5Block_nonscale.h"
+#include "Fields/FM3DMagnetoStatic.h"
+#include "Fields/FM3DMagnetoStaticExtended.h"
+#include "Fields/FM3DMagnetoStaticH5Block.h"
+#include "Physics/Physics.h"
 #include "Utilities/GeneralClassicException.h"
 #include "Utilities/Options.h"
 #include "Utilities/Util.h"
-#include "AbstractObjects/OpalData.h"
-#include "Physics/Physics.h"
 
 #include "H5hut.h"
 
@@ -44,10 +43,10 @@
 
 namespace fs = boost::filesystem;
 
-#define REGISTER_PARSE_TYPE(X) template <> struct Fieldmap::TypeParseTraits<X> \
-    { static const char* name; } ; const char* Fieldmap::TypeParseTraits<X>::name = #X
+#define REGISTER_PARSE_TYPE(X) template <> struct _Fieldmap::TypeParseTraits<X> \
+    { static const char* name; } ; const char* _Fieldmap::TypeParseTraits<X>::name = #X
 
-Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
+Fieldmap _Fieldmap::getFieldmap(std::string Filename, bool fast) {
     std::map<std::string, FieldmapDescription>::iterator position = FieldmapDictionary.find(Filename);
     if (position != FieldmapDictionary.end()) {
         (*position).second.RefCounter++;
@@ -62,14 +61,14 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T1DDynamic, new FM1DDynamic_fast(Filename))));
+                        FieldmapDescription(T1DDynamic,
+                                            _FM1DDynamic_fast::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T1DDynamic, new FM1DDynamic(Filename))));
+                        FieldmapDescription(T1DDynamic,
+                                            _FM1DDynamic::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
@@ -79,14 +78,14 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            TAstraDynamic, new Astra1DDynamic_fast(Filename))));
+                        FieldmapDescription(TAstraDynamic,
+                                            _Astra1DDynamic_fast::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            TAstraDynamic, new Astra1DDynamic(Filename))));
+                        FieldmapDescription(TAstraDynamic,
+                                            _Astra1DDynamic::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
@@ -96,14 +95,14 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T1DElectroStatic, new FM1DElectroStatic_fast(Filename))));
+                        FieldmapDescription(T1DElectroStatic,
+                                            _FM1DElectroStatic_fast::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T1DElectroStatic, new FM1DElectroStatic(Filename))));
+                        FieldmapDescription(T1DElectroStatic,
+                                            _FM1DElectroStatic::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
@@ -113,14 +112,14 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            TAstraElectroStatic, new Astra1DElectroStatic_fast(Filename))));
+                        FieldmapDescription(TAstraElectroStatic,
+                                            _Astra1DElectroStatic_fast::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            TAstraElectroStatic, new Astra1DElectroStatic(Filename))));
+                        FieldmapDescription(TAstraElectroStatic,
+                                            _Astra1DElectroStatic::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
@@ -130,14 +129,14 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T1DMagnetoStatic, new FM1DMagnetoStatic_fast(Filename))));
+                        FieldmapDescription(T1DMagnetoStatic,
+                                            _FM1DMagnetoStatic_fast::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T1DMagnetoStatic, new FM1DMagnetoStatic(Filename))));
+                        FieldmapDescription(T1DMagnetoStatic,
+                                            _FM1DMagnetoStatic::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
@@ -147,14 +146,14 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            TAstraMagnetoStatic, new Astra1DMagnetoStatic_fast(Filename))));
+                        FieldmapDescription(TAstraMagnetoStatic,
+                                            _Astra1DMagnetoStatic_fast::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            TAstraMagnetoStatic, new Astra1DMagnetoStatic(Filename))));
+                        FieldmapDescription(TAstraMagnetoStatic,
+                                            _Astra1DMagnetoStatic::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
@@ -163,7 +162,8 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
             position = FieldmapDictionary.insert(
                 std::make_pair(
                     Filename,
-                    FieldmapDescription(T1DProfile1, new FM1DProfile1(Filename))));
+                    FieldmapDescription(T1DProfile1,
+                                        _FM1DProfile1::create(Filename))));
             return (*position.first).second.Map;
             break;
 
@@ -171,8 +171,8 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
             position = FieldmapDictionary.insert(
                 std::make_pair(
                     Filename,
-                    FieldmapDescription(
-                        T1DProfile2, new FM1DProfile2(Filename))));
+                    FieldmapDescription(T1DProfile2,
+                                        _FM1DProfile2::create(Filename))));
             return (*position.first).second.Map;
             break;
 
@@ -180,8 +180,8 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
             position = FieldmapDictionary.insert(
                 std::make_pair(
                     Filename,
-                    FieldmapDescription(
-                        T2DDynamic, new FM2DDynamic(Filename))));
+                    FieldmapDescription(T2DDynamic,
+                                        _FM2DDynamic::create(Filename))));
             return (*position.first).second.Map;
             break;
 
@@ -189,8 +189,8 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
             position = FieldmapDictionary.insert(
                 std::make_pair(
                     Filename,
-                    FieldmapDescription(
-                        T2DElectroStatic, new FM2DElectroStatic(Filename))));
+                    FieldmapDescription(T2DElectroStatic,
+                                        _FM2DElectroStatic::create(Filename))));
             return (*position.first).second.Map;
             break;
 
@@ -198,8 +198,8 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
             position = FieldmapDictionary.insert(
                 std::make_pair(
                     Filename,
-                    FieldmapDescription(
-                        T2DMagnetoStatic, new FM2DMagnetoStatic(Filename))));
+                    FieldmapDescription(T2DMagnetoStatic,
+                                        _FM2DMagnetoStatic::create(Filename))));
             return (*position.first).second.Map;
             break;
 
@@ -207,32 +207,32 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
             position = FieldmapDictionary.insert(
                 std::make_pair(
                     Filename,
-                    FieldmapDescription(
-                        T3DDynamic, new FM3DDynamic(Filename))));
+                    FieldmapDescription(T3DDynamic,
+                                        _FM3DDynamic::create(Filename))));
             return (*position.first).second.Map;
             break;
 
         case T3DMagnetoStaticH5Block:
             position = FieldmapDictionary.insert(
                 std::make_pair(
-                    Filename, FieldmapDescription(
-                        T3DMagnetoStaticH5Block, new FM3DMagnetoStaticH5Block(Filename))));
+                    Filename, FieldmapDescription(T3DMagnetoStaticH5Block,
+                                                  _FM3DMagnetoStaticH5Block::create(Filename))));
             return (*position.first).second.Map;
             break;
 
         case T3DMagnetoStatic:
             position = FieldmapDictionary.insert(
                 std::make_pair(
-                    Filename, FieldmapDescription(
-                        T3DMagnetoStatic, new FM3DMagnetoStatic(Filename))));
+                    Filename, FieldmapDescription(T3DMagnetoStatic,
+                                                  _FM3DMagnetoStatic::create(Filename))));
             return (*position.first).second.Map;
             break;
 
         case T3DMagnetoStatic_Extended:
             position = FieldmapDictionary.insert(
                 std::make_pair(
-                    Filename, FieldmapDescription(
-                        T3DMagnetoStatic_Extended, new FM3DMagnetoStaticExtended(Filename))));
+                    Filename, FieldmapDescription(T3DMagnetoStatic_Extended,
+                                                  _FM3DMagnetoStaticExtended::create(Filename))));
             return (*position.first).second.Map;
             break;
 
@@ -241,26 +241,26 @@ Fieldmap *Fieldmap::getFieldmap(std::string Filename, bool fast) {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T3DDynamic, new FM3DH5Block_nonscale(Filename))));
+                        FieldmapDescription(T3DDynamic,
+                                            _FM3DH5Block_nonscale::create(Filename))));
             } else {
                 position = FieldmapDictionary.insert(
                     std::make_pair(
                         Filename,
-                        FieldmapDescription(
-                            T3DDynamic, new FM3DH5Block(Filename))));
+                        FieldmapDescription(T3DDynamic,
+                                            _FM3DH5Block::create(Filename))));
             }
             return (*position.first).second.Map;
             break;
 
         default:
-            throw GeneralClassicException("Fieldmap::getFieldmap()",
+            throw GeneralClassicException("_Fieldmap::getFieldmap()",
                                           "Couldn't determine type of fieldmap in file \"" + Filename + "\"");
         }
     }
 }
 
-std::vector<std::string> Fieldmap::getListFieldmapNames() {
+std::vector<std::string> _Fieldmap::getListFieldmapNames() {
     std::vector<std::string> name_list;
     for (std::map<std::string, FieldmapDescription>::const_iterator it = FieldmapDictionary.begin(); it != FieldmapDictionary.end(); ++ it) {
         name_list.push_back((*it).first);
@@ -268,20 +268,19 @@ std::vector<std::string> Fieldmap::getListFieldmapNames() {
     return name_list;
 }
 
-void Fieldmap::deleteFieldmap(std::string Filename) {
+void _Fieldmap::deleteFieldmap(std::string Filename) {
     freeMap(Filename);
 }
 
-void Fieldmap::clearDictionary() {
+void _Fieldmap::clearDictionary() {
     std::map<std::string, FieldmapDescription>::iterator it = FieldmapDictionary.begin();
     for (;it != FieldmapDictionary.end(); ++ it) {
-        delete it->second.Map;
-        it->second.Map = nullptr;
+        it->second.Map.reset();
     }
     FieldmapDictionary.clear();
 }
 
-MapType Fieldmap::readHeader(std::string Filename) {
+MapType _Fieldmap::readHeader(std::string Filename) {
     char magicnumber[5] = "    ";
     std::string buffer;
     int lines_read_m = 0;
@@ -291,11 +290,11 @@ MapType Fieldmap::readHeader(std::string Filename) {
         return T1DProfile1;
 
     if (Filename.empty())
-        throw GeneralClassicException("Fieldmap::readHeader()",
+        throw GeneralClassicException("_Fieldmap::readHeader()",
                                       "No field map file specified");
 
     if (!fs::exists(Filename))
-        throw GeneralClassicException("Fieldmap::readHeader()",
+        throw GeneralClassicException("_Fieldmap::readHeader()",
                                       "File '" + Filename + "' doesn't exist");
 
     std::ifstream File(Filename.c_str());
@@ -421,7 +420,7 @@ MapType Fieldmap::readHeader(std::string Filename) {
     return UNKNOWN;
 }
 
-void Fieldmap::readMap(std::string Filename) {
+void _Fieldmap::readMap(std::string Filename) {
     std::map<std::string, FieldmapDescription>::iterator position = FieldmapDictionary.find(Filename);
     if (position != FieldmapDictionary.end())
         if (!(*position).second.read) {
@@ -430,7 +429,7 @@ void Fieldmap::readMap(std::string Filename) {
         }
 }
 
-void Fieldmap::freeMap(std::string Filename) {
+void _Fieldmap::freeMap(std::string Filename) {
     std::map<std::string, FieldmapDescription>::iterator position = FieldmapDictionary.find(Filename);
     /*
       FIXME: find( ) make problem, crashes
@@ -441,14 +440,13 @@ void Fieldmap::freeMap(std::string Filename) {
         }
 
         if ((*position).second.RefCounter == 0) {
-            delete (*position).second.Map;
-            (*position).second.Map = nullptr;
+            (*position).second.Map.reset();
             FieldmapDictionary.erase(position);
         }
     }
 }
 
-void Fieldmap::checkMap(unsigned int accuracy,
+void _Fieldmap::checkMap(unsigned int accuracy,
                         std::pair<double, double> fieldDimensions,
                         double deltaZ,
                         const std::vector<double> &fourierCoefficients,
@@ -464,7 +462,7 @@ void Fieldmap::checkMap(unsigned int accuracy,
     checkMap(accuracy, length, zSampling, fourierCoefficients, splineCoefficients, splineAccelerator);
 }
 
-void Fieldmap::checkMap(unsigned int accuracy,
+void _Fieldmap::checkMap(unsigned int accuracy,
                         double length,
                         const std::vector<double> &zSampling,
                         const std::vector<double> &fourierCoefficients,
@@ -519,7 +517,7 @@ void Fieldmap::checkMap(unsigned int accuracy,
     if (std::sqrt(error / ezSquare) > 1e-1 || maxDiff > 1e-1 * ezMax) {
         lowResolutionWarning(std::sqrt(error / ezSquare), maxDiff / ezMax);
 
-        throw GeneralClassicException("Fieldmap::checkMap",
+        throw GeneralClassicException("_Fieldmap::checkMap",
                                       "Field map can't be reproduced properly with the given number of fourier components");
     }
     if (std::sqrt(error / ezSquare) > 1e-2 || maxDiff > 1e-2 * ezMax) {
@@ -527,13 +525,13 @@ void Fieldmap::checkMap(unsigned int accuracy,
     }
 }
 
-void Fieldmap::setEdgeConstants(const double &/*bendAngle*/, const double &/*entranceAngle*/, const double &/*exitAngle*/)
+void _Fieldmap::setEdgeConstants(const double &/*bendAngle*/, const double &/*entranceAngle*/, const double &/*exitAngle*/)
 {};
 
-void Fieldmap::setFieldLength(const double &)
+void _Fieldmap::setFieldLength(const double &)
 {};
 
-void Fieldmap::getLine(std::ifstream &in, int &lines_read, std::string &buffer) {
+void _Fieldmap::getLine(std::ifstream &in, int &lines_read, std::string &buffer) {
     size_t firstof = 0;
     size_t lastof;
 
@@ -555,7 +553,7 @@ void Fieldmap::getLine(std::ifstream &in, int &lines_read, std::string &buffer)
     }
 }
 
-bool Fieldmap::interpreteEOF(std::ifstream &in) {
+bool _Fieldmap::interpreteEOF(std::ifstream &in) {
     while(!in.eof()) {
         ++lines_read_m;
         in.getline(buffer_m, READ_BUFFER_LENGTH);
@@ -571,7 +569,7 @@ bool Fieldmap::interpreteEOF(std::ifstream &in) {
     return true;
 }
 
-void Fieldmap::interpretWarning(const std::ios_base::iostate &state,
+void _Fieldmap::interpretWarning(const std::ios_base::iostate &state,
                                  const bool &read_all,
                                  const std::string &expecting,
                                  const std::string &found) {
@@ -586,47 +584,47 @@ void Fieldmap::interpretWarning(const std::ios_base::iostate &state,
                  << "expecting: '" << expecting << "' on line " << lines_read_m << ",\n"
                  << "instead found: '" << found << "'." << std::endl;
     }
-    throw GeneralClassicException("Fieldmap::interpretWarning()",
+    throw GeneralClassicException("_Fieldmap::interpretWarning()",
                                   errormsg.str());
 }
 
-void Fieldmap::missingValuesWarning() {
+void _Fieldmap::missingValuesWarning() {
     std::stringstream errormsg;
     errormsg << "THERE SEEMS TO BE SOMETHING WRONG WITH YOUR FIELD MAP '" << Filename_m << "'.\n"
              << "There are only " << lines_read_m - 1 << " lines in the file, expecting more.\n"
              << "Please check the section about field maps in the user manual.";
 
-    throw GeneralClassicException("Fieldmap::missingValuesWarning()",
+    throw GeneralClassicException("_Fieldmap::missingValuesWarning()",
                                   errormsg.str());
 }
 
-void Fieldmap::exceedingValuesWarning() {
+void _Fieldmap::exceedingValuesWarning() {
     std::stringstream errormsg;
     errormsg << "THERE SEEMS TO BE SOMETHING WRONG WITH YOUR FIELD MAP '" << Filename_m << "'.\n"
              << "There are too many lines in the file, expecting only " << lines_read_m << " lines.\n"
              << "Please check the section about field maps in the user manual.";
 
-    throw GeneralClassicException("Fieldmap::exceedingValuesWarning()",
+    throw GeneralClassicException("_Fieldmap::exceedingValuesWarning()",
                                   errormsg.str());
 }
 
-void Fieldmap::disableFieldmapWarning() {
+void _Fieldmap::disableFieldmapWarning() {
     std::stringstream errormsg;
     errormsg << "DISABLING FIELD MAP '" + Filename_m + "' DUE TO PARSING ERRORS." ;
 
-    throw GeneralClassicException("Fieldmap::disableFieldmapsWarning()",
+    throw GeneralClassicException("_Fieldmap::disableFieldmapsWarning()",
                                   errormsg.str());
 }
 
-void Fieldmap::noFieldmapWarning() {
+void _Fieldmap::noFieldmapWarning() {
     std::stringstream errormsg;
     errormsg << "DISABLING FIELD MAP '" << Filename_m << "' SINCE FILE COULDN'T BE FOUND!";
 
-    throw GeneralClassicException("Fieldmap::noFieldmapsWarning()",
+    throw GeneralClassicException("_Fieldmap::noFieldmapsWarning()",
                                   errormsg.str());
 }
 
-void Fieldmap::lowResolutionWarning(double squareError, double maxError) {
+void _Fieldmap::lowResolutionWarning(double squareError, double maxError) {
     std::stringstream errormsg;
     errormsg << "IT SEEMS THAT YOU USE TOO FEW FOURIER COMPONENTS TO SUFFICIENTLY WELL\n"
              << "RESOLVE THE FIELD MAP '" << Filename_m << "'.\n"
@@ -649,7 +647,7 @@ void Fieldmap::lowResolutionWarning(double squareError, double maxError) {
     }
 }
 
-std::string Fieldmap::typeset_msg(const std::string &msg, const std::string &title) {
+std::string _Fieldmap::typeset_msg(const std::string &msg, const std::string &title) {
     static std::string frame("* ******************************************************************************\n");
     static unsigned int frame_width = frame.length() - 5;
     static std::string closure("                                                                               *\n");
@@ -706,35 +704,35 @@ std::string Fieldmap::typeset_msg(const std::string &msg, const std::string &tit
     return return_string;
 }
 
-void Fieldmap::getOnaxisEz(std::vector<std::pair<double, double> > &/*onaxis*/)
+void _Fieldmap::getOnaxisEz(std::vector<std::pair<double, double> > &/*onaxis*/)
 { }
 
-void Fieldmap::get1DProfile1EngeCoeffs(std::vector<double> &/*engeCoeffsEntry*/,
+void _Fieldmap::get1DProfile1EngeCoeffs(std::vector<double> &/*engeCoeffsEntry*/,
                                        std::vector<double> &/*engeCoeffsExit*/) {
 
 }
 
-void Fieldmap::get1DProfile1EntranceParam(double &/*entranceParameter1*/,
+void _Fieldmap::get1DProfile1EntranceParam(double &/*entranceParameter1*/,
                                           double &/*entranceParameter2*/,
                                           double &/*entranceParameter3*/) {
 
 }
 
-void Fieldmap::get1DProfile1ExitParam(double &/*exitParameter1*/,
+void _Fieldmap::get1DProfile1ExitParam(double &/*exitParameter1*/,
                                       double &/*exitParameter2*/,
                                       double &/*exitParameter3*/) {
 
 }
 
-double Fieldmap::getFieldGap() {
+double _Fieldmap::getFieldGap() {
     return 0.0;
 }
 
-void Fieldmap::setFieldGap(double /*gap*/) {
+void _Fieldmap::setFieldGap(double /*gap*/) {
 
 }
 
-void Fieldmap::write3DField(unsigned int nx,
+void _Fieldmap::write3DField(unsigned int nx,
                             unsigned int ny,
                             unsigned int nz,
                             const std::pair<double, double> &xrange,
@@ -813,6 +811,6 @@ REGISTER_PARSE_TYPE(unsigned int);
 REGISTER_PARSE_TYPE(double);
 REGISTER_PARSE_TYPE(std::string);
 
-std::string Fieldmap::alpha_numeric("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-+\211");
-std::map<std::string, Fieldmap::FieldmapDescription> Fieldmap::FieldmapDictionary = std::map<std::string, Fieldmap::FieldmapDescription>();
-char Fieldmap::buffer_m[READ_BUFFER_LENGTH];
+std::string _Fieldmap::alpha_numeric("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-+\211");
+std::map<std::string, _Fieldmap::FieldmapDescription> _Fieldmap::FieldmapDictionary = std::map<std::string, _Fieldmap::FieldmapDescription>();
+char _Fieldmap::buffer_m[READ_BUFFER_LENGTH];
\ No newline at end of file
diff --git a/src/Classic/Fields/Fieldmap.h b/src/Classic/Fields/Fieldmap.h
index 9c01fa963b194280c8f7ae006f4450a52a22b28b..35888367bb588372560b4170c73230a698ec1eeb 100644
--- a/src/Classic/Fields/Fieldmap.h
+++ b/src/Classic/Fields/Fieldmap.h
@@ -7,6 +7,7 @@
 #include <map>
 #include <vector>
 #include "Algorithms/Vektor.h"
+#include "Fields/Definitions.h"
 
 #include "gsl/gsl_interp.h"
 #include "gsl/gsl_spline.h"
@@ -57,11 +58,11 @@ enum DiffDirection {
     DZ
 };
 
-class Fieldmap {
+class _Fieldmap {
 
 public:
 
-    static Fieldmap *getFieldmap(std::string Filename, bool fast = false);
+    static Fieldmap getFieldmap(std::string Filename, bool fast = false);
     static std::vector<std::string> getListFieldmapNames();
     static void deleteFieldmap(std::string Filename);
     static void clearDictionary();
@@ -104,14 +105,14 @@ public:
     virtual void freeMap() = 0;
 
 protected:
-    Fieldmap () = delete;
+    _Fieldmap () = delete;
 
-    Fieldmap(const std::string& aFilename)
-        : Filename_m(aFilename),
+    _Fieldmap(const std::string& filename)
+        : Filename_m(filename),
         lines_read_m(0),
         normalize_m(true) { };
 
-    virtual ~Fieldmap() { ;};
+    virtual ~_Fieldmap() { ;};
     MapType Type;
 
     std::string Filename_m;
@@ -183,10 +184,10 @@ private:
 
     struct FieldmapDescription {
         MapType Type;
-        Fieldmap *Map;
+        Fieldmap Map;
         unsigned int RefCounter;
         bool read;
-        FieldmapDescription(MapType aType, Fieldmap *aMap):
+        FieldmapDescription(MapType aType, Fieldmap aMap):
             Type(aType),
             Map(aMap),
             RefCounter(1),
diff --git a/src/Classic/Fields/Fieldmap.hpp b/src/Classic/Fields/Fieldmap.hpp
index ded87c4a1f25110bac98c5ebdffa870d8bb26635..8343b75c07745774148f56ed3ab395ce8c398414 100644
--- a/src/Classic/Fields/Fieldmap.hpp
+++ b/src/Classic/Fields/Fieldmap.hpp
@@ -9,7 +9,7 @@
 #include "Fields/Fieldmap.h"
 
 template<class T>
-bool Fieldmap::interpretLine(std::ifstream & in, T & value, const bool & file_length_known)
+bool _Fieldmap::interpretLine(std::ifstream & in, T & value, const bool & file_length_known)
 {
     bool read_all = true;
     std::string buffer;
@@ -36,7 +36,7 @@ bool Fieldmap::interpretLine(std::ifstream & in, T & value, const bool & file_le
 }
 
 template<class S, class T>
-bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, const bool & file_length_known)
+bool _Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, const bool & file_length_known)
 {
     bool read_all = true;
     std::string buffer;
@@ -67,7 +67,7 @@ bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, const b
 }
 
 template<class S, class T, class U>
-bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & value3, const bool & file_length_known)
+bool _Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & value3, const bool & file_length_known)
 {
     bool read_all = true;
     std::string buffer;
@@ -101,7 +101,7 @@ bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & val
 }
 
 template<class S, class T, class U, class V>
-bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & value3, V & value4, const bool & file_length_known)
+bool _Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & value3, V & value4, const bool & file_length_known)
 {
     bool read_all = true;
     std::string buffer;
@@ -138,7 +138,7 @@ bool Fieldmap::interpretLine(std::ifstream & in, S & value1, T & value2, U & val
 }
 
 template<class S>
-bool Fieldmap::interpretLine(std::ifstream & in, S & value1, S & value2, S & value3, S & value4, S & value5, S & value6, const bool & file_length_known)
+bool _Fieldmap::interpretLine(std::ifstream & in, S & value1, S & value2, S & value3, S & value4, S & value5, S & value6, const bool & file_length_known)
 {
     bool read_all = true;
     std::string buffer;
diff --git a/src/Classic/Utilities/MSLang/matheval.hpp b/src/Classic/Utilities/MSLang/matheval.hpp
index 33b3bd875f7b72bbeb32bc71ac01faa656875cc5..0644d15766eaf069b0c304520dee579be3a550a9 100644
--- a/src/Classic/Utilities/MSLang/matheval.hpp
+++ b/src/Classic/Utilities/MSLang/matheval.hpp
@@ -27,7 +27,7 @@
 #define BOOST_RESULT_OF_USE_DECLTYPE
 #define BOOST_SPIRIT_USE_PHOENIX_V3
 #include <boost/math/constants/constants.hpp>
-#include <boost/spirit/include/phoenix.hpp>
+#include <boost/phoenix.hpp>
 #include <boost/spirit/include/qi.hpp>
 #include <boost/variant.hpp>
 
diff --git a/src/Main.cpp b/src/Main.cpp
index e57e68f1839608076ed97290327a01dcf68139aa..a8b06fd5e34ce14b28156c0be67ba2aa669b254b 100644
--- a/src/Main.cpp
+++ b/src/Main.cpp
@@ -511,7 +511,7 @@ int opalMain(int argc, char *argv[]) {
                        OpalData::getInstance()->getProblemCharacteristicValues());
 
     Ippl::Comm->barrier();
-    Fieldmap::clearDictionary();
+    _Fieldmap::clearDictionary();
     OpalData::deleteInstance();
     delete gmsg;
 
diff --git a/src/ValueDefinitions/RealConstant.cpp b/src/ValueDefinitions/RealConstant.cpp
index 4111c76fc212feddd75df1758d0467a8617395ec..b8585d53dcdabe223117c70f93bfb0f3d4f7d4db 100644
--- a/src/ValueDefinitions/RealConstant.cpp
+++ b/src/ValueDefinitions/RealConstant.cpp
@@ -60,9 +60,8 @@ RealConstant::RealConstant():
     opal->create(new RealConstant("CLIGHT", this, Physics::c));
     opal->create(new RealConstant("AMU",    this, Physics::amu));
 
-    opal->create(new RealConstant("OPALVERSION", this, OPAL_VERSION_MAJOR * 10000
-                                  + OPAL_VERSION_MINOR * 100
-                                  + OPAL_VERSION_PATCH));
+    opal->create(new RealConstant("OPALVERSION", this, OPAL_VERSION_MAJOR*10
+                                  + OPAL_VERSION_MINOR));
     opal->create(new RealConstant("RANK", this, Ippl::myNode()));
 }
 
diff --git a/src/opal.cpp b/src/opal.cpp
index 7513dbe162ca68a0afe73aece2e4795a5f5eb3cf..3c2cbb18d090a5c95870221c28189b6a5ac37dc8 100644
--- a/src/opal.cpp
+++ b/src/opal.cpp
@@ -85,7 +85,7 @@ int run_opal(char */*args*/[], std::string inputfile, int restartStep,
     // cleanup
     //OPAL->reset();
     OpalData::deleteInstance();
-    Fieldmap::clearDictionary();
+    _Fieldmap::clearDictionary();
     delete parser;
     delete gmsg;
 
diff --git a/tests/opal_src/Elements/OpalAsymmetricEngeTest.cpp b/tests/opal_src/Elements/OpalAsymmetricEngeTest.cpp
index b81a809a60ad0fc8f0286b286699b188828d9311..413d43cc0446da974ef71d51386da92d54f60ca3 100644
--- a/tests/opal_src/Elements/OpalAsymmetricEngeTest.cpp
+++ b/tests/opal_src/Elements/OpalAsymmetricEngeTest.cpp
@@ -1,27 +1,27 @@
-/* 
+/*
  *  Copyright (c) 2014, Chris Rogers
  *  All rights reserved.
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions are met: 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
  *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer. 
- *  2. Redistributions in binary form must reproduce the above copyright notice, 
- *     this list of conditions and the following disclaimer in the documentation 
+ *     this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
  *     and/or other materials provided with the distribution.
- *  3. Neither the name of STFC nor the names of its contributors may be used to 
- *     endorse or promote products derived from this software without specific 
+ *  3. Neither the name of STFC nor the names of its contributors may be used to
+ *     endorse or promote products derived from this software without specific
  *     prior written permission.
  *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  *  POSSIBILITY OF SUCH DAMAGE.
  */
 
@@ -40,7 +40,7 @@ void setReal(OpalAsymmetricEnge& enge, std::string attName, double value) {
 }
 
 void setRealArray(OpalAsymmetricEnge& enge,
-                  std::string attName, 
+                  std::string attName,
                   std::vector<double> value) {
     Attribute* att = enge.findAttribute(attName);
     ASSERT_NE(att, nullptr);
@@ -65,16 +65,13 @@ TEST(OpalAsymmetricEngeTest, TestUpdate) {
     std::shared_ptr<Enge> engeEnd = myEnge->getEngeEnd();
     EXPECT_EQ(myEnge->getX0Start(), 1.0);
     EXPECT_EQ(engeStart->getLambda(), 2.0);
-    ASSERT_EQ(engeStart->getCoefficients().size(), 2);
+    ASSERT_EQ(engeStart->getCoefficients().size(), 2u);
     EXPECT_EQ(engeStart->getCoefficients()[0], 3.0);
     EXPECT_EQ(engeStart->getCoefficients()[1], 4.0);
     EXPECT_EQ(myEnge->getX0End(), -1.0);
     EXPECT_EQ(engeEnd->getLambda(), -2.0);
-    ASSERT_EQ(engeEnd->getCoefficients().size(), 3);
+    ASSERT_EQ(engeEnd->getCoefficients().size(), 3u);
     EXPECT_EQ(engeEnd->getCoefficients()[0], -3.0);
     EXPECT_EQ(engeEnd->getCoefficients()[1], -4.0);
     EXPECT_EQ(engeEnd->getCoefficients()[2], -5.0);
-}
-
-
-
+}
\ No newline at end of file
diff --git a/tests/opal_src/Elements/OpalEngeTest.cpp b/tests/opal_src/Elements/OpalEngeTest.cpp
index 672c20f51863ceea0a4b24707d16718e7e25cb88..d3cf1944811ba684658956800fa41ec100f48f4b 100644
--- a/tests/opal_src/Elements/OpalEngeTest.cpp
+++ b/tests/opal_src/Elements/OpalEngeTest.cpp
@@ -1,27 +1,27 @@
-/* 
+/*
  *  Copyright (c) 2014, Chris Rogers
  *  All rights reserved.
- *  Redistribution and use in source and binary forms, with or without 
- *  modification, are permitted provided that the following conditions are met: 
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
  *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer. 
- *  2. Redistributions in binary form must reproduce the above copyright notice, 
- *     this list of conditions and the following disclaimer in the documentation 
+ *     this list of conditions and the following disclaimer.
+ *  2. Redistributions in binary form must reproduce the above copyright notice,
+ *     this list of conditions and the following disclaimer in the documentation
  *     and/or other materials provided with the distribution.
- *  3. Neither the name of STFC nor the names of its contributors may be used to 
- *     endorse or promote products derived from this software without specific 
+ *  3. Neither the name of STFC nor the names of its contributors may be used to
+ *     endorse or promote products derived from this software without specific
  *     prior written permission.
  *
- *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
- *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
- *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
- *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
- *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
- *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
- *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
- *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
- *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  *  POSSIBILITY OF SUCH DAMAGE.
  */
 
@@ -39,7 +39,7 @@ void setReal(OpalEnge& enge, std::string attName, double value) {
 }
 
 void setRealArray(OpalEnge& enge,
-                  std::string attName, 
+                  std::string attName,
                   std::vector<double> value) {
     Attribute* att = enge.findAttribute(attName);
     ASSERT_NE(att, nullptr);
@@ -60,10 +60,7 @@ TEST(OpalEngeTest, TestUpdate) {
     Enge* myEnge = dynamic_cast<Enge*>(myEFM.get());
     EXPECT_EQ(myEnge->getX0(), 1.0);
     EXPECT_EQ(myEnge->getLambda(), 2.0);
-    ASSERT_EQ(myEnge->getCoefficients().size(), 2);
+    ASSERT_EQ(myEnge->getCoefficients().size(), 2u);
     EXPECT_EQ(myEnge->getCoefficients()[0], 3.0);
     EXPECT_EQ(myEnge->getCoefficients()[1], 4.0);
-}
-
-
-
+}
\ No newline at end of file
diff --git a/tests/opal_src/Elements/OpalScalingFFAMagnetTest.cpp b/tests/opal_src/Elements/OpalScalingFFAMagnetTest.cpp
index 8bf1e25a597edf5f445589dfe912eb6f01f30de9..025b0010c0d9a6f316e4129e710b0c78a6b5e223 100644
--- a/tests/opal_src/Elements/OpalScalingFFAMagnetTest.cpp
+++ b/tests/opal_src/Elements/OpalScalingFFAMagnetTest.cpp
@@ -50,7 +50,7 @@ TEST(OpalScalingFFAMagnetTest, TestUpdate) {
     EXPECT_NEAR(mag1->getR0(), 12.5*Units::m2mm, 1e-9);
     EXPECT_NEAR(mag1->getFieldIndex(), 2.0, 1e-9);
     EXPECT_NEAR(mag1->getTanDelta(), 0.7, 1e-9);
-    EXPECT_EQ(mag1->getMaxOrder(), 3);
+    EXPECT_EQ(mag1->getMaxOrder(), 3u);
     EXPECT_NEAR(mag1->getRMin(), 11.95*Units::m2mm, 1e-9);
     EXPECT_NEAR(mag1->getRMax(), 13.15*Units::m2mm, 1e-9);
     EXPECT_NEAR(mag1->getVerticalExtent(), 3.0*Units::m2mm, 1e-9);
@@ -115,10 +115,10 @@ TEST(OpalScalingFFAMagnetTest, TestFieldCheck) {
         Vector_t B, P, E;
         double t = 0.;
         // magnet start plus half centre length should have maximum field
-        Vector_t rMiddle = cartesianCoord(r0mm, phi); 
+        Vector_t rMiddle = cartesianCoord(r0mm, phi);
         bool outOfBounds = mag1->apply(rMiddle, P, t, E, B);
         EXPECT_EQ(outOfBounds, oob[i]);
-        EXPECT_NEAR(B[1], field[i], 1e-4) << "failed for phi " 
+        EXPECT_NEAR(B[1], field[i], 1e-4) << "failed for phi "
                                         << position[i] << "*PI/64 " << std::endl;
     }
 
@@ -133,5 +133,4 @@ TEST(OpalScalingFFAMagnetTest, TestFieldCheck) {
     EXPECT_EQ(rot(1), -mag1->getPhiEnd());
     EXPECT_EQ(rot(2), 0.);
 
-}
-
+}
\ No newline at end of file