diff --git a/osm_nbi/engine.py b/osm_nbi/engine.py
index 12311d1..76b0f13 100644
--- a/osm_nbi/engine.py
+++ b/osm_nbi/engine.py
@@ -530,14 +530,14 @@
             if file_pkg:
                 file_pkg.close()
 
-    def new_nsr(self, session, ns_request):
+    def new_nsr(self, rollback, session, ns_request):
         """
         Creates a new nsr into database. It also creates needed vnfrs
+        :param rollback: list where this method appends created items at database in case a rollback may to be done
         :param session: contains the used login username and working project
         :param ns_request: params to be used for the nsr
         :return: the _id of nsr descriptor stored at database
         """
-        rollback = []
         step = ""
         try:
             # look for nsr
@@ -643,20 +643,16 @@
                     member_vnf["vnfd-id-ref"], member_vnf["member-vnf-index"])
                 self._format_new_data(session, "vnfrs", vnfr_descriptor)
                 self.db.create("vnfrs", vnfr_descriptor)
-                rollback.append({"session": session, "item": "vnfrs", "_id": vnfr_id, "force": True})
+                rollback.insert(0, {"item": "vnfrs", "_id": vnfr_id})
                 nsr_descriptor["constituent-vnfr-ref"].append(vnfr_id)
 
             step = "creating nsr at database"
             self._format_new_data(session, "nsrs", nsr_descriptor)
             self.db.create("nsrs", nsr_descriptor)
+            rollback.insert(0, {"item": "nsrs", "_id": nsr_id})
             return nsr_id
         except Exception as e:
             raise EngineException("Error {}: {}".format(step, e))
-            for rollback_item in rollback:
-                try:
-                    self.engine.del_item(**rollback)
-                except Exception as e2:
-                    self.logger.error("Rollback Exception {}: {}".format(rollback, e2))
 
     @staticmethod
     def _update_descriptor(desc, kwargs):
@@ -694,10 +690,11 @@
             raise EngineException(
                 "Invalid query string '{}'. Index '{}' out of  range".format(k, kitem_old))
 
-    def new_item(self, session, item, indata={}, kwargs=None, headers={}, force=False):
+    def new_item(self, rollback, session, item, indata={}, kwargs=None, headers={}, force=False):
         """
         Creates a new entry into database. For nsds and vnfds it creates an almost empty DISABLED  entry,
         that must be completed with a call to method upload_content
+        :param rollback: list where this method appends created items at database in case a rollback may to be done
         :param session: contains the used login username and working project
         :param item: it can be: users, projects, vim_accounts, sdns, nsrs, nsds, vnfds
         :param indata: data to be inserted
@@ -722,13 +719,14 @@
 
             if item == "nsrs":
                 # in this case the input descriptor is not the data to be stored
-                return self.new_nsr(session, ns_request=content)
+                return self.new_nsr(rollback, session, ns_request=content)
 
             self._validate_new_data(session, item_envelop, content, force)
             if item in ("nsds", "vnfds"):
                 content = {"_admin": {"userDefinedData": content}}
             self._format_new_data(session, item, content)
             _id = self.db.create(item, content)
+            rollback.insert(0, {"item": item, "_id": _id})
 
             if item == "vim_accounts":
                 msg_data = self.db.get_one(item, {"_id": _id})
@@ -763,9 +761,10 @@
         }
         return nslcmop
 
-    def ns_operation(self, session, nsInstanceId, operation, indata, kwargs=None):
+    def ns_operation(self, rollback, session, nsInstanceId, operation, indata, kwargs=None):
         """
         Performs a new operation over a ns
+        :param rollback: list where this method appends created items at database in case a rollback may to be done
         :param session: contains the used login username and working project
         :param nsInstanceId: _id of the nsr to perform the operation
         :param operation: it can be: instantiate, terminate, action, TODO: update, heal
@@ -795,6 +794,7 @@
             nslcmop = self.new_nslcmop(session, nsInstanceId, operation, indata)
             self._format_new_data(session, "nslcmops", nslcmop)
             _id = self.db.create("nslcmops", nslcmop)
