diff --git a/include/core/capture/capture_base.h b/include/core/capture/capture_base.h
index c10374ae82ae1a8f495e6adc3bea5b7f167b548b..324b83297d987561c4a119e699ac44c2d0eb4ec5 100644
--- a/include/core/capture/capture_base.h
+++ b/include/core/capture/capture_base.h
@@ -83,8 +83,7 @@ class CaptureBase : public NodeBase, public HasStateBlocks, public std::enable_s
 
         // State blocks
         const StateStructure& getStructure() const;
-        StateBlockPtr getStateBlock(const std::string& _key) const;
-        StateBlockPtr getStateBlock(const char _key) const { return getStateBlock(std::string(1, _key)); }
+        StateBlockPtr getStateBlock(const char& _key) const;
         StateBlockPtr getSensorP() const;
         StateBlockPtr getSensorO() const;
         StateBlockPtr getSensorIntrinsic() const;
@@ -138,17 +137,17 @@ std::shared_ptr<classType> CaptureBase::emplace(FrameBasePtr _frm_ptr, T&&... al
 
 inline StateBlockPtr CaptureBase::getSensorP() const
 {
-    return getStateBlock("P");
+    return getStateBlock('P');
 }
 
 inline StateBlockPtr CaptureBase::getSensorO() const
 {
-    return getStateBlock("O");
+    return getStateBlock('O');
 }
 
 inline StateBlockPtr CaptureBase::getSensorIntrinsic() const
 {
-    return getStateBlock("I");
+    return getStateBlock('I');
 }
 
 inline unsigned int CaptureBase::id() const
diff --git a/include/core/frame/frame_base.h b/include/core/frame/frame_base.h
index 91a94d274b36d0023a0ba267583f4b67726d8665..a28e13e1e73c089f717a43dcf23ed8d2cc486fe3 100644
--- a/include/core/frame/frame_base.h
+++ b/include/core/frame/frame_base.h
@@ -99,7 +99,7 @@ class FrameBase : public NodeBase, public HasStateBlocks, public std::enable_sha
         // State blocks ----------------------------------------------------
     public:
         using HasStateBlocks::addStateBlock;
-        StateBlockPtr addStateBlock(const std::string& _sb_type, const StateBlockPtr& _sb);
+        StateBlockPtr addStateBlock(const char& _sb_type, const StateBlockPtr& _sb);
         StateBlockPtr getV() const;
 
     protected:
@@ -211,7 +211,7 @@ inline TimeStamp FrameBase::getTimeStamp() const
 
 inline StateBlockPtr FrameBase::getV() const
 {
-    return getStateBlock("V");
+    return getStateBlock('V');
 }
 
 inline TrajectoryBasePtr FrameBase::getTrajectory() const
@@ -234,7 +234,7 @@ inline const FactorBasePtrList& FrameBase::getConstrainedByList() const
     return constrained_by_list_;
 }
 
