diff --git a/hello_wolf/factor_range_bearing.h b/hello_wolf/factor_range_bearing.h
index ffe896f75932fb269068ad1210ad37350e62ce30..0ca3ec0a4f31a403424f928b38cc98015ea728d7 100644
--- a/hello_wolf/factor_range_bearing.h
+++ b/hello_wolf/factor_range_bearing.h
@@ -48,6 +48,11 @@ class FactorRangeBearing : public FactorAutodiff<FactorRangeBearing, 2, 2, 1, 2,
             //
         }
 
+        virtual std::string getTopology() const override
+        {
+            return "LMK";
+        }
+
         template<typename T>
         bool operator ()(const T* const _p_w_r, // robot position
                          const T* const _o_w_r, // robot orientation
diff --git a/include/core/factor/factor_autodiff_distance_3D.h b/include/core/factor/factor_autodiff_distance_3D.h
index e26c412812fd7c7e869a79c8b95085eac43ed633..7c5c2d3767cef907138b8d60fdbc9090a3a71158 100644
--- a/include/core/factor/factor_autodiff_distance_3D.h
+++ b/include/core/factor/factor_autodiff_distance_3D.h
@@ -38,6 +38,11 @@ class FactorAutodiffDistance3D : public FactorAutodiff<FactorAutodiffDistance3D,
 
         virtual ~FactorAutodiffDistance3D() { /* nothing */ }
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("GEOM");
+        }
+
         template<typename T>
         bool operator () (const T* const _pos1,
                           const T* const _pos2,
diff --git a/include/core/factor/factor_base.h b/include/core/factor/factor_base.h
index 58ad77ae08d78efe9a0b5454551a3d69dfd21d50..a79e0640337809e2c9a22e3c6525d2b65b6386b9 100644
--- a/include/core/factor/factor_base.h
+++ b/include/core/factor/factor_base.h
@@ -84,6 +84,21 @@ class FactorBase : public NodeBase, public std::enable_shared_from_this<FactorBa
 
         unsigned int id() const;
 
+        /** \brief get the main topological characteristic
+         * Possible outputs:
+         *   - "ABS" absolute factor
+         *   - "MOTION" motion factor, e.g. odometry, IMU
+         *   - "LOOP" loop closure factor
+         *   - "LMK" landmark observation factor
+         *   - "GEOM" some geometric relation, e.g. distance
+         *   - "UNDEFINED" undefined topology
+         *   - "OTHER" other topologies
+         *  You can add you own return strings if you wish. But the strings above may already have a function in WOLF.
+         *
+         *  This function needs to be implemented in all derived classes
+         */
+        virtual std::string getTopology() const = 0;
+
         /** \brief Evaluate the factor given the input parameters and returning the residuals and jacobians
         **/
         virtual bool evaluate(double const* const* _parameters, double* _residuals, double** _jacobians) const = 0;
diff --git a/include/core/factor/factor_block_absolute.h b/include/core/factor/factor_block_absolute.h
index 86df0571601490f0845c79aeac7411e2492c45e3..a5cfac6600adffbbb8dcad6fe0fa8c77d1808605 100644
--- a/include/core/factor/factor_block_absolute.h
+++ b/include/core/factor/factor_block_absolute.h
@@ -62,6 +62,11 @@ class FactorBlockAbsolute : public FactorAnalytic
 
         virtual ~FactorBlockAbsolute() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("ABS");
+        }
+
         /** \brief Returns the residual evaluated in the states provided
          *
          * Returns the residual evaluated in the states provided in std::vector of mapped Eigen::VectorXd
diff --git a/include/core/factor/factor_diff_drive.h b/include/core/factor/factor_diff_drive.h
index 7065a709c1570017956b0e818e95e4f5794181a6..a57ca27393cb1a05f87923755d7e6695e5f76fcf 100644
--- a/include/core/factor/factor_diff_drive.h
+++ b/include/core/factor/factor_diff_drive.h
@@ -80,6 +80,12 @@ class FactorDiffDrive : public FactorAutodiff<FactorDiffDrive,
          **/
         virtual ~FactorDiffDrive() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("MOTION");
+        }
+
+
         template<typename T>
         bool operator ()(const T* const _p1, const T* const _o1, const T* const _p2,
                          const T* const _o2, const T* const _c, T* _residuals) const;
diff --git a/include/core/factor/factor_odom_2D.h b/include/core/factor/factor_odom_2D.h
index 4089238d8382223ab0260de7fbbbd23e68e8fcb9..23be00e288af137aafbac87025fc066de6fd51a3 100644
--- a/include/core/factor/factor_odom_2D.h
+++ b/include/core/factor/factor_odom_2D.h
@@ -33,6 +33,12 @@ class FactorOdom2D : public FactorAutodiff<FactorOdom2D, 3, 2, 1, 2, 1>
 
         virtual ~FactorOdom2D() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("MOTION");
+        }
+
+
         template<typename T>
         bool operator ()(const T* const _p1, const T* const _o1, const T* const _p2, const T* const _o2,
                          T* _residuals) const;
diff --git a/include/core/factor/factor_odom_2D_analytic.h b/include/core/factor/factor_odom_2D_analytic.h
index 793e071e1fc79ca43fa368f50c021bb5cdba9cd6..f705a76edb9dd87ad8aa5c7cb0a253fcb4859754 100644
--- a/include/core/factor/factor_odom_2D_analytic.h
+++ b/include/core/factor/factor_odom_2D_analytic.h
@@ -26,6 +26,12 @@ class FactorOdom2DAnalytic : public FactorRelative2DAnalytic
 
         virtual ~FactorOdom2DAnalytic() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("MOTION");
