diff --git a/swh/loader/package/loader.py b/swh/loader/package/loader.py
--- a/swh/loader/package/loader.py
+++ b/swh/loader/package/loader.py
@@ -17,7 +17,7 @@
 from swh.model.from_disk import Directory
 
 from swh.model.identifiers import (
-    identifier_to_bytes, revision_identifier
+    identifier_to_bytes, revision_identifier, snapshot_identifier
 )
 
 
@@ -430,3 +430,90 @@
         if self.done:
             self.generate_and_load_snapshot()
             self.flush()
+
+    def generate_and_load_snapshot(self):
+        """Generate and load snapshot for the package visit.
+
+        """
+        snapshot = {
+            'branches': self.generate_branches(),
+        }
+
+        snapshot['id'] = identifier_to_bytes(snapshot_identifier(snapshot))
+        self.maybe_load_snapshot(snapshot)
+
+    def generate_branches(self):
+        """Generate branches for the focused package
+
+        """
+        branches = {}
+        key = self.get_key()
+        for version in self.package_source_data:
+            branch_name = self.branch_name(version)
+            target = self.target_from_version(version[key])
+            branches[branch_name] = target
+            branches = self.find_head(branches, branch_name)
+            # How to find HEAD and branch name?
+
+            if not target:
+                self.package_visit_status = 'partial'
+
+        return branches
+
+    def find_head(self, branches, branch_name):
+        """Make branch head.
+
+        Checks if the current version is the latest version. Make it as head
+        if it is the latest version.
+
+        Args:
+            branches (dict): Branches for the focused package.
+            branch_name (str): Branch name
+
+        Returns:
+            dict: Branches for the focused package
+
+        """
+        if True:  # I don't know what to do here
+            # we need some condition here to check if the version is the
+            # latest version. I don't know how to check that because all
+            # of the package manager do not provide field like version
+            branches[b'HEAD'] = {
+                'target_type': 'alias',
+                'target': branch_name,
+            }
+        return branches
+
+    def branch_name(self, version):
+        """Find branch name.
+
+        Args:
+            version (dict): Information related to a particular package version
+
+        Returns:
+            Branch name encoded in ascii
+
+        """
+        # How to tackle this
+        pass
+
+    def target_from_version(self, key_value):
+        target = self.known_versions.get(key_value)
+        return {
+            'target': target,
+            'target_type': 'revision',
+        } if target else None
+
+    def cleanup(self):
+        """Clean up temporary disk use after downloading and extracting
+        package tarballs.
+
+        """
+        if self.debug:
+            self.log.warn('%s Will not clean up temp dir %s' % (
+                DEBUG_MODE, self.temp_directory
+            ))
+            return
+        if os.path.exists(self.temp_directory):
+            self.log.debug('Clean up %s' % self.temp_directory)
+            shutil.rmtree(self.temp_directory)