+            rollback.insert(0, {"item": "nslcmops", "_id": _id})
             indata["_id"] = _id
             self.msg.write("ns", operation, nslcmop)
             return _id
diff --git a/osm_nbi/nbi.py b/osm_nbi/nbi.py
index cb24045..4468f26 100644
--- a/osm_nbi/nbi.py
+++ b/osm_nbi/nbi.py
@@ -616,7 +616,8 @@
         _format = None
         method = "DONE"
         engine_item = None
-        rollback = None
+        rollback = []
+        session = None
         try:
             if not topic or not version or not item:
                 raise NbiException("URL must contain at least 'topic/version/item'", HTTPStatus.METHOD_NOT_ALLOWED)
@@ -682,9 +683,8 @@
                 if item in ("ns_descriptors_content", "vnf_packages_content"):
                     _id = cherrypy.request.headers.get("Transaction-Id")
                     if not _id:
-                        _id = self.engine.new_item(session, engine_item, {}, None, cherrypy.request.headers,
+                        _id = self.engine.new_item(rollback, session, engine_item, {}, None, cherrypy.request.headers,
                                                    force=force)
-                        rollback = {"session": session, "item": engine_item, "_id": _id, "force": True}
                     completed = self.engine.upload_content(session, engine_item, _id, indata, kwargs,
                                                            cherrypy.request.headers)
                     if completed:
@@ -693,18 +693,17 @@
                         cherrypy.response.headers["Transaction-Id"] = _id
                     outdata = {"id": _id}
                 elif item == "ns_instances_content":
-                    _id = self.engine.new_item(session, engine_item, indata, kwargs, force=force)
-                    rollback = {"session": session, "item": engine_item, "_id": _id, "force": True}
-                    self.engine.ns_operation(session, _id, "instantiate", {}, None)
+                    _id = self.engine.new_item(rollback, session, engine_item, indata, kwargs, force=force)
+                    self.engine.ns_operation(rollback, session, _id, "instantiate", {}, None)
                     self._set_location_header(topic, version, item, _id)
                     outdata = {"id": _id}
                 elif item == "ns_instances" and item2:
-                    _id = self.engine.ns_operation(session, _id, item2, indata, kwargs)
+                    _id = self.engine.ns_operation(rollback, session, _id, item2, indata, kwargs)
                     self._set_location_header(topic, version, "ns_lcm_op_occs", _id)
                     outdata = {"id": _id}
                     cherrypy.response.status = HTTPStatus.ACCEPTED.value
                 else:
-                    _id = self.engine.new_item(session, engine_item, indata, kwargs, cherrypy.request.headers,
+                    _id = self.engine.new_item(rollback, session, engine_item, indata, kwargs, cherrypy.request.headers,
                                                force=force)
                     self._set_location_header(topic, version, item, _id)
                     outdata = {"id": _id}
@@ -717,7 +716,8 @@
                     cherrypy.response.status = HTTPStatus.OK.value
                 else:  # len(args) > 1
                     if item == "ns_instances_content" and not force:
-                        opp_id = self.engine.ns_operation(session, _id, "terminate", {"autoremove": True}, None)
+                        opp_id = self.engine.ns_operation(rollback, session, _id, "terminate", {"autoremove": True},
+                                                          None)
                         outdata = {"_id": opp_id}
                         cherrypy.response.status = HTTPStatus.ACCEPTED.value
                     else:
@@ -747,11 +747,11 @@
             cherrypy.response.status = e.http_code.value
             if hasattr(outdata, "close"):  # is an open file
                 outdata.close()
-            if rollback:
+            for rollback_item in rollback:
                 try:
-                    self.engine.del_item(**rollback)
+                    self.engine.del_item(**rollback_item, session=session, force=True)
                 except Exception as e2:
-                    cherrypy.log("Rollback Exception {}: {}".format(rollback, e2))
+                    cherrypy.log("Rollback Exception {}: {}".format(rollback_item, e2))
             error_text = str(e)
             if isinstance(e, MsgException):
                 error_text = "{} has been '{}' but other modules cannot be informed because an error on bus".format(