+        }
+
+
 //        /** \brief Returns the factor residual size
 //         *
 //         * Returns the factor residual size
diff --git a/include/core/factor/factor_odom_3D.h b/include/core/factor/factor_odom_3D.h
index fbae8852ddc80001994d0bf18b4e5aa9b4d8392c..347bf50685cc05d93ccb55f0a80f58417b31ae6b 100644
--- a/include/core/factor/factor_odom_3D.h
+++ b/include/core/factor/factor_odom_3D.h
@@ -28,6 +28,12 @@ class FactorOdom3D : public FactorAutodiff<FactorOdom3D,6,3,4,3,4>
 
         virtual ~FactorOdom3D() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("MOTION");
+        }
+
+
         template<typename T>
                 bool operator ()(const T* const _p_current,
                                  const T* const _q_current,
diff --git a/include/core/factor/factor_pose_2D.h b/include/core/factor/factor_pose_2D.h
index ccbce591c01aa4038fe2bf56b9b0b4618678197d..5c47ee4bb272531fa17fa65caed367e8f3eadf49 100644
--- a/include/core/factor/factor_pose_2D.h
+++ b/include/core/factor/factor_pose_2D.h
@@ -25,6 +25,12 @@ class FactorPose2D: public FactorAutodiff<FactorPose2D,3,2,1>
 
         virtual ~FactorPose2D() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("ABS");
+        }
+
+
         template<typename T>
         bool operator ()(const T* const _p, const T* const _o, T* _residuals) const;
 
diff --git a/include/core/factor/factor_pose_3D.h b/include/core/factor/factor_pose_3D.h
index 50045c32dd1b2bdabce9265172cb3f43360e87a2..f8032f3b3bbfdaa6dcc490385f6880650fa63e12 100644
--- a/include/core/factor/factor_pose_3D.h
+++ b/include/core/factor/factor_pose_3D.h
@@ -24,6 +24,11 @@ class FactorPose3D: public FactorAutodiff<FactorPose3D,6,3,4>
 
         virtual ~FactorPose3D() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("ABS");
+        }
+
         template<typename T>
         bool operator ()(const T* const _p, const T* const _o, T* _residuals) const;
 
diff --git a/include/core/factor/factor_quaternion_absolute.h b/include/core/factor/factor_quaternion_absolute.h
index 52d6809a6036e407f130766d3076de0fb6c18d41..1d9793c7253f9ceb700d6320544d85c16d1110fc 100644
--- a/include/core/factor/factor_quaternion_absolute.h
+++ b/include/core/factor/factor_quaternion_absolute.h
@@ -32,6 +32,11 @@ class FactorQuaternionAbsolute: public FactorAutodiff<FactorQuaternionAbsolute,3
 
         virtual ~FactorQuaternionAbsolute() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("ABS");
+        }
+
         template<typename T>
         bool operator ()(const T* const _o, T* _residuals) const;
 
diff --git a/include/core/factor/factor_relative_2D_analytic.h b/include/core/factor/factor_relative_2D_analytic.h
index bd0b3ff66706627c58b58f64fcb81a275f3e1163..79da205abd9a3b703c0daba65424da7725d5aefe 100644
--- a/include/core/factor/factor_relative_2D_analytic.h
+++ b/include/core/factor/factor_relative_2D_analytic.h
@@ -54,6 +54,11 @@ class FactorRelative2DAnalytic : public FactorAnalytic
             //
         }
 
+        virtual std::string getTopology() const override
+        {
+            return std::string("GEOM");
+        }
+
         virtual ~FactorRelative2DAnalytic() = default;
 
         /** \brief Returns the factor residual size
diff --git a/test/dummy/factor_feature_dummy.h b/test/dummy/factor_feature_dummy.h
index 96a2dee46c5075e2b249499ab57d8a0bf2459237..6b31ffa63a398dc166a4e51fc552352f05a28390 100644
--- a/test/dummy/factor_feature_dummy.h
+++ b/test/dummy/factor_feature_dummy.h
@@ -18,6 +18,11 @@ class FactorFeatureDummy : public FactorBase
 
         virtual ~FactorFeatureDummy() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return "DUMMY";
+        }
+
         /** \brief Evaluate the factor given the input parameters and returning the residuals and jacobians
         **/
         virtual bool evaluate(double const* const* parameters, double* residuals, double** jacobians) const override {return true;};
diff --git a/test/dummy/factor_landmark_dummy.h b/test/dummy/factor_landmark_dummy.h
index f23c4f044778d4197a615e272f56ebd77ad70d7d..b4db44b7890f73289d54cb2708c85edb8a1b8b46 100644
--- a/test/dummy/factor_landmark_dummy.h
+++ b/test/dummy/factor_landmark_dummy.h
@@ -18,6 +18,11 @@ class FactorLandmarkDummy : public FactorBase
 
         virtual ~FactorLandmarkDummy() = default;
 
+        virtual std::string getTopology() const override
+        {
+            return "DUMMY";
+        }
+
         /** \brief Evaluate the factor given the input parameters and returning the residuals and jacobians
         **/
         virtual bool evaluate(double const* const* parameters, double* residuals, double** jacobians) const override {return true;};