diff --git a/src/controllers/Classifiers.tpp b/src/controllers/Classifiers.tpp
index 86b546788f4274763bf2c17c49eb27f4d8b3ac71..5b6844869540bcd1e16ee9c495785c41f108065a 100644
--- a/src/controllers/Classifiers.tpp
+++ b/src/controllers/Classifiers.tpp
@@ -20,11 +20,9 @@
 #include <qry/Instance_filter.h>
 #include <util/String.h>
 #include <qry/Return_code.h>
-#include <mttr/Class_instance_association_create.h>
+#include <mttr/Classifier_instance_factory.h>
 #include <mttr/Classifier_instance_create.h>
 #include <memory>
-#include <mttr/Classifier_instance_delete.h>
-#include <mttr/Classifier_instance_update.h>
 #include <svru/Request.h>
 #include <svru/Response.h>
 #include <svru/Request.h>
@@ -149,55 +147,40 @@ void Classifiers<T>::create_instance(
     
 
     auto json_ptr = req->jsonObject();
-    
+
     if (elem) {
       if (!elem->is_abstract()) {
-        std::shared_ptr<omm::Table> elem_lo = elem->table();
-        if (elem_lo) {
-          // additional table for association (binary association N-M)
-          const std::unordered_map<std::string, std::shared_ptr<const Json::Value>>
-              import_cache;
-          mttr::Classifier_instance_create ic(elem,*json_ptr,
-                                              import_cache);
-          ic.execute();
-
-          if (ic.return_code() == qry::Return_code::OK) {
-            resp = HttpResponse::newHttpJsonResponse(ic.return_json());
+
+        auto ic = mttr::Classifier_instance_factory::instance().make_create(
+            elem, *json_ptr);
+
+        if (ic) {
+          ic->execute();
+
+          if (ic->return_code() == qry::Return_code::OK) {
+            resp = HttpResponse::newHttpJsonResponse(ic->return_json());
           } else {
             resp->setStatusCode(drogon::k400BadRequest);
             resp->setContentTypeCode(CT_TEXT_HTML);
             resp->setBody("Classifier instance creation failed ");
           }
-        } else { // no table (binary association 1-N or 1-1), one class instance
-                 // must be updated
-          const std::unordered_map<std::string, std::shared_ptr<const Json::Value>>
-              import_cache;
-          const auto assoc = std::dynamic_pointer_cast<const omm::Association>(elem);
-          mttr::Class_instance_association_create iac(assoc, *json_ptr,
-                                                      import_cache);
-          iac.execute();
-
-          if (iac.return_code() == qry::Return_code::OK) {
-
-            resp = HttpResponse::newHttpJsonResponse(iac.return_json());
-          } else {
-            resp->setStatusCode(k400BadRequest);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Association instance creation failed ");
-          }
+        } else {
+          resp->setStatusCode(k500InternalServerError);
+          resp->setContentTypeCode(CT_TEXT_HTML);
+          resp->setBody("Classifier without relational object ");
         }
       } else {
         resp->setStatusCode(k400BadRequest);
         resp->setContentTypeCode(CT_TEXT_HTML);
         resp->setBody("Classifier is abstract, creation not applicable");
       }
+
     } else {
       resp->setStatusCode(k400BadRequest);
       resp->setContentTypeCode(CT_TEXT_HTML);
       resp->setBody("Classifier not found ");
     }
 
-    // }
     svru::Response::add_allow_headers(resp, req);
 
     callback(resp);
diff --git a/src/controllers/Instances.cpp b/src/controllers/Instances.cpp
index 597a3979a6bd0c26b274aeac9f5244027f7ce525..7c6037744adeaca30b451feb481236d49b59f71a 100644
--- a/src/controllers/Instances.cpp
+++ b/src/controllers/Instances.cpp
@@ -5,8 +5,7 @@
  *
  */
 #include <ctlr/Instances.h>
-#include <mttr/Class_instance_association_delete.h>
-#include <mttr/Class_instance_association_update.h>
+#include <mttr/Classifier_instance_factory.h>
 #include <mttr/Classifier_instance_delete.h>
 #include <mttr/Classifier_instance_update.h>
 #include <mttr/Data_import.h>
@@ -45,94 +44,45 @@ void Instances::update(const HttpRequestPtr &req,
         const auto [csf_id, row_id] =
         qry::Util::split_instance_id(p_inst_id);           
 
-        // lookup class at first
+        // lookup classifier
 
-        auto cls =
-        om_ptr->find_domain_element_by_id<omm::Class>(std::to_string(csf_id));
- 
+        auto csf =
+        om_ptr->find_domain_element_by_id<omm::Classifier>(std::to_string(csf_id));
+  
 
         auto resp = HttpResponse::newHttpResponse();
                 
 
         auto json_ptr = req->jsonObject() ;
 
-        if ( cls ) {
-                std::shared_ptr<omm::Table> elem_lo =  cls->table() ;
-
-                if (elem_lo) {
-
-                  const int upd_count = json_ptr->get("upd_count", 0).asInt();
-                  const std::unordered_map<std::string,
-                                           std::shared_ptr<const Json::Value>>
-                      import_cache;
-
-                  mttr::Classifier_instance_update iu(cls, *json_ptr, p_inst_id,
-                                                      import_cache, upd_count);
-                  iu.execute();
-
-                  if (iu.return_code() == qry::Return_code::OK) {
-                    resp->setStatusCode(drogon::k200OK);
-                    resp->setContentTypeCode(CT_TEXT_HTML);
-                    resp->setBody("Instance updated ");
-                  } else {
-                    resp->setStatusCode(drogon::k400BadRequest);
-                    resp->setContentTypeCode(CT_TEXT_HTML);
-                    resp->setBody("Instance updating failed ");
-                  }
-                } else {
-                  resp->setStatusCode(k500InternalServerError);
-                  resp->setContentTypeCode(CT_TEXT_HTML);
-                  resp->setBody("Class without relational object ");
-                }
-
-        } else {
-            const auto assoc = om_ptr->find_domain_element_by_id<omm::Association>(
-          std::to_string(csf_id));
-            if (assoc) {
-                std::shared_ptr<omm::Table> elem_lo =  assoc->table() ;
-                const int upd_count = json_ptr->get("upd_count",0).asInt();
-
-                if ( elem_lo ) {
-                    // additional table for association (binary association N-M)            
-                    const std::unordered_map<std::string, std::shared_ptr<const Json::Value>> import_cache;
-
-                    mttr::Classifier_instance_update iu (assoc, *json_ptr, p_inst_id, import_cache, upd_count);
-                    iu.execute ();
-                    
-                    if (iu.return_code () == qry::Return_code::OK) {
-                        resp->setStatusCode ( k200OK );
-                        resp->setContentTypeCode ( CT_TEXT_HTML );
-                        resp->setBody ( "Instance updated " );
-                    } else {
-                        resp->setStatusCode ( k400BadRequest );
-                        resp->setContentTypeCode ( CT_TEXT_HTML );
-                        resp->setBody ( "Instance updating failed " );
-                    }
-                    
-                } else { // no table (binary association 1-N or 1-1), one class instance must be updated
-                    const std::unordered_map<std::string, std::shared_ptr<const Json::Value>> import_cache;
+        if (csf) {
+          const int upd_count = json_ptr->get("upd_count", 0).asInt();
 
-                    mttr::Class_instance_association_update iau (assoc, *json_ptr, p_inst_id, import_cache, upd_count);
-                    iau.execute ();
-                    
-                    if (iau.return_code () == qry::Return_code::OK) {
-                        resp->setStatusCode ( k200OK );
-                        resp->setContentTypeCode ( CT_TEXT_HTML );
-                        resp->setBody ( "Instance updated " );
-                    } else {
-                        resp->setStatusCode ( k400BadRequest );
-                        resp->setContentTypeCode ( CT_TEXT_HTML );
-                        resp->setBody ( "Instance updating failed " );
-                    }
-    
-                }
+          auto iu = mttr::Classifier_instance_factory::instance().make_update(
+              csf, *json_ptr, p_inst_id, upd_count);
+          if (iu) {
+            iu->execute();
 
+            if (iu->return_code() == qry::Return_code::OK) {
+              resp->setStatusCode(drogon::k200OK);
+              resp->setContentTypeCode(CT_TEXT_HTML);
+              resp->setBody("Instance updated ");
             } else {
-                resp->setStatusCode ( k400BadRequest );
-                resp->setContentTypeCode ( CT_TEXT_HTML );
-                resp->setBody ( "Classifier not found " );
+              resp->setStatusCode(drogon::k400BadRequest);
+              resp->setContentTypeCode(CT_TEXT_HTML);
+              resp->setBody("Instance updating failed ");
             }
+          } else {
+            resp->setStatusCode(k500InternalServerError);
+            resp->setContentTypeCode(CT_TEXT_HTML);
+            resp->setBody("Classifier without relational object ");
+          }
+        } else {
+          resp->setStatusCode(k400BadRequest);
+          resp->setContentTypeCode(CT_TEXT_HTML);
+          resp->setBody("Classifier not found ");
         }
+
         svru::Response::add_allow_headers (resp, req) ;
 
         callback ( resp );
@@ -173,30 +123,26 @@ void Instances::deletion(const HttpRequestPtr &req,
         const auto [csf_id, row_id] =
         qry::Util::split_instance_id(p_inst_id);
 
-        // lookup class at first
+        // lookup classifier
 
-         auto cls =
-        om_ptr->find_domain_element_by_id<omm::Class>(std::to_string(csf_id));
- 
+        auto csf =
+        om_ptr->find_domain_element_by_id<omm::Classifier>(std::to_string(csf_id));
+  
 
         auto resp = HttpResponse::newHttpResponse();
                 
 
         auto json_ptr = req->jsonObject() ;
 
-        if (cls) {
-          std::shared_ptr<omm::Table> elem_lo = cls->table();
-
-          if (elem_lo) {
-
-            const int upd_count = (json_ptr == nullptr)
-                                      ? 0
-                                      : json_ptr->get("upd_count", 0).asInt();
+        if (csf) {
+          const int upd_count = json_ptr->get("upd_count", 0).asInt();
 
-            mttr::Classifier_instance_delete id(cls, p_inst_id, upd_count);
-            id.execute();
+          auto id = mttr::Classifier_instance_factory::instance().make_delete(
+              csf, p_inst_id, upd_count);
+          if (id) {
+            id->execute();
 
-            if (id.return_code() == qry::Return_code::OK) {
+            if (id->return_code() == qry::Return_code::OK) {
               resp->setStatusCode(drogon::k200OK);
               resp->setContentTypeCode(CT_TEXT_HTML);
               resp->setBody("Instance deleted ");
@@ -208,59 +154,14 @@ void Instances::deletion(const HttpRequestPtr &req,
           } else {
             resp->setStatusCode(k500InternalServerError);
             resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Class without relational object ");
+            resp->setBody("Classifier without relational object ");
           }
-
         } else {
-          const auto assoc =
-              om_ptr->find_domain_element_by_id<omm::Association>(
-                  std::to_string(csf_id));
-          if (assoc) {
-            std::shared_ptr<omm::Table> elem_lo = assoc->table();
-            const int upd_count = (json_ptr == nullptr)
-                                      ? 0
-                                      : json_ptr->get("upd_count", 0).asInt();
-
-            if (elem_lo) {
-              // additional table for association (binary association N-M)
-
-              mttr::Classifier_instance_delete id(assoc, p_inst_id, upd_count);
-              id.execute();
-
-              if (id.return_code() == qry::Return_code::OK) {
-                resp->setStatusCode(k200OK);
-                resp->setContentTypeCode(CT_TEXT_HTML);
-                resp->setBody("Instance deleted ");
-              } else {
-                resp->setStatusCode(k400BadRequest);
-                resp->setContentTypeCode(CT_TEXT_HTML);
-                resp->setBody("Instance deletion failed ");
-              }
-
-            } else { // no table (binary association 1-N or 1-1), one class
-                     // instance must be updated
-
-              mttr::Class_instance_association_delete iad(assoc, p_inst_id,
-                                                          upd_count);
-              iad.execute();
-
-              if (iad.return_code() == qry::Return_code::OK) {
-                resp->setStatusCode(k200OK);
-                resp->setContentTypeCode(CT_TEXT_HTML);
-                resp->setBody("Instance deleted ");
-              } else {
-                resp->setStatusCode(k400BadRequest);
-                resp->setContentTypeCode(CT_TEXT_HTML);
-                resp->setBody("Instance deletion failed ");
-              }
-            }
-
-          } else {
-            resp->setStatusCode(k400BadRequest);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Classifier not found ");
-          }
+          resp->setStatusCode(k400BadRequest);
+          resp->setContentTypeCode(CT_TEXT_HTML);
+          resp->setBody("Classifier not found ");
         }
+        
         svru::Response::add_allow_headers (resp, req) ;
 
         callback ( resp );
diff --git a/src/controllers/Trash.cpp b/src/controllers/Trash.cpp
index ba93884f255a762d26fa26e743a79fbefba05d9a..176563aca2069e9f12ad60c678d0b15cd143512f 100644
--- a/src/controllers/Trash.cpp
+++ b/src/controllers/Trash.cpp
@@ -8,8 +8,7 @@
 #include <drogon/HttpTypes.h>
 #include <svru/Request.h>
 #include <svru/Response.h>
-#include <mttr/Class_instance_association_eliminate.h>
-#include <mttr/Class_instance_association_recover.h>
+#include <mttr/Classifier_instance_factory.h>
 #include <mttr/Classifier_instance_eliminate.h>
 #include <mttr/Classifier_instance_recover.h>
 #include <mttr/Trash_empty.h>
@@ -114,95 +113,43 @@ void Trash::recover_instance(
         qry::Util::split_instance_id(p_trash_id);
    
 
-    // lookup class at first
-
-    auto cls =
-        om_ptr->find_domain_element_by_id<omm::Class>(std::to_string(csf_id));
-
+    // lookup classifier
 
+    auto csf = om_ptr->find_domain_element_by_id<omm::Classifier>(
+        std::to_string(csf_id));
 
     auto resp = HttpResponse::newHttpResponse();
 
-
-
     auto json_ptr = req->jsonObject();
 
-    if (cls) {
-      std::shared_ptr<omm::Table> elem_lo = cls->table();
+    if (csf) {
+      const int upd_count = json_ptr->get("upd_count", 0).asInt();
 
-      if (elem_lo) {
+      auto ir = mttr::Classifier_instance_factory::instance().make_recover(
+          csf, p_trash_id, upd_count);
+      if (ir) {
+        ir->execute();
 
-        const int upd_count =
-            (json_ptr == nullptr) ? 0 : json_ptr->get("upd_count", 0).asInt();
-
-        mttr::Classifier_instance_recover ir( cls, p_trash_id,
-                                             upd_count);
-        ir.execute();
-
-        if (ir.return_code() == qry::Return_code::OK) {
+        if (ir->return_code() == qry::Return_code::OK) {
           resp->setStatusCode(drogon::k200OK);
           resp->setContentTypeCode(CT_TEXT_HTML);
           resp->setBody("Instance recovered ");
         } else {
           resp->setStatusCode(drogon::k400BadRequest);
           resp->setContentTypeCode(CT_TEXT_HTML);
-          resp->setBody("Instance restoring failed ");
+          resp->setBody("Instance recovery failed ");
         }
       } else {
         resp->setStatusCode(k500InternalServerError);
         resp->setContentTypeCode(CT_TEXT_HTML);
-        resp->setBody("Class without relational object ");
+        resp->setBody("Classifier without relational object ");
       }
-
     } else {
-      const auto assoc = om_ptr->find_domain_element_by_id<omm::Association>(
-          std::to_string(csf_id));
-      if (assoc) {
-        std::shared_ptr<omm::Table> elem_lo = assoc->table();
-        const int upd_count =
-            (json_ptr == nullptr) ? 0 : json_ptr->get("upd_count", 0).asInt();
-
-        if (elem_lo) {
-          // additional table for association (binary association N-M)
-
-          mttr::Classifier_instance_recover ir(assoc, p_trash_id,
-                                               upd_count);
-          ir.execute();
-
-          if (ir.return_code() == qry::Return_code::OK) {
-            resp->setStatusCode(k200OK);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance recovered ");
-          } else {
-            resp->setStatusCode(k400BadRequest);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance restoring failed ");
-          }
-
-        } else { // no table (binary association 1-N or 1-1), one class instance
-                 // must be updated
-
-          mttr::Class_instance_association_recover iar( assoc,
-                                                       p_trash_id, upd_count);
-          iar.execute();
-
-          if (iar.return_code() == qry::Return_code::OK) {
-            resp->setStatusCode(k200OK);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance recovered ");
-          } else {
-            resp->setStatusCode(k400BadRequest);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance restoring failed ");
-          }
-        }
-
-      } else {
-        resp->setStatusCode(k400BadRequest);
-        resp->setContentTypeCode(CT_TEXT_HTML);
-        resp->setBody("Classifier not found ");
-      }
+      resp->setStatusCode(k400BadRequest);
+      resp->setContentTypeCode(CT_TEXT_HTML);
+      resp->setBody("Classifier not found ");
     }
+  
     svru::Response::add_allow_headers(resp, req);
 
     callback(resp);
@@ -239,39 +186,29 @@ void Trash::eliminate_instance(
 
   try {
 
+    auto om_ptr =
+        common::Singleton<common::Object_model_info>::instance().object();
 
-    auto om_ptr = common::Singleton<common::Object_model_info>::instance().object();
-
-
-    const auto [csf_id, row_id] =
-        qry::Util::split_instance_id(p_trash_id);
-
- 
-
-    // lookup class at first
+    const auto [csf_id, row_id] = qry::Util::split_instance_id(p_trash_id);
 
-    auto cls =
-        om_ptr->find_domain_element_by_id<omm::Class>(std::to_string(csf_id));
+    // lookup classifier
 
+    auto csf = om_ptr->find_domain_element_by_id<omm::Classifier>(
+        std::to_string(csf_id));
 
     auto resp = HttpResponse::newHttpResponse();
 
-
     auto json_ptr = req->jsonObject();
 
-    if (cls) {
-      std::shared_ptr<omm::Table> elem_lo = cls->table();
-
-      if (elem_lo) {
-
-        const int upd_count =
-            (json_ptr == nullptr) ? 0 : json_ptr->get("upd_count", 0).asInt();
+    if (csf) {
+      const int upd_count = json_ptr->get("upd_count", 0).asInt();
 
-        mttr::Classifier_instance_eliminate ip( cls, p_trash_id,
-                                               upd_count);
-        ip.execute();
+      auto ie = mttr::Classifier_instance_factory::instance().make_eliminate(
+          csf, p_trash_id, upd_count);
+      if (ie) {
+        ie->execute();
 
-        if (ip.return_code() == qry::Return_code::OK) {
+        if (ie->return_code() == qry::Return_code::OK) {
           resp->setStatusCode(drogon::k200OK);
           resp->setContentTypeCode(CT_TEXT_HTML);
           resp->setBody("Instance deleted definitively");
@@ -283,58 +220,14 @@ void Trash::eliminate_instance(
       } else {
         resp->setStatusCode(k500InternalServerError);
         resp->setContentTypeCode(CT_TEXT_HTML);
-        resp->setBody("Class without relational object ");
+        resp->setBody("Classifier without relational object ");
       }
-
     } else {
-      const auto assoc = om_ptr->find_domain_element_by_id<omm::Association>(
-          std::to_string(csf_id));
-      if (assoc) {
-        std::shared_ptr<omm::Table> elem_lo = assoc->table();
-        const int upd_count =
-            (json_ptr == nullptr) ? 0 : json_ptr->get("upd_count", 0).asInt();
-
-        if (elem_lo) {
-          // additional table for association (binary association N-M)
-
-          mttr::Classifier_instance_eliminate ip(assoc, p_trash_id,
-                                                 upd_count);
-          ip.execute();
-
-          if (ip.return_code() == qry::Return_code::OK) {
-            resp->setStatusCode(k200OK);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance deleted definitively");
-          } else {
-            resp->setStatusCode(k400BadRequest);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance definitive deletion failed ");
-          }
-
-        } else { // no table (binary association 1-N or 1-1), one class instance
-                 // must be updated
-
-          mttr::Class_instance_association_eliminate iap(assoc,
-                                                         p_trash_id, upd_count);
-          iap.execute();
-
-          if (iap.return_code() == qry::Return_code::OK) {
-            resp->setStatusCode(k200OK);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance deleted definitively");
-          } else {
-            resp->setStatusCode(k400BadRequest);
-            resp->setContentTypeCode(CT_TEXT_HTML);
-            resp->setBody("Instance definitive deletion failed ");
-          }
-        }
-
-      } else {
-        resp->setStatusCode(k400BadRequest);
-        resp->setContentTypeCode(CT_TEXT_HTML);
-        resp->setBody("Classifier not found ");
-      }
+      resp->setStatusCode(k400BadRequest);
+      resp->setContentTypeCode(CT_TEXT_HTML);
+      resp->setBody("Classifier not found ");
     }
+
     svru::Response::add_allow_headers(resp, req);
 
     callback(resp);