diff --git a/requirements-swh.txt b/requirements-swh.txt
--- a/requirements-swh.txt
+++ b/requirements-swh.txt
@@ -1,4 +1,4 @@
 swh.model >= 2.6.1
 swh.storage >= 0.41.1
 swh.scheduler >= 0.23.0
-swh.loader.core >= 2.3.0
+swh.loader.core >= 3.0.0
diff --git a/swh/loader/bzr/loader.py b/swh/loader/bzr/loader.py
--- a/swh/loader/bzr/loader.py
+++ b/swh/loader/bzr/loader.py
@@ -11,7 +11,18 @@
 import itertools
 import os
 from tempfile import mkdtemp
-from typing import Dict, Iterator, List, NewType, Optional, Set, Tuple, TypeVar, Union
+from typing import (
+    Any,
+    Dict,
+    Iterator,
+    List,
+    NewType,
+    Optional,
+    Set,
+    Tuple,
+    TypeVar,
+    Union,
+)
 
 from breezy import errors as bzr_errors
 from breezy import repository, tsort
@@ -31,7 +42,6 @@
     Content,
     ExtID,
     ObjectType,
-    Origin,
     Person,
     Release,
     Revision,
@@ -151,17 +161,12 @@
         storage: StorageInterface,
         url: str,
         directory: Optional[str] = None,
-        logging_class: str = "swh.loader.bzr.Loader",
         visit_date: Optional[datetime] = None,
         temp_directory: str = "/tmp",
         clone_timeout_seconds: int = 7200,
-        max_content_size: Optional[int] = None,
+        **kwargs: Any,
     ):
-        super().__init__(
-            storage=storage,
-            logging_class=logging_class,
-            max_content_size=max_content_size,
-        )
+        super().__init__(storage=storage, origin_url=url, **kwargs)
 
         self._temp_directory = temp_directory
         self._clone_timeout = clone_timeout_seconds
@@ -181,8 +186,7 @@
         self._latest_head: Optional[BzrRevisionId] = None
         self._load_status = "eventful"
 
-        self.origin_url = url
-        self.visit_date = visit_date
+        self.visit_date = visit_date or self.visit_date
         self.directory = directory
         self.repo: Optional[repository.Repository] = None
 
@@ -197,19 +201,11 @@
             log=self.log,
         )
 
-    def prepare_origin_visit(self) -> None:
-        """First step executed by the loader to prepare origin and visit
-        references. Set/update self.origin, and
-        optionally self.origin_url, self.visit_date.
-
-        """
-        self.origin = Origin(url=self.origin_url)
-
     def prepare(self) -> None:
         """Second step executed by the loader to prepare some state needed by
         the loader.
         """
-        latest_snapshot = snapshot_get_latest(self.storage, self.origin_url)
+        latest_snapshot = snapshot_get_latest(self.storage, self.origin.url)
         if latest_snapshot:
             self._set_recorded_state(latest_snapshot)
 
@@ -291,17 +287,17 @@
             )
             msg = "Cloning '%s' to '%s' with timeout %s seconds"
             self.log.debug(
-                msg, self.origin_url, self._repo_directory, self._clone_timeout
+                msg, self.origin.url, self._repo_directory, self._clone_timeout
             )
             closure = partial(
                 cmd_branch().run,
-                self.origin_url,
+                self.origin.url,
                 self._repo_directory,
                 no_tree=True,
                 use_existing_dir=True,
             )
             clone_with_timeout(
-                self.origin_url, self._repo_directory, closure, self._clone_timeout
+                self.origin.url, self._repo_directory, closure, self._clone_timeout
             )
         else:  # existing local repository
             # Allow to load on disk repository without cloning