-inline StateBlockPtr FrameBase::addStateBlock(const std::string& _sb_type,
+inline StateBlockPtr FrameBase::addStateBlock(const char& _sb_type,
                                               const StateBlockPtr& _sb)
 {
     if (isKeyOrAux())
diff --git a/include/core/math/SE2.h b/include/core/math/SE2.h
index 4ac32d2ded2923f212937cfa88a0994fb0dca5b4..a051a63e3989f4f0363fc96a8ed462fd1b407cea 100644
--- a/include/core/math/SE2.h
+++ b/include/core/math/SE2.h
@@ -69,8 +69,8 @@ inline Eigen::Matrix2d V_helper(const T theta)
 inline VectorComposite identity()
 {
     VectorComposite v;
-    v["P"] = Vector2d::Zero();
-    v["O"] = Vector1d::Zero();
+    v['P'] = Vector2d::Zero();
+    v['O'] = Vector1d::Zero();
 
     return v;
 }
@@ -138,12 +138,12 @@ inline void exp(const MatrixBase<D1>& _tau, MatrixBase<D2>& _delta, MatrixBase<D
 inline void exp(const VectorComposite& _tau, VectorComposite& _delta)
 {
     // [1] eq. 156
-    const auto &p = _tau.at("P");
-    const auto &theta = pi2pi(_tau.at("O")(0));
+    const auto &p = _tau.at('P');
+    const auto &theta = pi2pi(_tau.at('O')(0));
     Matrix2d V = V_helper(theta);
 
-    _delta["P"] = V * p;
-    _delta["O"] = Matrix1d(theta);
+    _delta['P'] = V * p;
+    _delta['O'] = Matrix1d(theta);
 }
 
 inline VectorComposite exp(const VectorComposite& tau)
@@ -158,22 +158,22 @@ inline VectorComposite exp(const VectorComposite& tau)
 inline void exp(const VectorComposite& _tau, VectorComposite& _delta, MatrixComposite& _J_delta_tau)
 {
     // [1] eq. 156
-    const auto &p = _tau.at("P");
-    const auto &theta = pi2pi(_tau.at("O")(0));
+    const auto &p = _tau.at('P');
+    const auto &theta = pi2pi(_tau.at('O')(0));
     Matrix2d V = V_helper(theta);
 
-    _delta["P"] = V * p;
-    _delta["O"] = Matrix1d(theta);
+    _delta['P'] = V * p;
+    _delta['O'] = Matrix1d(theta);
 
     // Jacobian follows the composite definition in [1] eq. 89, with jacobian blocks:
     //   J_Vp_p = V: see V_helper, eq. 158
     //   J_Vp_theta: see fcn helper
     //   J_theta_theta = 1; eq. 126
     _J_delta_tau.clear();
-    _J_delta_tau.emplace("P", "P", V);
-    _J_delta_tau.emplace("P", "O", J_Vp_theta(p, theta));
-    _J_delta_tau.emplace("O", "P", RowVector2d(0.0, 0.0));
-    _J_delta_tau.emplace("O", "O", Matrix1d(1));
+    _J_delta_tau.emplace('P', 'P', V);
+    _J_delta_tau.emplace('P', 'O', J_Vp_theta(p, theta));
+    _J_delta_tau.emplace('O', 'P', RowVector2d(0.0, 0.0));
+    _J_delta_tau.emplace('O', 'O', Matrix1d(1));
 }
 
 template<class D1, class D2, class D3>
@@ -247,18 +247,18 @@ inline void compose(const VectorComposite& _x1,
                     const VectorComposite& _x2,
                     VectorComposite& _c)
 {
-    const auto& p1 = _x1.at("P");
-    const auto& a1 = _x1.at("O")(0); // angle
+    const auto& p1 = _x1.at('P');
+    const auto& a1 = _x1.at('O')(0); // angle
     const auto& R1 = SO2::exp(a1);
 
-    const auto& p2 = _x2.at("P");
-    const auto& a2 = _x2.at("O")(0); // angle
+    const auto& p2 = _x2.at('P');
+    const auto& a2 = _x2.at('O')(0); // angle
 
     // tc = t1 + R1 t2
-    _c["P"] = p1 + R1 * p2;
+    _c['P'] = p1 + R1 * p2;
 
     // Rc = R1 R2 --> theta = theta1 + theta2
-    _c["O"] = Matrix1d( pi2pi(a1 + a2) ) ;
+    _c['O'] = Matrix1d( pi2pi(a1 + a2) ) ;
 }
 
 inline void compose(const VectorComposite& _x1,
@@ -267,12 +267,12 @@ inline void compose(const VectorComposite& _x1,
              MatrixComposite& _J_c_x1,
              MatrixComposite& _J_c_x2)
 {
-    const auto& p1 = _x1.at("P");
-    const auto& a1 = _x1.at("O")(0); // angle
+    const auto& p1 = _x1.at('P');
+    const auto& a1 = _x1.at('O')(0); // angle
     Matrix2d    R1 = SO2::exp(a1); // need temporary
 
-    const auto& p2 = _x2.at("P");
-    const auto& a2 = _x2.at("O")(0); // angle
+    const auto& p2 = _x2.at('P');
+    const auto& a2 = _x2.at('O')(0); // angle
 
     /* Jacobians in composite form [1] see eqs. (89, 125, 129, 130)
      *
@@ -302,25 +302,25 @@ inline void compose(const VectorComposite& _x1,
      */
 
     _J_c_x1.clear();
-    _J_c_x1.emplace("P", "P", Matrix2d::Identity());
-    _J_c_x1.emplace("P", "O", MatrixXd(R1 * skewed(p2)) );
-    _J_c_x1.emplace("O", "P", RowVector2d(0,0));
-    _J_c_x1.emplace("O", "O", Matrix1d(1));
+    _J_c_x1.emplace('P', 'P', Matrix2d::Identity());
+    _J_c_x1.emplace('P', 'O', MatrixXd(R1 * skewed(p2)) );
+    _J_c_x1.emplace('O', 'P', RowVector2d(0,0));
+    _J_c_x1.emplace('O', 'O', Matrix1d(1));
 
     _J_c_x2.clear();
-    _J_c_x2.emplace("P", "P", R1);
-    _J_c_x2.emplace("P", "O", Vector2d(0,0));
-    _J_c_x2.emplace("O", "P", RowVector2d(0,0));
-    _J_c_x2.emplace("O", "O", Matrix1d(1));
+    _J_c_x2.emplace('P', 'P', R1);
+    _J_c_x2.emplace('P', 'O', Vector2d(0,0));
+    _J_c_x2.emplace('O', 'P', RowVector2d(0,0));
+    _J_c_x2.emplace('O', 'O', Matrix1d(1));
 
 
     // Actually compose the vectors here. This avoids aliasing in case this is called with 'c' coinciding with 'x1' or 'x2'.
 
     // tc = t1 + R1 t2
-    _c["P"] = p1 + R1 * p2;
+    _c['P'] = p1 + R1 * p2;
 
     // Rc = R1 R2 --> theta = theta1 + theta2
-    _c["O"] = Matrix1d( pi2pi(a1 + a2) ) ;
+    _c['O'] = Matrix1d( pi2pi(a1 + a2) ) ;
 
 }
 
@@ -366,15 +366,15 @@ inline Matrix<typename D1::Scalar, 3, 1> plus(const MatrixBase<D1>& d1,
 
 inline void plus(const VectorComposite& x, const VectorComposite& tau, VectorComposite& res)
 {
-    plus(x.at("P"), x.at("O"), tau.at("P"), tau.at("O"), res.at("P"), res.at("O"));
+    plus(x.at('P'), x.at('O'), tau.at('P'), tau.at('O'), res.at('P'), res.at('O'));
 }
 
 inline VectorComposite plus(const VectorComposite& x, const VectorComposite& tau)
 {
     VectorComposite res;
 
-    res["P"] = Vector2d();
-    res["O"] = Vector1d();
+    res['P'] = Vector2d();
+    res['O'] = Vector1d();
 
     plus(x, tau, res);
 
diff --git a/include/core/math/SE3.h b/include/core/math/SE3.h
index 4b000889c59320e8c7e819725c415dd19308d077..79db282a20d91648b2f965d1b057dbb3b92cf324 100644
--- a/include/core/math/SE3.h
+++ b/include/core/math/SE3.h
@@ -67,8 +67,8 @@ inline void identity(MatrixBase<D1>& p, MatrixBase<D2>& q)
 inline void identity(VectorComposite& v)
 {
     v.clear();
-    v["P"] = Vector3d::Zero();
-    v["O"] = Quaterniond::Identity().coeffs();
+    v['P'] = Vector3d::Zero();
+    v['O'] = Quaterniond::Identity().coeffs();
 }
 
 template<typename T = double>
@@ -207,7 +207,7 @@ inline void compose(const MatrixBase<D1>& d1,
 
 inline void compose(const VectorComposite& x1, const VectorComposite& x2, VectorComposite& c)
 {
-    compose(x1.at("P"), x1.at("O"), x2.at("P"), x2.at("O"), c["P"], c["O"]);
+    compose(x1.at('P'), x1.at('O'), x2.at('P'), x2.at('O'), c['P'], c['O']);
 }
 
 inline void compose(const VectorComposite& x1,
@@ -218,20 +218,20 @@ inline void compose(const VectorComposite& x1,
 {
 
     // Some useful temporaries
-    const auto  R1 = q2R(x1.at("O")); //q1.matrix(); // make temporary
-    const auto& R2 = q2R(x2.at("O")); //q2.matrix(); // do not make temporary, only reference
+    const auto  R1 = q2R(x1.at('O')); //q1.matrix(); // make temporary
+    const auto& R2 = q2R(x2.at('O')); //q2.matrix(); // do not make temporary, only reference
 
     // Jac wrt first delta
-    J_c_x1.emplace("P", "P", Matrix3d::Identity()    ) ;
-    J_c_x1.emplace("P", "O", - R1 * skew(x2.at("P")) ) ;
-    J_c_x1.emplace("O", "P", Matrix3d::Zero()        ) ;
-    J_c_x1.emplace("O", "O", R2.transpose()          ) ;
+    J_c_x1.emplace('P', 'P', Matrix3d::Identity()    ) ;
+    J_c_x1.emplace('P', 'O', - R1 * skew(x2.at('P')) ) ;
+    J_c_x1.emplace('O', 'P', Matrix3d::Zero()        ) ;
+    J_c_x1.emplace('O', 'O', R2.transpose()          ) ;
 
     // Jac wrt second delta
-    J_c_x2.emplace("P", "P", R1                   );
-    J_c_x2.emplace("P", "O", Matrix3d::Zero()     );
-    J_c_x2.emplace("O", "P", Matrix3d::Zero()     );
-    J_c_x2.emplace("O", "O", Matrix3d::Identity() );
+    J_c_x2.emplace('P', 'P', R1                   );
+    J_c_x2.emplace('P', 'O', Matrix3d::Zero()     );
+    J_c_x2.emplace('O', 'P', Matrix3d::Zero()     );
+    J_c_x2.emplace('O', 'O', Matrix3d::Identity() );
 
     // compose deltas -- done here to avoid aliasing when calling with input `x1` and result `c` referencing the same variable
     compose(x1, x2, c);
@@ -325,15 +325,15 @@ inline Matrix<typename Derived::Scalar, 7, 1> exp(const MatrixBase<Derived>& d_i
 
 inline VectorComposite exp(const VectorComposite& tau)
 {
-    const auto& p     = tau.at("P");
-    const auto& theta = tau.at("O");
+    const auto& p     = tau.at('P');
+    const auto& theta = tau.at('O');
 
     Matrix3d V = jac_SO3_left(theta); // see [1] eqs. (174) and (145)
 
     VectorComposite  res;
 
-    res["P"] = V * p                 ;
-    res["O"] = exp_q(theta).coeffs() ;
+    res['P'] = V * p                 ;
+    res['O'] = exp_q(theta).coeffs() ;
 
     return res;
 }
@@ -392,15 +392,15 @@ inline Matrix<typename D1::Scalar, 7, 1> plus(const MatrixBase<D1>& d1,
 
 inline void plus(const VectorComposite& x, const VectorComposite& tau, VectorComposite& res)
 {
-    plus(x.at("P"), x.at("O"), tau.at("P"), tau.at("O"), res.at("P"), res.at("O"));
+    plus(x.at('P'), x.at('O'), tau.at('P'), tau.at('O'), res.at('P'), res.at('O'));
 }
 
 inline VectorComposite plus(const VectorComposite& x, const VectorComposite& tau)
 {
     VectorComposite res;
 
-    res["P"] = Vector3d();
-    res["O"] = Vector4d();
+    res['P'] = Vector3d();
+    res['O'] = Vector4d();
 
     plus(x, tau, res);
 
diff --git a/include/core/processor/processor_diff_drive.h b/include/core/processor/processor_diff_drive.h
index e50b2f55764cbc2a5570a4192ed8c15f560804fe..6fb9eb40f5923a5ca3526e64bc8abaa3da2397df 100644
--- a/include/core/processor/processor_diff_drive.h
+++ b/include/core/processor/processor_diff_drive.h
@@ -71,12 +71,12 @@ class ProcessorDiffDrive : public ProcessorOdom2d
 
 inline Eigen::VectorXd ProcessorDiffDrive::getCalibration (const CaptureBasePtr _capture) const
 {
-    return _capture->getStateBlock("I")->getState();
+    return _capture->getStateBlock('I')->getState();
 }
 
 inline void ProcessorDiffDrive::setCalibration (const CaptureBasePtr _capture, const VectorXd& _calibration)
 {
-    _capture->getStateBlock("I")->setState(_calibration);
+    _capture->getStateBlock('I')->setState(_calibration);
 }
 
 
diff --git a/include/core/sensor/sensor_base.h b/include/core/sensor/sensor_base.h
index d59daef943bffdc01e835453963f4dac8c7ad7df..b1572a010a6594473b51aceb949f5b21c26e8eb6 100644
--- a/include/core/sensor/sensor_base.h
+++ b/include/core/sensor/sensor_base.h
@@ -96,9 +96,9 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh
 
         unsigned int sensor_id_;   // sensor ID
 
-        std::map<std::string, bool> state_block_dynamic_; // mark dynamic state blocks
+        std::map<char, bool> state_block_dynamic_; // mark dynamic state blocks
 
-        std::map<std::string, FeatureBasePtr> params_prior_map_; // Priors (value and covariance) of extrinsic & intrinsic state blocks (by key in state_block_map_)
+        std::map<char, FeatureBasePtr> params_prior_map_; // Priors (value and covariance) of extrinsic & intrinsic state blocks (by key in state_block_map_)
 
     protected:
         Eigen::VectorXd noise_std_; // std of sensor noise
@@ -174,21 +174,18 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh
 
         // State blocks
         using HasStateBlocks::addStateBlock;
-        StateBlockPtr addStateBlock(const std::string& _key, const StateBlockPtr& _sb_ptr, const bool _dynamic = false);
-        StateBlockPtr addStateBlock(const char _key, const StateBlockPtr& _sb_ptr, const bool _dynamic = false) { return this->addStateBlock(std::string(1, _key), _sb_ptr, _dynamic); }
-        StateBlockPtr getStateBlockDynamic(const std::string& _key) const;
-        StateBlockPtr getStateBlockDynamic(const std::string& _key, const TimeStamp& _ts) const;
-        StateBlockPtr getStateBlockDynamic(const char _key) const { return getStateBlockDynamic(std::string(1,_key)); }
-        StateBlockPtr getStateBlockDynamic(const char _key, const TimeStamp& _ts) const { return getStateBlockDynamic(std::string(1,_key), _ts); }
+        StateBlockPtr addStateBlock(const char& _key, const StateBlockPtr& _sb_ptr, const bool _dynamic = false);
+        StateBlockPtr getStateBlockDynamic(const char& _key) const;
+        StateBlockPtr getStateBlockDynamic(const char& _key, const TimeStamp& _ts) const;
 
         // Declare a state block as dynamic or static (with _dymanic = false)
-        void setStateBlockDynamic(const std::string& _key, bool _dynamic = true);
+        void setStateBlockDynamic(const char& _key, bool _dynamic = true);
 
-        bool isStateBlockDynamic(const std::string& _key) const;
-        bool isStateBlockInCapture(const std::string& _key, const TimeStamp& _ts, CaptureBasePtr& _cap) const;
-        bool isStateBlockInCapture(const std::string& _key, CaptureBasePtr& _cap) const;
-        bool isStateBlockInCapture(const std::string& _key, const TimeStamp& _ts) const;
-        bool isStateBlockInCapture(const std::string& _key) const;
+        bool isStateBlockDynamic(const char& _key) const;
+        bool isStateBlockInCapture(const char& _key, const TimeStamp& _ts, CaptureBasePtr& _cap) const;
+        bool isStateBlockInCapture(const char& _key, CaptureBasePtr& _cap) const;
+        bool isStateBlockInCapture(const char& _key, const TimeStamp& _ts) const;
+        bool isStateBlockInCapture(const char& _key) const;
 
         StateBlockPtr getP(const TimeStamp _ts) const;
         StateBlockPtr getO(const TimeStamp _ts) const;
@@ -218,7 +215,7 @@ class SensorBase : public NodeBase, public HasStateBlocks, public std::enable_sh
          * \param _size state segment size (-1: whole state) (not used in quaternions)
          *
          **/
-        void addPriorParameter(const std::string& _key,
+        void addPriorParameter(const char& _key,
                                const Eigen::VectorXd& _x,
                                const Eigen::MatrixXd& _cov,
                                unsigned int _start_idx = 0,
@@ -296,7 +293,7 @@ inline const ProcessorBasePtrList& SensorBase::getProcessorList() const
     return processor_list_;
 }
 
-inline StateBlockPtr SensorBase::addStateBlock(const std::string& _key, const StateBlockPtr& _sb_ptr, const bool _dynamic)
+inline StateBlockPtr SensorBase::addStateBlock(const char& _key, const StateBlockPtr& _sb_ptr, const bool _dynamic)
 {
     assert((params_prior_map_.find(_key) == params_prior_map_.end() || _sb_ptr == nullptr) && "overwriting a state block that has an absolute factor");
     HasStateBlocks::addStateBlock(_key, _sb_ptr, getProblem());
@@ -304,13 +301,13 @@ inline StateBlockPtr SensorBase::addStateBlock(const std::string& _key, const St
     return _sb_ptr;
 }
 
-inline void SensorBase::setStateBlockDynamic(const std::string& _key, bool _dynamic)
+inline void SensorBase::setStateBlockDynamic(const char& _key, bool _dynamic)
 {
     assert(hasStateBlock(_key) and "setting dynamic an state block of a key that doesn't exist in the sensor. It is required anyway.");
     state_block_dynamic_[_key] = _dynamic;
 }
 
-inline bool SensorBase::isStateBlockDynamic(const std::string& _key) const
+inline bool SensorBase::isStateBlockDynamic(const char& _key) const
 {
     assert(state_block_dynamic_.count(_key) != 0);
     return state_block_dynamic_.at(_key);
@@ -338,17 +335,17 @@ inline void SensorBase::setHardware(const HardwareBasePtr _hw_ptr)
 
 inline void SensorBase::addPriorP(const Eigen::VectorXd& _x, const Eigen::MatrixXd& _cov, unsigned int _start_idx, int _size)
 {
-    addPriorParameter("P", _x, _cov, _start_idx, _size);
+    addPriorParameter('P', _x, _cov, _start_idx, _size);
 }
 
 inline void SensorBase::addPriorO(const Eigen::VectorXd& _x, const Eigen::MatrixXd& _cov)
 {
-    addPriorParameter("O", _x, _cov);
+    addPriorParameter('O', _x, _cov);
 }
 
 inline void SensorBase::addPriorIntrinsics(const Eigen::VectorXd& _x, const Eigen::MatrixXd& _cov, unsigned int _start_idx, int _size)
 {
-    addPriorParameter("I", _x, _cov);
+    addPriorParameter('I', _x, _cov);
 }
 
 inline SizeEigen SensorBase::getCalibSize() const
diff --git a/include/core/state_block/factory_state_block.h b/include/core/state_block/factory_state_block.h
index efa0db6d76410f4437180b3bc9f2c844c2b878d5..4e1028bf954a7c2ac71e4d133a097700a6150283 100644
--- a/include/core/state_block/factory_state_block.h
+++ b/include/core/state_block/factory_state_block.h
@@ -116,7 +116,7 @@ inline std::string FactoryStateBlock::getClass() const
 }
 
 template<>
-inline StateBlockPtr FactoryStateBlock::create(const std::string& _type, const Eigen::VectorXd& _state, bool _fixed)
+inline StateBlockPtr FactoryStateBlock::create(const string& _type, const Eigen::VectorXd& _state, bool _fixed)
 {
     typename CallbackMap::const_iterator creator_callback_it = get().callbacks_.find(_type);
 
diff --git a/include/core/state_block/has_state_blocks.h b/include/core/state_block/has_state_blocks.h
index a2d6e1e767da2bb800e5f83146a596ea8e35535a..5e1250ff066611a40af092e937324e840e58ae0e 100644
--- a/include/core/state_block/has_state_blocks.h
+++ b/include/core/state_block/has_state_blocks.h
@@ -16,10 +16,6 @@
 namespace wolf
 {
 
-/// State of nodes containing several state blocks
-//typedef std::unordered_map<std::string, Eigen::VectorXd> State;
-//typedef std::string StateStructure;
-
 
 class HasStateBlocks
 {
@@ -29,10 +25,10 @@ class HasStateBlocks
         virtual ~HasStateBlocks();
 
         const StateStructure& getStructure() const { return structure_; }
-        void appendToStructure(const std::string& _frame_type){ structure_ += _frame_type; }
-        bool isInStructure(const std::string& _sb_type) { return structure_.find(_sb_type) != std::string::npos; }
+        void appendToStructure(const char& _frame_type){ structure_ += _frame_type; }
+        bool isInStructure(const char& _sb_type) { return structure_.find(_sb_type) != std::string::npos; }
 
-        const std::unordered_map<std::string, StateBlockPtr>& getStateBlockMap() const;
+        const std::unordered_map<char, StateBlockPtr>& getStateBlockMap() const;
         std::vector<StateBlockPtr> getStateBlockVec() const;
 
         // Some typical shortcuts -- not all should be coded here, see notes below.
@@ -44,27 +40,22 @@ class HasStateBlocks
         virtual void unfix();
         virtual bool isFixed() const;
 
-        virtual StateBlockPtr   addStateBlock(const std::string& _sb_type, const StateBlockPtr& _sb, ProblemPtr _problem);
-        virtual StateBlockPtr   addStateBlock(const char _sb_type, const StateBlockPtr& _sb, ProblemPtr _problem) { return addStateBlock(std::string(1,_sb_type), _sb, _problem); }
-        virtual unsigned int    removeStateBlock(const std::string& _sb_type);
-        virtual unsigned int    removeStateBlock(const char _sb_type);
-        bool            hasStateBlock(const std::string& _sb_type) const { return state_block_map_.count(_sb_type) > 0; }
-        bool            hasStateBlock(const char _sb_type) const { return hasStateBlock(std::string(1, _sb_type)); }
+        virtual StateBlockPtr   addStateBlock(const char& _sb_type, const StateBlockPtr& _sb, ProblemPtr _problem);
+        virtual unsigned int    removeStateBlock(const char& _sb_type);
+        bool            hasStateBlock(const char& _sb_type) const { return state_block_map_.count(_sb_type) > 0; }
         bool            hasStateBlock(const StateBlockPtr& _sb) const;
-        StateBlockPtr   getStateBlock(const std::string& _sb_type) const;
-        StateBlockPtr   getStateBlock(const char _sb_type) const { return getStateBlock(std::string(1,_sb_type)); }
-        bool            setStateBlock(const std::string _sb_type, const StateBlockPtr& _sb);
-        bool            setStateBlock(const char _sb_type, const StateBlockPtr& _sb) { return setStateBlock(std::string(1, _sb_type), _sb); }
-        bool            stateBlockKey(const StateBlockPtr& _sb, std::string& _key) const;
-        std::unordered_map<std::string, StateBlockPtr>::const_iterator find(const StateBlockPtr& _sb) const;
+        StateBlockPtr   getStateBlock(const char& _sb_type) const;
+        bool            setStateBlock(const char _sb_type, const StateBlockPtr& _sb);
+        bool            stateBlockKey(const StateBlockPtr& _sb, char& _key) const;
+        std::unordered_map<char, StateBlockPtr>::const_iterator find(const StateBlockPtr& _sb) const;
 
         // Emplace derived state blocks (angle, quaternion, etc).
         template<typename SB, typename ... Args>
-        std::shared_ptr<SB> emplaceStateBlock(const std::string& _sb_type, ProblemPtr _problem, Args&&... _args_of_derived_state_block_constructor);
+        std::shared_ptr<SB> emplaceStateBlock(const char& _sb_type, ProblemPtr _problem, Args&&... _args_of_derived_state_block_constructor);
 
         // Emplace base state blocks.
         template<typename ... Args>
-        StateBlockPtr emplaceStateBlock(const std::string& _sb_type, ProblemPtr _problem, Args&&... _args_of_base_state_block_constructor);
+        StateBlockPtr emplaceStateBlock(const char& _sb_type, ProblemPtr _problem, Args&&... _args_of_base_state_block_constructor);
 
         // Register/remove state blocks to/from wolf::Problem
         void registerNewStateBlocks(ProblemPtr _problem) const;
@@ -87,7 +78,7 @@ class HasStateBlocks
 
     private:
         StateStructure structure_;
-        std::unordered_map<std::string, StateBlockPtr> state_block_map_;
+        std::unordered_map<char, StateBlockPtr> state_block_map_;
 
 };
 
@@ -112,7 +103,7 @@ inline HasStateBlocks::~HasStateBlocks()
     //
 }
 
-inline const std::unordered_map<std::string, StateBlockPtr>& HasStateBlocks::getStateBlockMap() const
+inline const std::unordered_map<char, StateBlockPtr>& HasStateBlocks::getStateBlockMap() const
 {
     return state_block_map_;
 }
@@ -127,18 +118,18 @@ inline std::vector<StateBlockPtr> HasStateBlocks::getStateBlockVec() const
     return sbv;
 }
 
-inline unsigned int HasStateBlocks::removeStateBlock(const char _sb_type)
-{
-    return removeStateBlock(std::string(1, _sb_type));
-}
+//inline unsigned int HasStateBlocks::removeStateBlock(const char _sb_type)
+//{
+//    return removeStateBlock(std::string(1, _sb_type));
+//}
 
-inline unsigned int HasStateBlocks::removeStateBlock(const std::string& _sb_type)
+inline unsigned int HasStateBlocks::removeStateBlock(const char& _sb_type)
 {
     return state_block_map_.erase(_sb_type);
 }
 
 template<typename SB, typename ... Args>
-inline std::shared_ptr<SB> HasStateBlocks::emplaceStateBlock(const std::string& _sb_type, ProblemPtr _problem, Args&&... _args_of_derived_state_block_constructor)
+inline std::shared_ptr<SB> HasStateBlocks::emplaceStateBlock(const char& _sb_type, ProblemPtr _problem, Args&&... _args_of_derived_state_block_constructor)
 {
     assert(state_block_map_.count(_sb_type) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead.");
     std::shared_ptr<SB> sb = std::make_shared<SB>(std::forward<Args>(_args_of_derived_state_block_constructor)...);
@@ -149,7 +140,7 @@ inline std::shared_ptr<SB> HasStateBlocks::emplaceStateBlock(const std::string&
 }
 
 template<typename ... Args>
-inline StateBlockPtr HasStateBlocks::emplaceStateBlock(const std::string& _sb_type, ProblemPtr _problem, Args&&... _args_of_base_state_block_constructor)
+inline StateBlockPtr HasStateBlocks::emplaceStateBlock(const char& _sb_type, ProblemPtr _problem, Args&&... _args_of_base_state_block_constructor)
 {
     assert(state_block_map_.count(_sb_type) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead.");
     auto sb = std::make_shared<StateBlock>(std::forward<Args>(_args_of_base_state_block_constructor)...);
@@ -159,7 +150,7 @@ inline StateBlockPtr HasStateBlocks::emplaceStateBlock(const std::string& _sb_ty
     return sb;
 }
 
-inline bool HasStateBlocks::setStateBlock(const std::string _sb_type, const StateBlockPtr& _sb)
+inline bool HasStateBlocks::setStateBlock(const char _sb_type, const StateBlockPtr& _sb)
 {
     assert (structure_.find(_sb_type) > 0 && "Cannot set a state block out of the state structure! Use addStateBlock instead.");
     assert ( state_block_map_.count(_sb_type) > 0 && "Cannot set an inexistent state block! Use addStateBlock instead.");
@@ -167,7 +158,7 @@ inline bool HasStateBlocks::setStateBlock(const std::string _sb_type, const Stat
     return true; // success
 }
 
-inline wolf::StateBlockPtr HasStateBlocks::getStateBlock(const std::string& _sb_type) const
+inline wolf::StateBlockPtr HasStateBlocks::getStateBlock(const char& _sb_type) const
 {
     auto it = state_block_map_.find(_sb_type);
     if (it != state_block_map_.end())
@@ -178,12 +169,12 @@ inline wolf::StateBlockPtr HasStateBlocks::getStateBlock(const std::string& _sb_
 
 inline wolf::StateBlockPtr HasStateBlocks::getP() const
 {
-    return getStateBlock("P");
+    return getStateBlock('P');
 }
 
 inline wolf::StateBlockPtr HasStateBlocks::getO() const
 {
-    return getStateBlock("O");
+    return getStateBlock('O');
 }
 
 inline void HasStateBlocks::fix()
@@ -238,9 +229,8 @@ inline void HasStateBlocks::setState(const Eigen::VectorXd& _state, const StateS
     assert(_state.size() == size && "In FrameBase::setState wrong state size");
 
     unsigned int index = 0;
-    for (const char ckey : structure)
+    for (const char key : structure)
     {
-        const auto& key = string(1,ckey);
         const auto& sb  = getStateBlock(key);
         assert (sb && "Stateblock key not in the structure");
 
@@ -257,9 +247,8 @@ inline void HasStateBlocks::setState (const Eigen::VectorXd& _state,
 {
     SizeEigen index = 0;
     auto size_it = _sizes.begin();
-    for (const auto& ckey : _structure)
+    for (const auto& key : _structure)
     {
-        const auto& key = string(1,ckey);
         const auto& sb = getStateBlock(key);
         assert (sb && "Stateblock key not in the structure");
         assert(*size_it == sb->getSize() && "State block size mismatch");
@@ -274,9 +263,8 @@ inline void HasStateBlocks::setState (const Eigen::VectorXd& _state,
 inline void HasStateBlocks::setState(const StateStructure& _structure, const std::list<VectorXd>& _vectors, const bool _notify)
 {
     auto vec_it = _vectors.begin();
-    for (const auto ckey : _structure)
+    for (const auto key : _structure)
     {
-        const auto key = string(1,ckey);
         const auto& sb = getStateBlock(key);
         assert (sb && "Stateblock key not in the structure");
         assert(vec_it->size() == sb->getSize() && "State block size mismatch");
@@ -317,10 +305,8 @@ inline VectorComposite HasStateBlocks::getState(const StateStructure& _structure
 
     VectorComposite state;
 
-    for (const auto ckey : structure)
+    for (const auto key : structure)
     {
-        const auto& key = string(1,ckey); // ckey is char
-
         auto state_it = state_block_map_.find(key);
 
         if (state_it != state_block_map_.end())
@@ -328,10 +314,6 @@ inline VectorComposite HasStateBlocks::getState(const StateStructure& _structure
             state.emplace(key, state_it->second->getState());
     }
 
-//    for (auto& pair_key_sb : state_block_map_)
-//    {
-//        state.emplace(pair_key_sb.first, pair_key_sb.second->getState());
-//    }
     return state;
 }
 
@@ -352,11 +334,11 @@ inline unsigned int HasStateBlocks::getSize(const StateStructure& _structure) co
     return size;
 }
 
-inline std::unordered_map<std::string, StateBlockPtr>::const_iterator HasStateBlocks::find(const StateBlockPtr& _sb) const
+inline std::unordered_map<char, StateBlockPtr>::const_iterator HasStateBlocks::find(const StateBlockPtr& _sb) const
 {
     const auto& it = std::find_if(state_block_map_.begin(),
                                   state_block_map_.end(),
-                                  [_sb](const std::pair<std::string, StateBlockPtr>& pair)
+                                  [_sb](const std::pair<char, StateBlockPtr>& pair)
                                   {
                                     return pair.second == _sb;
                                   }
@@ -372,7 +354,7 @@ inline bool HasStateBlocks::hasStateBlock(const StateBlockPtr &_sb) const
     return it != state_block_map_.end();
 }
 
-inline bool HasStateBlocks::stateBlockKey(const StateBlockPtr &_sb, std::string& _key) const
+inline bool HasStateBlocks::stateBlockKey(const StateBlockPtr &_sb, char& _key) const
 {
     const auto& it = this->find(_sb);
 
@@ -385,7 +367,7 @@ inline bool HasStateBlocks::stateBlockKey(const StateBlockPtr &_sb, std::string&
     }
     else
     {
-        _key = "";
+        _key = '0'; // '0' = not found
         return false;
     }
 }
diff --git a/include/core/state_block/state_composite.h b/include/core/state_block/state_composite.h
index 0d3cafcc80c602a4de1bf59b9ce7c2ddd9123c9a..c7a125ac0d96b1d1b0799ab9e983bccf76bf36db 100644
--- a/include/core/state_block/state_composite.h
+++ b/include/core/state_block/state_composite.h
@@ -22,16 +22,16 @@ using std::string;
 using namespace Eigen;
 
 typedef std::string StateStructure;
-typedef std::unordered_map < std::string, StateBlockPtr   > StateBlockMap;
+typedef std::unordered_map < char, StateBlockPtr   > StateBlockMap;
 typedef StateBlockMap::const_iterator StateBlockMapCIter;
 
-class VectorComposite : public std::unordered_map < std::string, Eigen::VectorXd >
+class VectorComposite : public std::unordered_map < char, Eigen::VectorXd >
 {
     public:
         VectorComposite() {};
         VectorComposite(const StateStructure& _s);
         VectorComposite(const StateStructure& _s, const std::list<int>& _sizes);
-        VectorComposite(const VectorComposite & v) : unordered_map<string, VectorXd>(v){};
+        VectorComposite(const VectorComposite & v) : unordered_map<char, VectorXd>(v){};
         /**
          * \brief Construct from Eigen::VectorXd and structure
          *
@@ -76,17 +76,17 @@ class VectorComposite : public std::unordered_map < std::string, Eigen::VectorXd
 };
 
 
-class MatrixComposite : public std::unordered_map < std::string, std::unordered_map < std::string, Eigen::MatrixXd > >
+class MatrixComposite : public std::unordered_map < char, std::unordered_map < char, Eigen::MatrixXd > >
 {
 
     private:
-        std::unordered_map < string, unsigned int> size_rows_, size_cols_;
+        std::unordered_map < char, unsigned int> size_rows_, size_cols_;
         unsigned int    rows() const;
         unsigned int    cols() const;
         void            sizeAndIndices(const StateStructure & _struct_rows,
                                        const StateStructure & _struct_cols,
-                                       std::unordered_map < string, unsigned int>& _indices_rows,
-                                       std::unordered_map < string, unsigned int>& _indices_cols,
+                                       std::unordered_map < char, unsigned int>& _indices_rows,
+                                       std::unordered_map < char, unsigned int>& _indices_cols,
                                        unsigned int& _rows,
                                        unsigned int& _cols) const;
 
@@ -129,25 +129,25 @@ class MatrixComposite : public std::unordered_map < std::string, std::unordered_
         static MatrixComposite identity(const StateStructure& _structure,
                                         const std::list<int>& _sizes);
 
-        unsigned int    count(const std::string &_row,
-                              const std::string &_col) const;
+        unsigned int    count(const char &_row,
+                              const char &_col) const;
 
-        bool            emplace(const std::string &_row,
-                                const std::string &_col,
+        bool            emplace(const char &_row,
+                                const char &_col,
                                 const Eigen::MatrixXd &_mat_blk);
 
         // throw error if queried block is not present
-        bool            at(const std::string &_row,
-                           const std::string &_col,
+        bool            at(const char &_row,
+                           const char &_col,
                            Eigen::MatrixXd &_mat_blk) const;
-        const MatrixXd& at(const std::string &_row,
-                           const std::string &_col) const;
-        MatrixXd&       at(const std::string &_row,
-                           const std::string &_col);
+        const MatrixXd& at(const char &_row,
+                           const char &_col) const;
+        MatrixXd&       at(const char &_row,
+                           const char &_col);
 
         // make some shadowed API available
-        using std::unordered_map < std::string, std::unordered_map < std::string, Eigen::MatrixXd > >::at;
-        using std::unordered_map < std::string, std::unordered_map < std::string, Eigen::MatrixXd > >::count;
+        using std::unordered_map < char, std::unordered_map < char, Eigen::MatrixXd > >::at;
+        using std::unordered_map < char, std::unordered_map < char, Eigen::MatrixXd > >::count;
 
 
         MatrixXd        matrix(const StateStructure & _struct_rows,
@@ -266,25 +266,25 @@ class StateBlockComposite
 
         const StateBlockMap&    getStateBlockMap() const;
 
-        StateBlockPtr           add(const std::string& _sb_type, const StateBlockPtr& _sb);
+        StateBlockPtr           add(const char& _sb_type, const StateBlockPtr& _sb);
 
         // Emplace derived state blocks (angle, quaternion, etc).
         template<typename SB, typename ... Args>
-        std::shared_ptr<SB>     emplace(const std::string& _sb_type, Args&&... _args_of_derived_state_block_constructor);
+        std::shared_ptr<SB>     emplace(const char& _sb_type, Args&&... _args_of_derived_state_block_constructor);
 
         // Emplace base state blocks.
         template<typename ... Args>
-        inline StateBlockPtr    emplace(const std::string& _sb_type, Args&&... _args_of_base_state_block_constructor);
+        inline StateBlockPtr    emplace(const char& _sb_type, Args&&... _args_of_base_state_block_constructor);
 
-        unsigned int            remove(const std::string& _sb_type);
-        bool                    has(const std::string& _sb_type) const { return state_block_map_.count(_sb_type) > 0; }
+        unsigned int            remove(const char& _sb_type);
+        bool                    has(const char& _sb_type) const { return state_block_map_.count(_sb_type) > 0; }
         bool                    has(const StateBlockPtr& _sb) const;
-        StateBlockPtr           at(const std::string& _sb_type) const;
-        void                    set(const std::string& _sb_type, const StateBlockPtr& _sb);
-        void                    set(const std::string& _sb_type, const VectorXd& _vec);
+        StateBlockPtr           at(const char& _sb_type) const;
+        void                    set(const char& _sb_type, const StateBlockPtr& _sb);
+        void                    set(const char& _sb_type, const VectorXd& _vec);
         void                    setVectors(const StateStructure& _structure, const std::list<VectorXd> &_vectors);
-        bool                    key(const StateBlockPtr& _sb, std::string& _key) const;
-        std::string             key(const StateBlockPtr& _sb) const;
+        bool                    key(const StateBlockPtr& _sb, char& _key) const;
+        char             key(const StateBlockPtr& _sb) const;
         StateBlockMapCIter      find(const StateBlockPtr& _sb) const;
 
         // identity and zero (they are the same with different names)
@@ -321,7 +321,7 @@ class StateBlockComposite
 
 //////////// IMPLEMENTATION ////////////
 
-inline unsigned int MatrixComposite::count(const std::string &_row, const std::string &_col) const
+inline unsigned int MatrixComposite::count(const char &_row, const char &_col) const
 {
     const auto& rit = this->find(_row);
 
@@ -334,7 +334,7 @@ inline unsigned int MatrixComposite::count(const std::string &_row, const std::s
 
 
 template<typename SB, typename ... Args>
-inline std::shared_ptr<SB> wolf::StateBlockComposite::emplace(const std::string &_sb_type,
+inline std::shared_ptr<SB> wolf::StateBlockComposite::emplace(const char &_sb_type,
                                                               Args &&... _args_of_derived_state_block_constructor)
 {
     assert(state_block_map_.count(_sb_type) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead.");
@@ -346,7 +346,7 @@ inline std::shared_ptr<SB> wolf::StateBlockComposite::emplace(const std::string
 }
 
 template<typename ... Args>
-inline StateBlockPtr wolf::StateBlockComposite::emplace(const std::string &_sb_type,
+inline StateBlockPtr wolf::StateBlockComposite::emplace(const char &_sb_type,
                                                         Args &&... _args_of_base_state_block_constructor)
 {
     assert(state_block_map_.count(_sb_type) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead.");
@@ -358,7 +358,7 @@ inline StateBlockPtr wolf::StateBlockComposite::emplace(const std::string &_sb_t
 }
 
 inline MatrixComposite::MatrixComposite (const MatrixComposite& m)
-        : unordered_map<string, unordered_map<string, MatrixXd> >(m), size_rows_(m.size_rows_), size_cols_(m.size_cols_)
+        : unordered_map<char, unordered_map<char, MatrixXd> >(m), size_rows_(m.size_rows_), size_cols_(m.size_cols_)
 {
 }
 
diff --git a/include/core/utils/converter.h b/include/core/utils/converter.h
index 8c8e34935d728a505537643fa4c51bf001787bb6..76e710f75d4aeb31589e27aa819304ec0b8d9cec 100644
--- a/include/core/utils/converter.h
+++ b/include/core/utils/converter.h
@@ -94,6 +94,16 @@ struct converter<bool>{
     }
 };
 template<>
+struct converter<char>{
+    static char convert(std::string val){
+        //Here we should check that val.length() == 1 and get val[0] into a char variable
+        if(val.length() == 1) return val.at(0);
+        else throw std::runtime_error("Invalid converstion to char. String too long. String provided: " + val);
+        throw std::runtime_error("Invalid char conversion. String provided: " + val);
+    }
+};
+    //// TYPES ----> ToSTRING
+template<>
 struct converter<std::string>{
     static std::string convert(std::string val){
         return val;
@@ -109,6 +119,9 @@ struct converter<std::string>{
     static std::string convert(double val){
         return std::to_string(val);
     }
+    static std::string convert(char val){
+        return std::to_string(val);
+    }
     template<typename A>
     static std::string convert(utils::list<A> val){
         std::string result = "";
@@ -171,17 +184,17 @@ struct converter<std::string>{
     static std::string convert(VectorComposite val){
         //TODO
         // throw std::runtime_error("TODO! We still haven't got around to implement convert for VectorComposite to String :(");
-        auto helper = std::unordered_map<StateStructure, Eigen::VectorXd>();
+        auto helper = std::unordered_map<char, Eigen::VectorXd>();
         for(const auto& pair: val)
-            helper.insert(std::pair<StateStructure, Eigen::VectorXd>(pair.first, pair.second));
+            helper.insert(std::pair<char, Eigen::VectorXd>(pair.first, pair.second));
         return converter<std::string>::convert(helper);
     }
     static std::string convert(MatrixComposite val){
         //TODO
         // throw std::runtime_error("TODO! We still haven't got around to implement convert for MatrixComposite to String :(");
-        auto helper = std::unordered_map< StateStructure, std::unordered_map<StateStructure, Eigen::MatrixXd>>();
+        auto helper = std::unordered_map< char, std::unordered_map<char, Eigen::MatrixXd>>();
         for(const auto& pair: val)
-            helper.insert(std::pair<StateStructure, std::unordered_map<StateStructure, Eigen::MatrixXd>>(pair.first, pair.second));
+            helper.insert(std::pair<char, std::unordered_map<char, Eigen::MatrixXd>>(pair.first, pair.second));
         return converter<std::string>::convert(helper);
     }
 };
@@ -305,13 +318,13 @@ struct converter<std::unordered_map<A,B>>{
 template<>
 struct converter<VectorComposite>{
     static VectorComposite convert(std::string val){
-       auto unordered_map = converter<std::unordered_map<StateStructure, Eigen::VectorXd>>::convert(val);
+       auto unordered_map = converter<std::unordered_map<char, Eigen::VectorXd>>::convert(val);
     //    VectorComposite result = VectorComposite(unordered_map);
     //    return result;
        auto helper = VectorComposite();
        for(auto const& it: unordered_map)
        {
-           helper.insert(std::pair<StateStructure, Eigen::VectorXd>(it.first, it.second));
+           helper.insert(std::pair<char, Eigen::VectorXd>(it.first, it.second));
        }
         return helper;
     }
@@ -319,14 +332,14 @@ struct converter<VectorComposite>{
 template<>
 struct converter<MatrixComposite>{
     static MatrixComposite convert(std::string val){
-       auto unordered_map = converter<std::unordered_map<StateStructure,
-                                                         std::unordered_map<StateStructure, Eigen::MatrixXd>>>::convert(val);
+       auto unordered_map = converter<std::unordered_map<char,
+                                                         std::unordered_map<char, Eigen::MatrixXd>>>::convert(val);
     //    VectorComposite result = VectorComposite(unordered_map);
     //    return result;
        auto helper = MatrixComposite();
        for(auto const& it: unordered_map)
        {
-           helper.insert(std::pair<StateStructure, std::unordered_map<StateStructure, Eigen::MatrixXd>>(it.first, it.second));
+           helper.insert(std::pair<char, std::unordered_map<char, Eigen::MatrixXd>>(it.first, it.second));
        }
         return helper;
     }
diff --git a/src/capture/capture_base.cpp b/src/capture/capture_base.cpp
index 880af68b86919dbab088f7f702f07ac41feefb98..7e7f627e525cf5a0a080dafdb3ce1372a85c671b 100644
--- a/src/capture/capture_base.cpp
+++ b/src/capture/capture_base.cpp
@@ -23,26 +23,26 @@ CaptureBase::CaptureBase(const std::string& _type,
     assert(time_stamp_.ok() && "Creating a capture with an invalid timestamp!");
     if (_sensor_ptr)
     {
-        if (_sensor_ptr->getP() != nullptr and _sensor_ptr->isStateBlockDynamic("P"))
+        if (_sensor_ptr->getP() != nullptr and _sensor_ptr->isStateBlockDynamic('P'))
         {
             assert(_p_ptr && "Pointer to dynamic position params is null!");
-            addStateBlock("P", _p_ptr, nullptr);
+            addStateBlock('P', _p_ptr, nullptr);
         }
         else
             assert(_p_ptr == nullptr && "Provided dynamic sensor position but the sensor position is static or doesn't exist");
 
-        if (_sensor_ptr->getO() != nullptr and _sensor_ptr->isStateBlockDynamic("O"))
+        if (_sensor_ptr->getO() != nullptr and _sensor_ptr->isStateBlockDynamic('O'))
         {
             assert(_o_ptr && "Pointer to dynamic orientation params is null!");
-            addStateBlock("O", _o_ptr, nullptr);
+            addStateBlock('O', _o_ptr, nullptr);
         }
         else
             assert(_o_ptr == nullptr && "Provided dynamic sensor orientation but the sensor orientation is static or doesn't exist");
 
-        if (_sensor_ptr->getIntrinsic() != nullptr and _sensor_ptr->isStateBlockDynamic("I"))
+        if (_sensor_ptr->getIntrinsic() != nullptr and _sensor_ptr->isStateBlockDynamic('I'))
         {
             assert(_intr_ptr && "Pointer to dynamic intrinsic params is null!");
-            addStateBlock("I", _intr_ptr, nullptr);
+            addStateBlock('I', _intr_ptr, nullptr);
         }
         else
             assert(_intr_ptr == nullptr && "Provided dynamic sensor intrinsics but the sensor intrinsics are static or don't exist");
@@ -157,7 +157,7 @@ const StateStructure& CaptureBase::getStructure() const
         return HasStateBlocks::getStructure();
 }
 
-StateBlockPtr CaptureBase::getStateBlock(const std::string& _key) const
+StateBlockPtr CaptureBase::getStateBlock(const char& _key) const
 {
     if (getSensor() and getSensor()->hasStateBlock(_key))
     {
diff --git a/src/frame/frame_base.cpp b/src/frame/frame_base.cpp
index 4147b98ca8dcd67d76fb732f11cbbee85cea9df8..a8f56d1a20302504ae0acad701a9fce7c86e91d9 100644
--- a/src/frame/frame_base.cpp
+++ b/src/frame/frame_base.cpp
@@ -28,7 +28,7 @@ FrameBase::FrameBase(const FrameType & _tp,
         const auto& key  = pair_key_vec.first;
         const auto& vec  = pair_key_vec.second;
 
-        StateBlockPtr sb = FactoryStateBlock::create(key, vec, false); // false = non fixed
+        StateBlockPtr sb = FactoryStateBlock::create(string(1,key), vec, false); // false = non fixed
 
         addStateBlock(key, sb);
     }
@@ -49,12 +49,11 @@ FrameBase::FrameBase(const FrameType & _tp,
     assert(_frame_structure.size() == _vectors.size() && "Structure size does not match number of provided vectors!");
 
     auto vec_it = _vectors.begin();
-    for (const auto ckey : _frame_structure)
+    for (const auto key : _frame_structure)
     {
-        const auto& key = string(1,ckey);
         const auto& vec = *vec_it;
 
-        StateBlockPtr sb = FactoryStateBlock::create(key, vec, false); // false = non fixed
+        StateBlockPtr sb = FactoryStateBlock::create(string(1,key), vec, false); // false = non fixed
 
         addStateBlock(key, sb);
 
@@ -77,15 +76,15 @@ FrameBase::FrameBase(const FrameType & _tp,
 {
     if (_p_ptr)
     {
-        addStateBlock("P", _p_ptr);
+        addStateBlock('P', _p_ptr);
     }
     if (_o_ptr)
     {
-        addStateBlock("O", _o_ptr);
+        addStateBlock('O', _o_ptr);
     }
     if (_v_ptr)
     {
-        addStateBlock("V", _v_ptr);
+        addStateBlock('V', _v_ptr);
     }
 }
 
diff --git a/src/landmark/landmark_base.cpp b/src/landmark/landmark_base.cpp
index 0fdd18775a2ea50c2ca6ee51ffaeaff9db7c85fa..af2d01b68e40c33b129f799d93fe3d133459671b 100644
--- a/src/landmark/landmark_base.cpp
+++ b/src/landmark/landmark_base.cpp
@@ -21,11 +21,11 @@ LandmarkBase::LandmarkBase(const std::string& _type, StateBlockPtr _p_ptr, State
 {
     if (_p_ptr)
     {
-        addStateBlock("P", _p_ptr, nullptr);
+        addStateBlock('P', _p_ptr, nullptr);
     }
     if (_o_ptr)
     {
-        addStateBlock("O", _o_ptr, nullptr);
+        addStateBlock('O', _o_ptr, nullptr);
     }
 
 }
diff --git a/src/problem/problem.cpp b/src/problem/problem.cpp
index b75b2eb0a6f961db7b9ceb217296f5cbf0f03530..9e84a825a30ffacf0ffb2e66fbb3670697901cd9 100644
--- a/src/problem/problem.cpp
+++ b/src/problem/problem.cpp
@@ -334,11 +334,9 @@ FrameBasePtr Problem::emplaceFrame(FrameType _frame_key_type, //
     VectorComposite state;
     SizeEigen index = 0;
     SizeEigen size = 0;
-    for (const auto& ckey : _frame_structure)
+    for (const auto& key : _frame_structure)
     {
-        const auto& key = string(1,ckey); // ckey is char
-
-        if (key == "O")
+        if (key == 'O')
         {
             if (_dim == 2) size = 1;
             else size = 4;
@@ -471,9 +469,8 @@ VectorComposite Problem::getState(const StateStructure& _structure) const
     else if (prior_options_ and prior_options_->mode != "nothing")
         state_last = prior_options_->state;
 
-    for (const auto& ckey : structure)
+    for (const auto& key : structure)
     {
-        const auto& key = string(1,ckey);
         if (state.count(key) == 0)
         {
             auto state_last_it = state_last.find(key);
@@ -482,7 +479,7 @@ VectorComposite Problem::getState(const StateStructure& _structure) const
                 state.emplace(key, state_last_it->second);
 
             else
-                state.emplace(key, stateZero(key).at(key));
+                state.emplace(key, stateZero(string(1,key)).at(key));
         }
     }
 
@@ -521,9 +518,8 @@ VectorComposite Problem::getState (const TimeStamp& _ts, const StateStructure& _
     else if (prior_options_ and prior_options_->mode != "nothing")
         state_last = prior_options_->state;
 
-    for (const auto& ckey : structure)
+    for (const auto& key : structure)
     {
-        const auto& key = string(1,ckey);
         if (state.count(key) == 0)
         {
             auto state_last_it = state_last.find(key);
@@ -532,7 +528,7 @@ VectorComposite Problem::getState (const TimeStamp& _ts, const StateStructure& _
                 state.emplace(key, state_last_it->second);
 
             else
-                state.emplace(key, stateZero(key).at(key));
+                state.emplace(key, stateZero(string(1,key)).at(key));
         }
     }
 
@@ -551,9 +547,9 @@ const StateStructure& Problem::getFrameStructure() const
 
 void Problem::appendToStructure(const StateStructure& _structure)
 {
-    for (const auto& ckey : _structure)
-        if (frame_structure_.find(ckey) == std::string::npos) // now key not found in problem structure -> append!
-            frame_structure_ += ckey;
+    for (const auto& key : _structure)
+        if (frame_structure_.find(key) == std::string::npos) // now key not found in problem structure -> append!
+            frame_structure_ += key;
 }
 
 void Problem::setTreeManager(TreeManagerBasePtr _gm)
@@ -589,11 +585,10 @@ VectorComposite Problem::stateZero ( const StateStructure& _structure ) const
     StateStructure structure = (_structure == "" ? getFrameStructure() : _structure);
 
     VectorComposite state;
-    for (const auto& ckey : structure)
+    for (const auto& key : structure)
     {
-        const auto& key = string(1,ckey);
         VectorXd vec;
-        if (key == "O")
+        if (key == 'O')
         {
             if (dim_ == 2) vec = VectorXd::Zero(1);
             else if (dim_ == 3) vec = Quaterniond::Identity().coeffs();
@@ -1067,7 +1062,7 @@ FrameBasePtr Problem::applyPriorOptions(const TimeStamp& _ts)
                 assert(sb->getLocalSize() == covar_blk.rows() && "prior_options cov. wrong size");
 
                 // feature
-                auto prior_fea = FeatureBase::emplace<FeatureBase>(prior_cap, "Prior " + key, state_blk, covar_blk);
+                auto prior_fea = FeatureBase::emplace<FeatureBase>(prior_cap, "Prior " + string(1,key), state_blk, covar_blk);
 
                 // factor
                 if (sb->hasLocalParametrization())
diff --git a/src/processor/processor_odom_2d.cpp b/src/processor/processor_odom_2d.cpp
index 284090e238f3c75327424cb76f3946e277e23bdf..2da7c330b59ffce0c7eceb11515e4f992a9eb3d9 100644
--- a/src/processor/processor_odom_2d.cpp
+++ b/src/processor/processor_odom_2d.cpp
@@ -93,8 +93,8 @@ void ProcessorOdom2d::statePlusDelta(const VectorComposite& _x,
     assert(_delta.size() == delta_size_ && "Wrong _x_plus_delta vector size");
 
     // This is just a frame composition in 2d
-    _x_plus_delta["P"] = _x.at("P")  + Eigen::Rotation2Dd(_x.at("O")(0)).matrix() * _delta.head<2>();
-    _x_plus_delta["O"] = Vector1d(pi2pi(_x.at("O")(0) + _delta(2)));
+    _x_plus_delta['P'] = _x.at('P')  + Eigen::Rotation2Dd(_x.at('O')(0)).matrix() * _delta.head<2>();
+    _x_plus_delta['O'] = Vector1d(pi2pi(_x.at('O')(0) + _delta(2)));
 }
 
 bool ProcessorOdom2d::voteForKeyFrame() const
diff --git a/src/processor/processor_odom_3d.cpp b/src/processor/processor_odom_3d.cpp
index 5b01e98b3ad8fbbe6f31bedc4f25b1a9cfe76747..d6f7e77a9562e8762f9ab99c9ac525b8fe592c54 100644
--- a/src/processor/processor_odom_3d.cpp
+++ b/src/processor/processor_odom_3d.cpp
@@ -147,13 +147,13 @@ void ProcessorOdom3d::statePlusDelta(const VectorComposite& _x,
 {   
     assert(_delta.size() == delta_size_ && "Wrong _delta vector size");
 
-    Eigen::Map<const Eigen::Vector3d>       p      (_x.at("P").data()     );
-    Eigen::Map<const Eigen::Quaterniond>    q      (_x.at("O").data()     );
+    Eigen::Map<const Eigen::Vector3d>       p      (_x.at('P').data()     );
+    Eigen::Map<const Eigen::Quaterniond>    q      (_x.at('O').data()     );
     Eigen::Map<const Eigen::Vector3d>       dp     (_delta.data()         );
     Eigen::Map<const Eigen::Quaterniond>    dq     (_delta.data()     + 3 );
 
-    _x_plus_delta["P"] = p + q * dp;
-    _x_plus_delta["O"] =    (q * dq).coeffs();
+    _x_plus_delta['P'] = p + q * dp;
+    _x_plus_delta['O'] =    (q * dq).coeffs();
 }
 
 
diff --git a/src/sensor/sensor_base.cpp b/src/sensor/sensor_base.cpp
index 7d15881a6aea62a9a01591ac5bede38d1b3c6342..b32f02f3dca55c584567b8d84e220a2f2604114b 100644
--- a/src/sensor/sensor_base.cpp
+++ b/src/sensor/sensor_base.cpp
@@ -33,13 +33,13 @@ SensorBase::SensorBase(const std::string& _type,
     noise_cov_.setZero();
 
     if (_p_ptr)
-        addStateBlock("P", _p_ptr, _p_dyn);
+        addStateBlock('P', _p_ptr, _p_dyn);
 
     if (_o_ptr)
-        addStateBlock("O", _o_ptr, _o_dyn);
+        addStateBlock('O', _o_ptr, _o_dyn);
 
     if (_intr_ptr)
-        addStateBlock("I", _intr_ptr, _intr_dyn);
+        addStateBlock('I', _intr_ptr, _intr_dyn);
 
     updateCalibSize();
 }
@@ -63,13 +63,13 @@ SensorBase::SensorBase(const std::string& _type,
     setNoiseStd(_noise_std);
 
     if (_p_ptr)
-        addStateBlock("P", _p_ptr, _p_dyn);
+        addStateBlock('P', _p_ptr, _p_dyn);
 
     if (_o_ptr)
-        addStateBlock("O", _o_ptr, _o_dyn);
+        addStateBlock('O', _o_ptr, _o_dyn);
 
     if (_intr_ptr)
-        addStateBlock("I", _intr_ptr, _intr_dyn);
+        addStateBlock('I', _intr_ptr, _intr_dyn);
 
     updateCalibSize();
 }
@@ -82,9 +82,8 @@ SensorBase::~SensorBase()
 
 void SensorBase::removeStateBlocks()
 {
-    for (const auto& _key : getStructure())
+    for (const auto& key : getStructure())
     {
-        auto key = std::string(1,_key);
         auto sbp = getStateBlock(key);
         if (sbp != nullptr)
         {
@@ -121,10 +120,9 @@ void SensorBase::unfixExtrinsics()
 
 void SensorBase::fixIntrinsics()
 {
-    for (const auto& _key : getStructure())
+    for (const auto& key : getStructure())
     {
-        auto key = std::string(1,_key);
-        if (key != "P" and key != "O") // exclude extrinsics
+        if (key != 'P' and key != 'O') // exclude extrinsics
         {
             auto sbp = getStateBlockDynamic(key);
             if (sbp != nullptr)
@@ -136,10 +134,9 @@ void SensorBase::fixIntrinsics()
 
 void SensorBase::unfixIntrinsics()
 {
-    for (const auto& _key : getStructure())
+    for (const auto& key : getStructure())
     {
-        auto key = std::string(1,_key);
-        if (key != "P" and key != "O") // exclude extrinsics
+        if (key != 'P' and key != 'O') // exclude extrinsics
         {
             auto sbp = getStateBlockDynamic(key);
             if (sbp != nullptr)
@@ -149,7 +146,7 @@ void SensorBase::unfixIntrinsics()
     updateCalibSize();
 }
 
-void SensorBase::addPriorParameter(const std::string& _key, const Eigen::VectorXd& _x, const Eigen::MatrixXd& _cov, unsigned int _start_idx, int _size)
+void SensorBase::addPriorParameter(const char& _key, const Eigen::VectorXd& _x, const Eigen::MatrixXd& _cov, unsigned int _start_idx, int _size)
 {
     assert(!isStateBlockInCapture(_key) && "SensorBase::addPriorParameter only allowed for static parameters");
 
@@ -287,32 +284,32 @@ CaptureBasePtr SensorBase::lastCapture(const TimeStamp& _ts) const
 
 StateBlockPtr SensorBase::getP(const TimeStamp _ts) const
 {
-    return getStateBlockDynamic("P", _ts);
+    return getStateBlockDynamic('P', _ts);
 }
 
 StateBlockPtr SensorBase::getO(const TimeStamp _ts) const
 {
-    return getStateBlockDynamic("O", _ts);
+    return getStateBlockDynamic('O', _ts);
 }
 
 StateBlockPtr SensorBase::getIntrinsic(const TimeStamp _ts) const
 {
-    return getStateBlockDynamic("I", _ts);
+    return getStateBlockDynamic('I', _ts);
 }
 
 StateBlockPtr SensorBase::getP() const
 {
-    return getStateBlockDynamic("P");
+    return getStateBlockDynamic('P');
 }
 
 StateBlockPtr SensorBase::getO() const
 {
-    return getStateBlockDynamic("O");
+    return getStateBlockDynamic('O');
 }
 
 StateBlockPtr SensorBase::getIntrinsic() const
 {
-    return getStateBlockDynamic("I");
+    return getStateBlockDynamic('I');
 }
 
 SizeEigen SensorBase::computeCalibSize() const
@@ -382,7 +379,7 @@ void SensorBase::removeProcessor(ProcessorBasePtr _proc_ptr)
     processor_list_.remove(_proc_ptr);
 }
 
-StateBlockPtr SensorBase::getStateBlockDynamic(const std::string& _key) const
+StateBlockPtr SensorBase::getStateBlockDynamic(const char& _key) const
 {
     CaptureBasePtr cap;
 
@@ -392,7 +389,7 @@ StateBlockPtr SensorBase::getStateBlockDynamic(const std::string& _key) const
     return getStateBlock(_key);
 }
 
-StateBlockPtr SensorBase::getStateBlockDynamic(const std::string& _key, const TimeStamp& _ts) const
+StateBlockPtr SensorBase::getStateBlockDynamic(const char& _key, const TimeStamp& _ts) const
 {
     CaptureBasePtr cap;
 
@@ -402,7 +399,7 @@ StateBlockPtr SensorBase::getStateBlockDynamic(const std::string& _key, const Ti
     return getStateBlock(_key);
 }
 
-bool SensorBase::isStateBlockInCapture(const std::string& _key, CaptureBasePtr& _cap) const
+bool SensorBase::isStateBlockInCapture(const char& _key, CaptureBasePtr& _cap) const
 {
     if (state_block_dynamic_.count(_key) != 0 and isStateBlockDynamic(_key))
     {
@@ -415,7 +412,7 @@ bool SensorBase::isStateBlockInCapture(const std::string& _key, CaptureBasePtr&
         return false;
 }
 
-bool SensorBase::isStateBlockInCapture(const std::string& _key, const TimeStamp& _ts, CaptureBasePtr& _cap) const
+bool SensorBase::isStateBlockInCapture(const char& _key, const TimeStamp& _ts, CaptureBasePtr& _cap) const
 {
     if (isStateBlockDynamic(_key))
     {
@@ -427,14 +424,14 @@ bool SensorBase::isStateBlockInCapture(const std::string& _key, const TimeStamp&
         return false;
 }
 
-bool SensorBase::isStateBlockInCapture(const std::string& _key) const
+bool SensorBase::isStateBlockInCapture(const char& _key) const
 {
     CaptureBasePtr cap;
 
     return isStateBlockInCapture(_key, cap);
 }
 
-bool SensorBase::isStateBlockInCapture(const std::string& _key, const TimeStamp& _ts) const
+bool SensorBase::isStateBlockInCapture(const char& _key, const TimeStamp& _ts) const
 {
     CaptureBasePtr cap;
 
@@ -477,9 +474,8 @@ void SensorBase::printHeader(int _depth, bool _constr_by, bool _metric, bool _st
     if (_metric && _state_blocks)
     {
         _stream << _tabs << "  " << "sb: ";
-        for (auto& _key : getStructure())
+        for (auto& key : getStructure())
         {
-            auto key = std::string(1,_key);
             auto sb = getStateBlockDynamic(key);
             _stream << key << "[" << (isStateBlockDynamic(key) ? "Dyn" : "Sta") << "," << (sb->isFixed() ? "Fix" : "Est") << "] = ( " << sb->getState().transpose() << " ); ";
         }
@@ -488,9 +484,8 @@ void SensorBase::printHeader(int _depth, bool _constr_by, bool _metric, bool _st
     else if (_metric)
     {
         _stream << _tabs << "  " << "( ";
-        for (auto& _key : getStructure())
+        for (auto& key : getStructure())
         {
-            auto key = std::string(1,_key);
             auto sb = getStateBlockDynamic(key);
             _stream << sb->getState().transpose() << " ";
         }
@@ -499,9 +494,8 @@ void SensorBase::printHeader(int _depth, bool _constr_by, bool _metric, bool _st
     else if (_state_blocks)
     {
         _stream << _tabs << "  " << "sb: ";
-        for (auto& _key : getStructure())
+        for (auto& key : getStructure())
         {
-            auto key = std::string(1,_key);
             auto sb = getStateBlockDynamic(key);
             _stream << key << "[" << (isStateBlockDynamic(key) ? "Dyn" : "Sta") << "," << (sb->isFixed() ? "Fix" : "Est") << "]; ";
         }
diff --git a/src/state_block/has_state_blocks.cpp b/src/state_block/has_state_blocks.cpp
index 83cf44b26bdfcad7e415633ef6d8fe783564a75c..5855fda6b33931665fb9240b715a7436ac1ed034 100644
--- a/src/state_block/has_state_blocks.cpp
+++ b/src/state_block/has_state_blocks.cpp
@@ -4,7 +4,7 @@
 namespace wolf
 {
 
-StateBlockPtr HasStateBlocks::addStateBlock(const std::string& _sb_type, const StateBlockPtr& _sb, ProblemPtr _problem)
+StateBlockPtr HasStateBlocks::addStateBlock(const char& _sb_type, const StateBlockPtr& _sb, ProblemPtr _problem)
 {
     assert(state_block_map_.count(_sb_type) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead.");
     state_block_map_.emplace(_sb_type, _sb);
diff --git a/src/state_block/state_composite.cpp b/src/state_block/state_composite.cpp
index 90b7f47c6b5ffa2a28374b5673827d325224430f..0f4efab6f1f093d8f1425d0855a453c6370f1c93 100644
--- a/src/state_block/state_composite.cpp
+++ b/src/state_block/state_composite.cpp
@@ -11,9 +11,8 @@ namespace wolf{
 VectorComposite::VectorComposite(const StateStructure& _structure, const std::list<int>& _sizes)
 {
     auto size_it = _sizes.begin();
-    for ( const auto& ckey : _structure)
+    for ( const auto& key : _structure)
     {
-        const auto& key     = string(1,ckey);
         const auto& size    = *size_it;
 
         this->emplace(key, VectorXd(size).setZero());
@@ -26,9 +25,8 @@ VectorComposite::VectorComposite(const VectorXd& _v, const StateStructure& _stru
 {
     int index = 0;
     auto size_it = _sizes.begin();
-    for ( const auto& ckey : _structure)
+    for ( const auto& key : _structure)
     {
-        const auto& key     = string(1,ckey);
         const auto& size    = *size_it;
 
         (*this)[key]        = _v.segment(index,size);
@@ -40,9 +38,8 @@ VectorComposite::VectorComposite(const VectorXd& _v, const StateStructure& _stru
 
 VectorComposite::VectorComposite (const StateStructure& _s)
 {
-    for (const auto& ckey : _s)
+    for (const auto& key : _s)
     {
-        const auto& key = string(1,ckey); // ckey is char
         this->emplace(key,VectorXd(0));
     }
 }
@@ -53,9 +50,8 @@ VectorComposite::VectorComposite (const StateStructure& _structure, const std::l
 
     auto vector_it = _vectors.begin();
 
-    for (const auto& ckey : _structure)
+    for (const auto& key : _structure)
     {
-        string key(1,ckey);
         this->emplace(key, *vector_it);
         vector_it++;
     }
@@ -67,9 +63,8 @@ Eigen::VectorXd VectorComposite::vector(const StateStructure &_structure) const
     // traverse once with unordered_map access
     std::vector<const VectorXd*> vp;
     unsigned int size = 0;
-    for (const auto& ckey : _structure)
+    for (const auto& key : _structure)
     {
-        std::string key(1,ckey); // ckey is char
         vp.push_back(&(this->at(key)));
         size +=  vp.back()->size();
     }
@@ -125,9 +120,8 @@ void VectorComposite::set (const VectorXd& _v, const StateStructure& _structure,
 {
     int index = 0;
     auto size_it = _sizes.begin();
-    for ( const auto& ckey : _structure)
+    for ( const auto& key : _structure)
     {
-        const auto& key     = string(1,ckey); // ckey is char
         const auto& size    = *size_it;
 
         (*this)[key]        = _v.segment(index,size);
@@ -156,7 +150,7 @@ wolf::VectorComposite operator -(const wolf::VectorComposite &_x)
 
 ////// MATRIX COMPOSITE //////////
 
-bool MatrixComposite::emplace(const std::string &_row, const std::string &_col, const Eigen::MatrixXd &_mat_blk)
+bool MatrixComposite::emplace(const char &_row, const char &_col, const Eigen::MatrixXd &_mat_blk)
 {
     // check rows
     if (size_rows_.count(_row) == 0)
@@ -175,7 +169,7 @@ bool MatrixComposite::emplace(const std::string &_row, const std::string &_col,
     return true;
 }
 
-bool MatrixComposite::at(const std::string &_row, const std::string &_col, Eigen::MatrixXd &_mat_blk) const
+bool MatrixComposite::at(const char &_row, const char &_col, Eigen::MatrixXd &_mat_blk) const
 {
     const auto &row_it = this->find(_row);
     if(row_it != this->end())
@@ -190,7 +184,7 @@ bool MatrixComposite::at(const std::string &_row, const std::string &_col, Eigen
     return true;
 }
 
-Eigen::MatrixXd& MatrixComposite::at(const std::string &_row, const std::string &_col)
+Eigen::MatrixXd& MatrixComposite::at(const char &_row, const char &_col)
 {
     const auto &row_it = this->find(_row);
     assert(row_it != this->end() && "Requested matrix block does not exist in matrix composite.");
@@ -201,7 +195,7 @@ Eigen::MatrixXd& MatrixComposite::at(const std::string &_row, const std::string
     return col_it->second;
 }
 
-const Eigen::MatrixXd& MatrixComposite::at(const std::string &_row, const std::string &_col) const
+const Eigen::MatrixXd& MatrixComposite::at(const char &_row, const char &_col) const
 {
     const auto &row_it = this->find(_row);
     assert(row_it != this->end() && "Requested matrix block does not exist in matrix composite.");
@@ -287,7 +281,7 @@ MatrixComposite MatrixComposite::operator - (void) const
 
     for (const auto& pair_rkey_row : *this)
     {
-        m.unordered_map<string,unordered_map<string, MatrixXd>>::emplace(pair_rkey_row.first, unordered_map<string, MatrixXd>());
+        m.unordered_map<char,unordered_map<char, MatrixXd>>::emplace(pair_rkey_row.first, unordered_map<char, MatrixXd>());
         for (const auto& pair_ckey_blk : pair_rkey_row.second)
         {
             m[pair_rkey_row.first].emplace(pair_ckey_blk.first, - pair_ckey_blk.second);
@@ -449,8 +443,8 @@ MatrixComposite operator * (double scalar_left, const MatrixComposite& M)
 MatrixXd MatrixComposite::matrix(const StateStructure &_struct_rows, const StateStructure &_struct_cols) const
 {
 
-    std::unordered_map < string, unsigned int> indices_rows;
-    std::unordered_map < string, unsigned int> indices_cols;
+    std::unordered_map < char, unsigned int> indices_rows;
+    std::unordered_map < char, unsigned int> indices_cols;
     unsigned int rows, cols;
 
     sizeAndIndices(_struct_rows, _struct_cols, indices_rows, indices_cols, rows, cols);
@@ -498,22 +492,20 @@ unsigned int MatrixComposite::cols() const
 
 void MatrixComposite::sizeAndIndices(const StateStructure &_struct_rows,
                                      const StateStructure &_struct_cols,
-                                     std::unordered_map<string, unsigned int> &_indices_rows,
-                                     std::unordered_map<string, unsigned int> &_indices_cols,
+                                     std::unordered_map<char, unsigned int> &_indices_rows,
+                                     std::unordered_map<char, unsigned int> &_indices_cols,
                                      unsigned int &_rows,
                                      unsigned int &_cols) const
 {
     _rows = 0;
     _cols = 0;
-    for (const auto& crow : _struct_rows)
+    for (const auto& row : _struct_rows)
     {
-        string row = string(1,crow); // crow is char
         _indices_rows[row]  = _rows;
         _rows              += size_rows_.at(row);
     }
-    for (const auto& ccol : _struct_cols)
+    for (const auto& col : _struct_cols)
     {
-        string col = string(1,ccol); // ccol is char
         _indices_cols[col]  = _cols;
         _cols              += size_cols_.at(col);
     }
@@ -521,16 +513,9 @@ void MatrixComposite::sizeAndIndices(const StateStructure &_struct_rows,
 
 MatrixComposite::MatrixComposite (const StateStructure& _row_structure, const StateStructure& _col_structure)
 {
-    for (const auto& rkey_char : _row_structure)
-    {
-        string rkey(1,rkey_char); // key was char
-        for (const auto& ckey_char : _col_structure)
-        {
-            string ckey(1,ckey_char); // key was char
-
+    for (const auto& rkey : _row_structure)
+        for (const auto& ckey : _col_structure)
             this->emplace(rkey, ckey, MatrixXd(0,0));
-        }
-    }
 }
 
 MatrixComposite::MatrixComposite (const StateStructure& _row_structure,
@@ -542,15 +527,11 @@ MatrixComposite::MatrixComposite (const StateStructure& _row_structure,
     assert (_col_structure.size() == _col_sizes.size() && "Column structure and sizes have different number of elements!");
 
     auto rsize_it = _row_sizes.begin();
-    for (const auto& rkey_char : _row_structure)
+    for (const auto& rkey : _row_structure)
     {
-        string rkey(1,rkey_char); // key was char
-
         auto csize_it = _col_sizes.begin();
-        for (const auto& ckey_char : _col_structure)
+        for (const auto& ckey : _col_structure)
         {
-            string ckey(1,ckey_char); // key was char
-
             this->emplace(rkey, ckey, MatrixXd(*rsize_it, *csize_it)); // caution: blocks non initialized.
 
             csize_it ++;
@@ -570,21 +551,17 @@ MatrixComposite::MatrixComposite (const MatrixXd& _m,
 
     SizeEigen rindex = 0, cindex;
     auto rsize_it = _row_sizes.begin();
-    for (const auto& rkey_char : _row_structure)
+    for (const auto& rkey : _row_structure)
     {
         assert(_m.rows() >= rindex + *rsize_it && "Provided matrix has insufficient number of rows");
 
-        string rkey(1,rkey_char); // key was char
-
         cindex = 0;
         auto csize_it = _col_sizes.begin();
 
-        for (const auto& ckey_char : _col_structure)
+        for (const auto& ckey : _col_structure)
         {
             assert(_m.cols() >= cindex + *csize_it && "Provided matrix has insufficient number of columns");
 
-            string ckey(1,ckey_char); // key was char
-
             this->emplace(rkey, ckey, _m.block(rindex, cindex, *rsize_it, *csize_it));
 
             cindex += *csize_it;
@@ -609,15 +586,11 @@ MatrixComposite MatrixComposite::zero (const StateStructure& _row_structure, con
     assert (_col_structure.size() == _col_sizes.size() && "Column structure and sizes have different number of elements!");
 
     auto rsize_it = _row_sizes.begin();
-    for (const auto& rkey_char : _row_structure)
+    for (const auto& rkey : _row_structure)
     {
-        string rkey(1,rkey_char); // key was char
-
         auto csize_it = _col_sizes.begin();
-        for (const auto& ckey_char : _col_structure)
+        for (const auto& ckey : _col_structure)
         {
-            string ckey(1,ckey_char); // key was char
-
             m.emplace(rkey, ckey, MatrixXd::Zero(*rsize_it, *csize_it));
 
             csize_it ++;
@@ -639,7 +612,7 @@ MatrixComposite MatrixComposite::identity (const StateStructure& _structure, con
     while (rkey_it != _structure.end())
     {
 
-        const auto& rkey = string(1,*rkey_it);
+        const auto& rkey = *rkey_it;
         const auto rsize = *rsize_it;
 
         m.emplace(rkey, rkey, MatrixXd::Identity(rsize,rsize)); // diagonal block
@@ -652,7 +625,7 @@ MatrixComposite MatrixComposite::identity (const StateStructure& _structure, con
 
         while (ckey_it != _structure.end())
         {
-            const auto& ckey = string(1,*ckey_it);
+            const auto& ckey  = *ckey_it;
             const auto& csize = *csize_it;
 
             m.emplace(rkey, ckey, MatrixXd::Zero(rsize, csize)); // above-diagonal block
@@ -763,7 +736,7 @@ bool StateBlockComposite::isFixed() const
     return fixed;
 }
 
-unsigned int StateBlockComposite::remove(const std::string &_sb_type)
+unsigned int StateBlockComposite::remove(const char &_sb_type)
 {
     return state_block_map_.erase(_sb_type);
 }
@@ -778,7 +751,7 @@ bool StateBlockComposite::has(const StateBlockPtr &_sb) const
     return found;
 }
 
-StateBlockPtr StateBlockComposite::at(const std::string &_sb_type) const
+StateBlockPtr StateBlockComposite::at(const char &_sb_type) const
 {
     auto it = state_block_map_.find(_sb_type);
     if (it != state_block_map_.end())
@@ -787,7 +760,7 @@ StateBlockPtr StateBlockComposite::at(const std::string &_sb_type) const
         return nullptr;
 }
 
-void StateBlockComposite::set(const std::string& _sb_type, const StateBlockPtr &_sb)
+void StateBlockComposite::set(const char& _sb_type, const StateBlockPtr &_sb)
 {
     auto it = state_block_map_.find(_sb_type);
     assert ( it != state_block_map_.end() && "Cannot set an inexistent state block! Use addStateBlock instead.");
@@ -795,7 +768,7 @@ void StateBlockComposite::set(const std::string& _sb_type, const StateBlockPtr &
     it->second = _sb;
 }
 
-void StateBlockComposite::set(const std::string& _key, const VectorXd &_vec)
+void StateBlockComposite::set(const char& _key, const VectorXd &_vec)
 {
     auto it = state_block_map_.find(_key);
     assert ( it != state_block_map_.end() && "Cannot set an inexistent state block! Use addStateBlock instead.");
@@ -810,15 +783,14 @@ void StateBlockComposite::setVectors(const StateStructure& _structure, const std
     assert(_structure.size() == _vectors.size() && "Sizes of structure and vector list do not match");
 
     auto vec_it = _vectors.begin();
-    for (const auto ckey : _structure)
+    for (const auto key : _structure)
     {
-        string key(1,ckey);
         set (key, *vec_it);
         vec_it++;
     }
 }
 
-bool StateBlockComposite::key(const StateBlockPtr &_sb, std::string &_key) const
+bool StateBlockComposite::key(const StateBlockPtr &_sb, char &_key) const
 {
     const auto& it = this->find(_sb);
 
@@ -831,12 +803,12 @@ bool StateBlockComposite::key(const StateBlockPtr &_sb, std::string &_key) const
     }
     else
     {
-        _key = "";
+        _key ='0';
         return false;
     }
 }
 
-std::string StateBlockComposite::key(const StateBlockPtr& _sb) const
+char StateBlockComposite::key(const StateBlockPtr& _sb) const
 {
     const auto& it = this->find(_sb);
 
@@ -845,7 +817,7 @@ std::string StateBlockComposite::key(const StateBlockPtr& _sb) const
     if (found)
         return it->first;
     else
-        return "";
+        return '0';
 }
 
 
@@ -853,7 +825,7 @@ StateBlockMapCIter StateBlockComposite::find(const StateBlockPtr &_sb) const
 {
     const auto& it = std::find_if(state_block_map_.begin(),
                                   state_block_map_.end(),
-                                  [_sb](const std::pair<std::string, StateBlockPtr>& pair)
+                                  [_sb](const std::pair<char, StateBlockPtr>& pair)
                                   {
                                       return pair.second == _sb;
                                   }
@@ -862,7 +834,7 @@ StateBlockMapCIter StateBlockComposite::find(const StateBlockPtr &_sb) const
     return it;
 }
 
-StateBlockPtr StateBlockComposite::add(const std::string &_sb_type, const StateBlockPtr &_sb)
+StateBlockPtr StateBlockComposite::add(const char &_sb_type, const StateBlockPtr &_sb)
 {
     assert(state_block_map_.count(_sb_type) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead.");
 
@@ -955,9 +927,8 @@ SizeEigen StateBlockComposite::stateSize() const
 SizeEigen StateBlockComposite::stateSize(const StateStructure &_structure) const
 {
     SizeEigen size = 0;
-    for (const auto& ckey : _structure)
+    for (const auto& key : _structure)
     {
-        string key(1,ckey);
         size += state_block_map_.at(key)->getSize();
     }
     return size;
@@ -968,9 +939,8 @@ VectorXd StateBlockComposite::stateVector(const StateStructure &_structure) cons
     VectorXd x(stateSize(_structure));
     SizeEigen index = 0;
     SizeEigen size;
-    for (const auto& ckey : _structure)
+    for (const auto& key : _structure)
     {
-        string key(1,ckey);
         const auto& sb          = state_block_map_.at(key);
         size                    = sb->getSize();
         x.segment(index,size)   = sb->getState();
@@ -984,9 +954,8 @@ void StateBlockComposite::stateVector(const StateStructure &_structure, VectorXd
     _vector.resize(stateSize(_structure));
     SizeEigen index = 0;
     SizeEigen size;
-    for (const auto& ckey : _structure)
+    for (const auto& key : _structure)
     {
-        string key(1,ckey);
         const auto& sb              = state_block_map_.at(key);
         size                        = sb->getSize();
         _vector.segment(index,size) = sb->getState();
diff --git a/test/gtest_SE3.cpp b/test/gtest_SE3.cpp
index 27acfea3069b92076bd30e4abd4ac28d787147bf..a99f7a19551f3e450e6b4958ded294db8980c62c 100644
--- a/test/gtest_SE3.cpp
+++ b/test/gtest_SE3.cpp
@@ -146,15 +146,15 @@ TEST(SE3, composeVectorComposite)
 
     VectorComposite x1, x2, xc("PO", {3,4});
 
-    x1.emplace("P", p1);
-    x1.emplace("O", q1.coeffs());
-    x2.emplace("P", p2);
-    x2.emplace("O", q2.coeffs());
+    x1.emplace('P', p1);
+    x1.emplace('O', q1.coeffs());
+    x2.emplace('P', p2);
+    x2.emplace('O', q2.coeffs());
 
     compose(x1, x2, xc);
 
-    ASSERT_MATRIX_APPROX(xc.at("P"), pc, 1e-8);
-    ASSERT_MATRIX_APPROX(xc.at("O"), qc.coeffs(), 1e-8);
+    ASSERT_MATRIX_APPROX(xc.at('P'), pc, 1e-8);
+    ASSERT_MATRIX_APPROX(xc.at('O'), qc.coeffs(), 1e-8);
 }
 
 TEST(SE3, composeVectorComposite_Jacobians)
@@ -174,26 +174,26 @@ TEST(SE3, composeVectorComposite_Jacobians)
     VectorComposite x1, x2, xc("PO", {3,4});
     MatrixComposite J_xc_x1, J_xc_x2;
 
-    x1.emplace("P", p1);
-    x1.emplace("O", q1.coeffs());
-    x2.emplace("P", p2);
-    x2.emplace("O", q2.coeffs());
+    x1.emplace('P', p1);
+    x1.emplace('O', q1.coeffs());
+    x2.emplace('P', p2);
+    x2.emplace('O', q2.coeffs());
 
     // we'll do xc = x1 * x2 and obtain Jacobians
     compose(x1, x2, xc, J_xc_x1, J_xc_x2);
 
-    ASSERT_MATRIX_APPROX(xc.at("P"), pc, 1e-8);
-    ASSERT_MATRIX_APPROX(xc.at("O"), qc.coeffs(), 1e-8);
+    ASSERT_MATRIX_APPROX(xc.at('P'), pc, 1e-8);
+    ASSERT_MATRIX_APPROX(xc.at('O'), qc.coeffs(), 1e-8);
 
-    ASSERT_MATRIX_APPROX(J_xc_x1.at("P", "P"), Matrix3d::Identity()   , 1e-8);
-    ASSERT_MATRIX_APPROX(J_xc_x1.at("P", "O"), - R1 * skew(p2)        , 1e-8);
-    ASSERT_MATRIX_APPROX(J_xc_x1.at("O", "P"), Matrix3d::Zero()       , 1e-8);
-    ASSERT_MATRIX_APPROX(J_xc_x1.at("O", "O"), R2.transpose()         , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x1.at('P', 'P'), Matrix3d::Identity()   , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x1.at('P', 'O'), - R1 * skew(p2)        , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x1.at('O', 'P'), Matrix3d::Zero()       , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x1.at('O', 'O'), R2.transpose()         , 1e-8);
 
-    ASSERT_MATRIX_APPROX(J_xc_x2.at("P", "P"), R1                     , 1e-8);
-    ASSERT_MATRIX_APPROX(J_xc_x2.at("P", "O"), Matrix3d::Zero()       , 1e-8);
-    ASSERT_MATRIX_APPROX(J_xc_x2.at("O", "P"), Matrix3d::Zero()       , 1e-8);
-    ASSERT_MATRIX_APPROX(J_xc_x2.at("O", "O"), Matrix3d::Identity()   , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x2.at('P', 'P'), R1                     , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x2.at('P', 'O'), Matrix3d::Zero()       , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x2.at('O', 'P'), Matrix3d::Zero()       , 1e-8);
+    ASSERT_MATRIX_APPROX(J_xc_x2.at('O', 'O'), Matrix3d::Identity()   , 1e-8);
 }
 
 TEST(SE3, exp_0_Composite)
@@ -205,13 +205,13 @@ TEST(SE3, exp_0_Composite)
 
     VectorComposite tau;
 
-    tau.emplace("P", p);
-    tau.emplace("O", theta);
+    tau.emplace('P', p);
+    tau.emplace('O', theta);
 
     VectorComposite x = SE3::exp(tau);
 
-    ASSERT_MATRIX_APPROX(x.at("P"), Vector3d::Zero(), 1e-8);
-    ASSERT_MATRIX_APPROX(x.at("O"), Quaterniond::Identity().coeffs(), 1e-8);
+    ASSERT_MATRIX_APPROX(x.at('P'), Vector3d::Zero(), 1e-8);
+    ASSERT_MATRIX_APPROX(x.at('O'), Quaterniond::Identity().coeffs(), 1e-8);
 
 }
 
@@ -223,20 +223,20 @@ TEST(SE3, plus_0_Composite)
     Vector4d q; q.setRandom().normalized();
 
     VectorComposite x;
-    x.emplace("P", p);
-    x.emplace("O", q);
+    x.emplace('P', p);
+    x.emplace('O', q);
 
     Vector3d dp; dp.setZero();
     Vector3d dtheta; dtheta.setZero();
 
     VectorComposite tau;
-    tau.emplace("P", dp);
-    tau.emplace("O", dtheta);
+    tau.emplace('P', dp);
+    tau.emplace('O', dtheta);
 
     VectorComposite res = plus(x, tau);
 
-    ASSERT_MATRIX_APPROX(res.at("P"), p, 1e-8);
-    ASSERT_MATRIX_APPROX(res.at("O"), q, 1e-8);
+    ASSERT_MATRIX_APPROX(res.at('P'), p, 1e-8);
+    ASSERT_MATRIX_APPROX(res.at('O'), q, 1e-8);
 }
 
 TEST(SE3, interpolate_I_xyz)
diff --git a/test/gtest_frame_base.cpp b/test/gtest_frame_base.cpp
index abdefc83d7d4a3e1f041f5355b3139c1276775cb..8f73d96ac2560d6366410b48da41e2a3ef3fe00b 100644
--- a/test/gtest_frame_base.cpp
+++ b/test/gtest_frame_base.cpp
@@ -163,7 +163,7 @@ TEST(FrameBase, Constructor_composite)
     ASSERT_TRUE         (F.isKey());
     ASSERT_MATRIX_APPROX(F.getP()->getState(), Vector3d(1,2,3), 1e-15);
     ASSERT_TRUE         (F.getO()->hasLocalParametrization());
-    ASSERT_EQ           (F.getStateBlock("V")->getSize(), 3);
+    ASSERT_EQ           (F.getStateBlock('V')->getSize(), 3);
 }
 
 TEST(FrameBase, Constructor_vectors)
@@ -176,7 +176,7 @@ TEST(FrameBase, Constructor_vectors)
     ASSERT_TRUE         (F.isKey());
     ASSERT_MATRIX_APPROX(F.getP()->getState(), Vector3d(1,2,3), 1e-15);
     ASSERT_TRUE         (F.getO()->hasLocalParametrization());
-    ASSERT_EQ           (F.getStateBlock("V")->getSize(), 3);
+    ASSERT_EQ           (F.getStateBlock('V')->getSize(), 3);
 }
 
 
diff --git a/test/gtest_has_state_blocks.cpp b/test/gtest_has_state_blocks.cpp
index 334aa59be910d88c2994c37dd324bad360b265b8..e17124a2d56687d8fe8de4c8d1144e49285e1f86 100644
--- a/test/gtest_has_state_blocks.cpp
+++ b/test/gtest_has_state_blocks.cpp
@@ -79,7 +79,7 @@ TEST_F(HasStateBlocksTest, Notifications_add_makeKF)
 
     ASSERT_FALSE(problem->getStateBlockNotification(sbv0, n));
 
-    F0->addStateBlock("V", sbv0);
+    F0->addStateBlock('V', sbv0);
 
     ASSERT_FALSE(problem->getStateBlockNotification(sbv0, n));
 
@@ -102,7 +102,7 @@ TEST_F(HasStateBlocksTest, Notifications_makeKF_add)
     F1->link(problem->getTrajectory());
     F1->setKey();
 
-    F1->addStateBlock("P", sbp1);
+    F1->addStateBlock('P', sbp1);
 
     ASSERT_TRUE(problem->getStateBlockNotification(sbp1, n));
     ASSERT_EQ(n, ADD);
@@ -111,7 +111,7 @@ TEST_F(HasStateBlocksTest, Notifications_makeKF_add)
 
     ASSERT_FALSE(problem->getStateBlockNotification(sbv1, n));
 
-    F1->addStateBlock("V", sbv1);
+    F1->addStateBlock('V', sbv1);
 
     ASSERT_TRUE(problem->getStateBlockNotification(sbv1, n));
     ASSERT_EQ(n, ADD);
@@ -131,7 +131,7 @@ TEST_F(HasStateBlocksTest, Add_solve_notify_solve_add)
     ASSERT_FALSE(problem->getStateBlockNotification(sbp0, n));
 
     F0->link(problem->getTrajectory());
-    F0->addStateBlock("V", sbv0);
+    F0->addStateBlock('V', sbv0);
     F0->setKey();
 
     ASSERT_TRUE(problem->getStateBlockNotification(sbv0, n));
@@ -158,7 +158,7 @@ TEST_F(HasStateBlocksTest, Add_solve_notify_solve_add)
 
     // Add again the same SB. This should crash
 
-    ASSERT_DEATH( F0->addStateBlock("V", sbv0) , "" );
+    ASSERT_DEATH( F0->addStateBlock('V', sbv0) , "" );
 
 }
 
@@ -170,48 +170,48 @@ TEST_F(HasStateBlocksTest, hasStateBlock)
 
 TEST_F(HasStateBlocksTest, stateBlockKey)
 {
-    std::string key;
+    char key;
     ASSERT_TRUE(F0->stateBlockKey(sbp0, key));
-    ASSERT_TRUE(key == "P");
+    ASSERT_TRUE(key == 'P');
 
     ASSERT_FALSE(F0->stateBlockKey(sbp1, key));
-    ASSERT_TRUE(key == "");
+    ASSERT_TRUE(key == '0');
 }
 
 TEST_F(HasStateBlocksTest, getState_structure)
 {
-    F0->addStateBlock("V", sbv0); // now KF0 is POV
+    F0->addStateBlock('V', sbv0); // now KF0 is POV
 
     WOLF_DEBUG("Retrieving state from F0 with structure ", F0->getStructure());
 
     auto state0 = F0->getState();
     WOLF_DEBUG("getState()     = ", state0);
     ASSERT_EQ(state0.size(), 3);
-    ASSERT_TRUE(state0.count("P"));
-    ASSERT_TRUE(state0.count("O"));
-    ASSERT_TRUE(state0.count("V"));
+    ASSERT_TRUE(state0.count('P'));
+    ASSERT_TRUE(state0.count('O'));
+    ASSERT_TRUE(state0.count('V'));
 
     state0 = F0->getState("PO");
     WOLF_DEBUG("getState(\"PO\") = ", state0);
     ASSERT_EQ(state0.size(), 2);
-    ASSERT_TRUE(state0.count("P"));
-    ASSERT_TRUE(state0.count("O"));
-    ASSERT_FALSE(state0.count("V"));
+    ASSERT_TRUE(state0.count('P'));
+    ASSERT_TRUE(state0.count('O'));
+    ASSERT_FALSE(state0.count('V'));
 
     state0 = F0->getState("PV");
     WOLF_DEBUG("getState(\"PV\") = ", state0);
     ASSERT_EQ(state0.size(), 2);
-    ASSERT_TRUE(state0.count("P"));
-    ASSERT_FALSE(state0.count("O"));
-    ASSERT_TRUE(state0.count("V"));
+    ASSERT_TRUE(state0.count('P'));
+    ASSERT_FALSE(state0.count('O'));
+    ASSERT_TRUE(state0.count('V'));
 
     state0 = F0->getState("OW"); // W does not exist
     WOLF_DEBUG("getState(\"OW\") = ", state0);
     ASSERT_EQ(state0.size(), 1);
-    ASSERT_FALSE(state0.count("P"));
-    ASSERT_TRUE(state0.count("O"));
-    ASSERT_FALSE(state0.count("V"));
-    ASSERT_FALSE(state0.count("W"));
+    ASSERT_FALSE(state0.count('P'));
+    ASSERT_TRUE(state0.count('O'));
+    ASSERT_FALSE(state0.count('V'));
+    ASSERT_FALSE(state0.count('W'));
 
 
 
diff --git a/test/gtest_param_prior.cpp b/test/gtest_param_prior.cpp
index 5d0d2cbfb209e6acf4396cbf5dad70fddac11285..8faac803c5ffe7e5780557fbc08155e43c3ca587 100644
--- a/test/gtest_param_prior.cpp
+++ b/test/gtest_param_prior.cpp
@@ -72,7 +72,7 @@ TEST(ParameterPrior, prior_p_segment)
 TEST(ParameterPrior, prior_o_segment)
 {
     // constraining segment of quaternion is not allowed
-    ASSERT_DEATH(odom_sensor_ptr_->addPriorParameter("O", prior_extrinsics.segment(1,2),Eigen::Matrix2d::Identity(),1,2),"");
+    ASSERT_DEATH(odom_sensor_ptr_->addPriorParameter('O', prior_extrinsics.segment(1,2),Eigen::Matrix2d::Identity(),1,2),"");
 }
 
 
diff --git a/test/gtest_problem.cpp b/test/gtest_problem.cpp
index 1470052b849465705eb860b34600d8d624dfb61c..210fdbee0df5a8e4b6f3e189a28b4fe6e841b9fd 100644
--- a/test/gtest_problem.cpp
+++ b/test/gtest_problem.cpp
@@ -349,7 +349,7 @@ TEST(Problem, perturb)
     intr->ticks_per_wheel_revolution    = 100;
     Vector3d extr(0,0,0);
     auto sensor = std::static_pointer_cast<SensorDiffDrive>(problem->installSensor("SensorDiffDrive", "sensor diff drive", extr, intr));
-    sensor->setStateBlockDynamic("I", true);
+    sensor->setStateBlockDynamic('I', true);
 
     Vector3d pose; pose << 0,0,0;
 
@@ -439,7 +439,7 @@ TEST(Problem, check)
     intr->ticks_per_wheel_revolution    = 100;
     Vector3d extr(0,0,0);
     auto sensor = std::static_pointer_cast<SensorDiffDrive>(problem->installSensor("SensorDiffDrive", "sensor diff drive", extr, intr));
-    sensor->setStateBlockDynamic("I", true);
+    sensor->setStateBlockDynamic('I', true);
 
     Vector3d pose; pose << 0,0,0;
 
@@ -554,6 +554,9 @@ TEST(Problem, getState)
     WOLF_DEBUG("P () = ", P->getState("P"));
     WOLF_DEBUG("PO() = ", P->getState("PO"));
     WOLF_DEBUG("x () = ", P->getState());
+    ASSERT_EQ(P->getState("P").size(), 1);
+    ASSERT_EQ(P->getState("PO").size(), 2);
+    ASSERT_EQ(P->getState().size(), 2);
 
 }
 
diff --git a/test/gtest_processor_motion.cpp b/test/gtest_processor_motion.cpp
index 85332d277caff7667ac27e76d18be4c1b06ab6a2..527aba1030ecc18a034b888d1ca02d75ad1408aa 100644
--- a/test/gtest_processor_motion.cpp
+++ b/test/gtest_processor_motion.cpp
@@ -120,12 +120,12 @@ TEST_F(ProcessorMotion_test, getState_structure)
         WOLF_DEBUG("t: ", t, "  x: ", problem->getState().vector("PO").transpose());
     }
 
-    ASSERT_TRUE (processor->getState("P").count("P"));
-    ASSERT_FALSE(processor->getState("P").count("O"));
-    ASSERT_FALSE(processor->getState("O").count("P"));
-    ASSERT_TRUE (processor->getState("O").count("O"));
+    ASSERT_TRUE (processor->getState("P").count('P'));
+    ASSERT_FALSE(processor->getState("P").count('O'));
+    ASSERT_FALSE(processor->getState("O").count('P'));
+    ASSERT_TRUE (processor->getState("O").count('O'));
 
-    WOLF_DEBUG("processor->getState(\"V\") = ", processor->getState("V"));
+    WOLF_DEBUG("processor->getState(\"V\") = ", processor->getState('V'));
     ASSERT_EQ   (processor->getState("V").size(), 0);
 }
 
@@ -150,10 +150,10 @@ TEST_F(ProcessorMotion_test, getState_time_structure)
         WOLF_DEBUG("t: ", t, "  x: ", problem->getState().vector("PO").transpose());
     }
 
-    ASSERT_TRUE (processor->getState(7, "P").count("P"));
-    ASSERT_FALSE(processor->getState(7, "P").count("O"));
-    ASSERT_FALSE(processor->getState(7, "O").count("P"));
-    ASSERT_TRUE (processor->getState(7, "O").count("O"));
+    ASSERT_TRUE (processor->getState(7, "P").count('P'));
+    ASSERT_FALSE(processor->getState(7, "P").count('O'));
+    ASSERT_FALSE(processor->getState(7, "O").count('P'));
+    ASSERT_TRUE (processor->getState(7, "O").count('O'));
 
     WOLF_DEBUG("processor->getState(7, \"V\") = ", processor->getState(7, "V"));
     ASSERT_EQ   (processor->getState(7, "V").size(), 0);
diff --git a/test/gtest_state_composite.cpp b/test/gtest_state_composite.cpp
index 56f705aa3b9c3689a076989fcd8e30896d80fe13..f4bcea67bd4e51af793e026f1496f2591fcfe98a 100644
--- a/test/gtest_state_composite.cpp
+++ b/test/gtest_state_composite.cpp
@@ -25,9 +25,9 @@ class StateBlockCompositeInit : public testing::Test
 
         void SetUp() override
         {
-            sbp = states.emplace("P", Vector3d(1,2,3));
-            sbv = states.emplace("V", Vector3d(4,5,6));
-            sbq = states.emplace<StateQuaternion>("Q", Vector4d(.5,.5,.5,.5));
+            sbp = states.emplace('P', Vector3d(1,2,3));
+            sbv = states.emplace('V', Vector3d(4,5,6));
+            sbq = states.emplace<StateQuaternion>('Q', Vector4d(.5,.5,.5,.5));
 
             sbx = std::make_shared<StateBlock>(Vector3d(7,8,9));
         }
@@ -57,8 +57,8 @@ TEST_F(StateBlockCompositeInit, emplace)
 
 TEST_F(StateBlockCompositeInit, has_key)
 {
-    ASSERT_TRUE(states.has("P"));
-    ASSERT_FALSE(states.has("X"));
+    ASSERT_TRUE(states.has('P'));
+    ASSERT_FALSE(states.has('X'));
 }
 
 TEST_F(StateBlockCompositeInit, has_sb)
@@ -69,22 +69,22 @@ TEST_F(StateBlockCompositeInit, has_sb)
 
 TEST_F(StateBlockCompositeInit, at)
 {
-    ASSERT_EQ(states.at("P"), sbp);
+    ASSERT_EQ(states.at('P'), sbp);
 
-    ASSERT_EQ(states.at("X"), nullptr);
+    ASSERT_EQ(states.at('X'), nullptr);
 }
 
 TEST_F(StateBlockCompositeInit, set_sb)
 {
-    states.set("P", sbx);
+    states.set('P', sbx);
 
-    ASSERT_EQ(states.at("P"), sbx);
+    ASSERT_EQ(states.at('P'), sbx);
 
-    states.set("P", sbp);
+    states.set('P', sbp);
 
-    ASSERT_DEATH(states.set("X", sbx), "");
+    ASSERT_DEATH(states.set('X', sbx), "");
 
-    ASSERT_EQ(states.at("X"), nullptr);
+    ASSERT_EQ(states.at('X'), nullptr);
 }
 
 TEST_F(StateBlockCompositeInit, set_vec)
@@ -92,13 +92,13 @@ TEST_F(StateBlockCompositeInit, set_vec)
     Vector3d p(11,22,33);
     Vector3d x(55,66,77);
 
-    states.set("P", p);
+    states.set('P', p);
 
-    ASSERT_MATRIX_APPROX(states.at("P")->getState(), p, 1e-20);
+    ASSERT_MATRIX_APPROX(states.at('P')->getState(), p, 1e-20);
 
-    ASSERT_DEATH(states.set("X", x), "");
+    ASSERT_DEATH(states.set('X', x), "");
 
-    ASSERT_EQ(states.at("X"), nullptr);
+    ASSERT_EQ(states.at('X'), nullptr);
 }
 
 TEST_F(StateBlockCompositeInit, set_vectors)
@@ -109,31 +109,31 @@ TEST_F(StateBlockCompositeInit, set_vectors)
 
     states.setVectors("PQ", {p, q});
 
-    ASSERT_MATRIX_APPROX(states.at("P")->getState(), p, 1e-20);
-    ASSERT_MATRIX_APPROX(states.at("Q")->getState(), q, 1e-20);
+    ASSERT_MATRIX_APPROX(states.at('P')->getState(), p, 1e-20);
+    ASSERT_MATRIX_APPROX(states.at('Q')->getState(), q, 1e-20);
 
     ASSERT_DEATH(states.setVectors("PX", {p,x}), "");
 
-    ASSERT_EQ(states.at("X"), nullptr);
+    ASSERT_EQ(states.at('X'), nullptr);
 }
 
 TEST_F(StateBlockCompositeInit, key_ref)
 {
-    std::string key;
+    char key;
     ASSERT_TRUE(states.key(sbp, key));
-    ASSERT_EQ(key, "P");
+    ASSERT_EQ(key, 'P');
 
     ASSERT_FALSE(states.key(sbx, key));
-    ASSERT_EQ(key, "");
+    ASSERT_EQ(key, '0');
 }
 
 TEST_F(StateBlockCompositeInit, key_return)
 {
     // existing key
-    ASSERT_EQ(states.key(sbp), "P");
+    ASSERT_EQ(states.key(sbp), 'P');
 
-    // non existing key returns empty string
-    ASSERT_EQ(states.key(sbx), "");
+    // non existing key returns zero char
+    ASSERT_EQ(states.key(sbx), '0');
 }
 
 TEST_F(StateBlockCompositeInit, find)
@@ -147,81 +147,81 @@ TEST_F(StateBlockCompositeInit, find)
 
 TEST_F(StateBlockCompositeInit, add)
 {
-    states.add("X", sbx);
+    states.add('X', sbx);
 
-    ASSERT_EQ(states.at("X"), sbx);
+    ASSERT_EQ(states.at('X'), sbx);
 }
 
 TEST_F(StateBlockCompositeInit, remove)
 {
     // remove existing block
-    states.remove("V");
+    states.remove('V');
     ASSERT_EQ(states.getStateBlockMap().size(), 2);
 
     // remove non existing block -- no effect
-    states.remove("X");
+    states.remove('X');
     ASSERT_EQ(states.getStateBlockMap().size(), 2);
 }
 
 TEST_F(StateBlockCompositeInit, perturb)
 {
-    ASSERT_TRUE(states.at("P")->getState().isApprox(sbp->getState(), 1e-3));
-    ASSERT_TRUE(states.at("V")->getState().isApprox(sbv->getState(), 1e-3));
-    ASSERT_TRUE(states.at("Q")->getState().isApprox(sbq->getState(), 1e-3));
+    ASSERT_TRUE(states.at('P')->getState().isApprox(sbp->getState(), 1e-3));
+    ASSERT_TRUE(states.at('V')->getState().isApprox(sbv->getState(), 1e-3));
+    ASSERT_TRUE(states.at('Q')->getState().isApprox(sbq->getState(), 1e-3));
 
     states.perturb(0.1);
 
     // values have moved wrt original
-    ASSERT_FALSE(states.at("P")->getState().isApprox(Vector3d(1,2,3), 1e-3));
-    ASSERT_FALSE(states.at("V")->getState().isApprox(Vector3d(4,5,6), 1e-3));
-    ASSERT_FALSE(states.at("Q")->getState().isApprox(Vector4d(.5,.5,.5,.5), 1e-3));
+    ASSERT_FALSE(states.at('P')->getState().isApprox(Vector3d(1,2,3), 1e-3));
+    ASSERT_FALSE(states.at('V')->getState().isApprox(Vector3d(4,5,6), 1e-3));
+    ASSERT_FALSE(states.at('Q')->getState().isApprox(Vector4d(.5,.5,.5,.5), 1e-3));
 }
 
 TEST_F(StateBlockCompositeInit, setIdentity)
 {
-    ASSERT_TRUE(states.at("P")->getState().isApprox(sbp->getState(), 1e-3));
-    ASSERT_TRUE(states.at("V")->getState().isApprox(sbv->getState(), 1e-3));
-    ASSERT_TRUE(states.at("Q")->getState().isApprox(sbq->getState(), 1e-3));
+    ASSERT_TRUE(states.at('P')->getState().isApprox(sbp->getState(), 1e-3));
+    ASSERT_TRUE(states.at('V')->getState().isApprox(sbv->getState(), 1e-3));
+    ASSERT_TRUE(states.at('Q')->getState().isApprox(sbq->getState(), 1e-3));
 
     states.setIdentity();
 
     // values have moved wrt original
-    ASSERT_TRUE(states.at("P")->getState().isApprox(Vector3d(0,0,0), 1e-10));
-    ASSERT_TRUE(states.at("V")->getState().isApprox(Vector3d(0,0,0), 1e-10));
-    ASSERT_TRUE(states.at("Q")->getState().isApprox(Vector4d(0,0,0,1), 1e-10));
+    ASSERT_TRUE(states.at('P')->getState().isApprox(Vector3d(0,0,0), 1e-10));
+    ASSERT_TRUE(states.at('V')->getState().isApprox(Vector3d(0,0,0), 1e-10));
+    ASSERT_TRUE(states.at('Q')->getState().isApprox(Vector4d(0,0,0,1), 1e-10));
 }
 
 TEST_F(StateBlockCompositeInit, identity)
 {
     VectorComposite v = states.identity();
 
-    ASSERT_TRUE(v.at("P").isApprox(Vector3d(0,0,0), 1e-10));
-    ASSERT_TRUE(v.at("V").isApprox(Vector3d(0,0,0), 1e-10));
-    ASSERT_TRUE(v.at("Q").isApprox(Vector4d(0,0,0,1), 1e-10));
+    ASSERT_TRUE(v.at('P').isApprox(Vector3d(0,0,0), 1e-10));
+    ASSERT_TRUE(v.at('V').isApprox(Vector3d(0,0,0), 1e-10));
+    ASSERT_TRUE(v.at('Q').isApprox(Vector4d(0,0,0,1), 1e-10));
 }
 
 TEST_F(StateBlockCompositeInit, fix)
 {
     states.fix();
 
-    ASSERT_TRUE(states.at("P")->isFixed());
-    ASSERT_TRUE(states.at("V")->isFixed());
-    ASSERT_TRUE(states.at("Q")->isFixed());
+    ASSERT_TRUE(states.at('P')->isFixed());
+    ASSERT_TRUE(states.at('V')->isFixed());
+    ASSERT_TRUE(states.at('Q')->isFixed());
 }
 
 TEST_F(StateBlockCompositeInit, unfix)
 {
     states.fix();
 
-    ASSERT_TRUE(states.at("P")->isFixed());
-    ASSERT_TRUE(states.at("V")->isFixed());
-    ASSERT_TRUE(states.at("Q")->isFixed());
+    ASSERT_TRUE(states.at('P')->isFixed());
+    ASSERT_TRUE(states.at('V')->isFixed());
+    ASSERT_TRUE(states.at('Q')->isFixed());
 
     states.unfix();
 
-    ASSERT_FALSE(states.at("P")->isFixed());
-    ASSERT_FALSE(states.at("V")->isFixed());
-    ASSERT_FALSE(states.at("Q")->isFixed());
+    ASSERT_FALSE(states.at('P')->isFixed());
+    ASSERT_FALSE(states.at('V')->isFixed());
+    ASSERT_FALSE(states.at('Q')->isFixed());
 }
 
 TEST_F(StateBlockCompositeInit, isFixed)
@@ -230,7 +230,7 @@ TEST_F(StateBlockCompositeInit, isFixed)
 
     ASSERT_TRUE(states.isFixed());
 
-    states.at("P")->unfix();
+    states.at('P')->unfix();
 
     ASSERT_FALSE(states.isFixed());
 }
@@ -245,23 +245,23 @@ TEST(VectorComposite, constructor_empty)
 TEST(VectorComposite, constructor_copy)
 {
     VectorComposite u;
-    u.emplace("a", Vector2d(1,2));
-    u.emplace("b", Vector3d(3,4,5));
+    u.emplace('a', Vector2d(1,2));
+    u.emplace('b', Vector3d(3,4,5));
 
     VectorComposite v(u);
 
     ASSERT_FALSE(v.empty());
 
-    ASSERT_MATRIX_APPROX(u["a"], v["a"], 1e-20);
-    ASSERT_MATRIX_APPROX(u["b"], v["b"], 1e-20);
+    ASSERT_MATRIX_APPROX(u['a'], v['a'], 1e-20);
+    ASSERT_MATRIX_APPROX(u['b'], v['b'], 1e-20);
 }
 
 TEST(VectorComposite, constructor_from_list)
 {
     VectorComposite v(Vector4d(1,2,3,4), "ab", {3,1});
 
-    ASSERT_MATRIX_APPROX(v.at("a"), Vector3d(1,2,3), 1e-20);
-    ASSERT_MATRIX_APPROX(v.at("b"), Vector1d(4), 1e-20);
+    ASSERT_MATRIX_APPROX(v.at('a'), Vector3d(1,2,3), 1e-20);
+    ASSERT_MATRIX_APPROX(v.at('b'), Vector1d(4), 1e-20);
 }
 
 TEST(VectorComposite, set)
@@ -270,8 +270,8 @@ TEST(VectorComposite, set)
 
     v.set(Vector4d(1,2,3,4), "ab", {3,1});
 
-    ASSERT_MATRIX_APPROX(v.at("a"), Vector3d(1,2,3), 1e-20);
-    ASSERT_MATRIX_APPROX(v.at("b"), Vector1d(4), 1e-20);
+    ASSERT_MATRIX_APPROX(v.at('a'), Vector3d(1,2,3), 1e-20);
+    ASSERT_MATRIX_APPROX(v.at('b'), Vector1d(4), 1e-20);
 }
 
 TEST(VectorComposite, operatorStream)
@@ -280,8 +280,8 @@ TEST(VectorComposite, operatorStream)
 
     VectorComposite x;
 
-    x.emplace("P", Vector2d(1,1));
-    x.emplace("O", Vector3d(2,2,2));
+    x.emplace('P', Vector2d(1,1));
+    x.emplace('O', Vector3d(2,2,2));
 
     WOLF_DEBUG("X = ", x);
 }
@@ -290,54 +290,54 @@ TEST(VectorComposite, operatorPlus)
 {
     VectorComposite x, y;
 
-    x.emplace("P", Vector2d(1,1));
-    x.emplace("O", Vector3d(2,2,2));
-    y.emplace("P", Vector2d(1,1));
-    y.emplace("O", Vector3d(2,2,2));
+    x.emplace('P', Vector2d(1,1));
+    x.emplace('O', Vector3d(2,2,2));
+    y.emplace('P', Vector2d(1,1));
+    y.emplace('O', Vector3d(2,2,2));
 
     WOLF_DEBUG("x + y = ", x + y);
 
-    ASSERT_MATRIX_APPROX((x+y).at("P"), Vector2d(2,2), 1e-20);
-    ASSERT_MATRIX_APPROX((x+y).at("O"), Vector3d(4,4,4), 1e-20);
+    ASSERT_MATRIX_APPROX((x+y).at('P'), Vector2d(2,2), 1e-20);
+    ASSERT_MATRIX_APPROX((x+y).at('O'), Vector3d(4,4,4), 1e-20);
 }
 
 TEST(VectorComposite, operatorMinus)
 {
     VectorComposite x, y;
 
-    x.emplace("P", Vector2d(3,3));
-    x.emplace("O", Vector3d(6,6,6));
-    y.emplace("P", Vector2d(1,1));
-    y.emplace("O", Vector3d(2,2,2));
+    x.emplace('P', Vector2d(3,3));
+    x.emplace('O', Vector3d(6,6,6));
+    y.emplace('P', Vector2d(1,1));
+    y.emplace('O', Vector3d(2,2,2));
 
     WOLF_DEBUG("x = ", x);
     WOLF_DEBUG("y = ", y);
     WOLF_DEBUG("x - y = ", x - y);
 
-    ASSERT_MATRIX_APPROX((x-y).at("P"), Vector2d(2,2), 1e-20);
-    ASSERT_MATRIX_APPROX((x-y).at("O"), Vector3d(4,4,4), 1e-20);
+    ASSERT_MATRIX_APPROX((x-y).at('P'), Vector2d(2,2), 1e-20);
+    ASSERT_MATRIX_APPROX((x-y).at('O'), Vector3d(4,4,4), 1e-20);
 }
 
 TEST(VectorComposite, unary_Minus)
 {
     VectorComposite x, y;
 
-    x.emplace("P", Vector2d(1,1));
-    x.emplace("O", Vector3d(2,2,2));
+    x.emplace('P', Vector2d(1,1));
+    x.emplace('O', Vector3d(2,2,2));
 
     WOLF_DEBUG("-x = ", -x);
 
-    ASSERT_MATRIX_APPROX((-x).at("P"), Vector2d(-1,-1), 1e-20);
-    ASSERT_MATRIX_APPROX((-x).at("O"), Vector3d(-2,-2,-2), 1e-20);
+    ASSERT_MATRIX_APPROX((-x).at('P'), Vector2d(-1,-1), 1e-20);
+    ASSERT_MATRIX_APPROX((-x).at('O'), Vector3d(-2,-2,-2), 1e-20);
 }
 
 TEST(VectorComposite, stateVector)
 {
     VectorComposite x;
 
-    x.emplace("P", Vector2d(1,1));
-    x.emplace("O", Vector3d(2,2,2));
-    x.emplace("V", Vector4d(3,3,3,3));
+    x.emplace('P', Vector2d(1,1));
+    x.emplace('O', Vector3d(2,2,2));
+    x.emplace('V', Vector4d(3,3,3,3));
 
     VectorXd y(5); y<<1,1,2,2,2;
     ASSERT_MATRIX_APPROX(x.vector("PO"), y, 1e-20);
@@ -365,7 +365,7 @@ TEST(MatrixComposite, Constructor_structure)
     MatrixComposite M("PO", "POV");
 
     ASSERT_EQ(M.size() , 2);
-    ASSERT_EQ(M.at("P").size() , 3);
+    ASSERT_EQ(M.at('P').size() , 3);
 
     ASSERT_TRUE(M.check());
 }
@@ -375,10 +375,10 @@ TEST(MatrixComposite, Constructor_structure_sizes)
     MatrixComposite M("PO", {3,4}, "POV", {3,4,3});
 
     ASSERT_EQ(M.size() , 2);
-    ASSERT_EQ(M.at("P").size() , 3);
+    ASSERT_EQ(M.at('P').size() , 3);
 
-    ASSERT_EQ(M.at("P","O").rows() , 3);
-    ASSERT_EQ(M.at("P","O").cols() , 4);
+    ASSERT_EQ(M.at('P','O').rows() , 3);
+    ASSERT_EQ(M.at('P','O').cols() , 4);
 
     ASSERT_EQ(M.matrix("PO","POV").rows() , 7);
     ASSERT_EQ(M.matrix("PO","POV").cols() , 10);
@@ -393,16 +393,16 @@ TEST(MatrixComposite, Constructor_eigenMatrix_structure_sizes)
     MatrixComposite M(m, "PO", {3,4}, "POV", {3,4,3});
 
     ASSERT_EQ(M.size() , 2);
-    ASSERT_EQ(M.at("P").size() , 3);
+    ASSERT_EQ(M.at('P').size() , 3);
 
-    ASSERT_EQ(M.at("P","O").rows() , 3);
-    ASSERT_EQ(M.at("P","O").cols() , 4);
+    ASSERT_EQ(M.at('P','O').rows() , 3);
+    ASSERT_EQ(M.at('P','O').cols() , 4);
 
     ASSERT_EQ(M.matrix("PO","POV").rows() , 7);
     ASSERT_EQ(M.matrix("PO","POV").cols() , 10);
 
-    ASSERT_MATRIX_APPROX(M.at("P","O"), m.block(0,3,3,4), 1e-20);
-    ASSERT_MATRIX_APPROX(M.at("O","V"), m.block(3,7,4,3), 1e-20);
+    ASSERT_MATRIX_APPROX(M.at('P','O'), m.block(0,3,3,4), 1e-20);
+    ASSERT_MATRIX_APPROX(M.at('O','V'), m.block(3,7,4,3), 1e-20);
 
     ASSERT_TRUE(M.check());
 }
@@ -462,10 +462,10 @@ TEST(MatrixComposite, emplace_operatorStream)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    ASSERT_TRUE(M.emplace("P", "P", Mpp));
-    ASSERT_TRUE(M.emplace("P", "O", Mpo));
-    ASSERT_TRUE(M.emplace("O", "P", Mop));
-    ASSERT_TRUE(M.emplace("O", "O", Moo));
+    ASSERT_TRUE(M.emplace('P', 'P', Mpp));
+    ASSERT_TRUE(M.emplace('P', 'O', Mpo));
+    ASSERT_TRUE(M.emplace('O', 'P', Mop));
+    ASSERT_TRUE(M.emplace('O', 'O', Moo));
 
     cout << "M = " << M << endl;
 }
@@ -485,14 +485,14 @@ TEST(MatrixComposite, emplace_operatorStream)
 //    Mop.setOnes(); Mop *= 3;
 //    Moo.setOnes(); Moo *= 4;
 //
-//    M.emplace("P", "P", Mpp);
-//    ASSERT_MATRIX_APPROX( M["P"]["P"], Mpp, 1e-20);
+//    M.emplace('P', 'P', Mpp);
+//    ASSERT_MATRIX_APPROX( M['P']['P'], Mpp, 1e-20);
 //
-//    M.emplace("P", "O", Mpo);
-//    ASSERT_MATRIX_APPROX( M["P"]["O"], Mpo, 1e-20);
+//    M.emplace('P', 'O', Mpo);
+//    ASSERT_MATRIX_APPROX( M['P']['O'], Mpo, 1e-20);
 //
 //    // return default empty matrix if block not present
-//    MatrixXd N = M["O"]["O"];
+//    MatrixXd N = M['O']['O'];
 //    ASSERT_EQ(N.rows(), 0);
 //    ASSERT_EQ(N.cols(), 0);
 //}
@@ -512,14 +512,14 @@ TEST(MatrixComposite, emplace_operatorStream)
 //    Mop.setOnes(); Mop *= 3;
 //    Moo.setOnes(); Moo *= 4;
 //
-//    M.emplace("P", "P", Mpp);
-//    ASSERT_MATRIX_APPROX( M("P", "P"), Mpp, 1e-20);
+//    M.emplace('P', 'P', Mpp);
+//    ASSERT_MATRIX_APPROX( M('P', 'P'), Mpp, 1e-20);
 //
-//    M.emplace("P", "O", Mpo);
-//    ASSERT_MATRIX_APPROX( M("P", "O"), Mpo, 1e-20);
+//    M.emplace('P', 'O', Mpo);
+//    ASSERT_MATRIX_APPROX( M('P', 'O'), Mpo, 1e-20);
 //
 //    // return default empty matrix if block not present
-//    MatrixXd N = M("O", "O");
+//    MatrixXd N = M('O', 'O');
 //    ASSERT_EQ(N.rows(), 0);
 //    ASSERT_EQ(N.cols(), 0);
 //}
@@ -539,14 +539,14 @@ TEST(MatrixComposite, operatorAt)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    ASSERT_MATRIX_APPROX( M.at("P", "P"), Mpp, 1e-20);
+    M.emplace('P', 'P', Mpp);
+    ASSERT_MATRIX_APPROX( M.at('P', 'P'), Mpp, 1e-20);
 
-    M.emplace("P", "O", Mpo);
-    ASSERT_MATRIX_APPROX( M.at("P", "O"), Mpo, 1e-20);
+    M.emplace('P', 'O', Mpo);
+    ASSERT_MATRIX_APPROX( M.at('P', 'O'), Mpo, 1e-20);
 
     // error if block not present
-    ASSERT_DEATH(MatrixXd N = M.at("O", "O"), "");
+    ASSERT_DEATH(MatrixXd N = M.at('O', 'O'), "");
 }
 
 TEST(MatrixComposite, productScalar)
@@ -563,10 +563,10 @@ TEST(MatrixComposite, productScalar)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    M.emplace("P", "O", Mpo);
-    M.emplace("O", "P", Mop);
-    M.emplace("O", "O", Moo);
+    M.emplace('P', 'P', Mpp);
+    M.emplace('P', 'O', Mpo);
+    M.emplace('O', 'P', Mop);
+    M.emplace('O', 'O', Moo);
     WOLF_DEBUG("M = " , M);
 
 
@@ -589,8 +589,8 @@ TEST(MatrixComposite, productVector)
     osize = 3;
 
     VectorComposite x;
-    x.emplace("P", Vector2d(1,1));
-    x.emplace("O", Vector3d(2,2,2));
+    x.emplace('P', Vector2d(1,1));
+    x.emplace('O', Vector3d(2,2,2));
 
     cout << "x= " << x << endl;
 
@@ -604,10 +604,10 @@ TEST(MatrixComposite, productVector)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    M.emplace("P", "O", Mpo);
-    M.emplace("O", "P", Mop);
-    M.emplace("O", "O", Moo);
+    M.emplace('P', 'P', Mpp);
+    M.emplace('P', 'O', Mpo);
+    M.emplace('O', 'P', Mop);
+    M.emplace('O', 'O', Moo);
     WOLF_DEBUG("M = " , M);
 
     VectorComposite y;
@@ -628,15 +628,15 @@ TEST(MatrixComposite, productVector)
     Vector2d yp(14,14);
     Vector3d yo(30,30,30);
 
-    ASSERT_MATRIX_APPROX(y.at("P"), yp, 1e-20);
-    ASSERT_MATRIX_APPROX(y.at("O"), yo, 1e-20);
+    ASSERT_MATRIX_APPROX(y.at('P'), yp, 1e-20);
+    ASSERT_MATRIX_APPROX(y.at('O'), yo, 1e-20);
 
     // throw if x has extra blocks
-    // x.emplace("V", Vector2d(3,3));
+    // x.emplace('V', Vector2d(3,3));
     // ASSERT_DEATH(y = M * x , ""); // M * x --> does not die if x has extra blocks wrt M
 
     // throw if x has missing blocks
-    // x.erase("O");
+    // x.erase('O');
     // cout << "x = " << x << endl;
     // ASSERT_DEATH(y = M * x , ""); // M * x --> exception if x has missing blocks wrt M, not caught by ASSERT_DEATH
 
@@ -657,10 +657,10 @@ TEST(MatrixComposite, product)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    M.emplace("P", "O", Mpo);
-    M.emplace("O", "P", Mop);
-    M.emplace("O", "O", Moo);
+    M.emplace('P', 'P', Mpp);
+    M.emplace('P', 'O', Mpo);
+    M.emplace('O', 'P', Mop);
+    M.emplace('O', 'O', Moo);
     WOLF_DEBUG("M = " , M);
 
     MatrixXd Noo(osize,osize), Nov(osize, vsize), Npo(psize,osize), Npv(psize,vsize);
@@ -669,10 +669,10 @@ TEST(MatrixComposite, product)
     Npo.setOnes(); Npo *= 3;
     Npv.setOnes(); Npv *= 4;
 
-    N.emplace("O", "O", Noo);
-    N.emplace("O", "V", Nov);
-    N.emplace("P", "O", Npo);
-    N.emplace("P", "V", Npv);
+    N.emplace('O', 'O', Noo);
+    N.emplace('O', 'V', Nov);
+    N.emplace('P', 'O', Npo);
+    N.emplace('P', 'V', Npv);
     WOLF_DEBUG("N = " , N);
 
     MatrixComposite MN;
@@ -693,10 +693,10 @@ TEST(MatrixComposite, product)
     MatrixXd MNoo(MatrixXd::Ones(osize,osize) * 22);
     MatrixXd MNov(MatrixXd::Ones(osize,vsize) * 32);
 
-    ASSERT_MATRIX_APPROX(MN.at("P","O"), MNpo, 1e-20);
-    ASSERT_MATRIX_APPROX(MN.at("P","V"), MNpv, 1e-20);
-    ASSERT_MATRIX_APPROX(MN.at("O","O"), MNoo, 1e-20);
-    ASSERT_MATRIX_APPROX(MN.at("O","V"), MNov, 1e-20);
+    ASSERT_MATRIX_APPROX(MN.at('P','O'), MNpo, 1e-20);
+    ASSERT_MATRIX_APPROX(MN.at('P','V'), MNpv, 1e-20);
+    ASSERT_MATRIX_APPROX(MN.at('O','O'), MNoo, 1e-20);
+    ASSERT_MATRIX_APPROX(MN.at('O','V'), MNov, 1e-20);
 
     ASSERT_TRUE(MN.check());
 }
@@ -717,10 +717,10 @@ TEST(MatrixComposite, propagate)
     Qop.setOnes(); Qop *= 2;
     Qoo.setOnes(); Qoo *= 3;
 
-    Q.emplace("P", "P", Qpp);
-    Q.emplace("P", "O", Qpo);
-    Q.emplace("O", "P", Qop);
-    Q.emplace("O", "O", Qoo);
+    Q.emplace('P', 'P', Qpp);
+    Q.emplace('P', 'O', Qpo);
+    Q.emplace('O', 'P', Qop);
+    Q.emplace('O', 'O', Qoo);
     WOLF_DEBUG("Q = " , Q);
 
     MatrixXd Jvp(vsize,psize), Jvo(vsize, osize), Jwp(wsize,psize), Jwo(wsize,osize);
@@ -729,10 +729,10 @@ TEST(MatrixComposite, propagate)
     Jwp.setOnes(); Jwp *= 3;
     Jwo.setOnes(); Jwo *= 4;
 
-    J.emplace("V", "P", Jvp);
-    J.emplace("V", "O", Jvo);
-    J.emplace("W", "P", Jwp);
-    J.emplace("W", "O", Jwo);
+    J.emplace('V', 'P', Jvp);
+    J.emplace('V', 'O', Jvo);
+    J.emplace('W', 'P', Jwp);
+    J.emplace('W', 'O', Jwo);
     WOLF_DEBUG("J = " , J);
 
     MatrixComposite JQJt;
@@ -763,15 +763,15 @@ TEST(MatrixComposite, sum)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    M.emplace("P", "O", Mpo);
-    M.emplace("O", "P", Mop);
-    M.emplace("O", "O", Moo);
+    M.emplace('P', 'P', Mpp);
+    M.emplace('P', 'O', Mpo);
+    M.emplace('O', 'P', Mop);
+    M.emplace('O', 'O', Moo);
     WOLF_DEBUG("M = " , M);
-    N.emplace("P", "P", Mpp);
-    N.emplace("P", "O", Mpo);
-    N.emplace("O", "P", Mop);
-    N.emplace("O", "O", Moo);
+    N.emplace('P', 'P', Mpp);
+    N.emplace('P', 'O', Mpo);
+    N.emplace('O', 'P', Mop);
+    N.emplace('O', 'O', Moo);
     WOLF_DEBUG("N = " , N);
 
     MatrixComposite MpN;
@@ -780,10 +780,10 @@ TEST(MatrixComposite, sum)
 
     WOLF_DEBUG("MpN = M + N = " , MpN);
 
-    ASSERT_MATRIX_APPROX(MpN.at("P","P"), 2 * Mpp, 1e-10);
-    ASSERT_MATRIX_APPROX(MpN.at("P","O"), 2 * Mpo, 1e-10);
-    ASSERT_MATRIX_APPROX(MpN.at("O","P"), 2 * Mop, 1e-10);
-    ASSERT_MATRIX_APPROX(MpN.at("O","O"), 2 * Moo, 1e-10);
+    ASSERT_MATRIX_APPROX(MpN.at('P','P'), 2 * Mpp, 1e-10);
+    ASSERT_MATRIX_APPROX(MpN.at('P','O'), 2 * Mpo, 1e-10);
+    ASSERT_MATRIX_APPROX(MpN.at('O','P'), 2 * Mop, 1e-10);
+    ASSERT_MATRIX_APPROX(MpN.at('O','O'), 2 * Moo, 1e-10);
 
 }
 
@@ -801,15 +801,15 @@ TEST(MatrixComposite, difference)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    M.emplace("P", "O", Mpo);
-    M.emplace("O", "P", Mop);
-    M.emplace("O", "O", Moo);
+    M.emplace('P', 'P', Mpp);
+    M.emplace('P', 'O', Mpo);
+    M.emplace('O', 'P', Mop);
+    M.emplace('O', 'O', Moo);
     WOLF_DEBUG("M = " , M);
-    N.emplace("P", "P", Mpp);
-    N.emplace("P", "O", Mpo);
-    N.emplace("O", "P", Mop);
-    N.emplace("O", "O", Moo);
+    N.emplace('P', 'P', Mpp);
+    N.emplace('P', 'O', Mpo);
+    N.emplace('O', 'P', Mop);
+    N.emplace('O', 'O', Moo);
     WOLF_DEBUG("N = " , N);
 
     MatrixComposite MmN;
@@ -818,10 +818,10 @@ TEST(MatrixComposite, difference)
 
     WOLF_DEBUG("MmN = M - N = " , MmN);
 
-    ASSERT_MATRIX_APPROX(MmN.at("P","P"), Mpp * 0, 1e-10);
-    ASSERT_MATRIX_APPROX(MmN.at("P","O"), Mpo * 0, 1e-10);
-    ASSERT_MATRIX_APPROX(MmN.at("O","P"), Mop * 0, 1e-10);
-    ASSERT_MATRIX_APPROX(MmN.at("O","O"), Moo * 0, 1e-10);
+    ASSERT_MATRIX_APPROX(MmN.at('P','P'), Mpp * 0, 1e-10);
+    ASSERT_MATRIX_APPROX(MmN.at('P','O'), Mpo * 0, 1e-10);
+    ASSERT_MATRIX_APPROX(MmN.at('O','P'), Mop * 0, 1e-10);
+    ASSERT_MATRIX_APPROX(MmN.at('O','O'), Moo * 0, 1e-10);
 
 }
 
@@ -839,10 +839,10 @@ TEST(MatrixComposite, unary_minus)
     Mop.setOnes(); Mop *= 3;
     Moo.setOnes(); Moo *= 4;
 
-    M.emplace("P", "P", Mpp);
-    M.emplace("P", "O", Mpo);
-    M.emplace("O", "P", Mop);
-    M.emplace("O", "O", Moo);
+    M.emplace('P', 'P', Mpp);
+    M.emplace('P', 'O', Mpo);
+    M.emplace('O', 'P', Mop);
+    M.emplace('O', 'O', Moo);
     WOLF_DEBUG("M = " , M);
 
     MatrixComposite m;
@@ -851,10 +851,10 @@ TEST(MatrixComposite, unary_minus)
 
     WOLF_DEBUG("m = - M = " , m);
 
-    ASSERT_MATRIX_APPROX(m.at("P","P"), - M.at("P","P"), 1e-10);
-    ASSERT_MATRIX_APPROX(m.at("P","O"), - M.at("P","O"), 1e-10);
-    ASSERT_MATRIX_APPROX(m.at("O","P"), - M.at("O","P"), 1e-10);
-    ASSERT_MATRIX_APPROX(m.at("O","O"), - M.at("O","O"), 1e-10);
+    ASSERT_MATRIX_APPROX(m.at('P','P'), - M.at('P','P'), 1e-10);
+    ASSERT_MATRIX_APPROX(m.at('P','O'), - M.at('P','O'), 1e-10);
+    ASSERT_MATRIX_APPROX(m.at('O','P'), - M.at('O','P'), 1e-10);
+    ASSERT_MATRIX_APPROX(m.at('O','O'), - M.at('O','O'), 1e-10);
 }
 
 int main(int argc, char **argv)