Repository: harness/harness

Issue:
Docker command in README.md is wrong, needs to be updated to have the correct port mappings (3022:3022 instead of 22:22)
I ran the docker command in the README of the repo and when I tried to clone a repo it had `:3022` in it.

The docker command in README.md maps `host port 22 to container port 22` which is wrong
It should  map `host port 3022 to container port 3022` like its mentioned in the [dev docs](https://developer.harness.io/docs/open-source/installation/quick-start).

Corrected codeblock:
```bash
docker run -d \
  -p 3000:3000 -p 3022:3022 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp/harness:/data \
  --name opensource \
  --restart always \
  harness/harness
```bash

Hints from issue comments:
@salhernandez: I'll create a PR for it


Solution patch:
diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml
index eeb529343..817ebde31 100644
--- a/.github/workflows/ci-lint.yml
+++ b/.github/workflows/ci-lint.yml
@@ -44,7 +44,7 @@ jobs:
         uses: golangci/golangci-lint-action@v3
         with:
           # Optional: version of golangci-lint to use in form of v1.2 or v1.2.3 or `latest` to use the latest version
-          version: v1.54
+          version: v1.64.5
 
           # Optional: working directory, useful for monorepos
           # working-directory: somedir
diff --git a/Makefile b/Makefile
index 935382373..04113bc4e 100644
--- a/Makefile
+++ b/Makefile
@@ -183,7 +183,7 @@ $(GOBIN)/protoc-gen-go-grpc:
 	go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
 
 $(GOBIN)/gci:
-	go install github.com/daixiang0/gci@v0.13.1
+	go install github.com/daixiang0/gci@v0.13.7
 
 help: ## show help message
 	@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n  make \033[36m\033[0m\n"} /^[$$()% 0-9a-zA-Z_-]+:.*?##/ { printf "  \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
diff --git a/README.md b/README.md
index 122719d7b..c116dd4a0 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ To install Harness yourself, simply run the command below. Once the container is
 ```bash
 docker run -d \
   -p 3000:3000 \
-  -p 22:22 \
+  -p 3022:3022 \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v /tmp/harness:/data \
   --name harness \
diff --git a/app/api/controller/gitspace/common/resource_validation.go b/app/api/controller/gitspace/common/resource_validation.go
index bf05c72dc..77ea876c5 100644
--- a/app/api/controller/gitspace/common/resource_validation.go
+++ b/app/api/controller/gitspace/common/resource_validation.go
@@ -29,41 +29,23 @@ import (
 // It removes any resources that are not compatible according to the IsResourceSpecChangeAllowed criteria.
 func FilterResourcesByCompatibility(
 	ctx context.Context,
-	resources []*types.InfraProviderResource,
-	referenceResourceID string,
+	filteredResources []*types.InfraProviderResource,
+	referenceResource *types.InfraProviderResource,
 ) ([]*types.InfraProviderResource, error) {
-	if referenceResourceID == "" {
-		return resources, nil
-	}
-
-	// Find reference resource and filter in a single pass
-	var referenceResource *types.InfraProviderResource
-	filteredResources := make([]*types.InfraProviderResource, 0)
-
-	for _, resource := range resources {
-		if resource.UID == referenceResourceID {
-			referenceResource = resource
-			continue
-		}
-		filteredResources = append(filteredResources, resource)
-	}
-
 	if referenceResource == nil {
-		log.Ctx(ctx).Warn().
-			Str("reference_resource_id", referenceResourceID).
-			Msg("reference resource not found, skipping compatibility filtering")
-		return resources, nil
+		return nil, fmt.Errorf("referenceResource cannot be nil")
 	}
 
-	// Now filter based on compatibility
 	compatibleResources := make([]*types.InfraProviderResource, 0)
+
+	// Now filter based on compatibility
 	for _, resource := range filteredResources {
 		_, err := IsResourceSpecChangeAllowed(referenceResource, resource)
 		if err != nil {
 			log.Ctx(ctx).Debug().
 				Err(err).
 				Str("resource_id", resource.UID).
-				Str("reference_id", referenceResourceID).
+				Str("reference_id", referenceResource.UID).
 				Msg("resource compatibility check failed")
 		} else {
 			compatibleResources = append(compatibleResources, resource)
@@ -218,6 +200,8 @@ func validateBootDiskChanges(existingMeta, newMeta map[string]string) (bool, err
 // checkPersistentDiskSizeChange compares existing and new persistent disk sizes.
 // and determines if the change is allowed and if hard reset is needed.
 // Returns (needsHardReset, error).
+//
+//nolint:unparam // the bool return value is kept for future extension
 func checkPersistentDiskSizeChange(existingDisk, newDisk string) (bool, error) {
 	existingVal, eErr := strconv.Atoi(existingDisk)
 	if eErr != nil {
@@ -229,18 +213,13 @@ func checkPersistentDiskSizeChange(existingDisk, newDisk string) (bool, error) {
 		return false, fmt.Errorf("invalid disk size format: cannot parse new disk size: %w", nErr)
 	}
 
-	// If persistent disk size reduced, return error
-	if newVal < existingVal {
+	// Disallow any changes to persistent disk size
+	if newVal != existingVal {
 		return false, fmt.Errorf(
-			"reducing persistent disk size is not allowed: from %d to %d",
+			"changing persistent disk size is not allowed: from %d to %d",
 			existingVal, newVal)
 	}
 
-	// If persistent disk size increased, mark for hard reset
-	if newVal > existingVal {
-		return true, nil
-	}
-
 	// Equal sizes, no hard reset needed
 	return false, nil
 }
diff --git a/app/api/controller/webhook/repo_create.go b/app/api/controller/webhook/repo_create.go
index 4feb97497..97723d19b 100644
--- a/app/api/controller/webhook/repo_create.go
+++ b/app/api/controller/webhook/repo_create.go
@@ -19,6 +19,7 @@ import (
 	"fmt"
 
 	"github.com/harness/gitness/app/auth"
+	"github.com/harness/gitness/app/paths"
 	"github.com/harness/gitness/types"
 	"github.com/harness/gitness/types/enum"
 )
@@ -42,10 +43,10 @@ func (c *Controller) CreateRepo(
 	}
 
 	hook, err := c.webhookService.Create(
-		ctx, session.Principal.ID, repo.ID, enum.WebhookParentRepo, typ, in,
+		ctx, &session.Principal, repo.ID, enum.WebhookParentRepo, typ, paths.Parent(repo.Path), repo.Identifier, in,
 	)
 	if err != nil {
-		return nil, fmt.Errorf("failed create webhook: %w", err)
+		return nil, fmt.Errorf("failed to create webhook: %w", err)
 	}
 
 	return hook, nil
diff --git a/app/api/controller/webhook/repo_delete.go b/app/api/controller/webhook/repo_delete.go
index e35390519..555b8ebb7 100644
--- a/app/api/controller/webhook/repo_delete.go
+++ b/app/api/controller/webhook/repo_delete.go
@@ -19,6 +19,7 @@ import (
 	"fmt"
 
 	"github.com/harness/gitness/app/auth"
+	"github.com/harness/gitness/app/paths"
 	"github.com/harness/gitness/types/enum"
 )
 
@@ -35,7 +36,8 @@ func (c *Controller) DeleteRepo(
 	}
 
 	return c.webhookService.Delete(
-		ctx, repo.ID, enum.WebhookParentRepo, webhookIdentifier,
+		ctx, &session.Principal, repo.ID, enum.WebhookParentRepo,
+		webhookIdentifier, paths.Parent(repo.Path), repo.Identifier,
 		c.preprocessor.IsInternalCall(session.Principal.Type),
 	)
 }
diff --git a/app/api/controller/webhook/repo_update.go b/app/api/controller/webhook/repo_update.go
index e5759f29e..af06d4736 100644
--- a/app/api/controller/webhook/repo_update.go
+++ b/app/api/controller/webhook/repo_update.go
@@ -19,6 +19,7 @@ import (
 	"fmt"
 
 	"github.com/harness/gitness/app/auth"
+	"github.com/harness/gitness/app/paths"
 	"github.com/harness/gitness/types"
 	"github.com/harness/gitness/types/enum"
 )
@@ -42,5 +43,7 @@ func (c *Controller) UpdateRepo(
 		return nil, fmt.Errorf("failed to preprocess update input: %w", err)
 	}
 
-	return c.webhookService.Update(ctx, repo.ID, enum.WebhookParentRepo, webhookIdentifier, typ, in)
+	return c.webhookService.Update(
+		ctx, &session.Principal, repo.ID, enum.WebhookParentRepo,
+		webhookIdentifier, typ, paths.Parent(repo.Path), repo.Identifier, in)
 }
diff --git a/app/api/controller/webhook/space_create.go b/app/api/controller/webhook/space_create.go
index 513b2436d..78fcf614d 100644
--- a/app/api/controller/webhook/space_create.go
+++ b/app/api/controller/webhook/space_create.go
@@ -41,7 +41,9 @@ func (c *Controller) CreateSpace(
 		return nil, fmt.Errorf("failed to preprocess create input: %w", err)
 	}
 
-	hook, err := c.webhookService.Create(ctx, session.Principal.ID, space.ID, enum.WebhookParentSpace, internal, in)
+	hook, err := c.webhookService.Create(ctx,
+		&session.Principal, space.ID, enum.WebhookParentSpace,
+		internal, space.Path, space.Identifier, in)
 	if err != nil {
 		return nil, fmt.Errorf("failed to create webhook: %w", err)
 	}
diff --git a/app/api/controller/webhook/space_delete.go b/app/api/controller/webhook/space_delete.go
index 1aaf26cdc..3dc565dee 100644
--- a/app/api/controller/webhook/space_delete.go
+++ b/app/api/controller/webhook/space_delete.go
@@ -35,7 +35,8 @@ func (c *Controller) DeleteSpace(
 	}
 
 	return c.webhookService.Delete(
-		ctx, space.ID, enum.WebhookParentSpace, webhookIdentifier,
+		ctx, &session.Principal, space.ID, enum.WebhookParentSpace,
+		webhookIdentifier, space.Path, space.Identifier,
 		c.preprocessor.IsInternalCall(session.Principal.Type),
 	)
 }
diff --git a/app/api/controller/webhook/space_update.go b/app/api/controller/webhook/space_update.go
index c85872ac1..9e2e6d727 100644
--- a/app/api/controller/webhook/space_update.go
+++ b/app/api/controller/webhook/space_update.go
@@ -43,6 +43,7 @@ func (c *Controller) UpdateSpace(
 	}
 
 	return c.webhookService.Update(
-		ctx, space.ID, enum.WebhookParentSpace, webhookIdentifier, typ, in,
+		ctx, &session.Principal, space.ID, enum.WebhookParentSpace,
+		webhookIdentifier, typ, space.Path, space.Identifier, in,
 	)
 }
diff --git a/app/api/request/gitspace.go b/app/api/request/gitspace.go
index a8dcf6c2c..c65cc3b9a 100644
--- a/app/api/request/gitspace.go
+++ b/app/api/request/gitspace.go
@@ -25,6 +25,8 @@ const (
 	PathParamGitspaceIdentifier = "gitspace_identifier"
 	QueryParamGitspaceOwner     = "gitspace_owner"
 	QueryParamGitspaceStates    = "gitspace_states"
+	QueryParamOrgs              = "org_identifiers"
+	QueryParamProjects          = "project_identifiers"
 )
 
 func GetGitspaceRefFromPath(r *http.Request) (string, error) {
@@ -63,6 +65,38 @@ func ParseGitspaceStates(r *http.Request) []enum.GitspaceFilterState {
 	return res
 }
 
+// ParseScopeFilter extracts scope filter from the url.
+func ParseScopeFilter(r *http.Request) types.ScopeFilter {
+	orgsTypesRaw := r.URL.Query()[QueryParamOrgs]
+	orgs := make([]string, 0, len(orgsTypesRaw))
+	orgsSet := make(map[string]struct{})
+	for _, pTypeRaw := range orgsTypesRaw {
+		if _, ok := orgsSet[pTypeRaw]; ok {
+			// already added
+			continue
+		}
+		orgs = append(orgs, pTypeRaw)
+		orgsSet[pTypeRaw] = struct{}{}
+	}
+
+	projectsTypesRaw := r.URL.Query()[QueryParamProjects]
+	projects := make([]string, 0, len(projectsTypesRaw))
+	projectsSet := make(map[string]struct{})
+	for _, pTypeRaw := range projectsTypesRaw {
+		if _, ok := projectsSet[pTypeRaw]; ok {
+			// already added
+			continue
+		}
+		projects = append(projects, pTypeRaw)
+		projectsSet[pTypeRaw] = struct{}{}
+	}
+
+	return types.ScopeFilter{
+		Orgs:     orgs,
+		Projects: projects,
+	}
+}
+
 // ParseGitspaceFilter extracts the gitspace filter from the url.
 func ParseGitspaceFilter(r *http.Request) types.GitspaceFilter {
 	return types.GitspaceFilter{
@@ -71,5 +105,6 @@ func ParseGitspaceFilter(r *http.Request) types.GitspaceFilter {
 		Sort:                 ParseGitspaceSort(r),
 		Owner:                ParseGitspaceOwner(r),
 		Order:                ParseOrder(r),
+		ScopeFilter:          ParseScopeFilter(r),
 	}
 }
diff --git a/app/gitspace/orchestrator/orchestrator_trigger.go b/app/gitspace/orchestrator/orchestrator_trigger.go
index 4bbf2870c..8bb68e206 100644
--- a/app/gitspace/orchestrator/orchestrator_trigger.go
+++ b/app/gitspace/orchestrator/orchestrator_trigger.go
@@ -385,39 +385,19 @@ func (o Orchestrator) TriggerDeleteGitspace(
 		}
 	}
 
-	// If marked for reset, skip container removal and waiting
-	if gitspaceConfig.IsMarkedForReset && infra.ProviderType != enum.InfraProviderTypeDocker {
-		if err := o.triggerDeleteGitspace(ctx, gitspaceConfig, infra, canDeleteUserData); err != nil {
+	if infra.ProviderType == enum.InfraProviderTypeDocker {
+		if err = o.removeGitspaceContainer(ctx, gitspaceConfig, *infra, canDeleteUserData); err != nil {
 			return &types.GitspaceError{
 				Error:        err,
 				ErrorMessage: ptr.String(err.Error()),
 			}
 		}
-		return nil
 	}
 
-	if err = o.removeGitspaceContainer(ctx, gitspaceConfig, *infra, canDeleteUserData); err != nil {
-		log.Warn().Msgf("error stopping and removing gitspace container: %v", err)
-		// If stop fails, delete the gitspace anyway
-		if err := o.triggerDeleteGitspace(ctx, gitspaceConfig, infra, canDeleteUserData); err != nil {
-			return &types.GitspaceError{
-				Error:        err,
-				ErrorMessage: ptr.String(err.Error()),
-			}
-		}
-	}
-
-	// TODO: Add a job for cleanup of infra if stop fails
-	log.Warn().Msgf(
-		"Checking and force deleting the infra if required for gitspace instance %s",
-		gitspaceConfig.GitspaceInstance.Identifier,
-	)
-	if err = o.waitForGitspaceCleanupOrTimeout(ctx, gitspaceConfig, 15*time.Minute, 60*time.Second); err != nil {
-		if err := o.triggerDeleteGitspace(ctx, gitspaceConfig, infra, canDeleteUserData); err != nil {
-			return &types.GitspaceError{
-				Error:        err,
-				ErrorMessage: ptr.String(err.Error()),
-			}
+	if err := o.triggerDeleteGitspace(ctx, gitspaceConfig, infra, canDeleteUserData); err != nil {
+		return &types.GitspaceError{
+			Error:        err,
+			ErrorMessage: ptr.String(err.Error()),
 		}
 	}
 	return nil
@@ -452,41 +432,6 @@ func (o Orchestrator) triggerDeleteGitspace(
 	return nil
 }
 
-func (o Orchestrator) waitForGitspaceCleanupOrTimeout(
-	ctx context.Context,
-	gitspaceConfig types.GitspaceConfig,
-	timeoutDuration time.Duration,
-	tickInterval time.Duration,
-) error {
-	ticker := time.NewTicker(tickInterval)
-	defer ticker.Stop()
-
-	timeout := time.After(timeoutDuration)
-
-	for {
-		select {
-		case <-ticker.C:
-			instance, err := o.gitspaceInstanceStore.Find(ctx, gitspaceConfig.GitspaceInstance.ID)
-			if err != nil {
-				return fmt.Errorf(
-					"failed to find gitspace instance %s: %w",
-					gitspaceConfig.GitspaceInstance.Identifier,
-					err,
-				)
-			}
-			if instance.State == enum.GitspaceInstanceStateDeleted ||
-				instance.State == enum.GitspaceInstanceStateCleaned {
-				return nil
-			}
-		case <-timeout:
-			return fmt.Errorf(
-				"timeout waiting for gitspace cleanup for instance %s",
-				gitspaceConfig.GitspaceInstance.Identifier,
-			)
-		}
-	}
-}
-
 func (o Orchestrator) emitGitspaceEvent(
 	ctx context.Context,
 	config types.GitspaceConfig,
diff --git a/app/services/infraprovider/create_config_and_resources.go b/app/services/infraprovider/create_config_and_resources.go
index e592dea8a..8b21aea8d 100644
--- a/app/services/infraprovider/create_config_and_resources.go
+++ b/app/services/infraprovider/create_config_and_resources.go
@@ -35,8 +35,8 @@ func (c *Service) CreateConfigAndResources(
 		if err != nil {
 			return fmt.Errorf("could not create the config: %q %w", infraProviderConfig.Identifier, err)
 		}
-		err = c.createMissingResources(ctx, infraProviderConfig.Resources, configID,
-			infraProviderConfig.SpaceID, *infraProviderConfig)
+		err = c.upsertResources(ctx, infraProviderConfig.Resources, configID,
+			infraProviderConfig.SpaceID, *infraProviderConfig, false)
 		if err != nil {
 			return fmt.Errorf("could not create the resources: %v %w", infraProviderConfig.Resources, err)
 		}
diff --git a/app/services/infraprovider/create_resource.go b/app/services/infraprovider/create_resource.go
index c880cee7b..9b8fb69c1 100644
--- a/app/services/infraprovider/create_resource.go
+++ b/app/services/infraprovider/create_resource.go
@@ -37,7 +37,7 @@ func (c *Service) CreateResources(
 	}
 
 	err = c.tx.WithTx(ctx, func(ctx context.Context) error {
-		return c.createMissingResources(ctx, resources, config.ID, spaceID, *config)
+		return c.upsertResources(ctx, resources, config.ID, spaceID, *config, false)
 	})
 	if err != nil {
 		return fmt.Errorf("failed to complete create txn for the infraprovider resource %w", err)
@@ -45,12 +45,13 @@ func (c *Service) CreateResources(
 	return nil
 }
 
-func (c *Service) createMissingResources(
+func (c *Service) upsertResources(
 	ctx context.Context,
 	resources []types.InfraProviderResource,
 	configID int64,
 	spaceID int64,
 	config types.InfraProviderConfig,
+	allowUpdates bool,
 ) error {
 	emptyStr := ""
 	for idx := range resources {
@@ -83,11 +84,28 @@ func (c *Service) createMissingResources(
 		}
 		existingResource, err := c.infraProviderResourceStore.FindByConfigAndIdentifier(ctx, resource.SpaceID,
 			configID, resource.UID)
-		if (err != nil && errors.Is(err, store.ErrResourceNotFound)) || existingResource == nil {
+		if err != nil { //nolint:nestif
+			if !errors.Is(err, store.ErrResourceNotFound) {
+				return fmt.Errorf("failed to check existing resource %s: %w", resource.UID, err)
+			}
+			// Resource doesn't exist, create it
 			if err = c.infraProviderResourceStore.Create(ctx, resource); err != nil {
 				return fmt.Errorf("failed to create infraprovider resource for %s: %w", resource.UID, err)
 			}
-			log.Info().Msgf("created new resource %s/%s", resource.InfraProviderConfigIdentifier, resource.UID)
+		} else {
+			// Resource exists
+			if allowUpdates {
+				if err := c.updateExistingResource(ctx, resource, existingResource); err != nil {
+					return fmt.Errorf("failed to update existing resource %s: %w", resource.UID, err)
+				}
+				log.Info().Msgf(
+					"updated existing resource %s/%s",
+					resource.InfraProviderConfigIdentifier,
+					resource.UID,
+				)
+			} else {
+				return fmt.Errorf("resource %s already exists", resource.UID)
+			}
 		}
 	}
 	return nil
@@ -165,3 +183,24 @@ func getMetadataVal(metadata map[string]string, key string) string {
 	}
 	return ""
 }
+
+// updateExistingResource updates an existing resource with new information while preserving
+// immutable fields.
+func (c *Service) updateExistingResource(
+	ctx context.Context,
+	resource *types.InfraProviderResource,
+	existingResource *types.InfraProviderResource,
+) error {
+	// Keep the ID and created timestamp from the existing resource
+	resource.ID = existingResource.ID
+	resource.Created = existingResource.Created
+
+	// Preserve immutable fields
+	resource.UID = existingResource.UID
+	resource.InfraProviderConfigID = existingResource.InfraProviderConfigID
+	resource.SpaceID = existingResource.SpaceID
+	resource.InfraProviderType = existingResource.InfraProviderType
+
+	// Update the resource
+	return c.infraProviderResourceStore.Update(ctx, resource)
+}
diff --git a/app/services/infraprovider/upsert.go b/app/services/infraprovider/upsert.go
index eac96e67c..3184b5004 100644
--- a/app/services/infraprovider/upsert.go
+++ b/app/services/infraprovider/upsert.go
@@ -71,8 +71,16 @@ func (c *Service) upsertConfigAndResources(
 	}
 
 	log.Info().Msgf("updated infraconfig %s", infraProviderConfig.Identifier)
-	if err = c.createMissingResources(ctx, infraProviderResources, infraProviderConfigID, space.ID,
-		*infraProviderConfig); err != nil {
+
+	// upsert instead of create
+	if err = c.upsertResources(
+		ctx,
+		infraProviderResources,
+		infraProviderConfigID,
+		space.ID,
+		*infraProviderConfig,
+		true,
+	); err != nil {
 		return err
 	}
 	return nil
diff --git a/app/services/webhook/common.go b/app/services/webhook/common.go
index 3de91adb6..b74155216 100644
--- a/app/services/webhook/common.go
+++ b/app/services/webhook/common.go
@@ -19,6 +19,7 @@ import (
 	"net"
 	"net/url"
 
+	"github.com/harness/gitness/audit"
 	"github.com/harness/gitness/errors"
 	"github.com/harness/gitness/types"
 	"github.com/harness/gitness/types/check"
@@ -83,7 +84,7 @@ func CheckURL(rawURL string, allowLoopback bool, allowPrivateNetwork bool, inter
 	return nil
 }
 
-// checkSecret validates the secret of a webhook.
+// CheckSecret validates the secret of a webhook.
 func CheckSecret(secret string) error {
 	if len(secret) > webhookMaxSecretLength {
 		return check.NewValidationErrorf("The secret of a webhook can be at most %d characters long.",
@@ -132,6 +133,16 @@ func ConvertTriggers(vals []string) []enum.WebhookTrigger {
 	return res
 }
 
+func webhookToResourceType(parentType enum.WebhookParent) audit.ResourceType {
+	switch parentType {
+	case enum.WebhookParentSpace, enum.WebhookParentRepo:
+		return audit.ResourceTypeCodeWebhook
+	case enum.WebhookParentRegistry:
+		return audit.ResourceTypeRegistryWebhook
+	}
+	return audit.ResourceTypeCodeWebhook
+}
+
 func (s *Service) sendSSE(
 	ctx context.Context,
 	parentID int64,
diff --git a/app/services/webhook/create.go b/app/services/webhook/create.go
index 89e29f005..08ee18e14 100644
--- a/app/services/webhook/create.go
+++ b/app/services/webhook/create.go
@@ -20,6 +20,7 @@ import (
 	"time"
 
 	"github.com/harness/gitness/app/store/database/migrate"
+	"github.com/harness/gitness/audit"
 	"github.com/harness/gitness/errors"
 	"github.com/harness/gitness/store"
 	"github.com/harness/gitness/types"
@@ -74,10 +75,12 @@ func (s *Service) sanitizeCreateInput(in *types.WebhookCreateInput, internal boo
 
 func (s *Service) Create(
 	ctx context.Context,
-	principalID int64,
+	principal *types.Principal,
 	parentID int64,
 	parentType enum.WebhookParent,
 	typ enum.WebhookType,
+	spacePath string,
+	scopeIdentifier string,
 	in *types.WebhookCreateInput,
 ) (*types.Webhook, error) {
 	err := s.sanitizeCreateInput(in, typ == enum.WebhookTypeInternal)
@@ -91,7 +94,9 @@ func (s *Service) Create(
 	}
 
 	scope := webhookScopeRepo
+	nameKey := audit.RepoName
 	if parentType == enum.WebhookParentSpace {
+		nameKey = audit.SpaceName
 		scope, err = s.spaceStore.GetTreeLevel(ctx, parentID)
 		if err != nil {
 			return nil, fmt.Errorf("failed to get parent tree level: %w", err)
@@ -103,7 +108,7 @@ func (s *Service) Create(
 	hook := &types.Webhook{
 		ID:         0, // the ID will be populated in the data layer
 		Version:    0, // the Version will be populated in the data layer
-		CreatedBy:  principalID,
+		CreatedBy:  principal.ID,
 		Created:    now,
 		Updated:    now,
 		ParentID:   parentID,
@@ -124,9 +129,8 @@ func (s *Service) Create(
 	}
 
 	err = s.webhookStore.Create(ctx, hook)
-
 	// internal hooks are hidden from non-internal read requests - properly communicate their existence on duplicate.
-	// This is best effort, any error we just ignore and fallback to original duplicate error.
+	// This is the best effort, any error we just ignore and fallback to original duplicate error.
 	if errors.Is(err, store.ErrDuplicate) && !(typ == enum.WebhookTypeInternal) {
 		existingHook, derr := s.webhookStore.FindByIdentifier(
 			ctx, enum.WebhookParentRepo, parentID, hook.Identifier)
@@ -141,11 +145,21 @@ func (s *Service) Create(
 			return nil, errors.Conflict("The provided identifier is reserved for internal purposes.")
 		}
 	}
-
 	if err != nil {
 		return nil, fmt.Errorf("failed to store webhook: %w", err)
 	}
 
+	err = s.auditService.Log(ctx,
+		*principal,
+		audit.NewResource(webhookToResourceType(parentType), hook.Identifier, nameKey, scopeIdentifier),
+		audit.ActionCreated,
+		spacePath,
+		audit.WithNewObject(hook),
+	)
+	if err != nil {
+		log.Ctx(ctx).Warn().Msgf("failed to insert audit log for create webhook operation: %s", err)
+	}
+
 	s.sendSSE(ctx, parentID, parentType, enum.SSETypeWebhookCreated, hook)
 
 	return hook, nil
diff --git a/app/services/webhook/delete.go b/app/services/webhook/delete.go
index 19b365bfe..57aa21737 100644
--- a/app/services/webhook/delete.go
+++ b/app/services/webhook/delete.go
@@ -17,15 +17,22 @@ package webhook
 import (
 	"context"
 
+	"github.com/harness/gitness/audit"
+	"github.com/harness/gitness/types"
 	"github.com/harness/gitness/types/enum"
+
+	"github.com/rs/zerolog/log"
 )
 
 // Delete deletes an existing webhook.
 func (s *Service) Delete(
 	ctx context.Context,
+	principal *types.Principal,
 	parentID int64,
 	parentType enum.WebhookParent,
 	webhookIdentifier string,
+	spacePath string,
+	scopeIdentifier string,
 	allowDeletingInternal bool,
 ) error {
 	hook, err := s.GetWebhookVerifyOwnership(ctx, parentID, parentType, webhookIdentifier)
@@ -41,6 +48,21 @@ func (s *Service) Delete(
 		return err
 	}
 
+	nameKey := audit.RepoName
+	if parentType == enum.WebhookParentSpace {
+		nameKey = audit.SpaceName
+	}
+	err = s.auditService.Log(ctx,
+		*principal,
+		audit.NewResource(webhookToResourceType(parentType), hook.Identifier, nameKey, scopeIdentifier),
+		audit.ActionDeleted,
+		spacePath,
+		audit.WithOldObject(hook),
+	)
+	if err != nil {
+		log.Ctx(ctx).Warn().Msgf("failed to insert audit log for delete webhook operation: %s", err)
+	}
+
 	s.sendSSE(ctx, parentID, parentType, enum.SSETypeWebhookDeleted, hook)
 
 	return nil
diff --git a/app/services/webhook/service.go b/app/services/webhook/service.go
index c1492dc9a..dbf35cd23 100644
--- a/app/services/webhook/service.go
+++ b/app/services/webhook/service.go
@@ -26,6 +26,7 @@ import (
 	"github.com/harness/gitness/app/sse"
 	"github.com/harness/gitness/app/store"
 	"github.com/harness/gitness/app/url"
+	"github.com/harness/gitness/audit"
 	"github.com/harness/gitness/encrypt"
 	"github.com/harness/gitness/events"
 	"github.com/harness/gitness/git"
@@ -164,6 +165,7 @@ type Service struct {
 	labelValueStore       store.LabelValueStore
 	encrypter             encrypt.Encrypter
 	config                Config
+	auditService          audit.Service
 	sseStreamer           sse.Streamer
 }
 
@@ -186,6 +188,7 @@ func NewService(
 	labelStore store.LabelStore,
 	webhookURLProvider URLProvider,
 	labelValueStore store.LabelValueStore,
+	auditService audit.Service,
 	sseStreamer sse.Streamer,
 	secretService secret.Service,
 	spacePathStore store.SpacePathStore,
@@ -216,6 +219,7 @@ func NewService(
 		config:                config,
 		labelStore:            labelStore,
 		labelValueStore:       labelValueStore,
+		auditService:          auditService,
 		sseStreamer:           sseStreamer,
 	}
 
diff --git a/app/services/webhook/repository.go b/app/services/webhook/store.go
similarity index 92%
rename from app/services/webhook/repository.go
rename to app/services/webhook/store.go
index 568447e9b..06319626e 100644
--- a/app/services/webhook/repository.go
+++ b/app/services/webhook/store.go
@@ -65,10 +65,14 @@ func (s *GitnessWebhookExecutorStore) ListForTrigger(
 
 func (s *GitnessWebhookExecutorStore) CreateWebhookExecution(
 	ctx context.Context,
-	hook *types.WebhookExecutionCore,
+	executionCore *types.WebhookExecutionCore,
 ) error {
-	webhookExecution := CoreWebhookExecutionToGitnessWebhookExecution(hook)
-	return s.webhookExecutionStore.Create(ctx, webhookExecution)
+	execution := CoreWebhookExecutionToGitnessWebhookExecution(executionCore)
+	if err := s.webhookExecutionStore.Create(ctx, execution); err != nil {
+		return err
+	}
+	executionCore.ID = execution.ID
+	return nil
 }
 
 func (s *GitnessWebhookExecutorStore) UpdateOptLock(
diff --git a/app/services/webhook/update.go b/app/services/webhook/update.go
index 01f012288..39e5fb7c2 100644
--- a/app/services/webhook/update.go
+++ b/app/services/webhook/update.go
@@ -19,9 +19,12 @@ import (
 	"errors"
 	"fmt"
 
+	"github.com/harness/gitness/audit"
 	"github.com/harness/gitness/types"
 	"github.com/harness/gitness/types/check"
 	"github.com/harness/gitness/types/enum"
+
+	"github.com/rs/zerolog/log"
 )
 
 func (s *Service) sanitizeUpdateInput(in *types.WebhookUpdateInput) error {
@@ -67,16 +70,20 @@ func (s *Service) sanitizeUpdateInput(in *types.WebhookUpdateInput) error {
 
 func (s *Service) Update(
 	ctx context.Context,
+	principal *types.Principal,
 	parentID int64,
 	parentType enum.WebhookParent,
 	webhookIdentifier string,
 	typ enum.WebhookType,
+	spacePath string,
+	scopeIdentifier string,
 	in *types.WebhookUpdateInput,
 ) (*types.Webhook, error) {
 	hook, err := s.GetWebhookVerifyOwnership(ctx, parentID, parentType, webhookIdentifier)
 	if err != nil {
 		return nil, fmt.Errorf("failed to verify webhook ownership: %w", err)
 	}
+	oldHook := hook.Clone()
 
 	if err := s.sanitizeUpdateInput(in); err != nil {
 		return nil, err
@@ -120,6 +127,22 @@ func (s *Service) Update(
 		return nil, err
 	}
 
+	nameKey := audit.RepoName
+	if parentType == enum.WebhookParentSpace {
+		nameKey = audit.SpaceName
+	}
+	err = s.auditService.Log(ctx,
+		*principal,
+		audit.NewResource(audit.ResourceTypeCodeWebhook, hook.Identifier, nameKey, scopeIdentifier),
+		audit.ActionUpdated,
+		spacePath,
+		audit.WithOldObject(oldHook),
+		audit.WithNewObject(hook),
+	)
+	if err != nil {
+		log.Ctx(ctx).Warn().Msgf("failed to insert audit log for update webhook operation: %s", err)
+	}
+
 	s.sendSSE(ctx, parentID, parentType, enum.SSETypeWebhookUpdated, hook)
 
 	return hook, nil
diff --git a/app/services/webhook/wire.go b/app/services/webhook/wire.go
index de0fabdd7..a11513343 100644
--- a/app/services/webhook/wire.go
+++ b/app/services/webhook/wire.go
@@ -22,6 +22,7 @@ import (
 	"github.com/harness/gitness/app/sse"
 	"github.com/harness/gitness/app/store"
 	"github.com/harness/gitness/app/url"
+	"github.com/harness/gitness/audit"
 	"github.com/harness/gitness/encrypt"
 	"github.com/harness/gitness/events"
 	"github.com/harness/gitness/git"
@@ -56,6 +57,7 @@ func ProvideService(
 	labelStore store.LabelStore,
 	webhookURLProvider URLProvider,
 	labelValueStore store.LabelValueStore,
+	auditService audit.Service,
 	sseStreamer sse.Streamer,
 	secretService secret.Service,
 	spacePathStore store.SpacePathStore,
@@ -78,6 +80,7 @@ func ProvideService(
 		labelStore,
 		webhookURLProvider,
 		labelValueStore,
+		auditService,
 		sseStreamer,
 		secretService,
 		spacePathStore,
diff --git a/app/store/database.go b/app/store/database.go
index 8c2e086d7..41456b75c 100644
--- a/app/store/database.go
+++ b/app/store/database.go
@@ -830,6 +830,9 @@ type (
 			filter types.ListQueryFilter,
 		) ([]*types.InfraProviderResource, error)
 
+		// Update tries to update the infra provider resource in the datastore
+		Update(ctx context.Context, infraProviderResource *types.InfraProviderResource) error
+
 		// Delete soft deletes the Infra provider resource with the given id.
 		Delete(ctx context.Context, id int64) error
 	}
diff --git a/app/store/database/infra_provider_resource.go b/app/store/database/infra_provider_resource.go
index 27b3f6905..a8f4d479c 100644
--- a/app/store/database/infra_provider_resource.go
+++ b/app/store/database/infra_provider_resource.go
@@ -262,6 +262,8 @@ type InfraProviderResourceView struct {
 	spaceStore store.SpaceStore
 }
 
+var _ store.InfraProviderResourceView = (*InfraProviderResourceView)(nil)
+
 func (i InfraProviderResourceView) Find(ctx context.Context, id int64) (*types.InfraProviderResource, error) {
 	stmt := database.Builder.
 		Select(infraProviderResourceSelectColumns).
@@ -349,3 +351,41 @@ func (s infraProviderResourceStore) Delete(ctx context.Context, id int64) error
 	}
 	return nil
 }
+
+// Update updates an existing infra provider resource in the database.
+func (s infraProviderResourceStore) Update(
+	ctx context.Context,
+	infraProviderResource *types.InfraProviderResource,
+) error {
+	metadata, err := json.Marshal(infraProviderResource.Metadata)
+	if err != nil {
+		return errors.Wrap(err, "Failed to marshal metadata")
+	}
+
+	now := time.Now().UnixMilli()
+	infraProviderResource.Updated = now
+
+	stmt := database.Builder.
+		Update(infraProviderResourceTable).
+		Set("ipreso_display_name", infraProviderResource.Name).
+		Set("ipreso_updated", infraProviderResource.Updated).
+		Set("ipreso_cpu", infraProviderResource.CPU).
+		Set("ipreso_memory", infraProviderResource.Memory).
+		Set("ipreso_disk", infraProviderResource.Disk).
+		Set("ipreso_network", infraProviderResource.Network).
+		Set("ipreso_region", infraProviderResource.Region).
+		Set("ipreso_metadata", metadata).
+		Set("ipreso_is_deleted", infraProviderResource.IsDeleted).
+		Set("ipreso_deleted", infraProviderResource.Deleted).
+		Where("ipreso_id = ?", infraProviderResource.ID)
+	sql, args, err := stmt.ToSql()
+	if err != nil {
+		return errors.Wrap(err, "Failed to convert squirrel builder to sql")
+	}
+	db := dbtx.GetAccessor(ctx, s.db)
+	if _, err := db.ExecContext(ctx, sql, args...); err != nil {
+		return database.ProcessSQLErrorf(
+			ctx, err, "infra provider resource update failed %s", infraProviderResource.UID)
+	}
+	return nil
+}
diff --git a/app/store/database/migrate/postgres/0134_create_quarantine_performance_indexes.down.sql b/app/store/database/migrate/postgres/0134_create_quarantine_performance_indexes.down.sql
new file mode 100644
index 000000000..d8128c990
--- /dev/null
+++ b/app/store/database/migrate/postgres/0134_create_quarantine_performance_indexes.down.sql
@@ -0,0 +1,6 @@
+DROP INDEX IF EXISTS idx_manifests_id_registry_image_name;
+DROP INDEX IF EXISTS idx_tags_manifest_id_image_name;
+
+ALTER TABLE quarantined_paths DROP CONSTRAINT IF EXISTS uq_quarantined_paths_composite;
+ALTER TABLE quarantined_paths ADD CONSTRAINT uq_quarantined_paths_composite 
+    UNIQUE (quarantined_path_registry_id, quarantined_path_artifact_id, quarantined_path_image_id, quarantined_path_node_id);
diff --git a/app/store/database/migrate/postgres/0134_create_quarantine_performance_indexes.up.sql b/app/store/database/migrate/postgres/0134_create_quarantine_performance_indexes.up.sql
new file mode 100644
index 000000000..4fec684c0
--- /dev/null
+++ b/app/store/database/migrate/postgres/0134_create_quarantine_performance_indexes.up.sql
@@ -0,0 +1,11 @@
+ALTER TABLE quarantined_paths DROP CONSTRAINT IF EXISTS uq_quarantined_paths_composite;
+
+ALTER TABLE quarantined_paths ADD CONSTRAINT uq_quarantined_paths_composite 
+    UNIQUE (quarantined_path_registry_id, quarantined_path_image_id, quarantined_path_artifact_id, quarantined_path_node_id);
+
+CREATE INDEX IF NOT EXISTS idx_manifests_id_registry_image_name
+    ON manifests (manifest_id, manifest_registry_id, manifest_image_name);
+
+CREATE INDEX IF NOT EXISTS idx_tags_manifest_id_image_name
+    ON tags (tag_manifest_id, tag_name);
+
diff --git a/app/store/database/migrate/sqlite/0134_create_quarantine_performance_indexes.down.sql b/app/store/database/migrate/sqlite/0134_create_quarantine_performance_indexes.down.sql
new file mode 100644
index 000000000..95695c75b
--- /dev/null
+++ b/app/store/database/migrate/sqlite/0134_create_quarantine_performance_indexes.down.sql
@@ -0,0 +1,18 @@
+DROP INDEX IF EXISTS idx_manifests_id_registry_image_name;
+DROP INDEX IF EXISTS idx_tags_manifest_id_name;
+
+CREATE TABLE quarantined_paths_temp (
+    quarantined_path_id TEXT PRIMARY KEY,
+    quarantined_path_registry_id INTEGER NOT NULL,
+    quarantined_path_image_id INTEGER REFERENCES images (image_id) ON DELETE CASCADE,
+    quarantined_path_artifact_id INTEGER REFERENCES artifacts (artifact_id) ON DELETE CASCADE,
+    quarantined_path_node_id TEXT REFERENCES nodes (node_id) ON DELETE CASCADE,
+    quarantined_path_reason TEXT NOT NULL,
+    quarantined_path_created_by INTEGER NOT NULL,
+    quarantined_path_created_at INTEGER NOT NULL,
+    FOREIGN KEY (quarantined_path_registry_id) REFERENCES registries (registry_id) ON DELETE CASCADE,
+    UNIQUE (quarantined_path_registry_id, quarantined_path_artifact_id, quarantined_path_image_id, quarantined_path_node_id)
+);
+INSERT INTO quarantined_paths_temp SELECT * FROM quarantined_paths;
+DROP TABLE quarantined_paths;
+ALTER TABLE quarantined_paths_temp RENAME TO quarantined_paths;
diff --git a/app/store/database/migrate/sqlite/0134_create_quarantine_performance_indexes.up.sql b/app/store/database/migrate/sqlite/0134_create_quarantine_performance_indexes.up.sql
new file mode 100644
index 000000000..b658427ba
--- /dev/null
+++ b/app/store/database/migrate/sqlite/0134_create_quarantine_performance_indexes.up.sql
@@ -0,0 +1,22 @@
+CREATE TABLE quarantined_paths_temp (
+    quarantined_path_id TEXT PRIMARY KEY,
+    quarantined_path_registry_id INTEGER NOT NULL,
+    quarantined_path_image_id INTEGER REFERENCES images (image_id) ON DELETE CASCADE,
+    quarantined_path_artifact_id INTEGER REFERENCES artifacts (artifact_id) ON DELETE CASCADE,
+    quarantined_path_node_id TEXT REFERENCES nodes (node_id) ON DELETE CASCADE,
+    quarantined_path_reason TEXT NOT NULL,
+    quarantined_path_created_by INTEGER NOT NULL,
+    quarantined_path_created_at INTEGER NOT NULL,
+    FOREIGN KEY (quarantined_path_registry_id) REFERENCES registries (registry_id) ON DELETE CASCADE,
+    UNIQUE (quarantined_path_registry_id, quarantined_path_image_id, quarantined_path_artifact_id, quarantined_path_node_id)
+);
+
+INSERT INTO quarantined_paths_temp SELECT * FROM quarantined_paths;
+DROP TABLE quarantined_paths;
+ALTER TABLE quarantined_paths_temp RENAME TO quarantined_paths;
+
+CREATE INDEX IF NOT EXISTS idx_manifests_id_registry_image_name
+    ON manifests (manifest_id, manifest_registry_id, manifest_image_name);
+
+CREATE INDEX IF NOT EXISTS idx_tags_manifest_id_name
+    ON tags (tag_manifest_id, tag_name);
diff --git a/app/store/database/repo.go b/app/store/database/repo.go
index f21a77a91..920ed31cc 100644
--- a/app/store/database/repo.go
+++ b/app/store/database/repo.go
@@ -758,7 +758,11 @@ func (s *RepoStore) ListSizeInfos(ctx context.Context) ([]*types.RepositorySizeI
 		Select("repo_id", "repo_git_uid", "repo_size", "repo_lfs_size", "repo_size_updated").
 		From("repositories").
 		Where("repo_last_git_push >= repo_size_updated").
-		Where("repo_deleted IS NULL")
+		Where("repo_deleted IS NULL").
+		Where("repo_state NOT IN (?, ?)",
+			enum.RepoStateGitImport,
+			enum.RepoStateMigrateGitPush,
+		)
 
 	sql, args, err := stmt.ToSql()
 	if err != nil {
diff --git a/audit/audit.go b/audit/audit.go
index 926d5a97f..3ba345959 100644
--- a/audit/audit.go
+++ b/audit/audit.go
@@ -80,8 +80,10 @@ const (
 	ResourceTypePushRule              ResourceType = "push_rule"
 	ResourceTypePullRequest           ResourceType = "pull_request"
 	ResourceTypeRepositorySettings    ResourceType = "repository_settings"
+	ResourceTypeCodeWebhook           ResourceType = "code_webhook"
 	ResourceTypeRegistry              ResourceType = "registry"
 	ResourceTypeRegistryUpstreamProxy ResourceType = "registry_upstream_proxy"
+	ResourceTypeRegistryWebhook       ResourceType = "registry_webhook"
 	ResourceTypeRegistryArtifact      ResourceType = "registry_artifact"
 )
 
@@ -95,8 +97,10 @@ func (a ResourceType) Validate() error {
 		ResourceTypePushRule,
 		ResourceTypePullRequest,
 		ResourceTypeRepositorySettings,
+		ResourceTypeCodeWebhook,
 		ResourceTypeRegistry,
 		ResourceTypeRegistryUpstreamProxy,
+		ResourceTypeRegistryWebhook,
 		ResourceTypeRegistryArtifact:
 		return nil
 
diff --git a/cmd/gitness/wire_gen.go b/cmd/gitness/wire_gen.go
index 5730ffb22..eb59a37d1 100644
--- a/cmd/gitness/wire_gen.go
+++ b/cmd/gitness/wire_gen.go
@@ -132,10 +132,12 @@ import (
 	api2 "github.com/harness/gitness/registry/app/api"
 	cargo3 "github.com/harness/gitness/registry/app/api/controller/pkg/cargo"
 	gopackage2 "github.com/harness/gitness/registry/app/api/controller/pkg/gopackage"
+	huggingface2 "github.com/harness/gitness/registry/app/api/controller/pkg/huggingface"
 	npm2 "github.com/harness/gitness/registry/app/api/controller/pkg/npm"
 	nuget2 "github.com/harness/gitness/registry/app/api/controller/pkg/nuget"
 	python2 "github.com/harness/gitness/registry/app/api/controller/pkg/python"
 	rpm2 "github.com/harness/gitness/registry/app/api/controller/pkg/rpm"
+	huggingface3 "github.com/harness/gitness/registry/app/api/handler/huggingface"
 	"github.com/harness/gitness/registry/app/api/router"
 	"github.com/harness/gitness/registry/app/events/artifact"
 	"github.com/harness/gitness/registry/app/events/asyncprocessing"
@@ -146,6 +148,7 @@ import (
 	"github.com/harness/gitness/registry/app/pkg/filemanager"
 	"github.com/harness/gitness/registry/app/pkg/generic"
 	"github.com/harness/gitness/registry/app/pkg/gopackage"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
 	"github.com/harness/gitness/registry/app/pkg/maven"
 	"github.com/harness/gitness/registry/app/pkg/npm"
 	"github.com/harness/gitness/registry/app/pkg/nuget"
@@ -458,7 +461,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
 	webhookExecutionStore := database.ProvideWebhookExecutionStore(db)
 	urlProvider := webhook.ProvideURLProvider(ctx)
 	secretService := secret3.ProvideSecretService(secretStore, encrypter, spaceFinder)
-	webhookService, err := webhook.ProvideService(ctx, webhookConfig, transactor, readerFactory, eventsReaderFactory, webhookStore, webhookExecutionStore, spaceStore, repoStore, pullReqStore, pullReqActivityStore, provider, principalStore, gitInterface, encrypter, labelStore, urlProvider, labelValueStore, streamer, secretService, spacePathStore)
+	webhookService, err := webhook.ProvideService(ctx, webhookConfig, transactor, readerFactory, eventsReaderFactory, webhookStore, webhookExecutionStore, spaceStore, repoStore, pullReqStore, pullReqActivityStore, provider, principalStore, gitInterface, encrypter, labelStore, urlProvider, labelValueStore, auditService, streamer, secretService, spacePathStore)
 	if err != nil {
 		return nil, err
 	}
@@ -529,12 +532,13 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
 	registryBlobRepository := database2.ProvideRegistryBlobDao(db)
 	bandwidthStatRepository := database2.ProvideBandwidthStatDao(db)
 	downloadStatRepository := database2.ProvideDownloadStatDao(db)
-	localRegistry := docker.LocalRegistryProvider(app, manifestService, blobRepository, registryRepository, manifestRepository, registryBlobRepository, mediaTypesRepository, tagRepository, imageRepository, artifactRepository, bandwidthStatRepository, downloadStatRepository, gcService, transactor, eventReporter)
+	quarantineArtifactRepository := database2.ProvideQuarantineArtifactDao(db)
+	localRegistry := docker.LocalRegistryProvider(app, manifestService, blobRepository, registryRepository, manifestRepository, registryBlobRepository, mediaTypesRepository, tagRepository, imageRepository, artifactRepository, bandwidthStatRepository, downloadStatRepository, gcService, transactor, eventReporter, quarantineArtifactRepository)
 	upstreamProxyConfigRepository := database2.ProvideUpstreamDao(db, registryRepository, spaceFinder)
 	proxyController := docker.ProvideProxyController(localRegistry, manifestService, secretService, spaceFinder)
 	remoteRegistry := docker.RemoteRegistryProvider(localRegistry, app, upstreamProxyConfigRepository, spaceFinder, secretService, proxyController)
 	coreController := pkg.CoreControllerProvider(registryRepository)
-	dbStore := docker.DBStoreProvider(blobRepository, imageRepository, artifactRepository, bandwidthStatRepository, downloadStatRepository)
+	dbStore := docker.DBStoreProvider(blobRepository, imageRepository, artifactRepository, bandwidthStatRepository, downloadStatRepository, manifestRepository, quarantineArtifactRepository)
 	dockerController := docker.ControllerProvider(localRegistry, remoteRegistry, coreController, spaceStore, authorizer, dbStore, spaceFinder)
 	evictor2 := cache2.ProvideEvictorRegistryCore(pubSub)
 	registryIDCache := cache2.ProvideRegistryIDCache(ctx, registryRepository, evictor2)
@@ -564,8 +568,7 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
 		return nil, err
 	}
 	registryHelper := cargo.LocalRegistryHelperProvider(fileManager, artifactRepository, spaceFinder)
-	quarantineArtifactRepository := database2.ProvideQuarantineArtifactDao(db)
-	apiHandler := router.APIHandlerProvider(registryRepository, upstreamProxyConfigRepository, fileManager, tagRepository, manifestRepository, cleanupPolicyRepository, imageRepository, storageDriver, spaceFinder, transactor, authenticator, provider, authorizer, auditService, artifactRepository, webhooksRepository, webhooksExecutionRepository, service2, spacePathStore, artifactReporter, downloadStatRepository, config, registryBlobRepository, registryFinder, asyncprocessingReporter, registryHelper, spaceController, quarantineArtifactRepository)
+	apiHandler := router.APIHandlerProvider(registryRepository, upstreamProxyConfigRepository, fileManager, tagRepository, manifestRepository, cleanupPolicyRepository, imageRepository, storageDriver, spaceFinder, transactor, authenticator, provider, authorizer, auditService, artifactRepository, webhooksRepository, webhooksExecutionRepository, service2, spacePathStore, artifactReporter, downloadStatRepository, config, registryBlobRepository, registryFinder, asyncprocessingReporter, registryHelper, spaceController, quarantineArtifactRepository, spaceStore)
 	packageTagRepository := database2.ProvidePackageTagDao(db)
 	localBase := base.LocalBaseProvider(registryRepository, fileManager, transactor, imageRepository, artifactRepository, nodesRepository, packageTagRepository)
 	mavenDBStore := maven.DBStoreProvider(registryRepository, imageRepository, artifactRepository, spaceStore, bandwidthStatRepository, downloadStatRepository, nodesRepository, upstreamProxyConfigRepository)
@@ -610,7 +613,10 @@ func initSystem(ctx context.Context, config *types.Config) (*server.System, erro
 	gopackageProxy := gopackage.ProxyProvider(localBase, upstreamProxyConfigRepository, registryRepository, imageRepository, artifactRepository, fileManager, transactor, provider, spaceFinder, secretService, artifactReporter, gopackageLocalRegistryHelper)
 	gopackageController := gopackage2.ControllerProvider(upstreamProxyConfigRepository, registryRepository, registryFinder, imageRepository, artifactRepository, fileManager, transactor, provider, gopackageLocalRegistry, gopackageProxy)
 	gopackageHandler := api2.NewGoPackageHandlerProvider(gopackageController, packagesHandler)
-	handler4 := router.PackageHandlerProvider(packagesHandler, mavenHandler, genericHandler, pythonHandler, nugetHandler, npmHandler, rpmHandler, cargoHandler, gopackageHandler)
+	huggingfaceLocalRegistry := huggingface.LocalRegistryProvider(localBase, fileManager, upstreamProxyConfigRepository, transactor, registryRepository, imageRepository, artifactRepository, provider)
+	huggingfaceController := huggingface2.ProvideController(upstreamProxyConfigRepository, registryRepository, imageRepository, artifactRepository, fileManager, transactor, provider, huggingfaceLocalRegistry)
+	huggingfaceHandler := huggingface3.ProvideHandler(huggingfaceController, packagesHandler)
+	handler4 := router.PackageHandlerProvider(packagesHandler, mavenHandler, genericHandler, pythonHandler, nugetHandler, npmHandler, rpmHandler, cargoHandler, gopackageHandler, huggingfaceHandler)
 	appRouter := router.AppRouterProvider(registryOCIHandler, apiHandler, handler2, handler3, handler4)
 	readerFactory3, err := events3.ProvideReaderFactory(eventsSystem)
 	if err != nil {
diff --git a/git/api/cat-file.go b/git/api/cat-file.go
index d82a9b74e..226c1e608 100644
--- a/git/api/cat-file.go
+++ b/git/api/cat-file.go
@@ -20,7 +20,6 @@ import (
 	"context"
 	"fmt"
 	"io"
-	"iter"
 	"strconv"
 	"strings"
 
@@ -31,6 +30,7 @@ import (
 
 	"github.com/djherbis/buffer"
 	"github.com/djherbis/nio/v3"
+	"iter"
 )
 
 // WriteCloserError wraps an io.WriteCloser with an additional CloseWithError function.
@@ -327,7 +327,10 @@ func catFileAnnotatedTags(
 	return tags, nil
 }
 
-func asCommit(commitSHA sha.SHA, raw parser.ObjectRaw) (Commit, error) {
+func asCommit(
+	commitSHA sha.SHA,
+	raw parser.ObjectRaw,
+) (Commit, error) {
 	var (
 		treeCount      int
 		authorCount    int
@@ -375,7 +378,7 @@ func asCommit(commitSHA sha.SHA, raw parser.ObjectRaw) (Commit, error) {
 		case "mergetag":
 			// encoding is not currently processed
 		default:
-			return Commit{}, fmt.Errorf("unknown commit header type %q", header.Type)
+			// custom headers not processed.
 		}
 	}
 
@@ -449,7 +452,6 @@ func asTag(tagSHA sha.SHA, raw parser.ObjectRaw) (Tag, error) {
 			taggerCount++
 			tagger = Signature{Identity: Identity{Name: name, Email: email}, When: when}
 		default:
-			return Tag{}, fmt.Errorf("unknown tag header type %q", header.Type)
 		}
 	}
 
diff --git a/registry/app/api/controller/metadata/artifact_mapper.go b/registry/app/api/controller/metadata/artifact_mapper.go
index f91aa1c9f..70de659cf 100644
--- a/registry/app/api/controller/metadata/artifact_mapper.go
+++ b/registry/app/api/controller/metadata/artifact_mapper.go
@@ -102,6 +102,7 @@ func mapToArtifactMetadata(
 		DownloadsCount:     &artifact.DownloadCount,
 		PullCommand:        &pullCommand,
 		IsQuarantined:      &artifact.IsQuarantined,
+		QuarantineReason:   artifact.QuarantineReason,
 	}
 }
 
@@ -142,6 +143,8 @@ func toPackageType(packageTypeStr string) (artifactapi.PackageType, error) {
 		return artifactapi.PackageTypeCARGO, nil
 	case string(artifactapi.PackageTypeGO):
 		return artifactapi.PackageTypeGO, nil
+	case string(artifactapi.PackageTypeHUGGINGFACE):
+		return artifactapi.PackageTypeHUGGINGFACE, nil
 	default:
 		return "", errors.New("invalid package type")
 	}
@@ -194,7 +197,8 @@ func GetAllArtifactResponse(
 	if artifacts == nil {
 		artifactMetadataList = make([]artifactapi.ArtifactMetadata, 0)
 	} else {
-		artifactMetadataList = GetArtifactMetadata(ctx, *artifacts, rootIdentifier, urlProvider, setupDetailsAuthHeaderPrefix)
+		artifactMetadataList = GetArtifactMetadata(ctx, *artifacts, rootIdentifier, urlProvider,
+			setupDetailsAuthHeaderPrefix)
 	}
 	pageCount := GetPageCount(count, pageSize)
 	listArtifact := &artifactapi.ListArtifact{
@@ -464,14 +468,15 @@ func GetNonOCIArtifactMetadata(
 		}
 		fileCount := tag.FileCount
 		artifactVersionMetadata := &artifactapi.ArtifactVersionMetadata{
-			PackageType:    &packageType,
-			FileCount:      &fileCount,
-			Name:           tag.Name,
-			Size:           &size,
-			LastModified:   &modifiedAt,
-			PullCommand:    &command,
-			DownloadsCount: &downloadCount,
-			IsQuarantined:  &tag.IsQuarantined,
+			PackageType:      &packageType,
+			FileCount:        &fileCount,
+			Name:             tag.Name,
+			Size:             &size,
+			LastModified:     &modifiedAt,
+			PullCommand:      &command,
+			DownloadsCount:   &downloadCount,
+			IsQuarantined:    &tag.IsQuarantined,
+			QuarantineReason: tag.QuarantineReason,
 		}
 		artifactVersionMetadataList = append(artifactVersionMetadataList, *artifactVersionMetadata)
 	}
@@ -484,6 +489,8 @@ func GetDockerArtifactDetails(
 	manifest *types.Manifest,
 	registryURL string,
 	downloadCount int64,
+	isQuarantined bool,
+	quarantineReason *string,
 ) *artifactapi.DockerArtifactDetailResponseJSONResponse {
 	repoPath := getRepoPath(registry.Name, tag.ImageName, manifest.Digest.String())
 	pullCommand := GetDockerPullCommand(tag.ImageName, tag.Name, registryURL)
@@ -491,16 +498,18 @@ func GetDockerArtifactDetails(
 	modifiedAt := GetTimeInMs(tag.UpdatedAt)
 	size := GetSize(manifest.TotalSize)
 	artifactDetail := &artifactapi.DockerArtifactDetail{
-		ImageName:      tag.ImageName,
-		Version:        tag.Name,
-		PackageType:    registry.PackageType,
-		CreatedAt:      &createdAt,
-		ModifiedAt:     &modifiedAt,
-		RegistryPath:   repoPath,
-		PullCommand:    &pullCommand,
-		Url:            GetTagURL(tag.ImageName, tag.Name, registryURL),
-		Size:           &size,
-		DownloadsCount: &downloadCount,
+		ImageName:        tag.ImageName,
+		Version:          tag.Name,
+		PackageType:      registry.PackageType,
+		CreatedAt:        &createdAt,
+		ModifiedAt:       &modifiedAt,
+		RegistryPath:     repoPath,
+		PullCommand:      &pullCommand,
+		Url:              GetTagURL(tag.ImageName, tag.Name, registryURL),
+		Size:             &size,
+		DownloadsCount:   &downloadCount,
+		IsQuarantined:    &isQuarantined,
+		QuarantineReason: quarantineReason,
 	}
 
 	response := &artifactapi.DockerArtifactDetailResponseJSONResponse{
@@ -614,6 +623,36 @@ func GetNugetArtifactDetail(
 	return *artifactDetail
 }
 
+func GetHFArtifactDetail(
+	image *types.Image, artifact *types.Artifact,
+	metadata map[string]interface{},
+	downloadCount int64,
+) artifactapi.ArtifactDetail {
+	createdAt := GetTimeInMs(artifact.CreatedAt)
+	modifiedAt := GetTimeInMs(artifact.UpdatedAt)
+	size, ok := metadata["size"].(float64)
+	if !ok {
+		log.Error().Msg("failed to get size from Hugging face metadata")
+	}
+	totalSize := GetSize(int64(size))
+	artifactDetail := &artifactapi.ArtifactDetail{
+		CreatedAt:     &createdAt,
+		ModifiedAt:    &modifiedAt,
+		Name:          &image.Name,
+		Version:       artifact.Version,
+		DownloadCount: &downloadCount,
+		Size:          &totalSize,
+	}
+	err := artifactDetail.FromHuggingFaceArtifactDetailConfig(artifactapi.HuggingFaceArtifactDetailConfig{
+		Metadata: &metadata,
+	})
+	if err != nil {
+		log.Error().Err(err).Msgf("Error setting the artifact details for hugging face package: [%s]", image.Name)
+		return artifactapi.ArtifactDetail{}
+	}
+	return *artifactDetail
+}
+
 func GetCargoArtifactDetail(
 	image *types.Image, artifact *types.Artifact,
 	metadata map[string]interface{},
@@ -737,7 +776,8 @@ func GetRPMArtifactDetail(
 		Metadata: &metadata,
 	})
 	if err != nil {
-		log.Error().Err(err).Msgf("Error setting the artifact details for artifact: [%s/%s].", image.Name, artifact.Version)
+		log.Error().Err(err).Msgf("Error setting the artifact details for artifact: [%s/%s].", image.Name,
+			artifact.Version)
 		return artifactapi.ArtifactDetail{}
 	}
 	return *artifactDetail
@@ -764,11 +804,15 @@ func GetArtifactVersionSummary(
 	artifactName string,
 	packageType artifactapi.PackageType,
 	version string,
+	isQuarantined bool,
+	quarantineReason string,
 ) *artifactapi.ArtifactVersionSummaryResponseJSONResponse {
 	artifactVersionSummary := &artifactapi.ArtifactVersionSummary{
-		ImageName:   artifactName,
-		PackageType: packageType,
-		Version:     version,
+		ImageName:        artifactName,
+		PackageType:      packageType,
+		Version:          version,
+		IsQuarantined:    &isQuarantined,
+		QuarantineReason: &quarantineReason,
 	}
 	response := &artifactapi.ArtifactVersionSummaryResponseJSONResponse{
 		Data:   *artifactVersionSummary,
diff --git a/registry/app/api/controller/metadata/base.go b/registry/app/api/controller/metadata/base.go
index 5066ca662..6d7d0116d 100644
--- a/registry/app/api/controller/metadata/base.go
+++ b/registry/app/api/controller/metadata/base.go
@@ -49,6 +49,7 @@ type RegistryRequestInfo struct {
 	labels       []string
 	registryIDs  []string
 	recursive    bool
+	scope        string
 }
 
 type RegistryRequestParams struct {
@@ -63,7 +64,8 @@ type RegistryRequestParams struct {
 	sortOrder         *api.SortOrder
 	sortField         *api.SortField
 	registryIDsParam  *api.RegistryIdentifierParam
-	recursive         bool
+	recursive         *api.RecursiveParam
+	scope             *api.GetAllRegistriesParamsScope
 }
 
 type ArtifactFilesRequestInfo struct {
@@ -122,6 +124,16 @@ func (c *APIController) GetRegistryRequestInfo(
 		return nil, err
 	}
 
+	scope := ""
+	if registryRequestParams.scope != nil {
+		scope = string(*registryRequestParams.scope)
+	}
+
+	recursive := false
+	if registryRequestParams.recursive != nil {
+		recursive = bool(*registryRequestParams.recursive)
+	}
+
 	return &RegistryRequestInfo{
 		RegistryRequestBaseInfo: baseInfo,
 		packageTypes:            packageTypes,
@@ -133,7 +145,8 @@ func (c *APIController) GetRegistryRequestInfo(
 		searchTerm:              searchTerm,
 		labels:                  labels,
 		registryIDs:             registryIDs,
-		recursive:               registryRequestParams.recursive,
+		recursive:               recursive,
+		scope:                   scope,
 	}, nil
 }
 
@@ -180,7 +193,7 @@ func (c *APIController) setUpstreamProxyIDs(
 
 	repos, err := c.RegistryRepository.GetAll(
 		ctx,
-		parentID,
+		[]int64{parentID},
 		[]string{string(registry.PackageType)},
 		"id",
 		"",
@@ -188,7 +201,6 @@ func (c *APIController) setUpstreamProxyIDs(
 		0,
 		"",
 		string(api.RegistryTypeUPSTREAM),
-		true,
 	)
 
 	if repos == nil || err != nil {
diff --git a/registry/app/api/controller/metadata/controller.go b/registry/app/api/controller/metadata/controller.go
index 8c2b2f82b..b183b7141 100644
--- a/registry/app/api/controller/metadata/controller.go
+++ b/registry/app/api/controller/metadata/controller.go
@@ -17,6 +17,7 @@ package metadata
 import (
 	spacecontroller "github.com/harness/gitness/app/api/controller/space"
 	"github.com/harness/gitness/app/auth/authz"
+	gstore "github.com/harness/gitness/app/store"
 	urlprovider "github.com/harness/gitness/app/url"
 	"github.com/harness/gitness/audit"
 	"github.com/harness/gitness/registry/app/api/interfaces"
@@ -62,6 +63,7 @@ type APIController struct {
 	CargoRegistryHelper          cargo.RegistryHelper
 	SpaceController              *spacecontroller.Controller
 	QuarantineArtifactRepository store.QuarantineArtifactRepository
+	SpaceStore                   gstore.SpaceStore
 }
 
 func NewAPIController(
@@ -94,6 +96,7 @@ func NewAPIController(
 	cargoRegistryHelper cargo.RegistryHelper,
 	spaceController *spacecontroller.Controller,
 	quarantineArtifactRepository store.QuarantineArtifactRepository,
+	spaceStore gstore.SpaceStore,
 ) *APIController {
 	return &APIController{
 		fileManager:                  fileManager,
@@ -125,5 +128,6 @@ func NewAPIController(
 		CargoRegistryHelper:          cargoRegistryHelper,
 		SpaceController:              spaceController,
 		QuarantineArtifactRepository: quarantineArtifactRepository,
+		SpaceStore:                   spaceStore,
 	}
 }
diff --git a/registry/app/api/controller/metadata/delete_quarantine_file_path.go b/registry/app/api/controller/metadata/delete_quarantine_file_path.go
index 94c7bfb05..6f6d8f0f4 100644
--- a/registry/app/api/controller/metadata/delete_quarantine_file_path.go
+++ b/registry/app/api/controller/metadata/delete_quarantine_file_path.go
@@ -124,9 +124,7 @@ func (c *APIController) DeleteQuarantineFilePath(
 			),
 		}, nil
 	}
-	return artifact.DeleteQuarantineFilePath204JSONResponse{
-		SuccessJSONResponse: artifact.SuccessJSONResponse{
-			Status: "SUCCESS",
-		},
+	return artifact.DeleteQuarantineFilePath200JSONResponse{
+		SuccessJSONResponse: artifact.SuccessJSONResponse(*GetSuccessResponse()),
 	}, nil
 }
diff --git a/registry/app/api/controller/metadata/get_artifact_detail.go b/registry/app/api/controller/metadata/get_artifact_detail.go
index ed9183115..781c82a45 100644
--- a/registry/app/api/controller/metadata/get_artifact_detail.go
+++ b/registry/app/api/controller/metadata/get_artifact_detail.go
@@ -177,6 +177,17 @@ func (c *APIController) GetArtifactDetails(
 			}, nil
 		}
 		artifactDetails = GetNugetArtifactDetail(img, art, result, downloadCount)
+	case artifact.PackageTypeHUGGINGFACE:
+		var result map[string]interface{}
+		err := json.Unmarshal(art.Metadata, &result)
+		if err != nil {
+			return artifact.GetArtifactDetails500JSONResponse{
+				InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
+					*GetErrorResponse(http.StatusInternalServerError, err.Error()),
+				),
+			}, nil
+		}
+		artifactDetails = GetHFArtifactDetail(img, art, result, downloadCount)
 	case artifact.PackageTypeCARGO:
 		var result map[string]interface{}
 		err := json.Unmarshal(art.Metadata, &result)
@@ -209,6 +220,22 @@ func (c *APIController) GetArtifactDetails(
 		}, nil
 	}
 
+	quarantinedArtifacts, err := c.QuarantineArtifactRepository.GetByFilePath(ctx, "", regInfo.RegistryID, image, version)
+	if err != nil {
+		return artifact.GetArtifactDetails500JSONResponse{
+			InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
+				*GetErrorResponse(http.StatusInternalServerError, err.Error()),
+			),
+		}, nil
+	}
+	if len(quarantinedArtifacts) > 0 {
+		isQuarantined := true
+		artifactDetails.IsQuarantined = &isQuarantined
+		artifactDetails.QuarantineReason = &quarantinedArtifacts[0].Reason
+	} else {
+		isQuarantined := false
+		artifactDetails.IsQuarantined = &isQuarantined
+	}
 	return artifact.GetArtifactDetails200JSONResponse{
 		ArtifactDetailResponseJSONResponse: artifact.ArtifactDetailResponseJSONResponse{
 			Data:   artifactDetails,
diff --git a/registry/app/api/controller/metadata/get_artifact_files.go b/registry/app/api/controller/metadata/get_artifact_files.go
index 95651b0e7..5f6e61200 100644
--- a/registry/app/api/controller/metadata/get_artifact_files.go
+++ b/registry/app/api/controller/metadata/get_artifact_files.go
@@ -118,19 +118,19 @@ func (c *APIController) GetArtifactFiles(
 
 	filePathPrefix, err := utils.GetFilePath(registry.PackageType, img.Name, art.Version)
 	if err != nil {
-		return failedToFetchFilesResponse(err, art)
+		return failedToFetchFilesResponse(ctx, err, art)
 	}
 	filePathPattern := filePathPrefix + "/%"
 	fileMetadataList, err := c.fileManager.GetFilesMetadata(ctx, filePathPattern, img.RegistryID,
 		reqInfo.sortByField, reqInfo.sortByOrder, reqInfo.limit, reqInfo.offset, reqInfo.searchTerm)
 	if err != nil {
-		return failedToFetchFilesResponse(err, art)
+		return failedToFetchFilesResponse(ctx, err, art)
 	}
 
 	count, err := c.fileManager.CountFilesByPath(ctx, filePathPattern, img.RegistryID)
 
 	if err != nil {
-		log.Error().Msgf("Failed to count files for artifact, err: %v", err.Error())
+		log.Ctx(ctx).Error().Msgf("Failed to count files for artifact, err: %v", err.Error())
 		return artifact.GetArtifactFiles500JSONResponse{
 			InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
 				*GetErrorResponse(http.StatusInternalServerError,
@@ -143,7 +143,7 @@ func (c *APIController) GetArtifactFiles(
 	switch registry.PackageType {
 	case artifact.PackageTypeGENERIC, artifact.PackageTypeMAVEN, artifact.PackageTypePYTHON,
 		artifact.PackageTypeNPM, artifact.PackageTypeRPM, artifact.PackageTypeNUGET,
-		artifact.PackageTypeCARGO, artifact.PackageTypeGO:
+		artifact.PackageTypeCARGO, artifact.PackageTypeGO, artifact.PackageTypeHUGGINGFACE:
 		return artifact.GetArtifactFiles200JSONResponse{
 			FileDetailResponseJSONResponse: *GetAllArtifactFilesResponse(
 				fileMetadataList, count, reqInfo.pageNumber, reqInfo.limit, registryURL, img.Name, art.Version,
@@ -158,8 +158,12 @@ func (c *APIController) GetArtifactFiles(
 	}
 }
 
-func failedToFetchFilesResponse(err error, art *types.Artifact) (artifact.GetArtifactFilesResponseObject, error) {
-	log.Error().Msgf("Failed to fetch files for artifact, err: %v", err.Error())
+func failedToFetchFilesResponse(
+	ctx context.Context,
+	err error,
+	art *types.Artifact,
+) (artifact.GetArtifactFilesResponseObject, error) {
+	log.Ctx(ctx).Error().Msgf("Failed to fetch files for artifact, err: %v", err.Error())
 	return artifact.GetArtifactFiles500JSONResponse{
 		InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
 			*GetErrorResponse(http.StatusInternalServerError,
diff --git a/registry/app/api/controller/metadata/get_artifacts_docker_details.go b/registry/app/api/controller/metadata/get_artifacts_docker_details.go
index 8cc98c877..f43e7ba94 100644
--- a/registry/app/api/controller/metadata/get_artifacts_docker_details.go
+++ b/registry/app/api/controller/metadata/get_artifacts_docker_details.go
@@ -104,10 +104,22 @@ func (c *APIController) GetDockerArtifactDetails(
 		return getArtifactDetailsErrResponse(err)
 	}
 
+	quarantineArtifacts, err := c.QuarantineArtifactRepository.GetByFilePath(ctx, "",
+		regInfo.RegistryID, image, dgst.String())
+	if err != nil {
+		return getArtifactDetailsErrResponse(err)
+	}
+	var isQuarantined bool
+	var quarantineReason *string
+	if len(quarantineArtifacts) > 0 {
+		isQuarantined = true
+		quarantineReason = &quarantineArtifacts[0].Reason
+	}
+
 	return artifact.GetDockerArtifactDetails200JSONResponse{
 		DockerArtifactDetailResponseJSONResponse: *GetDockerArtifactDetails(
 			registry, tag, m, c.URLProvider.RegistryURL(ctx, regInfo.RootIdentifier, registry.Name),
-			art.DownloadCount,
+			art.DownloadCount, isQuarantined, quarantineReason,
 		),
 	}, nil
 }
diff --git a/registry/app/api/controller/metadata/get_artifacts_docker_manifests.go b/registry/app/api/controller/metadata/get_artifacts_docker_manifests.go
index 6e06a40dd..038d9a905 100644
--- a/registry/app/api/controller/metadata/get_artifacts_docker_manifests.go
+++ b/registry/app/api/controller/metadata/get_artifacts_docker_manifests.go
@@ -159,6 +159,20 @@ func (c *APIController) getManifestDetails(
 	if mConfig != nil {
 		manifestDetails.OsArch = fmt.Sprintf("%s/%s", mConfig.Os, mConfig.Arch)
 	}
+
+	quarantinedArtifacts, err := c.QuarantineArtifactRepository.GetByFilePath(ctx, "",
+		m.RegistryID, image.Name, dgst.String())
+	if err != nil {
+		return artifact.DockerManifestDetails{}, err
+	}
+	if len(quarantinedArtifacts) > 0 {
+		isQuarantined := true
+		manifestDetails.IsQuarantined = &isQuarantined
+		manifestDetails.QuarantineReason = &quarantinedArtifacts[0].Reason
+	} else {
+		isQuarantined := false
+		manifestDetails.IsQuarantined = &isQuarantined
+	}
 	return manifestDetails, nil
 }
 
diff --git a/registry/app/api/controller/metadata/get_artifacts_version_summary.go b/registry/app/api/controller/metadata/get_artifacts_version_summary.go
index d402eff01..1fdf73c21 100644
--- a/registry/app/api/controller/metadata/get_artifacts_version_summary.go
+++ b/registry/app/api/controller/metadata/get_artifacts_version_summary.go
@@ -18,18 +18,23 @@ import (
 	"context"
 	"fmt"
 	"net/http"
+	"strings"
 
 	apiauth "github.com/harness/gitness/app/api/auth"
 	"github.com/harness/gitness/app/api/request"
 	"github.com/harness/gitness/registry/app/api/openapi/contracts/artifact"
+	"github.com/harness/gitness/registry/types"
 	"github.com/harness/gitness/types/enum"
+
+	"github.com/opencontainers/go-digest"
+	"github.com/rs/zerolog/log"
 )
 
 func (c *APIController) GetArtifactVersionSummary(
 	ctx context.Context,
 	r artifact.GetArtifactVersionSummaryRequestObject,
 ) (artifact.GetArtifactVersionSummaryResponseObject, error) {
-	image, version, pkgType, err := c.FetchArtifactSummary(ctx, r)
+	image, version, pkgType, isQuarantine, quarantineReason, err := c.FetchArtifactSummary(ctx, r)
 	if err != nil {
 		return artifact.GetArtifactVersionSummary500JSONResponse{
 			InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
@@ -39,7 +44,8 @@ func (c *APIController) GetArtifactVersionSummary(
 	}
 
 	return artifact.GetArtifactVersionSummary200JSONResponse{
-		ArtifactVersionSummaryResponseJSONResponse: *GetArtifactVersionSummary(image, pkgType, version),
+		ArtifactVersionSummaryResponseJSONResponse: *GetArtifactVersionSummary(image,
+			pkgType, version, isQuarantine, quarantineReason),
 	}, nil
 }
 
@@ -47,16 +53,16 @@ func (c *APIController) GetArtifactVersionSummary(
 func (c *APIController) FetchArtifactSummary(
 	ctx context.Context,
 	r artifact.GetArtifactVersionSummaryRequestObject,
-) (string, string, artifact.PackageType, error) {
+) (string, string, artifact.PackageType, bool, string, error) {
 	regInfo, err := c.RegistryMetadataHelper.GetRegistryRequestBaseInfo(ctx, "", string(r.RegistryRef))
 
 	if err != nil {
-		return "", "", "", fmt.Errorf("failed to get registry request base info: %w", err)
+		return "", "", "", false, "", fmt.Errorf("failed to get registry request base info: %w", err)
 	}
 
 	space, err := c.SpaceFinder.FindByRef(ctx, regInfo.ParentRef)
 	if err != nil {
-		return "", "", "", err
+		return "", "", "", false, "", err
 	}
 
 	session, _ := request.AuthSessionFrom(ctx)
@@ -68,31 +74,54 @@ func (c *APIController) FetchArtifactSummary(
 		session,
 		permissionChecks...,
 	); err != nil {
-		return "", "", "", err
+		return "", "", "", false, "", err
 	}
 
 	image := string(r.Artifact)
 	version := string(r.Version)
+	artifactVersion := version
+
+	if r.Params.Digest != nil && strings.TrimSpace(string(*r.Params.Digest)) != "" {
+		parsedDigest, err := types.NewDigest(digest.Digest(*r.Params.Digest))
+		if err != nil {
+			log.Ctx(ctx).Err(err).Msg("Failed to parse digest")
+		}
+		artifactVersion = parsedDigest.String()
+	}
 
 	registry, err := c.RegistryRepository.Get(ctx, regInfo.RegistryID)
 	if err != nil {
-		return "", "", "", err
+		return "", "", "", false, "", err
+	}
+
+	quarantinePath, err := c.QuarantineArtifactRepository.GetByFilePath(ctx,
+		"", regInfo.RegistryID, image, artifactVersion)
+
+	if err != nil {
+		log.Ctx(ctx).Err(err).Msg("failed to get quarantine path")
+	}
+
+	var quarantineReason string
+	var isQuarantined bool
+	if len(quarantinePath) > 0 {
+		isQuarantined = true
+		quarantineReason = quarantinePath[0].Reason
 	}
 
 	if registry.PackageType == artifact.PackageTypeDOCKER || registry.PackageType == artifact.PackageTypeHELM {
 		tag, err := c.TagStore.GetTagMetadata(ctx, regInfo.ParentID, regInfo.RegistryIdentifier, image, version)
 		if err != nil {
-			return "", "", "", err
+			return "", "", "", false, "", err
 		}
 
-		return image, tag.Name, tag.PackageType, nil
+		return image, tag.Name, tag.PackageType, isQuarantined, quarantineReason, nil
 	}
 	artifact, err := c.ArtifactStore.GetArtifactMetadata(ctx, regInfo.ParentID,
 		regInfo.RegistryIdentifier, image, version)
 
 	if err != nil {
-		return "", "", "", err
+		return "", "", "", false, "", err
 	}
 
-	return image, artifact.Name, artifact.PackageType, nil
+	return image, artifact.Name, artifact.PackageType, isQuarantined, quarantineReason, nil
 }
diff --git a/registry/app/api/controller/metadata/get_client_setup_details.go b/registry/app/api/controller/metadata/get_client_setup_details.go
index 2163bae6c..dc0dca83e 100644
--- a/registry/app/api/controller/metadata/get_client_setup_details.go
+++ b/registry/app/api/controller/metadata/get_client_setup_details.go
@@ -132,6 +132,8 @@ func (c *APIController) GenerateClientSetupDetails(
 		return c.generateCargoClientSetupDetail(ctx, registryRef, username, image, tag, registryType)
 	case string(artifact.PackageTypeGO):
 		return c.generateGoClientSetupDetail(ctx, registryRef, username, image, tag, registryType)
+	case string(artifact.PackageTypeHUGGINGFACE):
+		return c.generateHuggingFaceClientSetupDetail(ctx, registryRef, username, image, tag, registryType)
 	default:
 		log.Debug().Ctx(ctx).Msgf("Unknown package type for client details: %s", packageType)
 		return nil
@@ -1700,13 +1702,14 @@ func (c *APIController) replacePlaceholdersInSection(
 			continue
 		}
 		for j := range *st.Commands {
-			c.replaceText(username, st, j, hostname, registryName, image, tag, registryURL, groupID, uploadURL)
+			c.replaceText(ctx, username, st, j, hostname, registryName, image, tag, registryURL, groupID, uploadURL)
 		}
 	}
 	_ = clientSetupSection.FromClientSetupStepConfig(sec)
 }
 
 func (c *APIController) replaceText(
+	ctx context.Context,
 	username string,
 	st artifact.ClientSetupStep,
 	i int,
@@ -1725,31 +1728,35 @@ func (c *APIController) replaceText(
 	if username != "" {
 		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<USERNAME>", username))
 		if (*st.Commands)[i].Label != nil {
-			(*st.Commands)[i].Label = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Label, "<USERNAME>", username))
+			(*st.Commands)[i].Label = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Label, "<USERNAME>",
+				username))
 		}
 	}
 	if groupID != "" {
 		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<GROUP_ID>", groupID))
 	}
 	if registryURL != "" {
-		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<REGISTRY_URL>", registryURL))
+		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<REGISTRY_URL>",
+			registryURL))
 		if (*st.Commands)[i].Label != nil {
 			(*st.Commands)[i].Label = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Label,
 				"<REGISTRY_URL>", registryURL))
 		}
 	}
 	if uploadURL != "" {
-		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<UPLOAD_URL>", uploadURL))
+		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<UPLOAD_URL>",
+			uploadURL))
 	}
 	if hostname != "" {
 		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<HOSTNAME>", hostname))
 	}
 	if hostname != "" {
 		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value,
-			"<LOGIN_HOSTNAME>", common.GetHost(hostname)))
+			"<LOGIN_HOSTNAME>", common.GetHost(ctx, hostname)))
 	}
 	if repoName != "" {
-		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<REGISTRY_NAME>", repoName))
+		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<REGISTRY_NAME>",
+			repoName))
 	}
 	if image != nil {
 		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<IMAGE_NAME>",
@@ -1761,6 +1768,186 @@ func (c *APIController) replaceText(
 	}
 	if tag != nil {
 		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<TAG>", string(*tag)))
-		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<VERSION>", string(*tag)))
+		(*st.Commands)[i].Value = utils.StringPtr(strings.ReplaceAll(*(*st.Commands)[i].Value, "<VERSION>",
+			string(*tag)))
+	}
+}
+
+func (c *APIController) generateHuggingFaceClientSetupDetail(
+	ctx context.Context,
+	registryRef string,
+	username string,
+	image *artifact.ArtifactParam,
+	tag *artifact.VersionParam,
+	registryType artifact.RegistryType,
+) *artifact.ClientSetupDetailsResponseJSONResponse {
+	staticStepType := artifact.ClientSetupStepTypeStatic
+	generateTokenType := artifact.ClientSetupStepTypeGenerateToken
+
+	// Configuration section
+	section1 := artifact.ClientSetupSection{
+		Header: utils.StringPtr("Configure Hugging Face Client"),
+	}
+	_ = section1.FromClientSetupStepConfig(artifact.ClientSetupStepConfig{
+		Steps: &[]artifact.ClientSetupStep{
+			{
+				Header: utils.StringPtr("Set up environment variables to connect to Artifact Registry:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("export HF_HUB_ETAG_TIMEOUT=86400\nexport HF_HUB_DOWNLOAD_TIMEOUT=86400\nexport HF_ENDPOINT=<REGISTRY_URL>"),
+					},
+				},
+			},
+			{
+				Header: utils.StringPtr("For Hugging Face client version 0.19.0 and above, this timeout setting enables model resolution via pipelines and tokenizer libraries."),
+				Type:   &staticStepType,
+			},
+		},
+	})
+
+	// Authentication section
+	section2 := artifact.ClientSetupSection{
+		Header: utils.StringPtr("Configure Authentication"),
+	}
+	_ = section2.FromClientSetupStepConfig(artifact.ClientSetupStepConfig{
+		Steps: &[]artifact.ClientSetupStep{
+			{
+				Header: utils.StringPtr("Set up authentication for the Hugging Face client:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("export HF_TOKEN=<TOKEN>"),
+					},
+				},
+			},
+			{
+				Header: utils.StringPtr("Generate an identity token for authentication"),
+				Type:   &generateTokenType,
+			},
+		},
+	})
+
+	// Deploy Model section
+	section3 := artifact.ClientSetupSection{
+		Header: utils.StringPtr("Deploy Model"),
+	}
+	_ = section3.FromClientSetupStepConfig(artifact.ClientSetupStepConfig{
+		Steps: &[]artifact.ClientSetupStep{
+			{
+				Header: utils.StringPtr("Upload a model to Artifact Registry using the huggingface_hub library:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("from huggingface_hub import HfApi\napi = HfApi()\napi.upload_folder(\n    folder_path=\"<folder_name>\", # local folder containing model files\n    repo_id=\"<ARTIFACT_NAME>\", # name for the model in the registry\n    revision=\"<VERSION>\", # model version (defaults to 'main')\n    repo_type=\"model\"\n)"),
+					},
+				},
+			},
+		},
+	})
+
+	// Deploy Dataset section
+	section4 := artifact.ClientSetupSection{
+		Header: utils.StringPtr("Deploy Dataset"),
+	}
+	_ = section4.FromClientSetupStepConfig(artifact.ClientSetupStepConfig{
+		Steps: &[]artifact.ClientSetupStep{
+			{
+				Header: utils.StringPtr("Upload a dataset to Artifact Registry using the huggingface_hub library:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("from huggingface_hub import HfApi\napi = HfApi()\napi.upload_folder(\n    folder_path=\"<folder_name>\", # local folder containing dataset files\n    repo_id=\"<ARTIFACT_NAME>\", # name for the dataset in the registry\n    revision=\"<VERSION>\", # dataset version (defaults to 'main')\n    repo_type=\"dataset\"\n)"),
+					},
+				},
+			},
+		},
+	})
+
+	// Resolve Model section
+	section5 := artifact.ClientSetupSection{
+		Header: utils.StringPtr("Resolve Model"),
+	}
+	_ = section5.FromClientSetupStepConfig(artifact.ClientSetupStepConfig{
+		Steps: &[]artifact.ClientSetupStep{
+			{
+				Header: utils.StringPtr("Download a model from Artifact Registry:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("from huggingface_hub import snapshot_download\nsnapshot_download(\n    repo_id=\"<ARTIFACT_NAME>\", revision=\"<VERSION>\", etag_timeout=86400\n)"),
+					},
+				},
+			},
+			{
+				Header: utils.StringPtr("With Hugging Face client version 0.19.0+ and HF_HUB_ETAG_TIMEOUT set, you can resolve models with transformers, diffusers, and other libraries."),
+				Type:   &staticStepType,
+			},
+		},
+	})
+
+	// Resolve Dataset section
+	section6 := artifact.ClientSetupSection{
+		Header: utils.StringPtr("Resolve Dataset"),
+	}
+	_ = section6.FromClientSetupStepConfig(artifact.ClientSetupStepConfig{
+		Steps: &[]artifact.ClientSetupStep{
+			{
+				Header: utils.StringPtr("Artifact Registry supports resolving datasets using Hugging Face dataset libraries:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("from datasets import load_dataset\ndataset = load_dataset(\"<ARTIFACT_NAME>\")"),
+					},
+				},
+			},
+			{
+				Header: utils.StringPtr("Or download an entire dataset repository using the snapshot_download API:"),
+				Type:   &staticStepType,
+				Commands: &[]artifact.ClientSetupStepCommand{
+					{
+						Value: utils.StringPtr("from huggingface_hub import snapshot_download\nsnapshot_download(\n    repo_id=\"<ARTIFACT_NAME>\", revision=\"<VERSION>\", repo_type=\"dataset\", etag_timeout=86400\n)"),
+					},
+				},
+			},
+			{
+				Header: utils.StringPtr("Note: Artifact Registry fully caches only datasets hosted directly on Hugging Face, not those referencing external sources."),
+				Type:   &staticStepType,
+			},
+		},
+	})
+
+	sections := []artifact.ClientSetupSection{
+		section1,
+		section2,
+		section3,
+		section4,
+		section5,
+		section6,
+	}
+
+	if registryType == artifact.RegistryTypeUPSTREAM {
+		// For upstream registry, only include configuration, authentication, and resolve sections
+		sections = []artifact.ClientSetupSection{
+			section1,
+			section2,
+			section5,
+			section6,
+		}
+	}
+
+	clientSetupDetails := artifact.ClientSetupDetails{
+		MainHeader: "Hugging Face Client Setup",
+		SecHeader:  "Follow these instructions to interact with Hugging Face models and datasets in this registry.",
+		Sections:   sections,
+	}
+
+	registryURL := c.URLProvider.PackageURL(ctx, registryRef, "huggingface")
+	c.replacePlaceholders(ctx, &clientSetupDetails.Sections, username, registryRef, image, tag, registryURL, "",
+		string(artifact.PackageTypeHUGGINGFACE))
+
+	return &artifact.ClientSetupDetailsResponseJSONResponse{
+		Data:   clientSetupDetails,
+		Status: artifact.StatusSUCCESS,
 	}
 }
diff --git a/registry/app/api/controller/metadata/get_registries.go b/registry/app/api/controller/metadata/get_registries.go
index b30585926..4d8b70133 100644
--- a/registry/app/api/controller/metadata/get_registries.go
+++ b/registry/app/api/controller/metadata/get_registries.go
@@ -17,6 +17,7 @@ package metadata
 import (
 	"context"
 	"net/http"
+	"path"
 
 	apiauth "github.com/harness/gitness/app/api/auth"
 	"github.com/harness/gitness/app/api/request"
@@ -27,6 +28,7 @@ import (
 	"github.com/harness/gitness/types/enum"
 
 	"github.com/gotidy/ptr"
+	"github.com/rs/zerolog/log"
 )
 
 func (c *APIController) GetAllRegistries(
@@ -45,7 +47,8 @@ func (c *APIController) GetAllRegistries(
 		sortOrder:         r.Params.SortOrder,
 		sortField:         r.Params.SortField,
 		registryIDsParam:  nil,
-		recursive:         r.Params.Recursive != nil && bool(*r.Params.Recursive), // default is false
+		recursive:         r.Params.Recursive,
+		scope:             r.Params.Scope,
 	}
 	regInfo, err := c.GetRegistryRequestInfo(ctx, *registryRequestParams)
 	if err != nil {
@@ -89,14 +92,47 @@ func (c *APIController) GetAllRegistries(
 	if e != nil {
 		return nil, e
 	}
+	e = ValidateScope(regInfo.scope)
+	if e != nil {
+		return artifact.GetAllRegistries400JSONResponse{
+			BadRequestJSONResponse: artifact.BadRequestJSONResponse(
+				*GetErrorResponse(http.StatusBadRequest, e.Error()),
+			),
+		}, nil
+	}
 	e = ValidateRepoType(repoType)
 	if e != nil {
 		return nil, e
 	}
+
+	parentIDs := []int64{regInfo.ParentID}
+
+	if regInfo.recursive || regInfo.scope == string(artifact.Ancestors) {
+		parentIDs, err = c.SpaceStore.GetAncestorIDs(ctx, regInfo.ParentID)
+		if err != nil {
+			return artifact.GetAllRegistries500JSONResponse{
+				InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
+					*GetErrorResponse(http.StatusInternalServerError, err.Error()),
+				),
+			}, nil
+		}
+	}
+
+	if regInfo.scope == string(artifact.Descendants) {
+		parentIDs, err = c.SpaceStore.GetDescendantsIDs(ctx, regInfo.ParentID)
+		if err != nil {
+			return artifact.GetAllRegistries500JSONResponse{
+				InternalServerErrorJSONResponse: artifact.InternalServerErrorJSONResponse(
+					*GetErrorResponse(http.StatusInternalServerError, err.Error()),
+				),
+			}, nil
+		}
+	}
+
 	var count int64
 	repos, err = c.RegistryRepository.GetAll(
 		ctx,
-		regInfo.ParentID,
+		parentIDs,
 		regInfo.packageTypes,
 		regInfo.sortByField,
 		regInfo.sortByOrder,
@@ -104,11 +140,10 @@ func (c *APIController) GetAllRegistries(
 		regInfo.offset,
 		regInfo.searchTerm,
 		repoType,
-		regInfo.recursive,
 	)
 	count, _ = c.RegistryRepository.CountAll(
 		ctx,
-		regInfo.ParentID,
+		parentIDs,
 		regInfo.packageTypes,
 		regInfo.searchTerm,
 		repoType,
@@ -121,14 +156,14 @@ func (c *APIController) GetAllRegistries(
 		}, nil
 	}
 	return artifact.GetAllRegistries200JSONResponse{
-		ListRegistryResponseJSONResponse: *GetAllRegistryResponse(ctx,
+		ListRegistryResponseJSONResponse: *c.GetAllRegistryResponse(ctx,
 			repos, count, regInfo.pageNumber,
 			regInfo.limit, regInfo.RootIdentifier, c.URLProvider,
 		),
 	}, nil
 }
 
-func GetAllRegistryResponse(
+func (c *APIController) GetAllRegistryResponse(
 	ctx context.Context,
 	repos *[]store.RegistryMetadata,
 	count int64,
@@ -137,7 +172,7 @@ func GetAllRegistryResponse(
 	rootIdentifier string,
 	urlProvider url.Provider,
 ) *artifact.ListRegistryResponseJSONResponse {
-	repoMetadataList := GetRegistryMetadata(ctx, repos, rootIdentifier, urlProvider)
+	repoMetadataList := c.GetRegistryMetadata(ctx, repos, rootIdentifier, urlProvider)
 	pageCount := GetPageCount(count, pageSize)
 	listRepository := &artifact.ListRegistry{
 		ItemCount:  &count,
@@ -153,7 +188,7 @@ func GetAllRegistryResponse(
 	return response
 }
 
-func GetRegistryMetadata(
+func (c *APIController) GetRegistryMetadata(
 	ctx context.Context,
 	registryMetadatas *[]store.RegistryMetadata,
 	rootIdentifier string,
@@ -184,6 +219,8 @@ func GetRegistryMetadata(
 		if reg.PackageType == artifact.PackageTypeGENERIC {
 			regURL = urlProvider.RegistryURL(ctx, rootIdentifier, "generic", reg.RegIdentifier)
 		}
+
+		path := c.GetRegistryPath(ctx, reg.ParentID, reg.RegIdentifier)
 		// fix: refactor it
 		size := GetSize(reg.Size)
 		repoMetadata := artifact.RegistryMetadata{
@@ -197,8 +234,23 @@ func GetRegistryMetadata(
 			DownloadsCount: downloadCount,
 			RegistrySize:   &size,
 			Labels:         labels,
+			Path:           &path,
 		}
 		repoMetadataList = append(repoMetadataList, repoMetadata)
 	}
 	return repoMetadataList
 }
+
+func (c *APIController) GetRegistryPath(ctx context.Context, parentID int64, regIdentifier string) string {
+	if parentID != 0 {
+		space, err := c.SpaceFinder.FindByID(ctx, parentID)
+		if err != nil {
+			log.Ctx(ctx).Error().Msgf("Failed to find space by id %d: %s", parentID, err.Error())
+			return ""
+		}
+		if space != nil {
+			return path.Join(space.Path, regIdentifier)
+		}
+	}
+	return ""
+}
diff --git a/registry/app/api/controller/metadata/utils.go b/registry/app/api/controller/metadata/utils.go
index a31acf4a8..c6279b5f3 100644
--- a/registry/app/api/controller/metadata/utils.go
+++ b/registry/app/api/controller/metadata/utils.go
@@ -110,6 +110,12 @@ var validRepositoryTypes = []string{
 	string(a.RegistryTypeVIRTUAL),
 }
 
+var validScopes = []string{
+	string(a.Ancestors),
+	string(a.Descendants),
+	string(a.None),
+}
+
 var validPackageTypes = []string{
 	string(a.PackageTypeDOCKER),
 	string(a.PackageTypeHELM),
@@ -121,6 +127,7 @@ var validPackageTypes = []string{
 	string(a.PackageTypeNUGET),
 	string(a.PackageTypeCARGO),
 	string(a.PackageTypeGO),
+	string(a.PackageTypeHUGGINGFACE),
 }
 
 var validUpstreamSources = []string{
@@ -133,6 +140,7 @@ var validUpstreamSources = []string{
 	string(a.UpstreamConfigSourceNugetOrg),
 	string(a.UpstreamConfigSourceCrates),
 	string(a.UpstreamConfigSourceGoProxy),
+	string(a.UpstreamConfigSourceHuggingFace),
 }
 
 func ValidatePackageTypes(packageTypes []string) error {
@@ -142,6 +150,13 @@ func ValidatePackageTypes(packageTypes []string) error {
 	return errors.New("invalid package type")
 }
 
+func ValidateScope(scope string) error {
+	if len(scope) == 0 || IsScopeValid(scope) {
+		return nil
+	}
+	return errors.New("invalid scope")
+}
+
 func ValidatePackageType(packageType string) error {
 	if len(packageType) == 0 || IsPackageTypeValid(packageType) {
 		return nil
@@ -252,6 +267,15 @@ func IsPackageTypesValid(packageTypes []string) bool {
 	return true
 }
 
+func IsScopeValid(scope string) bool {
+	for _, item := range validScopes {
+		if item == scope {
+			return true
+		}
+	}
+	return false
+}
+
 func GetTimeInMs(t time.Time) string {
 	return fmt.Sprint(t.UnixMilli())
 }
@@ -381,7 +405,8 @@ func GetPullCommand(
 	case string(a.PackageTypeHELM):
 		return GetHelmPullCommand(image, tag, registryURL)
 	case string(a.PackageTypeGENERIC):
-		return GetGenericArtifactFileDownloadCommand(registryURL, image, tag, "<FILENAME>", setupDetailsAuthHeaderPrefix)
+		return GetGenericArtifactFileDownloadCommand(registryURL, image, tag, "<FILENAME>",
+			setupDetailsAuthHeaderPrefix)
 	case string(a.PackageTypePYTHON):
 		return GetPythonDownloadCommand(image, tag)
 	case string(a.PackageTypeNPM):
@@ -605,8 +630,10 @@ func GetRPMArtifactFileDownloadCommand(regURL, filename string, setupDetailsAuth
 	return downloadCommand
 }
 
-func GetNugetArtifactFileDownloadCommand(regURL, artifact, version, filename,
-	setupDetailsAuthHeaderPrefix string) string {
+func GetNugetArtifactFileDownloadCommand(
+	regURL, artifact, version, filename,
+	setupDetailsAuthHeaderPrefix string,
+) string {
 	downloadCommand := "curl --location '<HOSTNAME>/<ARTIFACT>/<VERSION>/<FILENAME>'" +
 		" --header '<AUTH_HEADER_PREFIX> <API_KEY>'" +
 		" -J -O"
diff --git a/registry/app/api/controller/mocks/registry_repository.go b/registry/app/api/controller/mocks/registry_repository.go
index f62a53651..48d59f14c 100644
--- a/registry/app/api/controller/mocks/registry_repository.go
+++ b/registry/app/api/controller/mocks/registry_repository.go
@@ -81,8 +81,8 @@ func (_c *RegistryRepository_Count_Call) RunAndReturn(run func(context.Context)
 }
 
 // CountAll provides a mock function with given fields: ctx, parentID, packageTypes, search, repoType
-func (_m *RegistryRepository) CountAll(ctx context.Context, parentID int64, packageTypes []string, search string, repoType string) (int64, error) {
-	ret := _m.Called(ctx, parentID, packageTypes, search, repoType)
+func (_m *RegistryRepository) CountAll(ctx context.Context, parentIDs []int64, packageTypes []string, search string, repoType string) (int64, error) {
+	ret := _m.Called(ctx, parentIDs, packageTypes, search, repoType)
 
 	if len(ret) == 0 {
 		panic("no return value specified for CountAll")
@@ -90,17 +90,17 @@ func (_m *RegistryRepository) CountAll(ctx context.Context, parentID int64, pack
 
 	var r0 int64
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, int64, []string, string, string) (int64, error)); ok {
-		return rf(ctx, parentID, packageTypes, search, repoType)
+	if rf, ok := ret.Get(0).(func(context.Context, []int64, []string, string, string) (int64, error)); ok {
+		return rf(ctx, parentIDs, packageTypes, search, repoType)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, int64, []string, string, string) int64); ok {
-		r0 = rf(ctx, parentID, packageTypes, search, repoType)
+	if rf, ok := ret.Get(0).(func(context.Context, []int64, []string, string, string) int64); ok {
+		r0 = rf(ctx, parentIDs, packageTypes, search, repoType)
 	} else {
 		r0 = ret.Get(0).(int64)
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, int64, []string, string, string) error); ok {
-		r1 = rf(ctx, parentID, packageTypes, search, repoType)
+	if rf, ok := ret.Get(1).(func(context.Context, []int64, []string, string, string) error); ok {
+		r1 = rf(ctx, parentIDs, packageTypes, search, repoType)
 	} else {
 		r1 = ret.Error(1)
 	}
@@ -115,17 +115,17 @@ type RegistryRepository_CountAll_Call struct {
 
 // CountAll is a helper method to define mock.On call
 //   - ctx context.Context
-//   - parentID int64
+//   - parentIDs []int64
 //   - packageTypes []string
 //   - search string
 //   - repoType string
-func (_e *RegistryRepository_Expecter) CountAll(ctx interface{}, parentID interface{}, packageTypes interface{}, search interface{}, repoType interface{}) *RegistryRepository_CountAll_Call {
-	return &RegistryRepository_CountAll_Call{Call: _e.mock.On("CountAll", ctx, parentID, packageTypes, search, repoType)}
+func (_e *RegistryRepository_Expecter) CountAll(ctx interface{}, parentIDs interface{}, packageTypes interface{}, search interface{}, repoType interface{}) *RegistryRepository_CountAll_Call {
+	return &RegistryRepository_CountAll_Call{Call: _e.mock.On("CountAll", ctx, parentIDs, packageTypes, search, repoType)}
 }
 
-func (_c *RegistryRepository_CountAll_Call) Run(run func(ctx context.Context, parentID int64, packageTypes []string, search string, repoType string)) *RegistryRepository_CountAll_Call {
+func (_c *RegistryRepository_CountAll_Call) Run(run func(ctx context.Context, parentIDs []int64, packageTypes []string, search string, repoType string)) *RegistryRepository_CountAll_Call {
 	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(context.Context), args[1].(int64), args[2].([]string), args[3].(string), args[4].(string))
+		run(args[0].(context.Context), args[1].([]int64), args[2].([]string), args[3].(string), args[4].(string))
 	})
 	return _c
 }
@@ -135,7 +135,7 @@ func (_c *RegistryRepository_CountAll_Call) Return(count int64, err error) *Regi
 	return _c
 }
 
-func (_c *RegistryRepository_CountAll_Call) RunAndReturn(run func(context.Context, int64, []string, string, string) (int64, error)) *RegistryRepository_CountAll_Call {
+func (_c *RegistryRepository_CountAll_Call) RunAndReturn(run func(context.Context, []int64, []string, string, string) (int64, error)) *RegistryRepository_CountAll_Call {
 	_c.Call.Return(run)
 	return _c
 }
@@ -484,8 +484,8 @@ func (_c *RegistryRepository_Get_Call) RunAndReturn(run func(context.Context, in
 }
 
 // GetAll provides a mock function with given fields: ctx, parentID, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType, recursive
-func (_m *RegistryRepository) GetAll(ctx context.Context, parentID int64, packageTypes []string, sortByField string, sortByOrder string, limit int, offset int, search string, repoType string, recursive bool) (*[]store.RegistryMetadata, error) {
-	ret := _m.Called(ctx, parentID, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType, recursive)
+func (_m *RegistryRepository) GetAll(ctx context.Context, parentIDs []int64, packageTypes []string, sortByField string, sortByOrder string, limit int, offset int, search string, repoType string) (*[]store.RegistryMetadata, error) {
+	ret := _m.Called(ctx, parentIDs, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType)
 
 	if len(ret) == 0 {
 		panic("no return value specified for GetAll")
@@ -493,19 +493,19 @@ func (_m *RegistryRepository) GetAll(ctx context.Context, parentID int64, packag
 
 	var r0 *[]store.RegistryMetadata
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, int64, []string, string, string, int, int, string, string, bool) (*[]store.RegistryMetadata, error)); ok {
-		return rf(ctx, parentID, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType, recursive)
+	if rf, ok := ret.Get(0).(func(context.Context, []int64, []string, string, string, int, int, string, string) (*[]store.RegistryMetadata, error)); ok {
+		return rf(ctx, parentIDs, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, int64, []string, string, string, int, int, string, string, bool) *[]store.RegistryMetadata); ok {
-		r0 = rf(ctx, parentID, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType, recursive)
+	if rf, ok := ret.Get(0).(func(context.Context, []int64, []string, string, string, int, int, string, string) *[]store.RegistryMetadata); ok {
+		r0 = rf(ctx, parentIDs, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType)
 	} else {
 		if ret.Get(0) != nil {
 			r0 = ret.Get(0).(*[]store.RegistryMetadata)
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, int64, []string, string, string, int, int, string, string, bool) error); ok {
-		r1 = rf(ctx, parentID, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType, recursive)
+	if rf, ok := ret.Get(1).(func(context.Context, []int64, []string, string, string, int, int, string, string) error); ok {
+		r1 = rf(ctx, parentIDs, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType)
 	} else {
 		r1 = ret.Error(1)
 	}
@@ -520,7 +520,7 @@ type RegistryRepository_GetAll_Call struct {
 
 // GetAll is a helper method to define mock.On call
 //   - ctx context.Context
-//   - parentID int64
+//   - parentIDs []int64
 //   - packageTypes []string
 //   - sortByField string
 //   - sortByOrder string
@@ -528,14 +528,13 @@ type RegistryRepository_GetAll_Call struct {
 //   - offset int
 //   - search string
 //   - repoType string
-//   - recursive bool
-func (_e *RegistryRepository_Expecter) GetAll(ctx interface{}, parentID interface{}, packageTypes interface{}, sortByField interface{}, sortByOrder interface{}, limit interface{}, offset interface{}, search interface{}, repoType interface{}, recursive interface{}) *RegistryRepository_GetAll_Call {
-	return &RegistryRepository_GetAll_Call{Call: _e.mock.On("GetAll", ctx, parentID, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType, recursive)}
+func (_e *RegistryRepository_Expecter) GetAll(ctx interface{}, parentIDs interface{}, packageTypes interface{}, sortByField interface{}, sortByOrder interface{}, limit interface{}, offset interface{}, search interface{}, repoType interface{}) *RegistryRepository_GetAll_Call {
+	return &RegistryRepository_GetAll_Call{Call: _e.mock.On("GetAll", ctx, parentIDs, packageTypes, sortByField, sortByOrder, limit, offset, search, repoType)}
 }
 
-func (_c *RegistryRepository_GetAll_Call) Run(run func(ctx context.Context, parentID int64, packageTypes []string, sortByField string, sortByOrder string, limit int, offset int, search string, repoType string, recursive bool)) *RegistryRepository_GetAll_Call {
+func (_c *RegistryRepository_GetAll_Call) Run(run func(ctx context.Context, parentIDs []int64, packageTypes []string, sortByField string, sortByOrder string, limit int, offset int, search string, repoType string)) *RegistryRepository_GetAll_Call {
 	_c.Call.Run(func(args mock.Arguments) {
-		run(args[0].(context.Context), args[1].(int64), args[2].([]string), args[3].(string), args[4].(string), args[5].(int), args[6].(int), args[7].(string), args[8].(string), args[9].(bool))
+		run(args[0].(context.Context), args[1].([]int64), args[2].([]string), args[3].(string), args[4].(string), args[5].(int), args[6].(int), args[7].(string), args[8].(string))
 	})
 	return _c
 }
diff --git a/registry/app/api/controller/pkg/huggingface/commit_revision.go b/registry/app/api/controller/pkg/huggingface/commit_revision.go
new file mode 100644
index 000000000..8ba9bdf3f
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/commit_revision.go
@@ -0,0 +1,79 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+// CommitEntry represents a single line in the commits input.
+// Make sure these structs are defined within this package or imported correctly.
+// If they are already defined in types.go or similar in this package, remove these definitions.
+
+func (c *controller) CommitRevision(
+	ctx context.Context,
+	info hftype.ArtifactInfo,
+	body io.ReadCloser) *CommitRevisionResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &CommitRevisionResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, commitRevisionResponse, err := hfRegistry.CommitRevision(ctx, info, body)
+		return &CommitRevisionResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, commitRevisionResponse,
+		}
+	}
+
+	result, err := base.NoProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &CommitRevisionResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	commitRevisionResponse, ok := result.(*CommitRevisionResponse)
+	if !ok {
+		return &CommitRevisionResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected CommitRevisionResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return commitRevisionResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/controller.go b/registry/app/api/controller/pkg/huggingface/controller.go
new file mode 100644
index 000000000..342a35362
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/controller.go
@@ -0,0 +1,75 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"io"
+
+	urlprovider "github.com/harness/gitness/app/url"
+	"github.com/harness/gitness/registry/app/pkg/filemanager"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/app/store"
+	"github.com/harness/gitness/store/database/dbtx"
+)
+
+// Controller defines the interface for Huggingface package operations.
+type Controller interface {
+	ValidateYaml(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *ValidateYamlResponse
+	PreUpload(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *PreUploadResponse
+	RevisionInfo(ctx context.Context, info hftype.ArtifactInfo, queryParams map[string][]string) *RevisionInfoResponse
+	LfsInfo(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser, token string) *LfsInfoResponse
+	LfsVerify(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *LfsVerifyResponse
+	CommitRevision(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *CommitRevisionResponse
+	LfsUpload(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *LfsUploadResponse
+	HeadFile(ctx context.Context, info hftype.ArtifactInfo, fileName string) *HeadFileResponse
+	DownloadFile(ctx context.Context, info hftype.ArtifactInfo, fileName string) *DownloadFileResponse
+}
+
+// controller implements the Controller interface.
+type controller struct {
+	fileManager filemanager.FileManager
+	proxyStore  store.UpstreamProxyConfigRepository
+	tx          dbtx.Transactor
+	registryDao store.RegistryRepository
+	imageDao    store.ImageRepository
+	artifactDao store.ArtifactRepository
+	urlProvider urlprovider.Provider
+	local       huggingface.LocalRegistry
+}
+
+// NewController creates a new Huggingface controller.
+func NewController(
+	proxyStore store.UpstreamProxyConfigRepository,
+	registryDao store.RegistryRepository,
+	imageDao store.ImageRepository,
+	artifactDao store.ArtifactRepository,
+	fileManager filemanager.FileManager,
+	tx dbtx.Transactor,
+	urlProvider urlprovider.Provider,
+	local huggingface.LocalRegistry,
+) Controller {
+	return &controller{
+		proxyStore:  proxyStore,
+		registryDao: registryDao,
+		imageDao:    imageDao,
+		artifactDao: artifactDao,
+		fileManager: fileManager,
+		tx:          tx,
+		urlProvider: urlProvider,
+		local:       local,
+	}
+}
diff --git a/registry/app/api/controller/pkg/huggingface/download_file.go b/registry/app/api/controller/pkg/huggingface/download_file.go
new file mode 100644
index 000000000..c975a2388
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/download_file.go
@@ -0,0 +1,75 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) DownloadFile(
+	ctx context.Context,
+	info hftype.ArtifactInfo,
+	fileName string,
+) *DownloadFileResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &DownloadFileResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, "", nil,
+			}
+		}
+		headers, body, redirectURL, err := hfRegistry.DownloadFile(ctx, info, fileName)
+		return &DownloadFileResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, redirectURL, body,
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &DownloadFileResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, "", nil,
+		}
+	}
+	downloadFileResponse, ok := result.(*DownloadFileResponse)
+	if !ok {
+		return &DownloadFileResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected DownloadFileResponse"),
+				nil,
+			}, "", nil,
+		}
+	}
+	return downloadFileResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/head_file.go b/registry/app/api/controller/pkg/huggingface/head_file.go
new file mode 100644
index 000000000..a2c68390d
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/head_file.go
@@ -0,0 +1,75 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) HeadFile(
+	ctx context.Context,
+	info hftype.ArtifactInfo,
+	fileName string,
+) *HeadFileResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &HeadFileResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				},
+			}
+		}
+		headers, err := hfRegistry.HeadFile(ctx, info, fileName)
+		return &HeadFileResponse{
+			BaseResponse{
+				err,
+				headers,
+			},
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &HeadFileResponse{
+			BaseResponse{
+				err,
+				nil,
+			},
+		}
+	}
+	headFileResponse, ok := result.(*HeadFileResponse)
+	if !ok {
+		return &HeadFileResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected HeadFileResponse"),
+				nil,
+			},
+		}
+	}
+	return headFileResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/lfs_info.go b/registry/app/api/controller/pkg/huggingface/lfs_info.go
new file mode 100644
index 000000000..a4d036c7d
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/lfs_info.go
@@ -0,0 +1,74 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) LfsInfo(
+	ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser, token string) *LfsInfoResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &LfsInfoResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, lfsInfoResponse, err := hfRegistry.LfsInfo(ctx, info, body, token)
+		return &LfsInfoResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, lfsInfoResponse,
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &LfsInfoResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	lfsInfoResponse, ok := result.(*LfsInfoResponse)
+	if !ok {
+		return &LfsInfoResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected LfsInfoResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return lfsInfoResponse
+
+}
diff --git a/registry/app/api/controller/pkg/huggingface/lfs_upload.go b/registry/app/api/controller/pkg/huggingface/lfs_upload.go
new file mode 100644
index 000000000..720692324
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/lfs_upload.go
@@ -0,0 +1,72 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) LfsUpload(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *LfsUploadResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &LfsUploadResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, lfsUploadResponse, err := hfRegistry.LfsUpload(ctx, info, body)
+		return &LfsUploadResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, lfsUploadResponse,
+		}
+	}
+
+	result, err := base.NoProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &LfsUploadResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	lfsUploadResponse, ok := result.(*LfsUploadResponse)
+	if !ok {
+		return &LfsUploadResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected LfsUploadResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return lfsUploadResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/lfs_verify.go b/registry/app/api/controller/pkg/huggingface/lfs_verify.go
new file mode 100644
index 000000000..1a5bd8bb1
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/lfs_verify.go
@@ -0,0 +1,72 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) LfsVerify(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *LfsVerifyResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &LfsVerifyResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, lfsVerifyResponse, err := hfRegistry.LfsVerify(ctx, info, body)
+		return &LfsVerifyResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, lfsVerifyResponse,
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &LfsVerifyResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	lfsVerifyResponse, ok := result.(*LfsVerifyResponse)
+	if !ok {
+		return &LfsVerifyResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected LfsVerifyResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return lfsVerifyResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/pre_upload.go b/registry/app/api/controller/pkg/huggingface/pre_upload.go
new file mode 100644
index 000000000..780be6982
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/pre_upload.go
@@ -0,0 +1,72 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) PreUpload(ctx context.Context, info hftype.ArtifactInfo, body io.ReadCloser) *PreUploadResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &PreUploadResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, preUploadResponse, err := hfRegistry.PreUpload(ctx, info, body)
+		return &PreUploadResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, preUploadResponse,
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &PreUploadResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	preUploadResponse, ok := result.(*PreUploadResponse)
+	if !ok {
+		return &PreUploadResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected PreUploadResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return preUploadResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/response.go b/registry/app/api/controller/pkg/huggingface/response.go
new file mode 100644
index 000000000..43b195f8f
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/response.go
@@ -0,0 +1,87 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"github.com/harness/gitness/registry/app/pkg/commons"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/app/storage"
+)
+
+var _ response.Response = (*ValidateYamlResponse)(nil)
+var _ response.Response = (*PreUploadResponse)(nil)
+var _ response.Response = (*RevisionInfoResponse)(nil)
+var _ response.Response = (*LfsInfoResponse)(nil)
+var _ response.Response = (*LfsVerifyResponse)(nil)
+var _ response.Response = (*LfsUploadResponse)(nil)
+var _ response.Response = (*HeadFileResponse)(nil)
+var _ response.Response = (*DownloadFileResponse)(nil)
+
+// Response is the base response interface.
+type BaseResponse struct {
+	Error           error
+	ResponseHeaders *commons.ResponseHeaders
+}
+
+func (r BaseResponse) GetError() error {
+	return r.Error
+}
+
+type ValidateYamlResponse struct {
+	BaseResponse
+	Response *huggingfacetype.ValidateYamlResponse
+}
+
+type PreUploadResponse struct {
+	BaseResponse
+	Response *huggingfacetype.PreUploadResponse
+}
+
+// RevisionInfoResponse represents a response for revision info.
+type RevisionInfoResponse struct {
+	BaseResponse
+	Response *huggingfacetype.RevisionInfoResponse
+}
+
+type LfsInfoResponse struct {
+	BaseResponse
+	Response *huggingfacetype.LfsInfoResponse
+}
+
+type LfsUploadResponse struct {
+	BaseResponse
+	Response *huggingfacetype.LfsUploadResponse
+}
+
+type LfsVerifyResponse struct {
+	BaseResponse
+	Response *huggingfacetype.LfsVerifyResponse
+}
+
+type CommitRevisionResponse struct {
+	BaseResponse
+	Response *huggingfacetype.CommitRevisionResponse
+}
+
+type HeadFileResponse struct {
+	BaseResponse
+}
+
+type DownloadFileResponse struct {
+	BaseResponse
+	RedirectURL string
+	Body        *storage.FileReader
+}
diff --git a/registry/app/api/controller/pkg/huggingface/revision_info.go b/registry/app/api/controller/pkg/huggingface/revision_info.go
new file mode 100644
index 000000000..00ab5cbf8
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/revision_info.go
@@ -0,0 +1,75 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) RevisionInfo(
+	ctx context.Context,
+	info hftype.ArtifactInfo,
+	queryParams map[string][]string,
+) *RevisionInfoResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &RevisionInfoResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, revisionInfoResponse, err := hfRegistry.RevisionInfo(ctx, info, queryParams)
+		return &RevisionInfoResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, revisionInfoResponse,
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &RevisionInfoResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	revisionInfoResponse, ok := result.(*RevisionInfoResponse)
+	if !ok {
+		return &RevisionInfoResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected RevisionInfoResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return revisionInfoResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/validate_yaml.go b/registry/app/api/controller/pkg/huggingface/validate_yaml.go
new file mode 100644
index 000000000..18591bc63
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/validate_yaml.go
@@ -0,0 +1,76 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"fmt"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/response"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	registrytypes "github.com/harness/gitness/registry/types"
+)
+
+func (c *controller) ValidateYaml(
+	ctx context.Context,
+	info hftype.ArtifactInfo,
+	body io.ReadCloser,
+) *ValidateYamlResponse {
+	f := func(registry registrytypes.Registry, a pkg.Artifact) response.Response {
+		info.RegIdentifier = registry.Name
+		info.RegistryID = registry.ID
+		hfRegistry, ok := a.(huggingface.Registry)
+		if !ok {
+			return &ValidateYamlResponse{
+				BaseResponse{
+					fmt.Errorf("invalid registry type: expected huggingface.Registry"),
+					nil,
+				}, nil,
+			}
+		}
+		headers, validateYamlResponse, err := hfRegistry.ValidateYaml(ctx, info, body)
+		return &ValidateYamlResponse{
+			BaseResponse{
+				err,
+				headers,
+			}, validateYamlResponse,
+		}
+	}
+
+	result, err := base.ProxyWrapper(ctx, c.registryDao, f, info)
+
+	if err != nil {
+		return &ValidateYamlResponse{
+			BaseResponse{
+				err,
+				nil,
+			}, nil,
+		}
+	}
+	validateYamlResponse, ok := result.(*ValidateYamlResponse)
+	if !ok {
+		return &ValidateYamlResponse{
+			BaseResponse{
+				fmt.Errorf("invalid response type: expected ValidateYamlResponse"),
+				nil,
+			}, nil,
+		}
+	}
+	return validateYamlResponse
+}
diff --git a/registry/app/api/controller/pkg/huggingface/wire.go b/registry/app/api/controller/pkg/huggingface/wire.go
new file mode 100644
index 000000000..b8906c9a7
--- /dev/null
+++ b/registry/app/api/controller/pkg/huggingface/wire.go
@@ -0,0 +1,53 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	urlprovider "github.com/harness/gitness/app/url"
+	"github.com/harness/gitness/registry/app/pkg/filemanager"
+	"github.com/harness/gitness/registry/app/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/store"
+	"github.com/harness/gitness/store/database/dbtx"
+
+	"github.com/google/wire"
+)
+
+// WireSet provides a wire set for the huggingface package.
+var WireSet = wire.NewSet(
+	ProvideController,
+)
+
+// ProvideController provides a huggingface controller.
+func ProvideController(
+	proxyStore store.UpstreamProxyConfigRepository,
+	registryDao store.RegistryRepository,
+	imageDao store.ImageRepository,
+	artifactDao store.ArtifactRepository,
+	fileManager filemanager.FileManager,
+	tx dbtx.Transactor,
+	urlProvider urlprovider.Provider,
+	local huggingface.LocalRegistry,
+) Controller {
+	return NewController(
+		proxyStore,
+		registryDao,
+		imageDao,
+		artifactDao,
+		fileManager,
+		tx,
+		urlProvider,
+		local,
+	)
+}
diff --git a/registry/app/api/handler/huggingface/commit_revision.go b/registry/app/api/handler/huggingface/commit_revision.go
new file mode 100644
index 000000000..9cdf310a6
--- /dev/null
+++ b/registry/app/api/handler/huggingface/commit_revision.go
@@ -0,0 +1,49 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) CommitRevision(w http.ResponseWriter, r *http.Request) {
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	response := h.controller.CommitRevision(ctx, *info, r.Body)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+
+}
diff --git a/registry/app/api/handler/huggingface/download_file.go b/registry/app/api/handler/huggingface/download_file.go
new file mode 100644
index 000000000..cc402d662
--- /dev/null
+++ b/registry/app/api/handler/huggingface/download_file.go
@@ -0,0 +1,73 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"fmt"
+	"net/http"
+	"net/url"
+
+	"github.com/harness/gitness/registry/app/pkg/commons"
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) DownloadFile(w http.ResponseWriter, r *http.Request) {
+
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+
+	filePath := r.PathValue("*")
+	decodedFilePath, err := url.PathUnescape(filePath)
+	if err != nil {
+		log.Ctx(ctx).Error().Msgf("Failed to decode file path: %v", err)
+		h.HandleError(r.Context(), w, err)
+		return
+	}
+
+	response := h.controller.DownloadFile(ctx, *info, decodedFilePath)
+
+	defer func() {
+		if response != nil && response.Body != nil {
+			err := response.Body.Close()
+			if err != nil {
+				log.Ctx(ctx).Error().Msgf("Failed to close body: %v", err)
+			}
+		}
+	}()
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+	}
+
+	if response.RedirectURL != "" {
+		http.Redirect(w, r, response.RedirectURL, http.StatusTemporaryRedirect)
+		return
+	}
+	err = commons.ServeContent(w, r, response.Body, decodedFilePath, nil)
+	if err != nil {
+		log.Ctx(ctx).Error().Msgf("Failed to serve content: %v", err)
+		h.HandleError(ctx, w, err)
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+}
diff --git a/registry/app/api/handler/huggingface/handler.go b/registry/app/api/handler/huggingface/handler.go
new file mode 100644
index 000000000..6a62856e2
--- /dev/null
+++ b/registry/app/api/handler/huggingface/handler.go
@@ -0,0 +1,118 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"fmt"
+	"net/http"
+	"regexp"
+	"strings"
+
+	"github.com/harness/gitness/registry/app/api/controller/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/api/handler/packages"
+	"github.com/harness/gitness/registry/app/pkg"
+	hftype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+
+	"github.com/go-chi/chi/v5"
+	"github.com/rs/zerolog/log"
+)
+
+// Repo validation regex.
+var (
+	repoIDMatcher = regexp.MustCompile(`^[a-zA-Z0-9](?:[a-zA-Z0-9\-/]{0,126}[a-zA-Z0-9])?$`)
+	allowedTypes  = map[string]bool{"model": true, "dataset": true}
+)
+
+// Handler defines the interface for Huggingface package operations.
+type Handler interface {
+	pkg.ArtifactInfoProvider
+	ValidateYAML(writer http.ResponseWriter, request *http.Request)
+	LfsInfo(writer http.ResponseWriter, request *http.Request)
+	LfsUpload(writer http.ResponseWriter, request *http.Request)
+	LfsVerify(writer http.ResponseWriter, request *http.Request)
+	PreUpload(writer http.ResponseWriter, request *http.Request)
+	RevisionInfo(w http.ResponseWriter, r *http.Request)
+	CommitRevision(writer http.ResponseWriter, request *http.Request)
+	HeadFile(w http.ResponseWriter, r *http.Request)
+	DownloadFile(w http.ResponseWriter, r *http.Request)
+}
+
+// handler implements the Handler interface.
+type handler struct {
+	packages.Handler
+	controller huggingface.Controller
+}
+
+// NewHandler creates a new Huggingface handler.
+func NewHandler(
+	controller huggingface.Controller,
+	packageHandler packages.Handler,
+) Handler {
+	return &handler{
+		Handler:    packageHandler,
+		controller: controller,
+	}
+}
+
+var _ Handler = (*handler)(nil)
+
+// GetPackageArtifactInfo retrieves artifact information from the request.
+func (h *handler) GetPackageArtifactInfo(r *http.Request) (pkg.PackageArtifactInfo, error) {
+	info, err := h.Handler.GetArtifactInfo(r)
+	if err != nil {
+		return nil, err
+	}
+
+	repoType := chi.URLParam(r, "repoType")
+	repo := chi.URLParam(r, "repo")
+	rev := chi.URLParam(r, "rev")
+	sha256 := chi.URLParam(r, "sha256")
+	if repoType != "" {
+		repoType = strings.TrimSuffix(repoType, "s")
+	} else {
+		repoType = "model"
+	}
+
+	// Validate repoType
+	if !allowedTypes[repoType] {
+		log.Ctx(r.Context()).Error().Msgf("unsupported repoType: %s", repoType)
+		return nil, fmt.Errorf("unsupported repoType")
+	}
+
+	// Validate repoID
+	if repo != "" && !isValidRepoID(repo) {
+		log.Ctx(r.Context()).Error().Msgf("Invalid repo ID: %s", repo)
+		return nil, fmt.Errorf("invalid repo ID format")
+	}
+
+	// Set default revision if not provided
+	if rev == "" {
+		rev = "main"
+	}
+	info.Image = repo
+
+	return &hftype.ArtifactInfo{
+		ArtifactInfo: info,
+		Repo:         repo,
+		Revision:     rev,
+		RepoType:     repoType,
+		SHA256:       sha256,
+	}, nil
+}
+
+// isValidRepoID validates the format of a repo ID.
+func isValidRepoID(repoID string) bool {
+	return repoIDMatcher.MatchString(repoID)
+}
diff --git a/registry/app/api/handler/huggingface/head_file.go b/registry/app/api/handler/huggingface/head_file.go
new file mode 100644
index 000000000..7bb7b5288
--- /dev/null
+++ b/registry/app/api/handler/huggingface/head_file.go
@@ -0,0 +1,50 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"fmt"
+	"net/http"
+	"net/url"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) HeadFile(w http.ResponseWriter, r *http.Request) {
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	filePath := r.PathValue("*")
+	decodedFilePath, err := url.PathUnescape(filePath)
+	if err != nil {
+		log.Ctx(ctx).Error().Msgf("Failed to decode file path: %v", err)
+		h.HandleError(r.Context(), w, err)
+		return
+	}
+	response := h.controller.HeadFile(r.Context(), *info, decodedFilePath)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+}
diff --git a/registry/app/api/handler/huggingface/lfs_info.go b/registry/app/api/handler/huggingface/lfs_info.go
new file mode 100644
index 000000000..ff15fedd9
--- /dev/null
+++ b/registry/app/api/handler/huggingface/lfs_info.go
@@ -0,0 +1,51 @@
+//  Copyright 2023 Harness, Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) LfsInfo(w http.ResponseWriter, r *http.Request) {
+
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	token := r.Header.Get("Authorization")
+	response := h.controller.LfsInfo(ctx, *info, r.Body, token)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+
+}
diff --git a/registry/app/api/handler/huggingface/lfs_upload.go b/registry/app/api/handler/huggingface/lfs_upload.go
new file mode 100644
index 000000000..f6950b186
--- /dev/null
+++ b/registry/app/api/handler/huggingface/lfs_upload.go
@@ -0,0 +1,49 @@
+//  Copyright 2023 Harness, Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) LfsUpload(w http.ResponseWriter, r *http.Request) {
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	response := h.controller.LfsUpload(ctx, *info, r.Body)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+
+}
diff --git a/registry/app/api/handler/huggingface/lfs_verify.go b/registry/app/api/handler/huggingface/lfs_verify.go
new file mode 100644
index 000000000..b09fe59ed
--- /dev/null
+++ b/registry/app/api/handler/huggingface/lfs_verify.go
@@ -0,0 +1,48 @@
+//  Copyright 2023 Harness, Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) LfsVerify(w http.ResponseWriter, r *http.Request) {
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	response := h.controller.LfsVerify(r.Context(), *info, r.Body)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+}
diff --git a/registry/app/api/handler/huggingface/pre_upload.go b/registry/app/api/handler/huggingface/pre_upload.go
new file mode 100644
index 000000000..3649d055d
--- /dev/null
+++ b/registry/app/api/handler/huggingface/pre_upload.go
@@ -0,0 +1,49 @@
+//  Copyright 2023 Harness, Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) PreUpload(w http.ResponseWriter, r *http.Request) {
+
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	response := h.controller.PreUpload(r.Context(), *info, r.Body)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+}
diff --git a/registry/app/api/handler/huggingface/revision_info.go b/registry/app/api/handler/huggingface/revision_info.go
new file mode 100644
index 000000000..ac77138e7
--- /dev/null
+++ b/registry/app/api/handler/huggingface/revision_info.go
@@ -0,0 +1,49 @@
+//  Copyright 2023 Harness, Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) RevisionInfo(w http.ResponseWriter, r *http.Request) {
+
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	response := h.controller.RevisionInfo(r.Context(), *info, r.URL.Query())
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+}
diff --git a/registry/app/api/handler/huggingface/validate_yaml.go b/registry/app/api/handler/huggingface/validate_yaml.go
new file mode 100644
index 000000000..2f7eea2b6
--- /dev/null
+++ b/registry/app/api/handler/huggingface/validate_yaml.go
@@ -0,0 +1,49 @@
+//  Copyright 2023 Harness, Inc.
+//
+//  Licensed under the Apache License, Version 2.0 (the "License");
+//  you may not use this file except in compliance with the License.
+//  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+
+package huggingface
+
+import (
+	"encoding/json"
+	"fmt"
+	"net/http"
+
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/request"
+
+	"github.com/rs/zerolog/log"
+)
+
+func (h *handler) ValidateYAML(w http.ResponseWriter, r *http.Request) {
+
+	ctx := r.Context()
+	info, ok := request.ArtifactInfoFrom(ctx).(*huggingfacetype.ArtifactInfo)
+	if !ok {
+		log.Ctx(ctx).Error().Msg("Failed to get artifact info from context")
+		h.HandleErrors(r.Context(), []error{fmt.Errorf("failed to fetch info from context")}, w)
+		return
+	}
+	response := h.controller.ValidateYaml(r.Context(), *info, r.Body)
+
+	if response.GetError() != nil {
+		h.HandleError(r.Context(), w, response.GetError())
+		return
+	}
+	response.ResponseHeaders.WriteToResponse(w)
+	err := json.NewEncoder(w).Encode(response.Response)
+	if err != nil {
+		h.HandleErrors(r.Context(), []error{err}, w)
+		return
+	}
+}
diff --git a/registry/app/api/handler/huggingface/wire.go b/registry/app/api/handler/huggingface/wire.go
new file mode 100644
index 000000000..b852660d5
--- /dev/null
+++ b/registry/app/api/handler/huggingface/wire.go
@@ -0,0 +1,38 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"github.com/harness/gitness/registry/app/api/controller/pkg/huggingface"
+	"github.com/harness/gitness/registry/app/api/handler/packages"
+
+	"github.com/google/wire"
+)
+
+// WireSet provides a wire set for the huggingface package.
+var WireSet = wire.NewSet(
+	ProvideHandler,
+)
+
+// ProvideHandler provides a huggingface handler.
+func ProvideHandler(
+	controller huggingface.Controller,
+	packageHandler packages.Handler,
+) Handler {
+	return NewHandler(
+		controller,
+		packageHandler,
+	)
+}
diff --git a/registry/app/api/handler/oci/base.go b/registry/app/api/handler/oci/base.go
index 6733066e5..cea416e59 100644
--- a/registry/app/api/handler/oci/base.go
+++ b/registry/app/api/handler/oci/base.go
@@ -56,8 +56,8 @@ func NewHandler(
 		Authenticator:  authenticator,
 		URLProvider:    urlProvider,
 		Authorizer:     authorizer,
-		OCIRelativeURL: ociRelativeURL,
 		registryFinder: registryFinder,
+		OCIRelativeURL: ociRelativeURL,
 	}
 }
 
@@ -129,7 +129,7 @@ func ExtractPathVars(
 	path = strings.Trim(path, "/")
 	segments := strings.Split(path, "/")
 	if len(segments) < MinSizeOfURLSegments {
-		log.Error().Ctx(ctx).Msgf("Invalid route: %s", path)
+		log.Ctx(ctx).Error().Msgf("Invalid route: %s", path)
 		return "", "", "", "", "", ""
 	}
 	rootIdentifier = segments[1]
@@ -161,12 +161,12 @@ func ExtractPathVars(
 	case Referrers:
 		dgst = segments[len(segments)-1]
 	case Invalid:
-		log.Warn().Msgf("Invalid route: %s", path)
+		log.Ctx(ctx).Warn().Msgf("Invalid route: %s", path)
 	default:
-		log.Warn().Msgf("Unknown route type: %s", typ)
+		log.Ctx(ctx).Warn().Msgf("Unknown route type: %s", typ)
 	}
 
-	log.Debug().Msgf(
+	log.Ctx(ctx).Debug().Msgf(
 		"For path: %s, rootIdentifier: %s, registry: %s, image: %s, ref: %s, dgst: %s, tag: %s",
 		path, rootIdentifier, registry, image, ref, dgst, tag,
 	)
diff --git a/registry/app/api/handler/oci/get_token.go b/registry/app/api/handler/oci/get_token.go
index 1ce9df703..20c9b9423 100644
--- a/registry/app/api/handler/oci/get_token.go
+++ b/registry/app/api/handler/oci/get_token.go
@@ -43,19 +43,19 @@ func (h *Handler) GetToken(w http.ResponseWriter, r *http.Request) {
 	ctx := r.Context()
 	session, ok := request.AuthSessionFrom(ctx)
 	if !ok || session.Principal == auth.AnonymousPrincipal {
-		returnForbiddenResponse(w, fmt.Errorf("no auth session found"))
+		returnForbiddenResponse(ctx, w, fmt.Errorf("no auth session found"))
 		return
 	}
 
 	if tokenMetadata, okt := session.Metadata.(*auth.TokenMetadata); okt &&
 		tokenMetadata.TokenType != enum.TokenTypePAT {
-		returnForbiddenResponse(w, fmt.Errorf("only personal access token allowed"))
+		returnForbiddenResponse(ctx, w, fmt.Errorf("only personal access token allowed"))
 		return
 	}
 
 	user, err := h.UserCtrl.FindNoAuth(ctx, session.Principal.UID)
 	if err != nil {
-		returnForbiddenResponse(w, err)
+		returnForbiddenResponse(ctx, w, err)
 		return
 	}
 
@@ -79,7 +79,7 @@ func (h *Handler) GetToken(w http.ResponseWriter, r *http.Request) {
 
 	jwtToken, err := h.getTokenDetails(user, subClaimsAccessPermissions)
 	if err != nil {
-		returnForbiddenResponse(w, err)
+		returnForbiddenResponse(ctx, w, err)
 		return
 	}
 	if jwtToken != "" {
@@ -90,7 +90,7 @@ func (h *Handler) GetToken(w http.ResponseWriter, r *http.Request) {
 				Token: jwtToken,
 			},
 		); err != nil {
-			log.Error().Msgf("failed to write token response: %v", err)
+			log.Ctx(ctx).Error().Msgf("failed to write token response: %v", err)
 		}
 		return
 	}
@@ -147,11 +147,11 @@ func getPermissionFromAction(ctx context.Context, action string) (enum.Permissio
 	}
 }
 
-func returnForbiddenResponse(w http.ResponseWriter, err error) {
+func returnForbiddenResponse(ctx context.Context, w http.ResponseWriter, err error) {
 	w.WriteHeader(http.StatusForbidden)
 	_, err2 := w.Write([]byte(fmt.Sprintf("requested access to the resource is denied: %v", err)))
 	if err2 != nil {
-		log.Error().Msgf("failed to write token response: %v", err2)
+		log.Ctx(ctx).Error().Msgf("failed to write token response: %v", err2)
 	}
 }
 
diff --git a/registry/app/api/handler/packages/handler.go b/registry/app/api/handler/packages/handler.go
index 26c516c49..0b8619cde 100644
--- a/registry/app/api/handler/packages/handler.go
+++ b/registry/app/api/handler/packages/handler.go
@@ -117,25 +117,27 @@ type Handler interface {
 type PathPackageType string
 
 const (
-	PathPackageTypeGeneric PathPackageType = "generic"
-	PathPackageTypeMaven   PathPackageType = "maven"
-	PathPackageTypePython  PathPackageType = "python"
-	PathPackageTypeNuget   PathPackageType = "nuget"
-	PathPackageTypeNpm     PathPackageType = "npm"
-	PathPackageTypeRPM     PathPackageType = "rpm"
-	PathPackageTypeCargo   PathPackageType = "cargo"
-	PathPackageTypeGo      PathPackageType = "go"
+	PathPackageTypeGeneric     PathPackageType = "generic"
+	PathPackageTypeMaven       PathPackageType = "maven"
+	PathPackageTypePython      PathPackageType = "python"
+	PathPackageTypeNuget       PathPackageType = "nuget"
+	PathPackageTypeNpm         PathPackageType = "npm"
+	PathPackageTypeRPM         PathPackageType = "rpm"
+	PathPackageTypeCargo       PathPackageType = "cargo"
+	PathPackageTypeGo          PathPackageType = "go"
+	PathPackageTypeHuggingFace PathPackageType = "huggingface"
 )
 
 var packageTypeMap = map[PathPackageType]artifact2.PackageType{
-	PathPackageTypeGeneric: artifact2.PackageTypeGENERIC,
-	PathPackageTypeMaven:   artifact2.PackageTypeMAVEN,
-	PathPackageTypePython:  artifact2.PackageTypePYTHON,
-	PathPackageTypeNuget:   artifact2.PackageTypeNUGET,
-	PathPackageTypeNpm:     artifact2.PackageTypeNPM,
-	PathPackageTypeRPM:     artifact2.PackageTypeRPM,
-	PathPackageTypeCargo:   artifact2.PackageTypeCARGO,
-	PathPackageTypeGo:      artifact2.PackageTypeGO,
+	PathPackageTypeGeneric:     artifact2.PackageTypeGENERIC,
+	PathPackageTypeMaven:       artifact2.PackageTypeMAVEN,
+	PathPackageTypePython:      artifact2.PackageTypePYTHON,
+	PathPackageTypeNuget:       artifact2.PackageTypeNUGET,
+	PathPackageTypeNpm:         artifact2.PackageTypeNPM,
+	PathPackageTypeRPM:         artifact2.PackageTypeRPM,
+	PathPackageTypeCargo:       artifact2.PackageTypeCARGO,
+	PathPackageTypeGo:          artifact2.PackageTypeGO,
+	PathPackageTypeHuggingFace: artifact2.PackageTypeHUGGINGFACE,
 }
 
 func (h *handler) GetAuthenticator() authn.Authenticator {
@@ -168,7 +170,7 @@ func (h *handler) TrackDownloadStats(
 	info := request.ArtifactInfoFrom(r.Context()) //nolint:contextcheck
 	if err := h.DownloadStatDao.CreateByRegistryIDImageAndArtifactName(ctx,
 		info.BaseArtifactInfo().RegistryID, info.BaseArtifactInfo().Image, info.GetVersion()); err != nil {
-		log.Error().Msgf("failed to create download stat: %v", err.Error())
+		log.Ctx(ctx).Error().Msgf("failed to create download stat: %v", err.Error())
 		return usererror.ErrInternal
 	}
 	return nil
@@ -181,7 +183,7 @@ func (h *handler) CheckQuarantineStatus(
 	filePath, err := utils.GetFilePath(info.BaseArtifactInfo().PathPackageType,
 		info.BaseArtifactInfo().Image, info.GetVersion())
 	if err != nil {
-		log.Error().Msgf("failed to find the file paths for artifact: [%s], "+
+		log.Ctx(ctx).Error().Msgf("failed to find the file paths for artifact: [%s], "+
 			"version: [%s] with registryID: [%d] with error: %v",
 			info.BaseArtifactInfo().Image, info.GetVersion(), info.BaseArtifactInfo().RegistryID, err.Error())
 		return usererror.ErrInternal
@@ -190,13 +192,13 @@ func (h *handler) CheckQuarantineStatus(
 	paths, err := h.QuarantineArtifactDao.GetByFilePath(ctx, filePath,
 		info.BaseArtifactInfo().RegistryID, info.BaseArtifactInfo().Image, info.GetVersion())
 	if err != nil {
-		log.Error().Msgf("failed to find the qurantine paths for artifact: [%s], "+
+		log.Ctx(ctx).Error().Msgf("failed to find the qurantine paths for artifact: [%s], "+
 			"version: [%s] with registryID: [%d] with error: %v",
 			info.BaseArtifactInfo().Image, info.GetVersion(), info.BaseArtifactInfo().RegistryID, err.Error())
 		return usererror.ErrInternal
 	}
 	if len(paths) != 0 {
-		log.Error().Msgf("Requested artifact: [%s] with "+
+		log.Ctx(ctx).Error().Msgf("Requested artifact: [%s] with "+
 			"version: [%s] and filename: [%s] with registryID: [%d] is quarantined",
 			info.BaseArtifactInfo().Image, info.GetVersion(), info.GetFileName(), info.BaseArtifactInfo().RegistryID)
 		return usererror.ErrQuarantinedArtifact
diff --git a/registry/app/api/middleware/auth.go b/registry/app/api/middleware/auth.go
index 0577e2eba..498429ad1 100644
--- a/registry/app/api/middleware/auth.go
+++ b/registry/app/api/middleware/auth.go
@@ -73,6 +73,21 @@ func BlockNonOciSourceToken(urlProvider url.Provider) func(http.Handler) http.Ha
 	}
 }
 
+func CheckSig() func(http.Handler) http.Handler {
+	return func(next http.Handler) http.Handler {
+		return http.HandlerFunc(
+			func(w http.ResponseWriter, r *http.Request) {
+				// Check if the sig query parameter exists
+				if token := r.URL.Query().Get("sig"); token != "" {
+					// Set the token as a Bearer token in the Authorization header
+					r.Header.Set("Authorization", fmt.Sprintf("Bearer %s", token))
+				}
+				next.ServeHTTP(w, r)
+			},
+		)
+	}
+}
+
 func CheckAuth() func(http.Handler) http.Handler {
 	return func(next http.Handler) http.Handler {
 		return http.HandlerFunc(
diff --git a/registry/app/api/middleware/quarantine_artifact.go b/registry/app/api/middleware/quarantine_artifact.go
index abfaf28b8..9ad12afca 100644
--- a/registry/app/api/middleware/quarantine_artifact.go
+++ b/registry/app/api/middleware/quarantine_artifact.go
@@ -15,11 +15,20 @@
 package middleware
 
 import (
+	"context"
+	"errors"
 	"net/http"
 
 	"github.com/harness/gitness/app/api/render"
+	"github.com/harness/gitness/registry/app/api/handler/oci"
 	"github.com/harness/gitness/registry/app/api/handler/packages"
+	"github.com/harness/gitness/registry/app/api/router/utils"
+	"github.com/harness/gitness/registry/app/dist_temp/errcode"
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/docker"
+	"github.com/harness/gitness/registry/types"
 
+	"github.com/opencontainers/go-digest"
 	"github.com/rs/zerolog/log"
 )
 
@@ -44,3 +53,85 @@ func CheckQuarantineStatus(
 		)
 	}
 }
+
+func CheckQuarantineStatusOCI(h *oci.Handler) func(http.Handler) http.Handler {
+	return func(next http.Handler) http.Handler {
+		return http.HandlerFunc(
+			func(w http.ResponseWriter, r *http.Request) {
+				path := r.URL.Path
+				methodType := r.Method
+
+				requestType := utils.GetRouteTypeV2(path)
+
+				sw := &StatusWriter{ResponseWriter: w}
+
+				if utils.Manifests != requestType || (http.MethodGet != methodType && http.MethodHead != methodType) {
+					next.ServeHTTP(sw, r)
+					return
+				}
+				ctx := r.Context()
+
+				info, err := h.GetRegistryInfo(r, true)
+				if err != nil {
+					log.Ctx(ctx).Error().Stack().Str("middleware",
+						"CheckQuarantineStatus").Err(err).Msgf("error while fetching the artifact info: %v",
+						err)
+					next.ServeHTTP(sw, r)
+					return
+				}
+
+				err = dbQuarantineStatusOCI(ctx, h.Controller, info)
+				if err != nil {
+					if errors.Is(err, errcode.ErrCodeManifestQuarantined) {
+						render.Forbiddenf(ctx, w, err.Error())
+						return
+					}
+					log.Ctx(ctx).Error().Stack().Str("middleware",
+						"CheckQuarantineStatus").Err(err).Msgf("error while checking the quarantine status of artifact, %v",
+						err)
+				}
+				next.ServeHTTP(sw, r)
+			},
+		)
+	}
+}
+
+func dbQuarantineStatusOCI(
+	ctx context.Context,
+	c *docker.Controller,
+	info pkg.RegistryInfo,
+) error {
+	registry := info.Registry
+
+	var parsedDigest digest.Digest
+	var err error
+	if info.Digest == "" {
+		dbManifest, err := c.DBStore.ManifestDao.FindManifestDigestByTagName(ctx, registry.ID, info.Image, info.Tag)
+		if err != nil {
+			return err
+		}
+		parsedDigest, err = dbManifest.Parse()
+		if err != nil {
+			return err
+		}
+	} else {
+		// Convert raw digest string to proper digest format with prefix
+		parsedDigest, err = digest.Parse(info.Digest)
+		if err != nil {
+			return err
+		}
+	}
+	typesDigest, err := types.NewDigest(parsedDigest)
+	if err != nil {
+		return err
+	}
+	digestVal := typesDigest.String()
+	quarantineArtifacts, err := c.DBStore.QuarantineDao.GetByFilePath(ctx, "", registry.ID, info.Image, digestVal)
+	if err != nil {
+		return err
+	}
+	if len(quarantineArtifacts) > 0 {
+		return errcode.ErrCodeManifestQuarantined
+	}
+	return nil
+}
diff --git a/registry/app/api/openapi/api.yaml b/registry/app/api/openapi/api.yaml
index 30924d624..8dbce0b0e 100644
--- a/registry/app/api/openapi/api.yaml
+++ b/registry/app/api/openapi/api.yaml
@@ -41,6 +41,7 @@ paths:
         - $ref: "#/components/parameters/sortField"
         - $ref: "#/components/parameters/searchTerm"
         - $ref: "#/components/parameters/recursiveParam"
+        - $ref: "#/components/parameters/scopeParam"
       responses:
         200:
           $ref: "#/components/responses/ListRegistryResponse"
@@ -71,6 +72,7 @@ paths:
         - $ref: "#/components/parameters/searchTerm"
         - $ref: "#/components/parameters/latestVersion"
         - $ref: "#/components/parameters/packageTypeParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
       responses:
         200:
           $ref: "#/components/responses/ListArtifactResponse"
@@ -475,6 +477,7 @@ paths:
         - $ref: "#/components/parameters/sortOrder"
         - $ref: "#/components/parameters/sortField"
         - $ref: "#/components/parameters/searchTerm"
+        - $ref: "#/components/parameters/artifactTypeParam"
       responses:
         200:
           $ref: "#/components/responses/ListRegistryArtifactResponse"
@@ -549,6 +552,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
       responses:
         200:
           $ref: "#/components/responses/Success"
@@ -573,6 +577,7 @@ paths:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
         - $ref: "#/components/parameters/versionPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
       responses:
         200:
           $ref: "#/components/responses/Success"
@@ -596,6 +601,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
       responses:
         200:
           $ref: "#/components/responses/ArtifactSummaryResponse"
@@ -619,6 +625,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
         - $ref: "#/components/parameters/pageNumber"
         - $ref: "#/components/parameters/pageSize"
         - $ref: "#/components/parameters/sortOrder"
@@ -647,6 +654,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
       requestBody:
         $ref: "#/components/requestBodies/ArtifactLabelRequest"
       responses:
@@ -697,7 +705,9 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
         - $ref: "#/components/parameters/versionPathParam"
+        - $ref: "#/components/parameters/digestOptParam"
       responses:
         200:
           $ref: "#/components/responses/ArtifactVersionSummaryResponse"
@@ -721,6 +731,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
         - $ref: "#/components/parameters/versionPathParam"
         - $ref: "#/components/parameters/childVersionParam"
       responses:
@@ -746,6 +757,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
         - $ref: "#/components/parameters/versionPathParam"
         - $ref: "#/components/parameters/pageNumber"
         - $ref: "#/components/parameters/pageSize"
@@ -775,6 +787,7 @@ paths:
       parameters:
         - $ref: "#/components/parameters/registryRefPathParam"
         - $ref: "#/components/parameters/artifactPathParam"
+        - $ref: "#/components/parameters/artifactTypeParam"
         - $ref: "#/components/parameters/versionPathParam"
         - $ref: "#/components/parameters/fileNamePathParam"
       responses:
@@ -1155,8 +1168,8 @@ paths:
         - $ref: "#/components/parameters/versionParam"
         - $ref: "#/components/parameters/filePathParam"
       responses:
-        204:
-          $ref: "#/components/responses/Success"
+        200:
+          $ref:  "#/components/responses/Success"
         400:
           $ref: "#/components/responses/BadRequest"
         401:
@@ -1310,6 +1323,17 @@ components:
             required:
               - status
               - data
+    quarantinePathDeleteResponse:
+      description: quarantine path response
+      content:
+        application/json:
+          schema:
+            type: object
+            properties:
+              status:
+                $ref: "#/components/schemas/Status"
+            required:
+              - status
     DockerArtifactDetailResponse:
       description: response to get docker artifact detail
       content:
@@ -2216,8 +2240,12 @@ components:
           type: string
         isQuarantined:
           type: boolean
+        quarantineReason:
+          type: string
         packageType:
           $ref: "#/components/schemas/PackageType"
+        artifactType:
+          $ref: "#/components/schemas/ArtifactType"
       required:
         - name
         - registryIdentifier
@@ -2248,6 +2276,8 @@ components:
           type: boolean
         packageType:
           $ref: "#/components/schemas/PackageType"
+        artifactType:
+          $ref: "#/components/schemas/ArtifactType"
       required:
         - name
         - registryIdentifier
@@ -2279,8 +2309,12 @@ components:
           type: string
         isQuarantined:
           type: boolean
+        quarantineReason:
+          type: string
         packageType:
           $ref: "#/components/schemas/PackageType"
+        artifactType:
+          $ref: "#/components/schemas/ArtifactType"
       required:
         - name
         - registryIdentifier
@@ -2345,8 +2379,14 @@ components:
           type: string
         createdBy:
           type: string
+        isQuarantined:
+          type: boolean
+        quarantineReason:
+          type: string
         packageType:
           $ref: "#/components/schemas/PackageType"
+        artifactType:
+          $ref: "#/components/schemas/ArtifactType"
       discriminator:
         propertyName: packageType
         mapping:
@@ -2360,6 +2400,7 @@ components:
           NUGET: "#/components/schemas/NugetArtifactDetailConfig"
           CARGO: "#/components/schemas/CargoArtifactDetailConfig"
           GO: "#/components/schemas/GoArtifactDetailConfig"
+          HUGGINGFACE: "#/components/schemas/HuggingFaceArtifactDetailConfig"
       oneOf:
         - $ref: "#/components/schemas/DockerArtifactDetailConfig"
         - $ref: "#/components/schemas/HelmArtifactDetailConfig"
@@ -2371,6 +2412,7 @@ components:
         - $ref: "#/components/schemas/NugetArtifactDetailConfig"
         - $ref: "#/components/schemas/CargoArtifactDetailConfig"
         - $ref: "#/components/schemas/GoArtifactDetailConfig"
+        - $ref: "#/components/schemas/HuggingFaceArtifactDetailConfig"
       required:
         - imageName
         - version
@@ -2445,6 +2487,13 @@ components:
       properties:
         pullCommand:
           type: string
+    HuggingFaceArtifactDetailConfig:
+      type: object
+      description: Config for huggingface artifact details
+      properties:
+        metadata:
+          type: object
+          additionalProperties: true
     Webhook:
       type: object
       description: Harness Regstries Webhook
@@ -2598,6 +2647,10 @@ components:
           type: string
         modifiedAt:
           type: string
+        isQuarantined:
+          type: boolean
+        quarantineReason:
+          type: string
       required:
         - imageName
         - version
@@ -2665,6 +2718,8 @@ components:
           type: string
         packageType:
           $ref: "#/components/schemas/PackageType"
+        artifactType:
+          $ref: "#/components/schemas/ArtifactType"
         labels:
           type: array
           items:
@@ -2687,8 +2742,14 @@ components:
           type: string
         version:
           type: string
+        isQuarantined:
+          type: boolean
+        quarantineReason:
+          type: string
         packageType:
           $ref: "#/components/schemas/PackageType"
+        artifactType:
+          $ref: "#/components/schemas/ArtifactType"
       required:
         - imageName
         - version
@@ -2734,6 +2795,10 @@ components:
         downloadsCount:
           type: integer
           format: int64
+        isQuarantined:
+          type: boolean
+        quarantineReason:
+          type: string
       required:
         - digest
         - layers
@@ -2816,6 +2881,7 @@ components:
             - NugetOrg
             - Crates
             - GoProxy
+            - HuggingFace
       x-discriminator-value: UPSTREAM
       required:
         - authType
@@ -2881,6 +2947,13 @@ components:
         - RPM
         - CARGO
         - GO
+        - HUGGINGFACE
+    ArtifactType:
+      type: string
+      description: refers to artifact type
+      enum:
+        - MODEL
+        - DATASET
     SectionType:
       type: string
       description: refers to client setup section type
@@ -3101,11 +3174,35 @@ components:
     recursiveParam:
       name: recursive
       in: query
-      description: Whether to list registries recursively.
+      description: |
+        Whether to list registries recursively.
+
+        **Deprecated.** Use the new `scope` parameter.
+
+        * `recursive=true`  → `scope=ancestors`
+        * `recursive=false` → `scope=none`
       required: false
       schema:
         type: boolean
         default: false
+    scopeParam:
+      name: scope
+      in: query
+      description: >
+        **Scope of registries to list**
+
+        * **none** – current space only (default)  
+        * **ancestors** – current space **plus** all parent spaces  
+        * **descendants** – current space **plus** all child spaces  
+
+        If omitted, `none` is assumed.
+      required: false
+      schema:
+        type: string
+        enum:
+          - ancestors
+          - descendants
+          - none
     spaceRefPathParam:
       name: space_ref
       in: path
@@ -3135,6 +3232,13 @@ components:
         or as a plain path ending with a trailing plus sign (`+`) as separator (e.g., `organization/project/registry/+`).
       schema:
         type: string
+    digestOptParam:
+      name: digest
+      in: query
+      required: false
+      description: Digest.
+      schema:
+        type: string
     webhookIdentifierPathParam:
       name: webhook_identifier
       in: path
@@ -3212,6 +3316,16 @@ components:
       description: search Term.
       schema:
         type: string
+    artifactTypeParam:
+      name: artifact_type
+      in: query
+      required: false
+      description: artifact type.
+      schema:
+        type: string
+        enum:
+          - MODEL
+          - DATASET
     pageNumber:
       name: page
       in: query
diff --git a/registry/app/api/openapi/contracts/artifact/services.gen.go b/registry/app/api/openapi/contracts/artifact/services.gen.go
index dcd46ebb6..4748af97f 100644
--- a/registry/app/api/openapi/contracts/artifact/services.gen.go
+++ b/registry/app/api/openapi/contracts/artifact/services.gen.go
@@ -44,19 +44,19 @@ type ServerInterface interface {
 	GetArtifactStatsForRegistry(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, params GetArtifactStatsForRegistryParams)
 	// Delete Artifact
 	// (DELETE /registry/{registry_ref}/artifact/{artifact})
-	DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam)
+	DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params DeleteArtifactParams)
 	// Update Artifact Labels
 	// (PUT /registry/{registry_ref}/artifact/{artifact}/labels)
-	UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam)
+	UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params UpdateArtifactLabelsParams)
 	// Get Artifact Stats
 	// (GET /registry/{registry_ref}/artifact/{artifact}/stats)
 	GetArtifactStats(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params GetArtifactStatsParams)
 	// Get Artifact Summary
 	// (GET /registry/{registry_ref}/artifact/{artifact}/summary)
-	GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam)
+	GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params GetArtifactSummaryParams)
 	// Delete an Artifact Version
 	// (DELETE /registry/{registry_ref}/artifact/{artifact}/version/{version})
-	DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam)
+	DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params DeleteArtifactVersionParams)
 	// Describe Artifact Details
 	// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/details)
 	GetArtifactDetails(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetArtifactDetailsParams)
@@ -74,7 +74,7 @@ type ServerInterface interface {
 	GetDockerArtifactManifests(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam)
 	// Get Artifact file
 	// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/file/{file_name})
-	GetArtifactFile(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, fileName FileNamePathParam)
+	GetArtifactFile(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, fileName FileNamePathParam, params GetArtifactFileParams)
 	// Describe Artifact files
 	// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/files)
 	GetArtifactFiles(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetArtifactFilesParams)
@@ -86,7 +86,7 @@ type ServerInterface interface {
 	GetHelmArtifactManifest(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam)
 	// Get Artifact Version Summary
 	// (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/summary)
-	GetArtifactVersionSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam)
+	GetArtifactVersionSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetArtifactVersionSummaryParams)
 	// List Artifact Versions
 	// (GET /registry/{registry_ref}/artifact/{artifact}/versions)
 	GetAllArtifactVersions(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params GetAllArtifactVersionsParams)
@@ -206,13 +206,13 @@ func (_ Unimplemented) GetArtifactStatsForRegistry(w http.ResponseWriter, r *htt
 
 // Delete Artifact
 // (DELETE /registry/{registry_ref}/artifact/{artifact})
-func (_ Unimplemented) DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
+func (_ Unimplemented) DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params DeleteArtifactParams) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
 // Update Artifact Labels
 // (PUT /registry/{registry_ref}/artifact/{artifact}/labels)
-func (_ Unimplemented) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
+func (_ Unimplemented) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params UpdateArtifactLabelsParams) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
@@ -224,13 +224,13 @@ func (_ Unimplemented) GetArtifactStats(w http.ResponseWriter, r *http.Request,
 
 // Get Artifact Summary
 // (GET /registry/{registry_ref}/artifact/{artifact}/summary)
-func (_ Unimplemented) GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
+func (_ Unimplemented) GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params GetArtifactSummaryParams) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
 // Delete an Artifact Version
 // (DELETE /registry/{registry_ref}/artifact/{artifact}/version/{version})
-func (_ Unimplemented) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam) {
+func (_ Unimplemented) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params DeleteArtifactVersionParams) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
@@ -266,7 +266,7 @@ func (_ Unimplemented) GetDockerArtifactManifests(w http.ResponseWriter, r *http
 
 // Get Artifact file
 // (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/file/{file_name})
-func (_ Unimplemented) GetArtifactFile(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, fileName FileNamePathParam) {
+func (_ Unimplemented) GetArtifactFile(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, fileName FileNamePathParam, params GetArtifactFileParams) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
@@ -290,7 +290,7 @@ func (_ Unimplemented) GetHelmArtifactManifest(w http.ResponseWriter, r *http.Re
 
 // Get Artifact Version Summary
 // (GET /registry/{registry_ref}/artifact/{artifact}/version/{version}/summary)
-func (_ Unimplemented) GetArtifactVersionSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam) {
+func (_ Unimplemented) GetArtifactVersionSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetArtifactVersionSummaryParams) {
 	w.WriteHeader(http.StatusNotImplemented)
 }
 
@@ -674,8 +674,19 @@ func (siw *ServerInterfaceWrapper) DeleteArtifact(w http.ResponseWriter, r *http
 		return
 	}
 
+	// Parameter object where we will unmarshal all parameters from the context
+	var params DeleteArtifactParams
+
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		siw.Handler.DeleteArtifact(w, r, registryRef, artifact)
+		siw.Handler.DeleteArtifact(w, r, registryRef, artifact, params)
 	}))
 
 	for _, middleware := range siw.HandlerMiddlewares {
@@ -708,8 +719,19 @@ func (siw *ServerInterfaceWrapper) UpdateArtifactLabels(w http.ResponseWriter, r
 		return
 	}
 
+	// Parameter object where we will unmarshal all parameters from the context
+	var params UpdateArtifactLabelsParams
+
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		siw.Handler.UpdateArtifactLabels(w, r, registryRef, artifact)
+		siw.Handler.UpdateArtifactLabels(w, r, registryRef, artifact, params)
 	}))
 
 	for _, middleware := range siw.HandlerMiddlewares {
@@ -795,8 +817,19 @@ func (siw *ServerInterfaceWrapper) GetArtifactSummary(w http.ResponseWriter, r *
 		return
 	}
 
+	// Parameter object where we will unmarshal all parameters from the context
+	var params GetArtifactSummaryParams
+
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		siw.Handler.GetArtifactSummary(w, r, registryRef, artifact)
+		siw.Handler.GetArtifactSummary(w, r, registryRef, artifact, params)
 	}))
 
 	for _, middleware := range siw.HandlerMiddlewares {
@@ -838,8 +871,19 @@ func (siw *ServerInterfaceWrapper) DeleteArtifactVersion(w http.ResponseWriter,
 		return
 	}
 
+	// Parameter object where we will unmarshal all parameters from the context
+	var params DeleteArtifactVersionParams
+
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		siw.Handler.DeleteArtifactVersion(w, r, registryRef, artifact, version)
+		siw.Handler.DeleteArtifactVersion(w, r, registryRef, artifact, version, params)
 	}))
 
 	for _, middleware := range siw.HandlerMiddlewares {
@@ -884,6 +928,14 @@ func (siw *ServerInterfaceWrapper) GetArtifactDetails(w http.ResponseWriter, r *
 	// Parameter object where we will unmarshal all parameters from the context
 	var params GetArtifactDetailsParams
 
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	// ------------- Optional query parameter "childVersion" -------------
 
 	err = runtime.BindQueryParameter("form", true, false, "childVersion", r.URL.Query(), &params.ChildVersion)
@@ -1170,8 +1222,19 @@ func (siw *ServerInterfaceWrapper) GetArtifactFile(w http.ResponseWriter, r *htt
 		return
 	}
 
+	// Parameter object where we will unmarshal all parameters from the context
+	var params GetArtifactFileParams
+
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		siw.Handler.GetArtifactFile(w, r, registryRef, artifact, version, fileName)
+		siw.Handler.GetArtifactFile(w, r, registryRef, artifact, version, fileName, params)
 	}))
 
 	for _, middleware := range siw.HandlerMiddlewares {
@@ -1216,6 +1279,14 @@ func (siw *ServerInterfaceWrapper) GetArtifactFiles(w http.ResponseWriter, r *ht
 	// Parameter object where we will unmarshal all parameters from the context
 	var params GetArtifactFilesParams
 
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	// ------------- Optional query parameter "page" -------------
 
 	err = runtime.BindQueryParameter("form", true, false, "page", r.URL.Query(), &params.Page)
@@ -1385,8 +1456,27 @@ func (siw *ServerInterfaceWrapper) GetArtifactVersionSummary(w http.ResponseWrit
 		return
 	}
 
+	// Parameter object where we will unmarshal all parameters from the context
+	var params GetArtifactVersionSummaryParams
+
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
+	// ------------- Optional query parameter "digest" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "digest", r.URL.Query(), &params.Digest)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "digest", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		siw.Handler.GetArtifactVersionSummary(w, r, registryRef, artifact, version)
+		siw.Handler.GetArtifactVersionSummary(w, r, registryRef, artifact, version, params)
 	}))
 
 	for _, middleware := range siw.HandlerMiddlewares {
@@ -1422,6 +1512,14 @@ func (siw *ServerInterfaceWrapper) GetAllArtifactVersions(w http.ResponseWriter,
 	// Parameter object where we will unmarshal all parameters from the context
 	var params GetAllArtifactVersionsParams
 
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	// ------------- Optional query parameter "page" -------------
 
 	err = runtime.BindQueryParameter("form", true, false, "page", r.URL.Query(), &params.Page)
@@ -1538,6 +1636,14 @@ func (siw *ServerInterfaceWrapper) GetAllArtifactsByRegistry(w http.ResponseWrit
 		return
 	}
 
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		siw.Handler.GetAllArtifactsByRegistry(w, r, registryRef, params)
 	}))
@@ -2402,6 +2508,14 @@ func (siw *ServerInterfaceWrapper) GetAllArtifacts(w http.ResponseWriter, r *htt
 		return
 	}
 
+	// ------------- Optional query parameter "artifact_type" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "artifact_type", r.URL.Query(), &params.ArtifactType)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "artifact_type", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		siw.Handler.GetAllArtifacts(w, r, spaceRef, params)
 	}))
@@ -2494,6 +2608,14 @@ func (siw *ServerInterfaceWrapper) GetAllRegistries(w http.ResponseWriter, r *ht
 		return
 	}
 
+	// ------------- Optional query parameter "scope" -------------
+
+	err = runtime.BindQueryParameter("form", true, false, "scope", r.URL.Query(), &params.Scope)
+	if err != nil {
+		siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "scope", Err: err})
+		return
+	}
+
 	handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
 		siw.Handler.GetAllRegistries(w, r, spaceRef, params)
 	}))
@@ -3402,6 +3524,7 @@ func (response GetArtifactStatsForRegistry500JSONResponse) VisitGetArtifactStats
 type DeleteArtifactRequestObject struct {
 	RegistryRef RegistryRefPathParam `json:"registry_ref"`
 	Artifact    ArtifactPathParam    `json:"artifact"`
+	Params      DeleteArtifactParams
 }
 
 type DeleteArtifactResponseObject interface {
@@ -3467,6 +3590,7 @@ func (response DeleteArtifact500JSONResponse) VisitDeleteArtifactResponse(w http
 type UpdateArtifactLabelsRequestObject struct {
 	RegistryRef RegistryRefPathParam `json:"registry_ref"`
 	Artifact    ArtifactPathParam    `json:"artifact"`
+	Params      UpdateArtifactLabelsParams
 	Body        *UpdateArtifactLabelsJSONRequestBody
 }
 
@@ -3603,6 +3727,7 @@ func (response GetArtifactStats500JSONResponse) VisitGetArtifactStatsResponse(w
 type GetArtifactSummaryRequestObject struct {
 	RegistryRef RegistryRefPathParam `json:"registry_ref"`
 	Artifact    ArtifactPathParam    `json:"artifact"`
+	Params      GetArtifactSummaryParams
 }
 
 type GetArtifactSummaryResponseObject interface {
@@ -3671,6 +3796,7 @@ type DeleteArtifactVersionRequestObject struct {
 	RegistryRef RegistryRefPathParam `json:"registry_ref"`
 	Artifact    ArtifactPathParam    `json:"artifact"`
 	Version     VersionPathParam     `json:"version"`
+	Params      DeleteArtifactVersionParams
 }
 
 type DeleteArtifactVersionResponseObject interface {
@@ -4082,6 +4208,7 @@ type GetArtifactFileRequestObject struct {
 	Artifact    ArtifactPathParam    `json:"artifact"`
 	Version     VersionPathParam     `json:"version"`
 	FileName    FileNamePathParam    `json:"file_name"`
+	Params      GetArtifactFileParams
 }
 
 type GetArtifactFileResponseObject interface {
@@ -4353,6 +4480,7 @@ type GetArtifactVersionSummaryRequestObject struct {
 	RegistryRef RegistryRefPathParam `json:"registry_ref"`
 	Artifact    ArtifactPathParam    `json:"artifact"`
 	Version     VersionPathParam     `json:"version"`
+	Params      GetArtifactVersionSummaryParams
 }
 
 type GetArtifactVersionSummaryResponseObject interface {
@@ -4628,11 +4756,11 @@ type DeleteQuarantineFilePathResponseObject interface {
 	VisitDeleteQuarantineFilePathResponse(w http.ResponseWriter) error
 }
 
-type DeleteQuarantineFilePath204JSONResponse struct{ SuccessJSONResponse }
+type DeleteQuarantineFilePath200JSONResponse struct{ SuccessJSONResponse }
 
-func (response DeleteQuarantineFilePath204JSONResponse) VisitDeleteQuarantineFilePathResponse(w http.ResponseWriter) error {
+func (response DeleteQuarantineFilePath200JSONResponse) VisitDeleteQuarantineFilePathResponse(w http.ResponseWriter) error {
 	w.Header().Set("Content-Type", "application/json")
-	w.WriteHeader(204)
+	w.WriteHeader(200)
 
 	return json.NewEncoder(w).Encode(response)
 }
@@ -6346,11 +6474,12 @@ func (sh *strictHandler) GetArtifactStatsForRegistry(w http.ResponseWriter, r *h
 }
 
 // DeleteArtifact operation middleware
-func (sh *strictHandler) DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
+func (sh *strictHandler) DeleteArtifact(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params DeleteArtifactParams) {
 	var request DeleteArtifactRequestObject
 
 	request.RegistryRef = registryRef
 	request.Artifact = artifact
+	request.Params = params
 
 	handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
 		return sh.ssi.DeleteArtifact(ctx, request.(DeleteArtifactRequestObject))
@@ -6373,11 +6502,12 @@ func (sh *strictHandler) DeleteArtifact(w http.ResponseWriter, r *http.Request,
 }
 
 // UpdateArtifactLabels operation middleware
-func (sh *strictHandler) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
+func (sh *strictHandler) UpdateArtifactLabels(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params UpdateArtifactLabelsParams) {
 	var request UpdateArtifactLabelsRequestObject
 
 	request.RegistryRef = registryRef
 	request.Artifact = artifact
+	request.Params = params
 
 	var body UpdateArtifactLabelsJSONRequestBody
 	if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
@@ -6435,11 +6565,12 @@ func (sh *strictHandler) GetArtifactStats(w http.ResponseWriter, r *http.Request
 }
 
 // GetArtifactSummary operation middleware
-func (sh *strictHandler) GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam) {
+func (sh *strictHandler) GetArtifactSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, params GetArtifactSummaryParams) {
 	var request GetArtifactSummaryRequestObject
 
 	request.RegistryRef = registryRef
 	request.Artifact = artifact
+	request.Params = params
 
 	handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
 		return sh.ssi.GetArtifactSummary(ctx, request.(GetArtifactSummaryRequestObject))
@@ -6462,12 +6593,13 @@ func (sh *strictHandler) GetArtifactSummary(w http.ResponseWriter, r *http.Reque
 }
 
 // DeleteArtifactVersion operation middleware
-func (sh *strictHandler) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam) {
+func (sh *strictHandler) DeleteArtifactVersion(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params DeleteArtifactVersionParams) {
 	var request DeleteArtifactVersionRequestObject
 
 	request.RegistryRef = registryRef
 	request.Artifact = artifact
 	request.Version = version
+	request.Params = params
 
 	handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
 		return sh.ssi.DeleteArtifactVersion(ctx, request.(DeleteArtifactVersionRequestObject))
@@ -6634,13 +6766,14 @@ func (sh *strictHandler) GetDockerArtifactManifests(w http.ResponseWriter, r *ht
 }
 
 // GetArtifactFile operation middleware
-func (sh *strictHandler) GetArtifactFile(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, fileName FileNamePathParam) {
+func (sh *strictHandler) GetArtifactFile(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, fileName FileNamePathParam, params GetArtifactFileParams) {
 	var request GetArtifactFileRequestObject
 
 	request.RegistryRef = registryRef
 	request.Artifact = artifact
 	request.Version = version
 	request.FileName = fileName
+	request.Params = params
 
 	handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
 		return sh.ssi.GetArtifactFile(ctx, request.(GetArtifactFileRequestObject))
@@ -6748,12 +6881,13 @@ func (sh *strictHandler) GetHelmArtifactManifest(w http.ResponseWriter, r *http.
 }
 
 // GetArtifactVersionSummary operation middleware
-func (sh *strictHandler) GetArtifactVersionSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam) {
+func (sh *strictHandler) GetArtifactVersionSummary(w http.ResponseWriter, r *http.Request, registryRef RegistryRefPathParam, artifact ArtifactPathParam, version VersionPathParam, params GetArtifactVersionSummaryParams) {
 	var request GetArtifactVersionSummaryRequestObject
 
 	request.RegistryRef = registryRef
 	request.Artifact = artifact
 	request.Version = version
+	request.Params = params
 
 	handler := func(ctx context.Context, w http.ResponseWriter, r *http.Request, request interface{}) (interface{}, error) {
 		return sh.ssi.GetArtifactVersionSummary(ctx, request.(GetArtifactVersionSummaryRequestObject))
@@ -7483,121 +7617,127 @@ func (sh *strictHandler) GetAllRegistries(w http.ResponseWriter, r *http.Request
 // Base64 encoded, gzipped, json marshaled Swagger object
 var swaggerSpec = []string{
 
-	"H4sIAAAAAAAC/+xde3PbOJL/KjjebdVuLWN5ZnNXV766Pxw/Eu/ajla2szU1l/LAJCRxQpEMAPoxKX/3",
-	"K7xIkARIUJIlOeE/M46IR6Px60bj0d3fvCBdZGmCEkq8g29eBjFcIIow/9c5vEMxGbPf2D9DRAIcZTRK",
-	"E+9AfNzzfC9i//qaI/zk+V4CF8g78GL20fM9EszRArLKEUUL3ih9ylgJQnGUzLxnX/0AMYZP3vOz703Q",
-	"LCIUP52FKKHRNELYQoIqCMqSFnowmt1GeqGVCLt+ylAXSayMhRgqPpUkoCRfeAe/ep/OJtc3h+ee792M",
-	"r64nJ4cX3me/Ttez70FMoykMqIWGQ/6ZWnpXlSsUtPVB55Z+LuECgXQKVNECDBmkc2OHGH3NI4xC74Di",
-	"HLUTEMyjOPyEMInSxELAESsC7kUZECUBJJyg4zT4gnBBF7GhVO+igx1hNEPExvBj/tHWi6jac/TTKEaM",
-	"vw7sP5TDBKdRjCxzwJq75X/3J6OFBPXZMnLeqySktRecLo4htckU+7QHTlO8gBS8ARcXo+Pj0S+//PKL",
-	"rVucLjp6jCFFhKqpN+g29hnI74yxFGG7rmOFb+/tOLpL0xjBhPecweALnCEXFTIWRdtUiWzttqFSemi1",
-	"DM7QZb64Q9ggYTnGKKGAlQGJKGSjZFalIERTmMfUO/jJ96Z87rwDL0rof731CiKihKIZwgUZV9EfyAB0",
-	"3i+DOh8VyBAGsjsTJYQ1YqTk5303UjAKckyie9sM/WuO6BxhQFMQR4QCLGYsQgQUVeOnPetaJIuYiZzC",
-	"mCDfBB3ZzdMETVtk8iaJvuYIMLED5ZIHpikGdI7ANEpgrCh+AlHCf73DMAnme+B6jsA9jHMEApiAOwQy",
-	"nN5HIQoBiviQIQEQTPM4fgI3k/M3KAlS9pX39me0N9vzwW8pnsEk+gMygv7082mG099RQP/086nq9be/",
-	"gFQ2lcUwSkR1lIRRMgMPEZ0DCCiGUcz+ncU5ASSaJeDPv/31t7+wagQxO4Wm2NjlSHY4Ut2N/vrbX/b+",
-	"LzFrRlXoFqNpT+VIEMTB/BphwyyIb4B9tOFAFLmlrH5HRymmpxGKQ0M/xSdLJymmt1NZoKuPjzg0KYHy",
-	"U0sfqSzQ2kcGA7QG9PJ2NgjdDeG1DaZ8yMtgVLL8n2zKBp538LwObI3pbUym6RqtF5p29HbfahOX5qyp",
-	"8XsnY7fowd32lN1azM+y2z7YfUB38zT9cvKIgpz1exZ2Kw5ZByBVSUO0hThZ5baochuFy1Gqb1hdCXUm",
-	"r7J9dSfuWRRGhL5Lwwhxm1DNGt/CT8RX9nuQJhQl/E+YZXEUCFn5nQgbuezkP5hMHHj/PipPD0biKxkZ",
-	"G+d0VPkgqWJGVJ6FkKJivwb46QHxtB33uomst9tCH1ODAUacwCRUtCqzQRBZkDHJY7R+Wo3NL0Fy0Q7A",
-	"eYwY6f8S4Fo3ybVme5MqMc8o/JpDDBMaJWvna7PldpSW5QHJUBBNowCwHS5fmaSBTrI0IVUhO0YURvFE",
-	"fupFfYbTDGEqpTaE1Fn4RKeMf4RCmpOueleilNIWQrX8qir7ou/yLCq9Y4unmV9inIxhM0RLmQ45RVyo",
-	"FZGnEUPz6nxJH5I4heENjpvaVn0EOY71syrPb+6M18QqjZy+HJsjGJYsY+DS+SU16kaBdJUvFlCouV1B",
-	"El8dgPqsM4j1TTbNINbnLrGHNUXM7BFzOSCIlCQpKqX9uh0WVTvfAU6F1QP04ohdY9w7GK57QT7BOMUm",
-	"8t7BEGC1RvveURyhhF4hmmdinduUzDc73uZccdOJUwQII0lfYsUNyFZMEFPXOwjpsCCsSvAFTKIpInQr",
-	"3FKd7yC/Fhppguhz+IQw2SifRJc7aZMwwkreqIncLHuKXneTNczeX5sqYsYxMdx9ixuZdAo+QJwgQqrX",
-	"o2xIxdVYG19KWpt3ZqKJozQXVFcJuJ4zFlAYy+uy4trK8z30CBdZjNyuxMSNWI9eWPFqL/v7zv2cJSF6",
-	"NPcTaHeAevPujZuv9Vjbif1qT2dWs9k1otuXWFoJ5aKJZ9/7gOLFVtbdZsc7oAXmKF6Y1lyd2A2vuKau",
-	"d45T+mp7llCEExhfIXyPsDCSX9zkVp0CwnsFSBT0vfOI0G0cSDT63bbpzdcZw5G1TugWeLNTbKnzQ250",
-	"t8AWdS22C9yRu2lSOY+UnLqIZphz4GwBZ2iDjKp2vAU+TRp8WiiSQLTgto3kkbq82YKU1bveSWkrL7c2",
-	"zped4Id+NyeIq12gbZAtlZ53Qqrq14CFWMlLO1Lct2+QUY2+t7GF5eyRV4+kfEFQPUzXqd0Cg3ZCwB40",
-	"Yi5TeprmSfjyJinbL8qLVxSyOUlzHCDwAAlIUgqmnIpn3xvHMEqu0aNtXaDokY74m6L/AcEcYoLo/+Z0",
-	"+ua/qzQW+0+2WYlTHzykOA7/rXlx2KT0UD5ZYj1VwLNhzbwrWllc8Ptix+z4hmJDDNop/VxXzZJRjKyr",
-	"PAgQISvwYx0DcxmRpBRMNNzfJDCnc5RQRizagK6od1jQkOLoj80RIHsrH9psem2td7sFhDdf5OkasXgp",
-	"tEl27Kg+NL56GkM63xB3qp1ugUnaCyv+2rcEyrN64iieVnEN8w/0dIUCjOg/0FNzwFCVMTrBwGoLmv+g",
-	"Q+mrDAbojCsRhwNwU2XOX1NPRA2og6KiXD9aqtUsVNSn0UDS52ffO0zS5GmRcnhoDynk0bPFKTGgQBbw",
-	"vTBi3xdRAqk40VzALGMUHHzzjg4n7z9ar+EhnqXV/o7SZBrNPN87/nj0j5NJn7vpour7k8uTydmRre57",
-	"lCAcBbbKVmrf20j9cHJ+4X6YX1S7OPx0cmmrdwHvUWKpeDm2dneZ2Xq7vHl/cm2tls8QtVQc/3L94aOV",
-	"zvETnac2Qid2QicWQp99Jf5PlxXPOO479+x7aYI+Tr2DX/u/XSh66Hv94lixDVddde3T3VWzZQK6ql5m",
-	"yw10smQ9O8q6atoVReekWKp99mvLjFjKw0NqVNPy6zvzIqReihZ3vA4afJGGfP9r6VD4DBg+6OLQsZyP",
-	"q5JD5OVto8n70nu2fQXhp7eXwvlY9wQRuz/pP5xjtiboZDYtBt/quVCdFHkZ088NVqdYNtBGwQWiUBlV",
-	"lpWuKOJbXiyTPjMfkX8W5lFoci72lxg3q0PohQTVpiCV5XF8lC4WMDF3iRsBIFqLWa0pZ4QWnvGNfuuu",
-	"4rVe2xAiXgY34NF4lyLK2TDSByKqjnpv4VCFPyK5oinWnmk4VMuzXv08t7FJvuZyYJQs2U8HLydshcoy",
-	"NbmMnHUo7mWFqUXVuupSCW0HhabiIdgVGw91UTDajtBekzGNYrR2Tfn9aj3Lgr0JlVd7yN70hRWPShuA",
-	"skl2uxguPxUrmi6dkpXTuaKqJkrlqSQbtwzboeL/3BCEx5CQhxSHnm865tC33Z8NLkx2i7cZ2oP/zs+j",
-	"eK2mq1Z9NhaahoBhGLGGYDzWyghn1Po5j4FDR0wQ82ycxlFgwIn8DMR3TmNjNZgUQTcahKLHLMLoGD4R",
-	"sxbqEu4xRtPosZ9+Vz7Tvaua2dNwNDDwiD/954XAsW3KYJR8QDC0HyO1fxVXsfpoHP0jrkTdTktbI1An",
-	"R+v8czt/VEft/FGl2k+dzi7Pzy5PXEZHUVYcV1wfvruy1bmGd/UKzaMK2uuMwkxG14bWREhjMztfFinU",
-	"QQXLKTCaLdSmSWuD7ZplVqRhHYoldzkUc26JJdsg8/PVOFLrqOBMFxc0I6KDGUAV9U07ZPOeCca5xXzo",
-	"psuy0nTOEaEoW3qCeqvUgtkWSiuF6ms0261Fged7/NwOUnSdfkGJcTE2ekJ12kTF+fiWNzkvtGFxt4P7",
-	"GrjiDGlXTqpajpLbTDGzm1pzYW9n4nMnQcXL9048FiWbtkXZRDtbi5J2RnHPrpOEOh0ECDcwm6ZfYVOk",
-	"Wuigk3SeWYhi1n2NDAlpPlt4ktFXnXRhg3uGZSolhzhwuOmTVNkHr6BgtUmdZ6pdmdm5s5Ses47fFRZF",
-	"BM9YDUc22c2qFiaVRfptexd60z1AUp89+yZmOUVpYkbhrVKX1NDiEDanNBPOJoAX0vzAvLf7b01hO0Ib",
-	"Gg+LPapSowDepTnlIcyEQ4uB5AUiBM4s5GEESSpioBURbGAUo9DzO1ULH41q3cisR4phaWXXYk7KZzS8",
-	"ECi2SVW+frE8d2gx6nQav/ATBlHYRKDmFNmgj32z2i5zFHwh+aLnkambydNmSlg3+r3OyGRA0XIUzc51",
-	"Yk2ca7vkbTMHZqJetz1QacHJHnjf/5zo/WYPiQwejU1liuJFp+1cOEi03NGu07AeTOeVTGfrU4o2bJo8",
-	"TddhNhvdRTtg+NIm89+nOJ3pb5fVQ+rGQss0GI9iaQGiOGtWj+AcCmnvzWwYKgQkx5Fpvc4JwhbFXGOC",
-	"gEs5BhMvKr6PLeEAVBli1Q7Epbpr/IDGM4EhisDORRGooa3EQRfOztXpmXPsCZFJo2nobwQBy1xXD6hx",
-	"RE3LUyGT/7GDiin8g62a6pMq0LO1Xpqr/ixgUGCvX4HVnLxb4NPwvTaeUbwMApuu6APwdhp4JaP0qdH6",
-	"1sfoK+jYQKpbs84LbMtrgAEs2w7WVOZHWX5OnTSHgo590aohV6OsC447uMmokzas1d/RWl33TW7BTTOk",
-	"w6ADtzn7+0YlmHcELNQmHEzyuI/Wa3ixtyq9nsu1INwG0yIwhYNmLxV6GUJiQOqurdYPDjNqnkkntGo+",
-	"2K0oLdrtQp4WM2Y5DGqhXgxPSV0a72y0D2cqzvrDMr7Ty7g2yUaYpgGMnQ7qnR7/m43XimO2gQi7k2jb",
-	"fcqC1eq+UFEFLFcCM5zm2ZnrXUvzeMJw5mDpiX+7hjPzHQZOZ1iGT2mLJetAo837tY2XSbbY6MWp3WO2",
-	"lcrcmLDlBekcVy9C6xEzpggTQFMg7wu1R5jSy185wxfe5qUTv3SvVw7swvtduJb7MroAd9o3vdts8Y1u",
-	"41/Gq22UgfajEttmuvkWDcZx+oDCMaQU4aTfLcFdnAZflqwb1F1AHN/+6rVMzRYT5bJzLt/kdzwDaH1e",
-	"4XtRu8/WDjkM2q76zU9fKknn5Etot0t869nE9+4v3UgtvQnfwvX4Dr6ki2BN4hoouMrvpC4tk6ulGHyK",
-	"MM1hDFIMbjJCMYILXZW1efMUOfQtLFTtFY48Kv2+pbwkZU1uPPXW2kvXaG267rj4myi+9XPBaZypuq81",
-	"dokujr96ubd3KOHl1MT6NXeniljhAZjtYZeSvyvbA6/+AHFcKeSqoI+ptm7kxkx4xuSeg2liME22YHys",
-	"glC2ZZ+w8p1PBg3GhatZ0bVnYBXF0bhKdL+HwH25mORSoZrWEIteV5sPtUz45Qpj2kVYtv1uq4P14KBr",
-	"obA+DXz+3Iyy2iVxZBWRW+9jb0QomyApAq6n4VqAWa0FhR01oZzZnnxWybaFR2PjjHbIWafBbhcM3xPB",
-	"jJccm6i83LDaZFISVWV/pbsmX/0GhprA0JlR4VvXM3p7puVdgfFOAHVXwPRS+DFCY4lzucn4YqPHNboL",
-	"fMvaVUnqKOMgKDfkvouVDGkgoxSYwHJVnH7WMwCFPHgyAdG04vD0AAkgIsjzNOeLaZJS3UP65ujo5OrK",
-	"873Tw7Pzmwnr/WQy+Tgxdq8HJjCc1MM76TdOTH7j880Hr2hMqiGyQscwQKB2nLU9HLxzJ7fCNzdCcTSb",
-	"mVzLNKtJFikn83ByfXZ6eHR9ezQ5Obw+42esxW/HJ+cn/DfTxNa2rBY5zOUrQ2OIF9XEGKePppddMBe7",
-	"ITebqhJdp8uOKsPsdJZsRunhthbUggC11lflKoq7OOnmrpvz/M7zvaOc0JRZrIcP5CRgs8Svdo5QQjFX",
-	"zuOnceTxK4q/M2bxa4CPmAHtCDNJZno7Zcx8Ms6Y03avGFZDCfve45uKenoj3Q5LO5nBQp+FZpB6l3DM",
-	"ZIkozMQh+HJOEL50c0xRJdlEV09yeuBcnW25PGLMa6KwYoAhdQlvPcuZoJm80FZFV4h8uoazHZTAu9h2",
-	"jotKx1l3Bap725ou2tsxGCUEBTlGZoIimT3PduxMEaF6KoA8pj0eB8gKK0SD3aqYyUWmx1InVyXDLDm4",
-	"LboEp7TugEoPNK/EoDb7n+2yJWaq2KB0idmH6+uxkjWg6tVl7i4NzQ7e8xL87mq9nfIy5UBP0mXFtdBu",
-	"vZpXn45kJAGXiKNNEWoxhRppK4wW7uTkenJ2+O785FZYuMzmvT48v7Xbu41HPu4qGJxotBiVsauylauR",
-	"Y3GkgjgYTkQcm8ClIDgruSLfP9aw6K4iixQjeHn9ipFUVh+nzgOVNZiqMKt/WcDFNtQ0n8SjoyZugb/1",
-	"0OT7WoJ/1LWvvpopJlWWL8sSZ1rNaklhGtqqlrOl44GYY7RfK/8iW9wDSCyoLW+vHfuXpoO7oFWNh8qF",
-	"uefr4y/obOez/VSzLYxFK9ta+OMc4AGWzinWYTxzsZymKlGRJFbIYss98RsQonsUs8ESCckDb05pRg5G",
-	"o4eHh725qLoXpVwSIhq3N3g4PtPiUBx4P+3t7+3zy/kMJTCLvAPvb/wncaXK2TvC+uvM1GS2HfFlFsCi",
-	"oz2PNylfLYZFEf21FcRwgSgXessJRVlkxAMdTND0nznCT2P2O7/sl+vnO2lDmRopi0SovEU0LKN8sD/v",
-	"/2RvSJYbNdIVPvve2/397orvYKh1/NalL0PGtrf7f3OtVyZa+08X+kwp1XmOKRXXTc20Ps8UztgUetou",
-	"/TOrVOBm9E39dYvR9FnAJ0bUYEQf8981IIFIRJWCQZDmCeXnBOzfs+geJUAEZqoCTTSxNNBwMbdTpjZ0",
-	"qFVg4sBNlZvwFaDj7f7b7kpFStP1wakx3zY8+d4MGRTPBNEcJ6SEiwzi1h827xHdBcy8RtWyLfDYJt+O",
-	"oSw3YOiGZxkkKykd/qzp6SUAtPb1bQDhWkHYRM8SS+JIGZGj8lGSUd+dR4TWo+c0ba1GTB6yJkT6nfUy",
-	"OEOX3IXItTR/medQliCIg/k1wsuq1gZXBnh3w9sEOA3gpWO/I76JSv5khPd7RGv5n/ZMC3Ulk9Rpites",
-	"d7uxOMXp4hhS5FyBplrxpdBbGfOA3G7kNrG0Cm6/qb9cti+q9T3L5kSLZ7EZvCrihx3NpnY02hSvAXOa",
-	"WdBiwnYbBqLclkwDGwh7WrjGVJfPq6jUwRjoZeuu0xzQIL5+y2CbyB5siMGGaAN7mSjDAe6icDvgy4wa",
-	"r8qiqNE/gLIvKIt5Xwcs5cXQ6Jv8o4+xq5JWdhm9n7R0kTurnFXWwsFe3tQNQNIA0ktheqQlRulWvuWZ",
-	"slX3akkmXxOiu+sE8ygOP6mKqyt5wahBx7tIBQPkHTLh8IWEgj+od5INc2Y+o4iYsr19h4IiEmGtIiIm",
-	"Rg2C0kNQrOkilbjUCqxVasrkdM5CU2SA65CZMlPcIDImkRH8GURlBVEpILYJUdFT/TgLi5Y4qENc9BRD",
-	"g8C0rTGKU4PorCA6Gtw2KTxkKekh7uJDfojteS0l6SAJa5CEF19HplGMRt/Yf28TuEDPVlH4PScU3MM4",
-	"4pcW6DEiFCUBqqRgYc20be1PxffvbClho76EC7Suw1vGpUF4ep7cSui9zG6eNe54wCWKdsjAd7gBecGX",
-	"aimmH3Ho1jArfBqhONzIG7gyU/Egr8ucwilheRmpnaN44XQCZ8rua5ThZsrYH8Oya457wHsPvFuyRyvU",
-	"Vz6vEfpOZwPWlMKt4H+t5wIro3/Y5q+Mf8Mm/wUkoNeTEHkp5/Q0RJbdgRciGxMA89AHEei5RamhbL12",
-	"T7uTCwEwjrnTVZ0ay8O/OD6sZwHeaaT/kNsPQ+bnQSj7OuFo+F5WHPvKHhFhQUs3mzb5I++eNu6QI14i",
-	"D8LXJXz17COD9PWUvoYk9Hb1FFFs3/Aotm+6NvvKxfno/AyIQKwyXqryc7+DBIUgTVQyKBUPtyGgWhjX",
-	"7R0E9LUCl7cAm8MdoO7uUW+D2zJ4LwP4tD0mFr+DMjURP2pToZNM74nLoqcqxM8rAbTbBU3rHujtd/X2",
-	"eE3oDe24UKjVwGiNB/HVBYMvhr5lXOKaMbKW8oerhjT7AYMbfXWGTpvC0/MEty7q5zJLrgpjaTvHr6ST",
-	"/g4COey2iaw4/QPivwY0hfziJ64yjQHgFKS7oCzCh2mhs7ekMWsxP5eKAle08YMGgStn0QAUFwU5+ib/",
-	"ui0Db7pFhyu7NlmG64VXt9opQtCqQQxuYxtyG2uFYEfIuC5V9R7RVw+kH1dFVWbPvJDlK4BDRELYOXwM",
-	"q+AGIVbHwDpXwVERXr97G9GIgl8cDjJ7rm03cVJ2sgsQfrlNycqbAT0pyQ+8K6gA5oXwXn4vfruNwufl",
-	"xaBlZa8kjngF+H+okX0WrslC+JHxbYbDZtE9KvJjtOFclDCmPakifIJkfoQB5wPOy8sdOyisaC9SoY5w",
-	"3uZSwM8yYRwDrQoQVUwGSC1hLVlfPoDlbsVr6XOHm0KnS3HTXJf3g8W3lnPDInFEvSlr/ohqou7tpZEw",
-	"JlxeMtr2gL7lslAYYWMGoFGbjb5Jw7LzwLETnirrRAc8I9aqvFCU2V9kahyVUEYkTRZpjkzJZ4YDxRfO",
-	"ROEMKd/+TtsBMDzfxG6iZVBISz2b7gWdtjC+DugRJTcFoGFxfIVReteyOI4W0UzAbhQt4KxrA1CUBqK0",
-	"zJgCE8Bh19wHXKgKZ6L1F0Dwa3zqsPROpsrPQVocNzJ13K5DUkbf+P/56U6cznTJaVgCxbSdpzNymmI+",
-	"ey8kDKZGJKEvb1qMYxgl1+hxeHjuaFSUyGQY4o/PoUTpaiAlFGJqz+h4xT5rvbcpcl62gPCw6Xk9CKvN",
-	"8qqISrM2QKWZM57SbIDTq4STPsetaOIHcWT0jf+/d44oVRQQGZO/M0UUTz+99HHhkNjhe9yv10Gk0Mqx",
-	"QrqB6upFWZbvcJzcDD4nRRru8m7uB3kU3l06hhSRIkeB0yC53931U4ZWvYYanDJ7btt0wXIVXlz6rblJ",
-	"b1nBFnhAc4XbiAA3Iecu9L0qff/ijlGQYxLdo9WvkIeUuT3vjjWhaQovq8AbEGJUfwpTuF/nOPYOvBHM",
-	"otH9T3z+ZFv1OofjMwJoCgJ+deiDnJ+S+iBuECP3FJpUMyCZW5shKpvQdZFsoVzXWxsA0gkcpFMg4vya",
-	"GmvEUnVuc47ihanFWgwje3tGlj2UfkKyveLtyPPn5/8PAAD//2ag5HNAIwEA",
+	"H4sIAAAAAAAC/+x963LcOJLuq+DwnImY1tAqd4/PxoY25kdZF7dmZFlTkjzRMe2QIRJVxTGLZAOgZI1D",
+	"EftrH2D3DedJNnAjQRIgwbqpZPFPt1zEJZH4MpFIIBPfvCBdZGmCEkq8g29eBjFcIIow/9cZvEUxuWC/",
+	"sX+GiAQ4ymiUJt6B+Ljv+V7E/vVbjvCD53sJXCDvwIvZR8/3SDBHC8gqRxQteKP0IWMlCMVRMvMeffUD",
+	"xBg+eI+PvjdBs4hQ/HAaooRG0whhCwmqIChLWujBaHYT6YVWIuzqIUNdJLEyFmKo+FSSgJJ84R383ft4",
+	"Orm6Hp95vnd9cXk1OR6/9z75dboefQ9iGk1hQC00jPlnauldVa5Q0NYHnVv6OYcLBNIpUEULMGSQzo0d",
+	"YvRbHmEUegcU58iNgBZmqyKA1d7vGO+Nle3vPxwdM6Yfja/Gl8dXZp4H8ygOPyJMojSxkHPIioA7UQZE",
+	"SQAJ589RGnxBuGATsVGqd9ExO2E0Q4R+yGwQOOLfbR2J2k5drNZ+n/meRjFiiHIA3FjN+0kUIwvqWHM3",
+	"/O/+ZLSQoD5bRs57lYS09oLTxRGkNmCzT/vgJMULSMEr8P796Oho9Msvv/xi6xani44eY0gRoQpdBm3O",
+	"PgP5nTGWImzX7qzwzZ0dqrdpGiOY8J4zGHyBM+SiNC9E0TblKVtrSnMPPZ7BGTrPF7cIG4Q4xxglFLAy",
+	"IBGFbJTMqhSEaArzmHoHP/relM+dd+BFCf23N15BRJRQNEO4IOMy+icyAJ33y6DORwUyhIHszkQJYY0Y",
+	"KfnptRspGAU5JtGdbYb+Nkd0jjCgKYgjQgEWMxYhAoqq8cP+r8mvyd7eEcowCiBF4f7eHrgmCNA5Agm6",
+	"B59JkGboMyjMDFEDfC4a+ROT0M8A/Ou//luW/hNMAkRoisnnWtEpjAn6rBdN0gR9/jWxGgGypplXvDnf",
+	"hGA52ocJmraohusk+i1HgEk/KG0NME0xH/80SmCsGPcAooT/eothEsz3wdUcgTsY5wgEMAG3CGQ4vYtC",
+	"FAIUcc5DAiCY5nH8AK4nZ69QEqTsK+/t92h/tu+DzymewST6J2QE/e6nkwyn/0AB/d1PJ6rXzz+AVDaV",
+	"xTBKRHWUhFEyA/cRnQMIKIZRzP6dxTkBJJol4Pef//D5B1aNIDZzNMXGLkeyw5HqbvSHzz/sl9NRVdCq",
+	"0A1G0546mk+2ZRb29i7ZVyY7Gkglbvf2GIT29hhO9vbAv/7zf0Ag5Z1kMEAgTeIH8HsJiR8AAKx0AUBj",
+	"lb09xqi9PQDjmAG7+EJkdUYfSkKYUIcGuA1Q1P81OZ2CdBFRikIffObwBhEBkJB8gcJ9K9Q5h4zGTjEY",
+	"z/c0yljVNEFm24cgiIP5FcIGfotvgH20LReiyA1l9TsmNsX0JEJxaOin+GTpJMX0ZioLdPXxAYcm3V9+",
+	"aukjlQVa+2DztwZtIQCyPVWxJf3Qphb4kJfRCZLlf2VTNvC8g+d1YGtMb2MyTddotNK0o7e71t1WuVEy",
+	"NX7ntI0qenDfcshuLbuOsts+2L1Ht/M0/XL8FQU56/c07FYcsg5AqpKGaAtxsspNUeUmCpejVPfMuBLq",
+	"TF7FT+NO3KMojAh9m4YR4lsBNWvcVzURX9nvQZpQlPA/YZbFUSBk5R9EbI3KTv4fk4kD7/+OSjfZSHwl",
+	"I2PjnI4qHyRVzAbJsxBSVHgCAHeTEU9zLa2byHq7LfQxNRhgxAlMQkWrMtMEkQUZkzxG66fV2PwSJBft",
+	"AJzHiJH+NwGudZNca7Y3qRLzjMLfcohhQqNk7XxtttyO0rI8IBkKomkUgGkUi4VTbohIliakKmRHiMIo",
+	"nshPvajPcJohTKXUhpA6C5/olPGPUEhz0lXvUpRS2kKolr+ryr7ouzSC01u2eJr5JcbJGDZDtJTpkFPE",
+	"hVoReRIxNK/Ol/Q+iVMYXuO4qW3VR5DjWHfKen7TIbImVmnk9OXYHMGwZBkDl84vqVG3CqTLfLGAQs3t",
+	"CpL46gDUZ51BrG+ybQaxPneJPawpYmaPmMsBQaQkSVEp7denYVG18x3gVFg9mikObzTGvYXhuhfkY4xT",
+	"bCLvLQwBVmu07x3GEUroJaJ5Jta5bcl8s+OnnCtuOnGKAGEk6UusOFt7EhPE1PUOQjosCKsS/B4m0RQR",
+	"+iTcUp3vIL8WGmmC6DP4gDDZKp9ElztpkzDCSt6oidwue4ped5M1zN5fmypixjExXPIQB3HpFPwMcYII",
+	"qZ6KsyEVJ6JtfClpbR6ViiYO01xQXSXgas5YQGEsT0mL00rP99BXuMhi5HYSKg5Ce/TCild7ef3auZ/T",
+	"JERfzf0E2tGv3rx74+bTXNZ2Yj/R1ZnVbHaN6PYlllZCuWji0fd+RvHiSdbdZsc7oAXmKF6Y1lyd2C2v",
+	"uKaud45T+mp7mlCEExhfInyHsDCSN25yq04B4b0CJAr63llE6FM4JBr9PrXpzdcZg8taJ/QJeLNTbKnz",
+	"Q250n4At6lhsF7gjd9Ok4o+UnHofzTDnwOkCztAWGVXt+An4NGnwaaFIAtGC2zaSR+rw5gmkrN71Tkpb",
+	"ebi1db7sBD/0szlBXO0AbYtsqfS8E1JVPwYsxEoe2pHivH2LjGr0/RRbWM4eefRIyhsEVWe6Tu0TMGgn",
+	"BOxeI+Y8pSdpnoSbN0nZflEevKKQzUma4wCBe0hAklIw5VQ8+t5FDKPkCn21rQsUfaUjfqfoP0Awh5gg",
+	"+qecTl/9e5XGYv/JNitx6oP7FMfh/2keHDYpHcsrS6ynCni2rJl3RSuLA35f7Jgd71BsiUE7pZ/rqlky",
+	"ipF1mQcBImQFfqxjYC4jkpSCiYb76wTmdI4SGvH775vXFfUOCxpSHP1zewTI3sqLNtteW+vdPgHCmzfy",
+	"dI1Y3BTaJjt2VB8abz1dQDrfEneqnT4Bk7QbVvy2bwmUR3XFUVyt4hrmL+jhEgUY0b+gh+aAoSpjjH2C",
+	"1Ra0QFmH0pcZDNApVyIODnBTZc5fU09EDaiDoqJcP1qq1SxU1KfRQNKnR98bJ2nysEg5PLSLFNL1bIm+",
+	"DSiQBXwvjNj3RZRAKjyaC5hljIKDb97hePLug/UYHuJZWu3vME2m0czzvaMPh385nvQ5my6qvjs+P56c",
+	"HtrqvkMJwlFgq2yl9p2N1J+Pz967O/PLatfv3p2evzsZHx5ba+ezWZTMTmCALI28H388PrdVfw/vUGKp",
+	"eH5hpfk8s5F8fv3u+MpaLZ8haql48cvVzx+sdF480HlqI3RiJ3RiIfTRVzrk4bwSVcnjLh99L03Qh6l3",
+	"8Pf+FyCKHvqe4ThWbANnV137dHfVbJmArqrn2XIDnSxZz46yrpp2bdM5KctV65Lex09+fa3TcgK43jlT",
+	"mBa2SDimxnVGfn1rXkXVVdfikNphCYrIX4tVPjSFRvveIg35Ht9Ck4iLMHzQpbWDCxdVwdavgkNpSTXX",
+	"XHmK3fhwV0aPty+l3I19LoLv9ZAYsQ2W8fM5ZoujPpam6eRbQziqwJCnUv3CwHWKZQNtFLxHFCrr0rLk",
+	"F0XWCVwFPrJm9PXnGatD6HuJ2m1hNsvj+DBdLGBi7tIJ07iRU6a1mNVudRaBIvVEo996LoZar20QFHew",
+	"G/hr3AAS5XxL/EAfHKk66maLQxV+XeeSpli7EONQLc969fPYxiZ5b86BUbLk9haa5aS50KemJpcR5I6l",
+	"Z1lpbVkHXBW96rPuVpgizOP4K0l/PL9HFp/GJXgHja4SomxGs/M8OQUQ7NLXCyzTKEZrXypeuNq3mETb",
+	"0Pm1mIlm2LW4v9xA7CZUW7secgDShi3XFQ3UThWV07lZPY1LJzzjfU01XROELyAh9ykOPd/k1dO9TCbF",
+	"Zd+bNRMY8d+5+5XXakYm1hGx0NQgDMOINQTjC62MiL2uuzUNHDpkE51nF2kcBQasys9AfOc0NpbkSZG1",
+	"pUEo+ppFGB3BB2JWl11a6AKjafS130KpUgT0rmpmTyOuxsAjHunCC4Ej25TBKPkZwdDuNW3/Km4e6KNx",
+	"DAe6FHU791MagTo5Wuef2vmjOmrnjyrV7mQ9PT87PT92GR1FWeFYuxq/vbTVuYK39QpNpxrt5U0zk9Hl",
+	"QzER0nCbzJdFCnXQ03IKjPYftWnS2mC7ZpkVqQ8qELbBcijm3BK2hUHm56txpNZRwZkuLmjWTgczgCrq",
+	"m/wg5qURxrnFhOmmy7LSdM4RoShbeoJ6q9SC2RZKK4XqazTbMkeB53vcwwwpukq/oMS4GBsD/zrtsuI4",
+	"qAbjbe8WV/dL7ohN39dYFx7HXfFrthyetJl05ujOpoHQzunHToKKgJFOXBclmzZK2UQ7W4uSdkbxgMjj",
+	"hDp5dUT0pG3FWGGDp1rooJN0OqBEMeseTSbQNTt7HmR2bied2uCeYblLyRgHDgfkkir74BUUrLat80y1",
+	"K0U7dzblK7eyaLUjFTODi0ku+u1meQuzyyJ1NrcvFAu96R5gq6PAvqlaTuGamFEEi9UlPrTEY84pzUSs",
+	"F+CFtDBM783rN6asOaEN1eNiz6zUMYC3aU55BkERT2YgeYEIgTMLeZhDiTdQJJCCUYxCz+9UUXw0qnUj",
+	"s75SDEurv5bpV95i44VAsW2r8vWL5bZRi5Gp0/iFezxEYROBWkxygz72zWpLzVHwheSLnr5wNxOszW6x",
+	"Oh56+Q1lGudyFM3OdWJNnGu7HtFmVsxEvW67otKCk13xrr/f6t12nVaGgOKmMkXxotOWL+KTWm4YrNPQ",
+	"fzI7/fswwa2XkNqwaQr0Xof5bYzW7oDhpk3vrgs6rXwSdacwQFsV5j9PcTrTwx1U7EXDOGBalye+tQiP",
+	"8Nere7MOhbQrqjbcF0Kd48hkY+QEYctiUps4AfFyDKb5q4RLt2QQUWWIVaMRl+quKUcaF2qGxCM7l3ik",
+	"hrYSB104O1MeSOd0NeKVqebmZCsIWObuxIAaR9S0XKozpSxwUDFFSgGrpvqoCvRsrZfmqt8fGRTY81dg",
+	"tbwQLfBppGsw+lU2g8Bm9ooBeDsNvJJR+tRofetj9BV0bCDVrVnnBbblRsUAlqfO71Y+UrT8nDppDgUd",
+	"+6JVQ65GWRccd3CTUSdtWKu/o7W6ns6gBTfNLDCDDnzK2X9tVIJ5R45TbcLBJI/7aL1G4otWpddzuRaE",
+	"22Ba5LJx0OylQi+zzgxI3bXV+t5hRs0z6YRWLW1DK0qLdruQp6WZWg6DWnYow3Vcl8Y7G+3DmUp+j2EZ",
+	"3+llXJtkI0zTAMZOjnqnIA6z8VrJ5WAgwh4S3na2sWC1uk81VAHLkcAMp3l26no+1HRPGHwOlp74tys4",
+	"M59h4HSGZcaltvTTDjTaYt3beJlki62eD9nj41upzI1vPG2Qzovq4a0tGk6ecWoXWWViEJX6osgtUeb9",
+	"kBk5VLoKketCJJLwZUISnuejmoLDdBO2JS9CGzczXm2r7LQ7Tmxba0PkVByn9yi8gJQinPQ7M7iN0+DL",
+	"knWDelCN421qvZap2WKiXPbRZZRDx0WG1gsivhe1R+LtUCyr7bKC+fJO5dVKebfc7RqC1VMx5BmwB5xW",
+	"wym3FJK6nmjSTQaN1qS1gaDL/Fbq4fJlxxSDjxGmOYxBisF1RihGcKGrwbbYquuLy6vJ8diag0i1V4RV",
+	"fTydXF2Pz2zlJSlrCqqqt9ZeukZrM5DKJfpH8a1fQFTDO+u+TnVrg14S3aXAl1MT69f6nSpihetvtmtt",
+	"Sv4ubdfb+gPEcZWRK4o+ptqakxuf4TS+LDyYNQaz5gkMl1UQyjb/E1a+88KkwTBxNUm6dh+sonCyS1UU",
+	"7SNwVy4muVSopjXEotfVNkYtE365wph2IBYHgtvqYHVBdC0U1kuGj5+aKZ67JI6sInLrveqOCGUTJEXA",
+	"1a+uZbfWWlDYURPKme3JC5psg3l4YZzRDjnrNPbtguF7IpP6kmMTlZcbVptMSqKq7K901+Sr38BQExg6",
+	"Myp86woisD/zvisw3gmg7gqYNoUfIzSW8PBNLt5v1dWjJyRoWbsqL8rKrBQqKLzvYiUTTMicESawXBZ+",
+	"1PrzYyHP3E5ANK2Ee91DAojIMD/N+WKapFSPV78+PDy+vPR872R8enY9Yb0fTyYfJsbu9TQRBp8/vJVR",
+	"/MQUxT/ffiqRxqQa8lx0DAMEasdZ28PBW3dyK3xzIxRHs5kpsE6zmmSRcjLHk6vTk/Hh1c3h5Hh8dcq9",
+	"tcVvR8dnx/w308TWtqwWOczlfUVjwh3VxAVOv5ruiMFc7IbcbKpKrqMuO6pMetRZspkzidtaUEvJ1Fpf",
+	"laso7sJnzgNX5/mt53uHOaEps1jH9+Q4YLPED4kOUUIxV84XDxeRxw87/syYxQ8UPmAGtEPMJJnp7ZQx",
+	"88GrhNAY589p81cMsqGSfe/rq4qyeiVDMEurmYFEn5PmexkumeHJEgnhiUMe+JwgfO4W8KJKsmmv+nV6",
+	"oF55ulwuR+Y1wVgx+ZM63Ld6diZoJg/KVdF+cfGVHMZr8PSgBN7GNq8uKoOI3dWpHnlsOsBvx2CUEBTk",
+	"GJkJiuRDnjYnNEWE6q+S5DHtcelAVlghafOTiplccnosfHKNMsySQwinS/ZW636ojGzzSgxqs//JLlti",
+	"portSpeY/Xx1daFkDah6dZm7TUNzsPu8BL+7Wm+nvHz9pCfpsuJaaLce+atPhzKrgktK3qYItRhGjRd0",
+	"jPbu5Phqcjp+e3Z8I+xdZgFfjc9u7NZv4/KQuwoGxxotRmXsqmzlauRYHKmEFgb/iGMTuBQEZyUnavDK",
+	"JRbdVWTx2hFeXr9iJJXVh6nzQGUNpirM6l8WcLEUNc0n8eioiVvgb3WhfF9L8Etd++qrmWJSZfmyLHGm",
+	"1az2PlVDW9Wej+q4eOaYMtrKv8iWA8Ih67Jj/9J0cBe0qvFQOT73fH38BZ3tfLb7ONtSerSyDa8hTTEs",
+	"g16sw3jkYjlN1Ztpklghiy2nxq9AiO5QzAZLJCQPvDmlGTkYje7v7/fnoup+lHJJiGjc3uD44lTLyXHg",
+	"/bj/ev81P6rPUAKzyDvw/sh/EgesnL0jrN/6TE1m2yFfZgEsOtr3eJPyNmRYFNHvbUEMF4hyobf4K8oi",
+	"I55AYYKmf80Rfrhgv/Ojf7l+vpU2lKmRskiEyjNFwzLKB/vT6x/tDclyo8bLqY++9+b16+6Kb2GodfzG",
+	"pS/D45FvXv/RtV755uP/d6HvVO7PLhG+Q1i9J+l7ROXKUzOtzzOFMzaFnrZL/8QqFbgZfVN/3WA0fRTw",
+	"iRE1GNFH/HcNSCASGbZgEKR5QrmfgP17Ft2hBIgkVVWgiSaWBhou5nbK1IYOtQpMHLipnkl9Buh48/pN",
+	"d6XideX1wakx3zY8+d4MGRTPBNEcJ6SEi0xo1x827xDdBcw8R9XyVOCxTb4dQ1luwNA1f/CUrKR0+CWn",
+	"h00AaO3r2wDCtYKwiZ4llsSRMiJH5RUlo747iwitZ+Vp2lqNXD9kTYj0O+tlcIbOeWiSa2l+T8+hLEEQ",
+	"B/MrhJdVrQ2uDPDuhrcJcBrAy4QBjvgm6nU0I7zfIVp7IG3ftFBXnlo7SfGa9W43Fqc4XRxBipwr0FQr",
+	"vhR6K2MekNuN3CaWVsHtN/WXy/ZFtb5v2ZxoeTK2g1dF/FKVrh4yNGyDtrEN0nCxBqBqtkSL3dttTYhy",
+	"T2RPrBW5PW1p47O2j6so78Hs6GVVr9Pw0ORi/TbIbovDYK28XGtlRMpnThzgLgq3A758D+X7t11qgx6Q",
+	"3BfJBVjWgWV5bjX6Jv/oY4urN1e7bPKP2kujOwtv9eDlYM7v9KlG0kDfpgRhpD18063mSz+5Vctrj5o+",
+	"Ky2/GdkJ5lEcflQVV19OBHeH1cRFlBiKb5EJvBuSJB5n4CRQ5ucjjXJlekqQfH+LjHgdbRURMTFqEJQe",
+	"gmJ901SJS63AWqWmfPnQWWiK5wU7ZKZ8hnAQGZPICP4MorKCqBQQ24ao6O8/OQuL9ppUh7jo704NAtO2",
+	"xihODaKzguhocNum8JClpIe4i8+zW3BWEIhizIMkrEESNr6OTKMYjb6x/94kcIEeraLwj5xQcAfjiJ+p",
+	"oK8RoSgJUOWNG9ZMmz/gRHwfnAGE8/0cLtCqQqezdpC4no5lidfNuABY446uNFG0Q3AGN9rGLwemmH7A",
+	"oVvDrPBJhOJwK9cOy4eyByFfxt+nJGwzoj5H8cLJ12d6XNoo+M0Xi1+GDdkc94D3Hni3PF6uUF/5vEbo",
+	"O3khrC9at4L/uXogVkb/4FBYGf8Gd8IGJKDX3Rh5/Od0R0aWfa5XZTbpt/uQ0XVsmqocHiSt5/apBub1",
+	"mlft4UsEwDjm4XR1aiwXLeN4XH83+vsTqBe5NTI8MD5Ict+YLE0olpXhvgJLRM7YMuqqTWjJ24etx2eJ",
+	"6+IvRvi2d/nP9KDwILI9RbYhPr3DhUVe5Fc8L/KrLu+FCpM/PDsFIrWvzMCrciXcQoJCkCbqoTKVYbkh",
+	"1Vpi4KfzbPS1UJcHe3O4A9TdszLY4LYM3sskUG03vsXvoHzsivsOVfot06XvsuiJShP1TADtdkz1gjLY",
+	"rAm9oR0XCrUaGK05RX5zweDG0LdMsGMzz9pSkY7VtHgvMEHWb87QaVN4+hvWrYv6mXzBWaVCtR1MVJ46",
+	"/w6Sgez2plZx+gXivwY0hfziJ64yjUkEFaS7oCxS0Gnp159IY9byxi6VSbBo44UmEixn0QAUFwU5+ib/",
+	"uimTt7plGCy7NlmG64VXt9op0hirQQzJB7cUptcKwY60g12q6h2izx5IL1dFVWbPvJDlK4BD5LjYOXwM",
+	"q+AWIVbHwDpXwVHxREP3NqLxkkLhHGT2XNtu4rjsZBcgvLlNycqbAf1hmxe8K6gAZkN4L78Xv91E4ePy",
+	"YtCyslceH3kG+L+vkX0arslCeMn4NsNhu+geFW+stOFclDA+nVNF+ATJNzYGnA84Lw937KCwor14XHeE",
+	"87bACu7LhHEMtCpAVDEZILUnkMn63pRY7lS89iDzcFLodChumuvyfLD41uI3LB4fqTdlfYOk+vT70z1F",
+	"YnzCe8mM7QP6lnvJxAgbMwCN2mz0TRqWnQ7HTniql0s64BmxVuWBonxBSD6vpB4lEs9wi6eyTA8YDQ7F",
+	"Db9m4gwp337x3AEw/M2S3UTLoJCWuqDdCzptWZ0d0CNKbgtAw+L4DPMvr2VxHC2imYDdKFrAWdcGoCgN",
+	"RGn56g5MAIddcx/wXlU4Fa1vAMHP8arD0juZKj8HaXHcyNRxuw5JGX3j/+fenTid6ZLTsASKaTtLZ+Qk",
+	"xXz2NiQMpkYkoZs3LS5iGCVX6Otw8dzRqCiRyTDEL59DidLVQEooxNT+Kugl+6z13qbIedkCwsOm5/kg",
+	"rDbLqyIqzdoAlWbOeEqzAU7PEk76HLeiiTviyOgb/3/vd8ZUUUDkawudz4zxJ8yXdhcOT3Z8j/v1OogU",
+	"WjlWSDdQXUMvy/Id0ZbbweekeMq9PJsbgi1l6RhSRIqHJJwGyePuegWMrzOic4jk7LnX06XRVeJxGezm",
+	"JvJlBVteBC1+bitSvwxOlaZ4UdkQfIc7EUGOSXTnzhMSpOuL3R4k3fl4WhOxpqizCrwBIXT12zZFhHeO",
+	"Y+/AG8EsGt39yOdPtlWvM744JYCmIOCnkz7IuSPWB3GDGLlt0XQAA5G5tRmisgldc8kWStOhtQEg48xB",
+	"OgUiC7OpsUamW+c25yhemFqs5X2yt2dk2X0ZiiTbK66nPH56/N8AAAD//4joZ2VbLQEA",
 }
 
 // GetSwagger returns the content of the embedded swagger specification file
diff --git a/registry/app/api/openapi/contracts/artifact/types.gen.go b/registry/app/api/openapi/contracts/artifact/types.gen.go
index 1ee96fe27..c0bb247bb 100644
--- a/registry/app/api/openapi/contracts/artifact/types.gen.go
+++ b/registry/app/api/openapi/contracts/artifact/types.gen.go
@@ -11,6 +11,12 @@ import (
 	"github.com/oapi-codegen/runtime"
 )
 
+// Defines values for ArtifactType.
+const (
+	ArtifactTypeDATASET ArtifactType = "DATASET"
+	ArtifactTypeMODEL   ArtifactType = "MODEL"
+)
+
 // Defines values for AuthType.
 const (
 	AuthTypeAccessKeySecretKey AuthType = "AccessKeySecretKey"
@@ -26,16 +32,17 @@ const (
 
 // Defines values for PackageType.
 const (
-	PackageTypeCARGO   PackageType = "CARGO"
-	PackageTypeDOCKER  PackageType = "DOCKER"
-	PackageTypeGENERIC PackageType = "GENERIC"
-	PackageTypeGO      PackageType = "GO"
-	PackageTypeHELM    PackageType = "HELM"
-	PackageTypeMAVEN   PackageType = "MAVEN"
-	PackageTypeNPM     PackageType = "NPM"
-	PackageTypeNUGET   PackageType = "NUGET"
-	PackageTypePYTHON  PackageType = "PYTHON"
-	PackageTypeRPM     PackageType = "RPM"
+	PackageTypeCARGO       PackageType = "CARGO"
+	PackageTypeDOCKER      PackageType = "DOCKER"
+	PackageTypeGENERIC     PackageType = "GENERIC"
+	PackageTypeGO          PackageType = "GO"
+	PackageTypeHELM        PackageType = "HELM"
+	PackageTypeHUGGINGFACE PackageType = "HUGGINGFACE"
+	PackageTypeMAVEN       PackageType = "MAVEN"
+	PackageTypeNPM         PackageType = "NPM"
+	PackageTypeNUGET       PackageType = "NUGET"
+	PackageTypePYTHON      PackageType = "PYTHON"
+	PackageTypeRPM         PackageType = "RPM"
 )
 
 // Defines values for RegistryType.
@@ -98,6 +105,7 @@ const (
 	UpstreamConfigSourceCustom       UpstreamConfigSource = "Custom"
 	UpstreamConfigSourceDockerhub    UpstreamConfigSource = "Dockerhub"
 	UpstreamConfigSourceGoProxy      UpstreamConfigSource = "GoProxy"
+	UpstreamConfigSourceHuggingFace  UpstreamConfigSource = "HuggingFace"
 	UpstreamConfigSourceMavenCentral UpstreamConfigSource = "MavenCentral"
 	UpstreamConfigSourceNpmJs        UpstreamConfigSource = "NpmJs"
 	UpstreamConfigSourceNugetOrg     UpstreamConfigSource = "NugetOrg"
@@ -117,12 +125,98 @@ const (
 	VIRTUAL  RegistryTypeParam = "VIRTUAL"
 )
 
+// Defines values for ArtifactTypeParam.
+const (
+	DATASET ArtifactTypeParam = "DATASET"
+	MODEL   ArtifactTypeParam = "MODEL"
+)
+
+// Defines values for ScopeParam.
+const (
+	Ancestors   ScopeParam = "ancestors"
+	Descendants ScopeParam = "descendants"
+	None        ScopeParam = "none"
+)
+
+// Defines values for DeleteArtifactParamsArtifactType.
+const (
+	DeleteArtifactParamsArtifactTypeDATASET DeleteArtifactParamsArtifactType = "DATASET"
+	DeleteArtifactParamsArtifactTypeMODEL   DeleteArtifactParamsArtifactType = "MODEL"
+)
+
+// Defines values for UpdateArtifactLabelsParamsArtifactType.
+const (
+	UpdateArtifactLabelsParamsArtifactTypeDATASET UpdateArtifactLabelsParamsArtifactType = "DATASET"
+	UpdateArtifactLabelsParamsArtifactTypeMODEL   UpdateArtifactLabelsParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetArtifactSummaryParamsArtifactType.
+const (
+	GetArtifactSummaryParamsArtifactTypeDATASET GetArtifactSummaryParamsArtifactType = "DATASET"
+	GetArtifactSummaryParamsArtifactTypeMODEL   GetArtifactSummaryParamsArtifactType = "MODEL"
+)
+
+// Defines values for DeleteArtifactVersionParamsArtifactType.
+const (
+	DeleteArtifactVersionParamsArtifactTypeDATASET DeleteArtifactVersionParamsArtifactType = "DATASET"
+	DeleteArtifactVersionParamsArtifactTypeMODEL   DeleteArtifactVersionParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetArtifactDetailsParamsArtifactType.
+const (
+	GetArtifactDetailsParamsArtifactTypeDATASET GetArtifactDetailsParamsArtifactType = "DATASET"
+	GetArtifactDetailsParamsArtifactTypeMODEL   GetArtifactDetailsParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetArtifactFileParamsArtifactType.
+const (
+	GetArtifactFileParamsArtifactTypeDATASET GetArtifactFileParamsArtifactType = "DATASET"
+	GetArtifactFileParamsArtifactTypeMODEL   GetArtifactFileParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetArtifactFilesParamsArtifactType.
+const (
+	GetArtifactFilesParamsArtifactTypeDATASET GetArtifactFilesParamsArtifactType = "DATASET"
+	GetArtifactFilesParamsArtifactTypeMODEL   GetArtifactFilesParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetArtifactVersionSummaryParamsArtifactType.
+const (
+	GetArtifactVersionSummaryParamsArtifactTypeDATASET GetArtifactVersionSummaryParamsArtifactType = "DATASET"
+	GetArtifactVersionSummaryParamsArtifactTypeMODEL   GetArtifactVersionSummaryParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetAllArtifactVersionsParamsArtifactType.
+const (
+	GetAllArtifactVersionsParamsArtifactTypeDATASET GetAllArtifactVersionsParamsArtifactType = "DATASET"
+	GetAllArtifactVersionsParamsArtifactTypeMODEL   GetAllArtifactVersionsParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetAllArtifactsByRegistryParamsArtifactType.
+const (
+	GetAllArtifactsByRegistryParamsArtifactTypeDATASET GetAllArtifactsByRegistryParamsArtifactType = "DATASET"
+	GetAllArtifactsByRegistryParamsArtifactTypeMODEL   GetAllArtifactsByRegistryParamsArtifactType = "MODEL"
+)
+
+// Defines values for GetAllArtifactsParamsArtifactType.
+const (
+	GetAllArtifactsParamsArtifactTypeDATASET GetAllArtifactsParamsArtifactType = "DATASET"
+	GetAllArtifactsParamsArtifactTypeMODEL   GetAllArtifactsParamsArtifactType = "MODEL"
+)
+
 // Defines values for GetAllRegistriesParamsType.
 const (
 	GetAllRegistriesParamsTypeUPSTREAM GetAllRegistriesParamsType = "UPSTREAM"
 	GetAllRegistriesParamsTypeVIRTUAL  GetAllRegistriesParamsType = "VIRTUAL"
 )
 
+// Defines values for GetAllRegistriesParamsScope.
+const (
+	GetAllRegistriesParamsScopeAncestors   GetAllRegistriesParamsScope = "ancestors"
+	GetAllRegistriesParamsScopeDescendants GetAllRegistriesParamsScope = "descendants"
+	GetAllRegistriesParamsScopeNone        GetAllRegistriesParamsScope = "none"
+)
+
 // AccessKeySecretKey defines model for AccessKeySecretKey.
 type AccessKeySecretKey struct {
 	AccessKey                 *string `json:"accessKey,omitempty"`
@@ -139,17 +233,21 @@ type Anonymous interface{}
 
 // ArtifactDetail Artifact Detail
 type ArtifactDetail struct {
-	CreatedAt     *string `json:"createdAt,omitempty"`
-	CreatedBy     *string `json:"createdBy,omitempty"`
-	DownloadCount *int64  `json:"downloadCount,omitempty"`
-	ModifiedAt    *string `json:"modifiedAt,omitempty"`
-	Name          *string `json:"name,omitempty"`
+	// ArtifactType refers to artifact type
+	ArtifactType  *ArtifactType `json:"artifactType,omitempty"`
+	CreatedAt     *string       `json:"createdAt,omitempty"`
+	CreatedBy     *string       `json:"createdBy,omitempty"`
+	DownloadCount *int64        `json:"downloadCount,omitempty"`
+	IsQuarantined *bool         `json:"isQuarantined,omitempty"`
+	ModifiedAt    *string       `json:"modifiedAt,omitempty"`
+	Name          *string       `json:"name,omitempty"`
 
 	// PackageType refers to package
-	PackageType PackageType `json:"packageType"`
-	Size        *string     `json:"size,omitempty"`
-	Version     string      `json:"version"`
-	union       json.RawMessage
+	PackageType      PackageType `json:"packageType"`
+	QuarantineReason *string     `json:"quarantineReason,omitempty"`
+	Size             *string     `json:"size,omitempty"`
+	Version          string      `json:"version"`
+	union            json.RawMessage
 }
 
 // ArtifactLabelRequest defines model for ArtifactLabelRequest.
@@ -159,15 +257,18 @@ type ArtifactLabelRequest struct {
 
 // ArtifactMetadata Artifact Metadata
 type ArtifactMetadata struct {
-	DownloadsCount *int64    `json:"downloadsCount,omitempty"`
-	IsQuarantined  *bool     `json:"isQuarantined,omitempty"`
-	Labels         *[]string `json:"labels,omitempty"`
-	LastModified   *string   `json:"lastModified,omitempty"`
-	Name           string    `json:"name"`
+	// ArtifactType refers to artifact type
+	ArtifactType   *ArtifactType `json:"artifactType,omitempty"`
+	DownloadsCount *int64        `json:"downloadsCount,omitempty"`
+	IsQuarantined  *bool         `json:"isQuarantined,omitempty"`
+	Labels         *[]string     `json:"labels,omitempty"`
+	LastModified   *string       `json:"lastModified,omitempty"`
+	Name           string        `json:"name"`
 
 	// PackageType refers to package
 	PackageType        *PackageType `json:"packageType,omitempty"`
 	PullCommand        *string      `json:"pullCommand,omitempty"`
+	QuarantineReason   *string      `json:"quarantineReason,omitempty"`
 	RegistryIdentifier string       `json:"registryIdentifier"`
 	RegistryPath       string       `json:"registryPath"`
 	Version            *string      `json:"version,omitempty"`
@@ -183,28 +284,36 @@ type ArtifactStats struct {
 
 // ArtifactSummary Harness Artifact Summary
 type ArtifactSummary struct {
-	CreatedAt      *string   `json:"createdAt,omitempty"`
-	DownloadsCount *int64    `json:"downloadsCount,omitempty"`
-	ImageName      string    `json:"imageName"`
-	Labels         *[]string `json:"labels,omitempty"`
-	ModifiedAt     *string   `json:"modifiedAt,omitempty"`
+	// ArtifactType refers to artifact type
+	ArtifactType   *ArtifactType `json:"artifactType,omitempty"`
+	CreatedAt      *string       `json:"createdAt,omitempty"`
+	DownloadsCount *int64        `json:"downloadsCount,omitempty"`
+	ImageName      string        `json:"imageName"`
+	Labels         *[]string     `json:"labels,omitempty"`
+	ModifiedAt     *string       `json:"modifiedAt,omitempty"`
 
 	// PackageType refers to package
 	PackageType PackageType `json:"packageType"`
 }
 
+// ArtifactType refers to artifact type
+type ArtifactType string
+
 // ArtifactVersionMetadata Artifact Version Metadata
 type ArtifactVersionMetadata struct {
-	DigestCount    *int    `json:"digestCount,omitempty"`
-	DownloadsCount *int64  `json:"downloadsCount,omitempty"`
-	FileCount      *int64  `json:"fileCount,omitempty"`
-	IsQuarantined  *bool   `json:"isQuarantined,omitempty"`
-	LastModified   *string `json:"lastModified,omitempty"`
-	Name           string  `json:"name"`
+	// ArtifactType refers to artifact type
+	ArtifactType   *ArtifactType `json:"artifactType,omitempty"`
+	DigestCount    *int          `json:"digestCount,omitempty"`
+	DownloadsCount *int64        `json:"downloadsCount,omitempty"`
+	FileCount      *int64        `json:"fileCount,omitempty"`
+	IsQuarantined  *bool         `json:"isQuarantined,omitempty"`
+	LastModified   *string       `json:"lastModified,omitempty"`
+	Name           string        `json:"name"`
 
 	// PackageType refers to package
 	PackageType        *PackageType `json:"packageType,omitempty"`
 	PullCommand        *string      `json:"pullCommand,omitempty"`
+	QuarantineReason   *string      `json:"quarantineReason,omitempty"`
 	RegistryIdentifier string       `json:"registryIdentifier"`
 	RegistryPath       string       `json:"registryPath"`
 	Size               *string      `json:"size,omitempty"`
@@ -212,11 +321,15 @@ type ArtifactVersionMetadata struct {
 
 // ArtifactVersionSummary Docker Artifact Version Summary
 type ArtifactVersionSummary struct {
-	ImageName string `json:"imageName"`
+	// ArtifactType refers to artifact type
+	ArtifactType  *ArtifactType `json:"artifactType,omitempty"`
+	ImageName     string        `json:"imageName"`
+	IsQuarantined *bool         `json:"isQuarantined,omitempty"`
 
 	// PackageType refers to package
-	PackageType PackageType `json:"packageType"`
-	Version     string      `json:"version"`
+	PackageType      PackageType `json:"packageType"`
+	QuarantineReason *string     `json:"quarantineReason,omitempty"`
+	Version          string      `json:"version"`
 }
 
 // AuthType Authentication type
@@ -280,15 +393,17 @@ type DockerArtifactDetail struct {
 	CreatedAt      *string `json:"createdAt,omitempty"`
 	DownloadsCount *int64  `json:"downloadsCount,omitempty"`
 	ImageName      string  `json:"imageName"`
+	IsQuarantined  *bool   `json:"isQuarantined,omitempty"`
 	ModifiedAt     *string `json:"modifiedAt,omitempty"`
 
 	// PackageType refers to package
-	PackageType  PackageType `json:"packageType"`
-	PullCommand  *string     `json:"pullCommand,omitempty"`
-	RegistryPath string      `json:"registryPath"`
-	Size         *string     `json:"size,omitempty"`
-	Url          string      `json:"url"`
-	Version      string      `json:"version"`
+	PackageType      PackageType `json:"packageType"`
+	PullCommand      *string     `json:"pullCommand,omitempty"`
+	QuarantineReason *string     `json:"quarantineReason,omitempty"`
+	RegistryPath     string      `json:"registryPath"`
+	Size             *string     `json:"size,omitempty"`
+	Url              string      `json:"url"`
+	Version          string      `json:"version"`
 }
 
 // DockerArtifactDetailConfig Config for docker artifact details
@@ -316,11 +431,13 @@ type DockerLayersSummary struct {
 
 // DockerManifestDetails Harness Artifact Layers
 type DockerManifestDetails struct {
-	CreatedAt      *string `json:"createdAt,omitempty"`
-	Digest         string  `json:"digest"`
-	DownloadsCount *int64  `json:"downloadsCount,omitempty"`
-	OsArch         string  `json:"osArch"`
-	Size           *string `json:"size,omitempty"`
+	CreatedAt        *string `json:"createdAt,omitempty"`
+	Digest           string  `json:"digest"`
+	DownloadsCount   *int64  `json:"downloadsCount,omitempty"`
+	IsQuarantined    *bool   `json:"isQuarantined,omitempty"`
+	OsArch           string  `json:"osArch"`
+	QuarantineReason *string `json:"quarantineReason,omitempty"`
+	Size             *string `json:"size,omitempty"`
 }
 
 // DockerManifests Harness Manifests
@@ -393,6 +510,11 @@ type HelmArtifactManifest struct {
 	Manifest string `json:"manifest"`
 }
 
+// HuggingFaceArtifactDetailConfig Config for huggingface artifact details
+type HuggingFaceArtifactDetailConfig struct {
+	Metadata *map[string]interface{} `json:"metadata,omitempty"`
+}
+
 // JfrogReplicationRegistry defines model for JfrogReplicationRegistry.
 type JfrogReplicationRegistry struct {
 	Namespace             string  `json:"namespace"`
@@ -620,12 +742,14 @@ type Registry struct {
 
 // RegistryArtifactMetadata Artifact Metadata
 type RegistryArtifactMetadata struct {
-	DownloadsCount *int64    `json:"downloadsCount,omitempty"`
-	IsQuarantined  *bool     `json:"isQuarantined,omitempty"`
-	Labels         *[]string `json:"labels,omitempty"`
-	LastModified   *string   `json:"lastModified,omitempty"`
-	LatestVersion  string    `json:"latestVersion"`
-	Name           string    `json:"name"`
+	// ArtifactType refers to artifact type
+	ArtifactType   *ArtifactType `json:"artifactType,omitempty"`
+	DownloadsCount *int64        `json:"downloadsCount,omitempty"`
+	IsQuarantined  *bool         `json:"isQuarantined,omitempty"`
+	Labels         *[]string     `json:"labels,omitempty"`
+	LastModified   *string       `json:"lastModified,omitempty"`
+	LatestVersion  string        `json:"latestVersion"`
+	Name           string        `json:"name"`
 
 	// PackageType refers to package
 	PackageType        *PackageType `json:"packageType,omitempty"`
@@ -888,9 +1012,15 @@ type ArtifactParam string
 // ArtifactPathParam defines model for artifactPathParam.
 type ArtifactPathParam string
 
+// ArtifactTypeParam defines model for artifactTypeParam.
+type ArtifactTypeParam string
+
 // ChildVersionParam defines model for childVersionParam.
 type ChildVersionParam string
 
+// DigestOptParam defines model for digestOptParam.
+type DigestOptParam string
+
 // DigestParam defines model for digestParam.
 type DigestParam string
 
@@ -921,6 +1051,9 @@ type RecursiveParam bool
 // RegistryRefPathParam defines model for registryRefPathParam.
 type RegistryRefPathParam string
 
+// ScopeParam defines model for scopeParam.
+type ScopeParam string
+
 // SearchTerm defines model for searchTerm.
 type SearchTerm string
 
@@ -1262,6 +1395,24 @@ type GetArtifactStatsForRegistryParams struct {
 	To *ToDateParam `form:"to,omitempty" json:"to,omitempty"`
 }
 
+// DeleteArtifactParams defines parameters for DeleteArtifact.
+type DeleteArtifactParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *DeleteArtifactParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+}
+
+// DeleteArtifactParamsArtifactType defines parameters for DeleteArtifact.
+type DeleteArtifactParamsArtifactType string
+
+// UpdateArtifactLabelsParams defines parameters for UpdateArtifactLabels.
+type UpdateArtifactLabelsParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *UpdateArtifactLabelsParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+}
+
+// UpdateArtifactLabelsParamsArtifactType defines parameters for UpdateArtifactLabels.
+type UpdateArtifactLabelsParamsArtifactType string
+
 // GetArtifactStatsParams defines parameters for GetArtifactStats.
 type GetArtifactStatsParams struct {
 	// From Date. Format - MM/DD/YYYY
@@ -1271,12 +1422,36 @@ type GetArtifactStatsParams struct {
 	To *ToDateParam `form:"to,omitempty" json:"to,omitempty"`
 }
 
+// GetArtifactSummaryParams defines parameters for GetArtifactSummary.
+type GetArtifactSummaryParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *GetArtifactSummaryParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+}
+
+// GetArtifactSummaryParamsArtifactType defines parameters for GetArtifactSummary.
+type GetArtifactSummaryParamsArtifactType string
+
+// DeleteArtifactVersionParams defines parameters for DeleteArtifactVersion.
+type DeleteArtifactVersionParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *DeleteArtifactVersionParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+}
+
+// DeleteArtifactVersionParamsArtifactType defines parameters for DeleteArtifactVersion.
+type DeleteArtifactVersionParamsArtifactType string
+
 // GetArtifactDetailsParams defines parameters for GetArtifactDetails.
 type GetArtifactDetailsParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *GetArtifactDetailsParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+
 	// ChildVersion Child version incase of Docker artifacts.
 	ChildVersion *ChildVersionParam `form:"childVersion,omitempty" json:"childVersion,omitempty"`
 }
 
+// GetArtifactDetailsParamsArtifactType defines parameters for GetArtifactDetails.
+type GetArtifactDetailsParamsArtifactType string
+
 // GetDockerArtifactDetailsParams defines parameters for GetDockerArtifactDetails.
 type GetDockerArtifactDetailsParams struct {
 	// Digest Digest.
@@ -1295,8 +1470,20 @@ type GetDockerArtifactManifestParams struct {
 	Digest DigestParam `form:"digest" json:"digest"`
 }
 
+// GetArtifactFileParams defines parameters for GetArtifactFile.
+type GetArtifactFileParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *GetArtifactFileParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+}
+
+// GetArtifactFileParamsArtifactType defines parameters for GetArtifactFile.
+type GetArtifactFileParamsArtifactType string
+
 // GetArtifactFilesParams defines parameters for GetArtifactFiles.
 type GetArtifactFilesParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *GetArtifactFilesParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+
 	// Page Current page number
 	Page *PageNumber `form:"page,omitempty" json:"page,omitempty"`
 
@@ -1313,8 +1500,26 @@ type GetArtifactFilesParams struct {
 	SearchTerm *SearchTerm `form:"search_term,omitempty" json:"search_term,omitempty"`
 }
 
+// GetArtifactFilesParamsArtifactType defines parameters for GetArtifactFiles.
+type GetArtifactFilesParamsArtifactType string
+
+// GetArtifactVersionSummaryParams defines parameters for GetArtifactVersionSummary.
+type GetArtifactVersionSummaryParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *GetArtifactVersionSummaryParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+
+	// Digest Digest.
+	Digest *DigestOptParam `form:"digest,omitempty" json:"digest,omitempty"`
+}
+
+// GetArtifactVersionSummaryParamsArtifactType defines parameters for GetArtifactVersionSummary.
+type GetArtifactVersionSummaryParamsArtifactType string
+
 // GetAllArtifactVersionsParams defines parameters for GetAllArtifactVersions.
 type GetAllArtifactVersionsParams struct {
+	// ArtifactType artifact type.
+	ArtifactType *GetAllArtifactVersionsParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
+
 	// Page Current page number
 	Page *PageNumber `form:"page,omitempty" json:"page,omitempty"`
 
@@ -1331,6 +1536,9 @@ type GetAllArtifactVersionsParams struct {
 	SearchTerm *SearchTerm `form:"search_term,omitempty" json:"search_term,omitempty"`
 }
 
+// GetAllArtifactVersionsParamsArtifactType defines parameters for GetAllArtifactVersions.
+type GetAllArtifactVersionsParamsArtifactType string
+
 // GetAllArtifactsByRegistryParams defines parameters for GetAllArtifactsByRegistry.
 type GetAllArtifactsByRegistryParams struct {
 	// Label Label.
@@ -1350,8 +1558,14 @@ type GetAllArtifactsByRegistryParams struct {
 
 	// SearchTerm search Term.
 	SearchTerm *SearchTerm `form:"search_term,omitempty" json:"search_term,omitempty"`
+
+	// ArtifactType artifact type.
+	ArtifactType *GetAllArtifactsByRegistryParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
 }
 
+// GetAllArtifactsByRegistryParamsArtifactType defines parameters for GetAllArtifactsByRegistry.
+type GetAllArtifactsByRegistryParamsArtifactType string
+
 // GetClientSetupDetailsParams defines parameters for GetClientSetupDetails.
 type GetClientSetupDetailsParams struct {
 	// Artifact Artifat
@@ -1461,8 +1675,14 @@ type GetAllArtifactsParams struct {
 
 	// PackageType Registry Package Type
 	PackageType *PackageTypeParam `form:"package_type,omitempty" json:"package_type,omitempty"`
+
+	// ArtifactType artifact type.
+	ArtifactType *GetAllArtifactsParamsArtifactType `form:"artifact_type,omitempty" json:"artifact_type,omitempty"`
 }
 
+// GetAllArtifactsParamsArtifactType defines parameters for GetAllArtifacts.
+type GetAllArtifactsParamsArtifactType string
+
 // GetAllRegistriesParams defines parameters for GetAllRegistries.
 type GetAllRegistriesParams struct {
 	// PackageType Registry Package Type
@@ -1487,12 +1707,25 @@ type GetAllRegistriesParams struct {
 	SearchTerm *SearchTerm `form:"search_term,omitempty" json:"search_term,omitempty"`
 
 	// Recursive Whether to list registries recursively.
+	//
+	// **Deprecated.** Use the new `scope` parameter.
+	//
+	// * `recursive=true`  → `scope=ancestors`
+	// * `recursive=false` → `scope=none`
 	Recursive *RecursiveParam `form:"recursive,omitempty" json:"recursive,omitempty"`
+
+	// Scope **Scope of registries to list**
+	// * **none** – current space only (default)   * **ancestors** – current space **plus** all parent spaces   * **descendants** – current space **plus** all child spaces
+	// If omitted, `none` is assumed.
+	Scope *GetAllRegistriesParamsScope `form:"scope,omitempty" json:"scope,omitempty"`
 }
 
 // GetAllRegistriesParamsType defines parameters for GetAllRegistries.
 type GetAllRegistriesParamsType string
 
+// GetAllRegistriesParamsScope defines parameters for GetAllRegistries.
+type GetAllRegistriesParamsScope string
+
 // CreateRegistryJSONRequestBody defines body for CreateRegistry for application/json ContentType.
 type CreateRegistryJSONRequestBody RegistryRequest
 
@@ -1817,6 +2050,36 @@ func (t *ArtifactDetail) MergeGoArtifactDetailConfig(v GoArtifactDetailConfig) e
 	return err
 }
 
+// AsHuggingFaceArtifactDetailConfig returns the union data inside the ArtifactDetail as a HuggingFaceArtifactDetailConfig
+func (t ArtifactDetail) AsHuggingFaceArtifactDetailConfig() (HuggingFaceArtifactDetailConfig, error) {
+	var body HuggingFaceArtifactDetailConfig
+	err := json.Unmarshal(t.union, &body)
+	return body, err
+}
+
+// FromHuggingFaceArtifactDetailConfig overwrites any union data inside the ArtifactDetail as the provided HuggingFaceArtifactDetailConfig
+func (t *ArtifactDetail) FromHuggingFaceArtifactDetailConfig(v HuggingFaceArtifactDetailConfig) error {
+	t.PackageType = "HUGGINGFACE"
+
+	b, err := json.Marshal(v)
+	t.union = b
+	return err
+}
+
+// MergeHuggingFaceArtifactDetailConfig performs a merge with any union data inside the ArtifactDetail, using the provided HuggingFaceArtifactDetailConfig
+func (t *ArtifactDetail) MergeHuggingFaceArtifactDetailConfig(v HuggingFaceArtifactDetailConfig) error {
+	t.PackageType = "HUGGINGFACE"
+
+	b, err := json.Marshal(v)
+	if err != nil {
+		return err
+	}
+
+	merged, err := runtime.JSONMerge(t.union, b)
+	t.union = merged
+	return err
+}
+
 func (t ArtifactDetail) Discriminator() (string, error) {
 	var discriminator struct {
 		Discriminator string `json:"packageType"`
@@ -1841,6 +2104,8 @@ func (t ArtifactDetail) ValueByDiscriminator() (interface{}, error) {
 		return t.AsGoArtifactDetailConfig()
 	case "HELM":
 		return t.AsHelmArtifactDetailConfig()
+	case "HUGGINGFACE":
+		return t.AsHuggingFaceArtifactDetailConfig()
 	case "MAVEN":
 		return t.AsMavenArtifactDetailConfig()
 	case "NPM":
@@ -1869,6 +2134,13 @@ func (t ArtifactDetail) MarshalJSON() ([]byte, error) {
 		}
 	}
 
+	if t.ArtifactType != nil {
+		object["artifactType"], err = json.Marshal(t.ArtifactType)
+		if err != nil {
+			return nil, fmt.Errorf("error marshaling 'artifactType': %w", err)
+		}
+	}
+
 	if t.CreatedAt != nil {
 		object["createdAt"], err = json.Marshal(t.CreatedAt)
 		if err != nil {
@@ -1890,6 +2162,13 @@ func (t ArtifactDetail) MarshalJSON() ([]byte, error) {
 		}
 	}
 
+	if t.IsQuarantined != nil {
+		object["isQuarantined"], err = json.Marshal(t.IsQuarantined)
+		if err != nil {
+			return nil, fmt.Errorf("error marshaling 'isQuarantined': %w", err)
+		}
+	}
+
 	if t.ModifiedAt != nil {
 		object["modifiedAt"], err = json.Marshal(t.ModifiedAt)
 		if err != nil {
@@ -1909,6 +2188,13 @@ func (t ArtifactDetail) MarshalJSON() ([]byte, error) {
 		return nil, fmt.Errorf("error marshaling 'packageType': %w", err)
 	}
 
+	if t.QuarantineReason != nil {
+		object["quarantineReason"], err = json.Marshal(t.QuarantineReason)
+		if err != nil {
+			return nil, fmt.Errorf("error marshaling 'quarantineReason': %w", err)
+		}
+	}
+
 	if t.Size != nil {
 		object["size"], err = json.Marshal(t.Size)
 		if err != nil {
@@ -1936,6 +2222,13 @@ func (t *ArtifactDetail) UnmarshalJSON(b []byte) error {
 		return err
 	}
 
+	if raw, found := object["artifactType"]; found {
+		err = json.Unmarshal(raw, &t.ArtifactType)
+		if err != nil {
+			return fmt.Errorf("error reading 'artifactType': %w", err)
+		}
+	}
+
 	if raw, found := object["createdAt"]; found {
 		err = json.Unmarshal(raw, &t.CreatedAt)
 		if err != nil {
@@ -1957,6 +2250,13 @@ func (t *ArtifactDetail) UnmarshalJSON(b []byte) error {
 		}
 	}
 
+	if raw, found := object["isQuarantined"]; found {
+		err = json.Unmarshal(raw, &t.IsQuarantined)
+		if err != nil {
+			return fmt.Errorf("error reading 'isQuarantined': %w", err)
+		}
+	}
+
 	if raw, found := object["modifiedAt"]; found {
 		err = json.Unmarshal(raw, &t.ModifiedAt)
 		if err != nil {
@@ -1978,6 +2278,13 @@ func (t *ArtifactDetail) UnmarshalJSON(b []byte) error {
 		}
 	}
 
+	if raw, found := object["quarantineReason"]; found {
+		err = json.Unmarshal(raw, &t.QuarantineReason)
+		if err != nil {
+			return fmt.Errorf("error reading 'quarantineReason': %w", err)
+		}
+	}
+
 	if raw, found := object["size"]; found {
 		err = json.Unmarshal(raw, &t.Size)
 		if err != nil {
diff --git a/registry/app/api/router/harness/route.go b/registry/app/api/router/harness/route.go
index 281d15fac..42f4a338a 100644
--- a/registry/app/api/router/harness/route.go
+++ b/registry/app/api/router/harness/route.go
@@ -89,6 +89,7 @@ func NewAPIHandler(
 	cargoRegistryHelper cargo.RegistryHelper,
 	spaceController *spacecontroller.Controller,
 	quarantineArtifactRepository store.QuarantineArtifactRepository,
+	spaceStore corestore.SpaceStore,
 ) APIHandler {
 	r := chi.NewRouter()
 	r.Use(audit.Middleware())
@@ -125,6 +126,7 @@ func NewAPIHandler(
 		cargoRegistryHelper,
 		spaceController,
 		quarantineArtifactRepository,
+		spaceStore,
 	)
 
 	handler := artifact.NewStrictHandler(apiController, []artifact.StrictMiddlewareFunc{})
diff --git a/registry/app/api/router/oci/route.go b/registry/app/api/router/oci/route.go
index 5650062a5..b1ec92521 100644
--- a/registry/app/api/router/oci/route.go
+++ b/registry/app/api/router/oci/route.go
@@ -89,6 +89,7 @@ func NewOCIHandler(handlerV2 *oci.Handler) RegistryOCIHandler {
 			r.Use(middleware.BlockNonOciSourceToken(handlerV2.URLProvider))
 			r.Use(middleware.TrackDownloadStat(handlerV2))
 			r.Use(middleware.TrackBandwidthStat(handlerV2))
+			r.Use(middleware.CheckQuarantineStatusOCI(handlerV2))
 
 			r.Handle("/*", http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
 				path := req.URL.Path
diff --git a/registry/app/api/router/packages/route.go b/registry/app/api/router/packages/route.go
index 489cfe5c9..ca2bb3e9e 100644
--- a/registry/app/api/router/packages/route.go
+++ b/registry/app/api/router/packages/route.go
@@ -22,6 +22,7 @@ import (
 	"github.com/harness/gitness/registry/app/api/handler/cargo"
 	"github.com/harness/gitness/registry/app/api/handler/generic"
 	"github.com/harness/gitness/registry/app/api/handler/gopackage"
+	"github.com/harness/gitness/registry/app/api/handler/huggingface"
 	"github.com/harness/gitness/registry/app/api/handler/maven"
 	"github.com/harness/gitness/registry/app/api/handler/npm"
 	"github.com/harness/gitness/registry/app/api/handler/nuget"
@@ -54,6 +55,7 @@ func NewRouter(
 	rpmHandler rpm.Handler,
 	cargoHandler cargo.Handler,
 	gopackageHandler gopackage.Handler,
+	huggingfaceHandler huggingface.Handler,
 ) Handler {
 	r := chi.NewRouter()
 
@@ -335,6 +337,64 @@ func NewRouter(
 				Get("/*", gopackageHandler.DownloadPackageFile)
 			// TODO: Add api for regenerate package index and download latest package info file
 		})
+
+		// Huggingface routes
+		r.Route("/huggingface", func(r chi.Router) {
+			r.Use(middleware.CheckSig())
+			r.Use(middlewareauthn.Attempt(packageHandler.GetAuthenticator()))
+			r.Use(middleware.CheckAuth())
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Post("/api/validate-yaml", huggingfaceHandler.ValidateYAML)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Post("/api/{repoType}/{repo}/preupload/{rev}", huggingfaceHandler.PreUpload)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Get("/api/{repoType}/{repo}/revision/{rev}", huggingfaceHandler.RevisionInfo)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Post("/{repo}.git/info/lfs/objects/batch", huggingfaceHandler.LfsInfo)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Post("/{repoType}/{repo}.git/info/lfs/objects/batch", huggingfaceHandler.LfsInfo)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsUpload)).
+				Put("/api/{repoType}/{repo}/{rev}/multipart/upload/{sha256}", huggingfaceHandler.LfsUpload)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Post("/api/{repoType}/{repo}/{rev}/multipart/verify/{sha256}", huggingfaceHandler.LfsVerify)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsUpload)).
+				Post("/api/{repoType}/{repo}/commit/{rev}", huggingfaceHandler.CommitRevision)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Head("/{repo}/resolve/{rev}/*", huggingfaceHandler.HeadFile)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				Head("/{repoType}/{repo}/resolve/{rev}/*", huggingfaceHandler.HeadFile)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				With(middleware.TrackDownloadStats(packageHandler)).
+				Get("/{repo}/resolve/{rev}/*", huggingfaceHandler.DownloadFile)
+
+			r.With(middleware.StoreArtifactInfo(huggingfaceHandler)).
+				With(middleware.RequestPackageAccess(packageHandler, enum.PermissionArtifactsDownload)).
+				With(middleware.TrackDownloadStats(packageHandler)).
+				Get("/{repoType}/{repo}/resolve/{rev}/*", huggingfaceHandler.DownloadFile)
+
+		})
 	})
 
 	return r
diff --git a/registry/app/api/router/wire.go b/registry/app/api/router/wire.go
index af95f8dc9..5954aefbd 100644
--- a/registry/app/api/router/wire.go
+++ b/registry/app/api/router/wire.go
@@ -26,6 +26,7 @@ import (
 	"github.com/harness/gitness/registry/app/api/handler/cargo"
 	"github.com/harness/gitness/registry/app/api/handler/generic"
 	"github.com/harness/gitness/registry/app/api/handler/gopackage"
+	"github.com/harness/gitness/registry/app/api/handler/huggingface"
 	"github.com/harness/gitness/registry/app/api/handler/maven"
 	"github.com/harness/gitness/registry/app/api/handler/npm"
 	"github.com/harness/gitness/registry/app/api/handler/nuget"
@@ -91,6 +92,7 @@ func APIHandlerProvider(
 	cargoRegistryHelper cargoutils.RegistryHelper,
 	spaceController *spacecontroller.Controller,
 	quarantineArtifactRepository store.QuarantineArtifactRepository,
+	spaceStore corestore.SpaceStore,
 ) harness.APIHandler {
 	return harness.NewAPIHandler(
 		repoDao,
@@ -122,6 +124,7 @@ func APIHandlerProvider(
 		cargoRegistryHelper,
 		spaceController,
 		quarantineArtifactRepository,
+		spaceStore,
 	)
 }
 
@@ -147,6 +150,7 @@ func PackageHandlerProvider(
 	rpmHandler rpm.Handler,
 	cargoHandler cargo.Handler,
 	gopackageHandler gopackage.Handler,
+	huggingfaceHandler huggingface.Handler,
 ) packagerrouter.Handler {
 	return packagerrouter.NewRouter(
 		handler,
@@ -158,6 +162,7 @@ func PackageHandlerProvider(
 		rpmHandler,
 		cargoHandler,
 		gopackageHandler,
+		huggingfaceHandler,
 	)
 }
 
diff --git a/registry/app/api/utils/path_utils.go b/registry/app/api/utils/path_utils.go
index 0c3b05a7e..60474fc91 100644
--- a/registry/app/api/utils/path_utils.go
+++ b/registry/app/api/utils/path_utils.go
@@ -90,6 +90,8 @@ func GetFilePath(
 		return GetCargoFilePath(imageName, version), nil
 	case artifact.PackageTypeGO:
 		return GetGoFilePath(imageName, version), nil
+	case artifact.PackageTypeHUGGINGFACE:
+		return GetGenericFilePath(imageName, version), nil
 	default:
 		return "", fmt.Errorf("unsupported package type: %s", packageType)
 	}
diff --git a/registry/app/api/wire.go b/registry/app/api/wire.go
index 02c871e9d..c02f6bcbd 100644
--- a/registry/app/api/wire.go
+++ b/registry/app/api/wire.go
@@ -23,6 +23,7 @@ import (
 	urlprovider "github.com/harness/gitness/app/url"
 	cargo2 "github.com/harness/gitness/registry/app/api/controller/pkg/cargo"
 	gopackage2 "github.com/harness/gitness/registry/app/api/controller/pkg/gopackage"
+	"github.com/harness/gitness/registry/app/api/controller/pkg/huggingface"
 	"github.com/harness/gitness/registry/app/api/controller/pkg/npm"
 	nuget2 "github.com/harness/gitness/registry/app/api/controller/pkg/nuget"
 	python2 "github.com/harness/gitness/registry/app/api/controller/pkg/python"
@@ -30,6 +31,7 @@ import (
 	"github.com/harness/gitness/registry/app/api/handler/cargo"
 	"github.com/harness/gitness/registry/app/api/handler/generic"
 	"github.com/harness/gitness/registry/app/api/handler/gopackage"
+	hf2 "github.com/harness/gitness/registry/app/api/handler/huggingface"
 	mavenhandler "github.com/harness/gitness/registry/app/api/handler/maven"
 	npm2 "github.com/harness/gitness/registry/app/api/handler/npm"
 	nugethandler "github.com/harness/gitness/registry/app/api/handler/nuget"
@@ -49,6 +51,7 @@ import (
 	"github.com/harness/gitness/registry/app/pkg/filemanager"
 	generic2 "github.com/harness/gitness/registry/app/pkg/generic"
 	gopackageregistry "github.com/harness/gitness/registry/app/pkg/gopackage"
+	hf3 "github.com/harness/gitness/registry/app/pkg/huggingface"
 	"github.com/harness/gitness/registry/app/pkg/maven"
 	npm22 "github.com/harness/gitness/registry/app/pkg/npm"
 	"github.com/harness/gitness/registry/app/pkg/nuget"
@@ -255,6 +258,9 @@ var WireSet = wire.NewSet(
 	cargoregistry.WireSet,
 	gopackage2.ControllerSet,
 	gopackageregistry.WireSet,
+	huggingface.WireSet,
+	hf2.WireSet,
+	hf3.WireSet,
 )
 
 func Wire(_ *types.Config) (RegistryApp, error) {
diff --git a/registry/app/common/url_utils.go b/registry/app/common/url_utils.go
index a2a6d7545..9939b85a4 100644
--- a/registry/app/common/url_utils.go
+++ b/registry/app/common/url_utils.go
@@ -15,6 +15,7 @@
 package common
 
 import (
+	"context"
 	"net/url"
 	"strings"
 
@@ -33,25 +34,25 @@ func GenerateSetupClientHostnameAndRegistry(registryURL string) (hostname string
 	return regURL.Host, strings.Trim(regURL.Path, "/")
 }
 
-func GetHost(urlStr string) string {
+func GetHost(ctx context.Context, urlStr string) string {
 	if !strings.Contains(urlStr, "://") {
 		urlStr = "https://" + urlStr
 	}
 	u, err := url.Parse(urlStr)
 	if err != nil {
-		log.Warn().Msgf("Failed to parse URL: %s", urlStr)
+		log.Ctx(ctx).Warn().Msgf("Failed to parse URL: %s", urlStr)
 		return ""
 	}
 	return u.Host
 }
 
-func GetHostName(urlStr string) string {
+func GetHostName(ctx context.Context, urlStr string) string {
 	if !strings.Contains(urlStr, "://") {
 		urlStr = "https://" + urlStr
 	}
 	u, err := url.Parse(urlStr)
 	if err != nil {
-		log.Warn().Msgf("Failed to parse URL: %s", urlStr)
+		log.Ctx(ctx).Warn().Msgf("Failed to parse URL: %s", urlStr)
 		return ""
 	}
 	return u.Hostname()
diff --git a/registry/app/dist_temp/errcode/register.go b/registry/app/dist_temp/errcode/register.go
index d00e6af89..e986292d1 100644
--- a/registry/app/dist_temp/errcode/register.go
+++ b/registry/app/dist_temp/errcode/register.go
@@ -238,6 +238,17 @@ var (
 		},
 	)
 
+	// ErrCodeManifestQuarantined returned when image manifest is quarantined.
+	ErrCodeManifestQuarantined = register(
+		errGroup, ErrorDescriptor{
+			Value:   "ARTIFACT_QUARANTINED",
+			Message: "artifact quarantined",
+			Description: `This error is returned when the manifest, identified by
+		name or tag is quarantined`,
+			HTTPStatusCode: http.StatusForbidden,
+		},
+	)
+
 	// ErrCodeManifestReferencedInList is returned when attempting to delete a manifest that is still referenced by at
 	// least one manifest list.
 	ErrCodeManifestReferencedInList = register(
diff --git a/registry/app/driver/s3-aws/s3.go b/registry/app/driver/s3-aws/s3.go
index 734d62d30..89a56eb14 100644
--- a/registry/app/driver/s3-aws/s3.go
+++ b/registry/app/driver/s3-aws/s3.go
@@ -174,7 +174,7 @@ func init() {
 
 // TODO: figure-out why init is not called automatically
 func Register() {
-	log.Info().Msgf("registering s3 driver")
+	log.Ctx(context.Background()).Info().Msgf("registering s3 driver")
 }
 
 // s3DriverFactory implements the factory.StorageDriverFactory interface.
@@ -583,7 +583,7 @@ func getS3LogLevelFromParam(param interface{}) aws.LogLevelType {
 	}
 	logLevelParam, ok := param.(string)
 	if !ok {
-		log.Warn().Msg("Error: param is not of type string")
+		log.Ctx(context.Background()).Warn().Msg("Error: param is not of type string")
 	}
 	var logLevel aws.LogLevelType
 	switch strings.ToLower(logLevelParam) {
diff --git a/registry/app/driver/s3-aws/s3_v2_signer.go b/registry/app/driver/s3-aws/s3_v2_signer.go
index 870c82187..00f8becfa 100644
--- a/registry/app/driver/s3-aws/s3_v2_signer.go
+++ b/registry/app/driver/s3-aws/s3_v2_signer.go
@@ -23,6 +23,7 @@
 package s3
 
 import (
+	"context"
 	"crypto/hmac"
 	"crypto/sha256"
 	"encoding/base64"
@@ -79,7 +80,7 @@ func setv2Handlers(svc *s3.S3) {
 		func(r *request.Request) {
 			parsedURL, err := url.Parse(r.HTTPRequest.URL.String())
 			if err != nil {
-				log.Fatal().Msgf("Failed to parse URL: %v", err)
+				log.Ctx(context.Background()).Fatal().Msgf("Failed to parse URL: %v", err)
 			}
 			r.HTTPRequest.URL.Opaque = parsedURL.Path
 		},
@@ -109,13 +110,13 @@ func Sign(req *request.Request) {
 	}
 
 	// nolint:errcheck.
-	err := v2.Sign()
+	err := v2.Sign(req.Context())
 	if err != nil {
-		log.Fatal().Msgf("Error in signing s3: %v", err)
+		log.Ctx(req.Context()).Fatal().Msgf("Error in signing s3: %v", err)
 	}
 }
 
-func (v2 *signer) Sign() error {
+func (v2 *signer) Sign(ctx context.Context) error {
 	credValue, err := v2.Credentials.Get()
 	if err != nil {
 		return err
@@ -217,7 +218,7 @@ func (v2 *signer) Sign() error {
 		headers["Authorization"] = []string{"AWS " + accessKey + ":" + v2.signature}
 	}
 
-	log.Debug().
+	log.Ctx(ctx).Debug().
 		Interface("string-to-sign", v2.stringToSign).
 		Interface("signature", v2.signature).
 		Msg("request signature")
diff --git a/registry/app/metadata/huggingface/metadata.go b/registry/app/metadata/huggingface/metadata.go
new file mode 100644
index 000000000..681012790
--- /dev/null
+++ b/registry/app/metadata/huggingface/metadata.go
@@ -0,0 +1,70 @@
+//  Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import "github.com/harness/gitness/registry/app/metadata"
+
+// CardData represents the card data for a HuggingFace model.
+type CardData struct {
+	Language []string `json:"language,omitempty"`
+	Tags     []string `json:"tags,omitempty"`
+	License  string   `json:"license,omitempty"`
+}
+
+// Sibling represents a file in a HuggingFace model.
+type Sibling struct {
+	RFilename string `json:"rfilename"`
+}
+
+var _ metadata.Metadata = (*HuggingFaceMetadata)(nil)
+
+type Metadata struct {
+	ID           string    `json:"id"`
+	ModelID      string    `json:"modelId,omitempty"`
+	SHA          string    `json:"sha,omitempty"`
+	Downloads    int64     `json:"downloads,omitempty"`
+	Likes        int64     `json:"likes,omitempty"`
+	LibraryName  string    `json:"libraryName,omitempty"`
+	Tags         []string  `json:"tags,omitempty"`
+	CardData     *CardData `json:"cardData,omitempty"`
+	Siblings     []Sibling `json:"siblings,omitempty"`
+	LastModified string    `json:"lastModified,omitempty"`
+	Private      bool      `json:"private,omitempty"`
+	Readme       string    `json:"readme,omitempty"`
+}
+
+//nolint:revive
+type HuggingFaceMetadata struct {
+	Metadata
+	Files     []metadata.File `json:"files"`
+	FileCount int64           `json:"file_count"`
+	Size      int64           `json:"size"`
+}
+
+func (p *HuggingFaceMetadata) GetFiles() []metadata.File {
+	return p.Files
+}
+
+func (p *HuggingFaceMetadata) SetFiles(files []metadata.File) {
+	p.Files = files
+	p.FileCount = int64(len(files))
+}
+func (p *HuggingFaceMetadata) GetSize() int64 {
+	return p.Size
+}
+
+func (p *HuggingFaceMetadata) UpdateSize(size int64) {
+	p.Size += size
+}
diff --git a/registry/app/pkg/base/base.go b/registry/app/pkg/base/base.go
index c1e1dc0f4..deef0bcd1 100644
--- a/registry/app/pkg/base/base.go
+++ b/registry/app/pkg/base/base.go
@@ -344,7 +344,7 @@ func (l *localBase) GetSHA256(ctx context.Context, info pkg.ArtifactInfo, path s
 	err error,
 ) {
 	filePath := "/" + path
-	sha256, err = l.fileManager.HeadFile(ctx, filePath, info.RegistryID)
+	sha256, _, err = l.fileManager.HeadFile(ctx, filePath, info.RegistryID)
 	if err != nil {
 		return false, "", err
 	}
@@ -358,7 +358,7 @@ func (l *localBase) GetSHA256ByPath(ctx context.Context, registryID int64, fileP
 	sha256 string,
 	err error,
 ) {
-	sha256, err = l.fileManager.HeadFile(ctx, "/"+filePath, registryID)
+	sha256, _, err = l.fileManager.HeadFile(ctx, "/"+filePath, registryID)
 	if err != nil {
 		return false, "", err
 	}
@@ -467,7 +467,8 @@ func (l *localBase) DeletePackage(ctx context.Context, info pkg.PackageArtifactI
 				return err
 			}
 
-			err = l.imageDao.DeleteByImageNameAndRegID(ctx, info.BaseArtifactInfo().RegistryID, info.BaseArtifactInfo().Image)
+			err = l.imageDao.DeleteByImageNameAndRegID(ctx, info.BaseArtifactInfo().RegistryID,
+				info.BaseArtifactInfo().Image)
 
 			if err != nil {
 				return err
@@ -475,7 +476,7 @@ func (l *localBase) DeletePackage(ctx context.Context, info pkg.PackageArtifactI
 			return nil
 		})
 	if err != nil {
-		log.Warn().Msgf("Failed to delete the package %v", info.BaseArtifactInfo().Image)
+		log.Ctx(ctx).Warn().Msgf("Failed to delete the package %v", info.BaseArtifactInfo().Image)
 		return err
 	}
 
@@ -501,7 +502,8 @@ func (l *localBase) DeleteVersion(ctx context.Context, info pkg.PackageArtifactI
 			return nil
 		})
 	if err != nil {
-		log.Warn().Msgf("Failed to delete the version for artifact %v:%v", info.BaseArtifactInfo().Image, info.GetVersion())
+		log.Ctx(ctx).Warn().Msgf("Failed to delete the version for artifact %v:%v", info.BaseArtifactInfo().Image,
+			info.GetVersion())
 		return err
 	}
 	return nil
diff --git a/registry/app/pkg/base/wrapper.go b/registry/app/pkg/base/wrapper.go
index 206027704..f6c0612aa 100644
--- a/registry/app/pkg/base/wrapper.go
+++ b/registry/app/pkg/base/wrapper.go
@@ -95,6 +95,7 @@ func proxyInternal(
 			requestRepoKey, pkg.JoinWithSeparator(", ", skippedRegNames...))
 	}
 
+	//todo: fix error message
 	return r, errors.NotFound("no matching artifacts found in registry %s", requestRepoKey)
 }
 
@@ -125,7 +126,7 @@ func filterRegs(
 
 	exists, imageVersion := info.GetImageVersion()
 	if !exists {
-		log.Debug().Msgf("image version not ready for %s, skipping filter", repoKey)
+		log.Ctx(ctx).Debug().Msgf("image version not ready for %s, skipping filter", repoKey)
 		return registries, nil, nil
 	}
 
@@ -134,7 +135,7 @@ func filterRegs(
 		blockedPatterns := repo.BlockedPattern
 		isAllowed, err := utils.IsPatternAllowed(allowedPatterns, blockedPatterns, imageVersion)
 		if !isAllowed || err != nil {
-			log.Debug().Ctx(ctx).Msgf("Skipping repository %s", repo.Name)
+			log.Ctx(ctx).Debug().Msgf("Skipping repository %s", repo.Name)
 			skipped = append(skipped, repo)
 			continue
 		}
@@ -163,7 +164,7 @@ func GetOrderedRepos(
 	if len(proxies) > 0 {
 		upstreamRepos, err2 := registryDao.GetByIDIn(ctx, proxies)
 		if err2 != nil {
-			log.Error().Msgf("Failed to get upstream proxies for %s: %v", repoKey, err2)
+			log.Ctx(ctx).Error().Msgf("Failed to get upstream proxies for %s: %v", repoKey, err2)
 			return result, err2
 		}
 		repoMap := make(map[int64]registrytypes.Registry)
diff --git a/registry/app/pkg/cargo/proxy.go b/registry/app/pkg/cargo/proxy.go
index 81ea9ca05..a9ce67741 100644
--- a/registry/app/pkg/cargo/proxy.go
+++ b/registry/app/pkg/cargo/proxy.go
@@ -124,7 +124,7 @@ func (r *proxy) DownloadPackageIndex(
 	if err != nil {
 		return nil, nil, nil, "", fmt.Errorf("failed to create remote registry helper: %w", err)
 	}
-	result, err := helper.GetPackageIndex(info.Image, filePath)
+	result, err := helper.GetPackageIndex(ctx, info.Image, filePath)
 	if err != nil {
 		return nil, nil, nil, "", fmt.Errorf("failed to get package index file: %w", err)
 	}
@@ -163,7 +163,7 @@ func (r *proxy) DownloadPackage(
 	if err != nil {
 		return nil, nil, nil, "", fmt.Errorf("failed to create remote registry helper: %w", err)
 	}
-	registryConfig, err := helper.GetRegistryConfig()
+	registryConfig, err := helper.GetRegistryConfig(ctx)
 	if err != nil {
 		return nil, nil, nil, "", fmt.Errorf("failed to get registry config: %w", err)
 	}
@@ -209,8 +209,10 @@ func (r *proxy) RegeneratePackageIndex(
 	return nil, errcode.ErrCodeInvalidRequest.WithDetail(fmt.Errorf("not implemented"))
 }
 
-func (r *proxy) putFileToLocal(ctx context.Context, info *cargotype.ArtifactInfo,
-	remote RemoteRegistryHelper) error {
+func (r *proxy) putFileToLocal(
+	ctx context.Context, info *cargotype.ArtifactInfo,
+	remote RemoteRegistryHelper,
+) error {
 	// Get pacakage from upstream source
 	file, err := remote.GetPackageFile(ctx, info.Image, info.Version)
 	if err != nil {
@@ -262,7 +264,7 @@ func (r *proxy) putFileToLocal(ctx context.Context, info *cargotype.ArtifactInfo
 	// regenerate package index
 	r.localRegistryHelper.UpdatePackageIndex(ctx, *info)
 
-	log.Info().Msgf("Successfully uploaded file for pkg: %s , version: %s",
+	log.Ctx(ctx).Info().Msgf("Successfully uploaded file for pkg: %s , version: %s",
 		info.Image, info.Version)
 	return nil
 }
diff --git a/registry/app/pkg/cargo/remote_helper.go b/registry/app/pkg/cargo/remote_helper.go
index c979c0f86..008bc13c0 100644
--- a/registry/app/pkg/cargo/remote_helper.go
+++ b/registry/app/pkg/cargo/remote_helper.go
@@ -33,13 +33,13 @@ import (
 
 type RemoteRegistryHelper interface {
 	// GetRegistryConfig Fetches the registry configuration for the remote registry
-	GetRegistryConfig() (*cargo.RegistryConfig, error)
+	GetRegistryConfig(ctx context.Context) (*cargo.RegistryConfig, error)
 
 	// GetFile Downloads the file for the given package and filename
 	GetPackageFile(ctx context.Context, pkg string, version string) (io.ReadCloser, error)
 
 	// GetPackageIndex Fetches the package index for the given package
-	GetPackageIndex(pkg string, filePath string) (io.ReadCloser, error)
+	GetPackageIndex(ctx context.Context, pkg string, filePath string) (io.ReadCloser, error)
 }
 
 type remoteRegistryHelper struct {
@@ -99,19 +99,20 @@ func (r *remoteRegistryHelper) init(
 	return nil
 }
 
-func (r *remoteRegistryHelper) GetRegistryConfig() (*cargo.RegistryConfig, error) {
-	config, err := r.adapter.GetRegistryConfig()
+func (r *remoteRegistryHelper) GetRegistryConfig(ctx context.Context) (*cargo.RegistryConfig, error) {
+	config, err := r.adapter.GetRegistryConfig(ctx)
 	if err != nil {
-		log.Error().Err(err).Msg("failed to get registry config")
+		log.Ctx(ctx).Error().Err(err).Msg("failed to get registry config")
 		return nil, fmt.Errorf("failed to get registry config: %w", err)
 	}
 	return config, nil
 }
 
-func (r *remoteRegistryHelper) GetPackageIndex(
-	pkg string, filePath string,
-) (io.ReadCloser, error) {
-	data, err := r.adapter.GetPackageFile(filePath)
+func (r *remoteRegistryHelper) GetPackageIndex(ctx context.Context, pkg string, filePath string) (
+	io.ReadCloser,
+	error,
+) {
+	data, err := r.adapter.GetPackageFile(ctx, filePath)
 	if err != nil {
 		return nil, fmt.Errorf("failed to get package index: %s", pkg)
 	}
@@ -126,7 +127,7 @@ func (r *remoteRegistryHelper) GetPackageFile(
 ) (io.ReadCloser, error) {
 	// get the file for the package
 	filePath := downloadPackageFilePath(pkg, version)
-	data, err := r.adapter.GetPackageFile(filePath)
+	data, err := r.adapter.GetPackageFile(ctx, filePath)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("failed to get package file: %s, %s", pkg, filePath)
 		return nil, fmt.Errorf("failed to get package file: %s, %s", pkg, filePath)
diff --git a/registry/app/pkg/core_controller.go b/registry/app/pkg/core_controller.go
index ef4853298..a8964aaa7 100644
--- a/registry/app/pkg/core_controller.go
+++ b/registry/app/pkg/core_controller.go
@@ -43,23 +43,23 @@ func NewCoreController(registryDao store2.RegistryRepository) *CoreController {
 	}
 }
 
-func (c *CoreController) factory(t ArtifactType) Artifact {
+func (c *CoreController) factory(ctx context.Context, t ArtifactType) Artifact {
 	switch t {
 	case LocalRegistry:
 		return TypeRegistry[t]
 	case RemoteRegistry:
 		return TypeRegistry[t]
 	default:
-		log.Error().Stack().Msgf("Invalid artifact type %v", t)
+		log.Ctx(ctx).Error().Stack().Msgf("Invalid artifact type %v", t)
 		return nil
 	}
 }
 
-func (c *CoreController) GetArtifact(registry types.Registry) Artifact {
+func (c *CoreController) GetArtifact(ctx context.Context, registry types.Registry) Artifact {
 	if string(registry.Type) == string(artifact.RegistryTypeVIRTUAL) {
-		return c.factory(LocalRegistry)
+		return c.factory(ctx, LocalRegistry)
 	}
-	return c.factory(RemoteRegistry)
+	return c.factory(ctx, RemoteRegistry)
 }
 
 func (c *CoreController) GetOrderedRepos(ctx context.Context, artInfo RegistryInfo) ([]types.Registry, error) {
@@ -70,7 +70,7 @@ func (c *CoreController) GetOrderedRepos(ctx context.Context, artInfo RegistryIn
 	if len(proxies) > 0 {
 		upstreamRepos, err2 := c.RegistryDao.GetByIDIn(ctx, proxies)
 		if err2 != nil {
-			log.Error().Msgf("Failed to get upstream proxies for %s: %v", registry.Name, err2)
+			log.Ctx(ctx).Error().Msgf("Failed to get upstream proxies for %s: %v", registry.Name, err2)
 			return result, err2
 		}
 		repoMap := make(map[int64]types.Registry)
diff --git a/registry/app/pkg/docker/controller.go b/registry/app/pkg/docker/controller.go
index 28383f2b8..562e6dbb6 100644
--- a/registry/app/pkg/docker/controller.go
+++ b/registry/app/pkg/docker/controller.go
@@ -54,10 +54,12 @@ type Controller struct {
 
 type DBStore struct {
 	BlobRepo         store.BlobRepository
+	ManifestDao      store.ManifestRepository
 	ImageDao         store.ImageRepository
 	ArtifactDao      store.ArtifactRepository
 	BandwidthStatDao store.BandwidthStatRepository
 	DownloadStatDao  store.DownloadStatRepository
+	QuarantineDao    store.QuarantineArtifactRepository
 }
 
 type TagsAPIResponse struct {
@@ -98,6 +100,8 @@ func NewDBStore(
 	artifactDao store.ArtifactRepository,
 	bandwidthStatDao store.BandwidthStatRepository,
 	downloadStatDao store.DownloadStatRepository,
+	manifestDao store.ManifestRepository,
+	quarantineDao store.QuarantineArtifactRepository,
 ) *DBStore {
 	return &DBStore{
 		BlobRepo:         blobRepo,
@@ -105,6 +109,8 @@ func NewDBStore(
 		ArtifactDao:      artifactDao,
 		BandwidthStatDao: bandwidthStatDao,
 		DownloadStatDao:  downloadStatDao,
+		ManifestDao:      manifestDao,
+		QuarantineDao:    quarantineDao,
 	}
 }
 
@@ -133,7 +139,7 @@ func (c *Controller) ProxyWrapper(
 	}
 	for _, registry := range repos {
 		log.Ctx(ctx).Info().Msgf("Using Repository: %s, Type: %s", registry.Name, registry.Type)
-		artifact, ok := c.GetArtifact(registry).(Registry)
+		artifact, ok := c.GetArtifact(ctx, registry).(Registry)
 		if !ok {
 			log.Ctx(ctx).Warn().Msgf("artifact %s is not a registry", registry.Name)
 			continue
@@ -150,7 +156,11 @@ func (c *Controller) ProxyWrapper(
 	if response != nil && !pkg.IsEmpty(response.GetErrors()) {
 		switch resourceType {
 		case ResourceTypeManifest:
-			response.SetError(errcode.ErrCodeManifestUnknown)
+			if errors.Is(response.GetErrors()[0], errcode.ErrCodeManifestQuarantined) {
+				response.SetError(errcode.ErrCodeManifestQuarantined)
+			} else {
+				response.SetError(errcode.ErrCodeManifestUnknown)
+			}
 		case ResourceTypeBlob:
 			response.SetError(errcode.ErrCodeBlobUnknown)
 		default:
diff --git a/registry/app/pkg/docker/local.go b/registry/app/pkg/docker/local.go
index e4fa54595..3663203d7 100644
--- a/registry/app/pkg/docker/local.go
+++ b/registry/app/pkg/docker/local.go
@@ -114,42 +114,45 @@ func NewLocalRegistry(
 	tagDao store.TagRepository, imageDao store.ImageRepository, artifactDao store.ArtifactRepository,
 	bandwidthStatDao store.BandwidthStatRepository, downloadStatDao store.DownloadStatRepository,
 	gcService gc.Service, tx dbtx.Transactor, reporter event.Reporter,
+	quarantineArtifactDao store.QuarantineArtifactRepository,
 ) Registry {
 	return &LocalRegistry{
-		App:              app,
-		ms:               ms,
-		registryDao:      registryDao,
-		manifestDao:      manifestDao,
-		registryBlobDao:  registryBlobDao,
-		blobRepo:         blobRepo,
-		mtRepository:     mtRepository,
-		tagDao:           tagDao,
-		imageDao:         imageDao,
-		artifactDao:      artifactDao,
-		bandwidthStatDao: bandwidthStatDao,
-		downloadStatDao:  downloadStatDao,
-		gcService:        gcService,
-		tx:               tx,
-		reporter:         reporter,
+		App:                   app,
+		ms:                    ms,
+		registryDao:           registryDao,
+		manifestDao:           manifestDao,
+		registryBlobDao:       registryBlobDao,
+		blobRepo:              blobRepo,
+		mtRepository:          mtRepository,
+		tagDao:                tagDao,
+		imageDao:              imageDao,
+		artifactDao:           artifactDao,
+		bandwidthStatDao:      bandwidthStatDao,
+		downloadStatDao:       downloadStatDao,
+		gcService:             gcService,
+		tx:                    tx,
+		reporter:              reporter,
+		quarantineArtifactDao: quarantineArtifactDao,
 	}
 }
 
 type LocalRegistry struct {
-	App              *App
-	ms               ManifestService
-	registryDao      store.RegistryRepository
-	manifestDao      store.ManifestRepository
-	registryBlobDao  store.RegistryBlobRepository
-	blobRepo         store.BlobRepository
-	mtRepository     store.MediaTypesRepository
-	tagDao           store.TagRepository
-	imageDao         store.ImageRepository
-	artifactDao      store.ArtifactRepository
-	bandwidthStatDao store.BandwidthStatRepository
-	downloadStatDao  store.DownloadStatRepository
-	gcService        gc.Service
-	tx               dbtx.Transactor
-	reporter         event.Reporter
+	App                   *App
+	ms                    ManifestService
+	registryDao           store.RegistryRepository
+	manifestDao           store.ManifestRepository
+	registryBlobDao       store.RegistryBlobRepository
+	blobRepo              store.BlobRepository
+	mtRepository          store.MediaTypesRepository
+	tagDao                store.TagRepository
+	imageDao              store.ImageRepository
+	artifactDao           store.ArtifactRepository
+	bandwidthStatDao      store.BandwidthStatRepository
+	downloadStatDao       store.DownloadStatRepository
+	gcService             gc.Service
+	tx                    dbtx.Transactor
+	reporter              event.Reporter
+	quarantineArtifactDao store.QuarantineArtifactRepository
 }
 
 func (r *LocalRegistry) Base() error {
@@ -804,11 +807,10 @@ func (r *LocalRegistry) handlePutManifestErrors(
 			case errors.As(verificationError, &manifest.BlobUnknownError{}):
 				var manifestBlobUnknownError manifest.BlobUnknownError
 				errors.As(verificationError, &manifestBlobUnknownError)
-				dgst := manifestBlobUnknownError.Digest
 				errs = append(
 					errs,
 					errcode.ErrCodeManifestBlobUnknown.WithDetail(
-						dgst,
+						manifestBlobUnknownError.Digest,
 					),
 				)
 			case errors.As(verificationError, &manifest.NameInvalidError{}):
@@ -971,8 +973,8 @@ func (r *LocalRegistry) PushBlobChunk(
 	}
 
 	if err := blobUploadResponse(
-		ctx, responseHeaders, artInfo.RegIdentifier,
-		artInfo,
+		ctx, responseHeaders,
+		artInfo.RegIdentifier, artInfo,
 	); err != nil {
 		errs = append(errs, errcode.ErrCodeUnknown.WithDetail(err))
 		return responseHeaders, errs
@@ -1079,9 +1081,7 @@ func (r *LocalRegistry) PushBlob(
 		// Clean up the backend blob data if there was an error.
 		if err := ctx.Upload.Cancel(ctx); err != nil {
 			// If the cleanup fails, all we can do is observe and report.
-			log.Error().Stack().Err(
-				err,
-			).Msgf("error canceling upload after error: %v", err)
+			log.Ctx(ctx).Error().Stack().Err(err).Msgf("error canceling upload after error: %v", err)
 		}
 		return responseHeaders, errs
 	}
@@ -1090,10 +1090,7 @@ func (r *LocalRegistry) PushBlob(
 	err = r.dbPutBlobUploadComplete(ctx, "application/octet-stream", artInfo.Digest, int(desc.Size), artInfo)
 	if err != nil {
 		errs = append(errs, err)
-		log.Error().Stack().Err(err).Msgf(
-			"ensure blob %s failed, error: %v",
-			artInfo.Digest, err,
-		)
+		log.Ctx(ctx).Error().Msgf("failed to put blob in database: %v", err) //nolint:contextcheck
 		return responseHeaders, errs
 	}
 
@@ -1165,7 +1162,7 @@ func (r *LocalRegistry) DeleteManifest(
 	ctx context.Context,
 	artInfo pkg.RegistryInfo,
 ) (errs []error, responseHeaders *commons.ResponseHeaders) {
-	log.Debug().Msg("DeleteImageManifest")
+	log.Ctx(ctx).Debug().Msg("DeleteImageManifest")
 	var tag = artInfo.Tag
 	var d = artInfo.Digest
 
@@ -1173,7 +1170,7 @@ func (r *LocalRegistry) DeleteManifest(
 
 	// TODO: If Tag is not empty, we just untag the tag, nothing more!
 	if tag != "" {
-		log.Debug().Msg("DeleteImageTag")
+		log.Ctx(ctx).Debug().Msg("DeleteImageTag")
 		_, err := r.ms.DeleteTag(ctx, artInfo.RegIdentifier, tag, artInfo)
 		if err != nil {
 			errs = append(errs, err)
@@ -1319,7 +1316,7 @@ func (r *LocalRegistry) GetBlobUploadStatus(
 	}
 
 	errList := make([]error, 0)
-	log.Debug().Msgf("GetBlobUploadStatus")
+	log.Ctx(ctx.Context).Debug().Msgf("GetBlobUploadStatus")
 
 	if ctx.Upload == nil {
 		blobs := ctx.OciBlobStore
@@ -1429,7 +1426,7 @@ func blobUploadResponse(
 		context.State,
 	)
 	if err != nil {
-		log.Info().Msgf("error building upload state token: %s", err)
+		log.Ctx(context.Context).Info().Msgf("error building upload state token: %s", err)
 		return err
 	}
 	image := info.Image
@@ -1444,7 +1441,7 @@ func blobUploadResponse(
 		},
 	)
 	if err != nil {
-		log.Info().Msgf("error building upload url: %s", err)
+		log.Ctx(context.Context).Info().Msgf("error building upload url: %s", err)
 		return err
 	}
 
@@ -1582,7 +1579,7 @@ func (r *LocalRegistry) dbPutBlobUploadComplete(
 		}, dbtx.TxDefault,
 	)
 	if err != nil {
-		log.Error().Msgf("failed to put blob in database: %v", err)
+		log.Ctx(ctx.Context).Error().Msgf("failed to put blob in database: %v", err)
 		return fmt.Errorf("committing database transaction: %w", err)
 	}
 
@@ -1604,7 +1601,7 @@ func (r *LocalRegistry) dbDeleteBlob(
 	d digest.Digest,
 	info pkg.RegistryInfo,
 ) error {
-	log.Debug().Msgf("deleting blob from repository in database")
+	log.Ctx(ctx.Context).Debug().Msgf("deleting blob from repository in database")
 
 	if !config.Registry.Storage.S3Storage.Delete {
 		return storage.ErrUnsupported
@@ -1635,7 +1632,7 @@ func (r *LocalRegistry) dbGetTags(
 	ctx context.Context, filters types.FilterParams,
 	info pkg.RegistryInfo,
 ) ([]string, bool, error) {
-	log.Debug().Msgf("finding tags in database")
+	log.Ctx(ctx).Debug().Msgf("finding tags in database")
 
 	reg := info.Registry
 
@@ -1665,7 +1662,7 @@ func (r *LocalRegistry) dbMountBlob(
 	ctx context.Context, fromImageRef, toRepo string,
 	d digest.Digest, info pkg.RegistryInfo,
 ) error {
-	log.Debug().Msgf("cross repository blob mounting")
+	log.Ctx(ctx).Debug().Msgf("cross repository blob mounting")
 
 	destRepo, err := r.registryDao.GetByParentIDAndName(ctx, info.ParentID, toRepo)
 	if err != nil {
diff --git a/registry/app/pkg/docker/manifest_service.go b/registry/app/pkg/docker/manifest_service.go
index 17883b951..e0a8dc52a 100644
--- a/registry/app/pkg/docker/manifest_service.go
+++ b/registry/app/pkg/docker/manifest_service.go
@@ -464,7 +464,7 @@ func (l *manifestService) dbPutManifestV2(
 		return nil
 	}
 
-	log.Debug().Msgf("manifest %s not found in database", dgst.String())
+	log.Ctx(ctx).Debug().Msgf("manifest %s not found in database", dgst.String())
 
 	cfg := &types.Configuration{
 		MediaType: mfst.Config().MediaType,
diff --git a/registry/app/pkg/docker/wire.go b/registry/app/pkg/docker/wire.go
index 89a162de3..fa8072a87 100644
--- a/registry/app/pkg/docker/wire.go
+++ b/registry/app/pkg/docker/wire.go
@@ -45,11 +45,12 @@ func LocalRegistryProvider(
 	tagDao store.TagRepository, imageDao store.ImageRepository, artifactDao store.ArtifactRepository,
 	bandwidthStatDao store.BandwidthStatRepository, downloadStatDao store.DownloadStatRepository,
 	gcService gc.Service, tx dbtx.Transactor, reporter event.Reporter,
+	quarantineArtifactDao store.QuarantineArtifactRepository,
 ) *LocalRegistry {
 	registry, ok := NewLocalRegistry(
 		app, ms, manifestDao, registryDao, registryBlobDao, blobRepo,
 		mtRepository, tagDao, imageDao, artifactDao, bandwidthStatDao, downloadStatDao,
-		gcService, tx, reporter,
+		gcService, tx, reporter, quarantineArtifactDao,
 	).(*LocalRegistry)
 	if !ok {
 		return nil
@@ -104,8 +105,10 @@ func DBStoreProvider(
 	artifactDao store.ArtifactRepository,
 	bandwidthStatDao store.BandwidthStatRepository,
 	downloadStatDao store.DownloadStatRepository,
+	manifestDao store.ManifestRepository,
+	quarantineDao store.QuarantineArtifactRepository,
 ) *DBStore {
-	return NewDBStore(blobRepo, imageDao, artifactDao, bandwidthStatDao, downloadStatDao)
+	return NewDBStore(blobRepo, imageDao, artifactDao, bandwidthStatDao, downloadStatDao, manifestDao, quarantineDao)
 }
 
 func StorageServiceProvider(cfg *types.Config, driver storagedriver.StorageDriver) *storage.Service {
diff --git a/registry/app/pkg/filemanager/file_manager.go b/registry/app/pkg/filemanager/file_manager.go
index d6d1e7550..a7b7e36b2 100644
--- a/registry/app/pkg/filemanager/file_manager.go
+++ b/registry/app/pkg/filemanager/file_manager.go
@@ -142,7 +142,7 @@ func (f *FileManager) dbSaveFile(
 	}
 	created, err := f.genericBlobDao.Create(ctx, gb)
 	if err != nil {
-		log.Error().Msgf("failed to save generic blob in db with "+
+		log.Ctx(ctx).Error().Msgf("failed to save generic blob in db with "+
 			"sha256 : %s, err: %s", fileInfo.Sha256, err.Error())
 		return "", false, fmt.Errorf("failed to save generic blob"+
 			" in db with sha256 : %s, err: %w", fileInfo.Sha256, err)
@@ -157,7 +157,7 @@ func (f *FileManager) dbSaveFile(
 		return nil
 	})
 	if err != nil {
-		log.Error().Msgf("failed to save nodes for file : %s, with "+
+		log.Ctx(ctx).Error().Msgf("failed to save nodes for file : %s, with "+
 			"path : %s, err: %s", fileInfo.Filename, filePath, err)
 		return "", false, fmt.Errorf("failed to save nodes for"+
 			" file : %s, with path : %s, err: %w", fileInfo.Filename, filePath, err)
@@ -165,6 +165,37 @@ func (f *FileManager) dbSaveFile(
 	return blobID, created, nil
 }
 
+func (f *FileManager) SaveNodes(
+	ctx context.Context,
+	filePath string,
+	regID int64,
+	rootParentID int64,
+	createdBy int64,
+	sha256 string,
+) error {
+	gb, err := f.genericBlobDao.FindBySha256AndRootParentID(ctx, sha256, rootParentID)
+	if err != nil {
+		log.Ctx(ctx).Error().Msgf("failed to find generic blob in db with "+
+			"sha256 : %s, err: %s", sha256, err.Error())
+		return fmt.Errorf("failed to find generic blob"+
+			" in db with sha256 : %s, err: %w", sha256, err)
+	}
+	// Saving the nodes
+	err = f.tx.WithTx(ctx, func(ctx context.Context) error {
+		err = f.createNodes(ctx, filePath, gb.ID, regID, createdBy)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	if err != nil {
+		log.Ctx(ctx).Error().Msgf("failed to save nodes for file with "+
+			"path : %s, err: %s", filePath, err)
+		return fmt.Errorf("failed to save nodes for file with path : %s, err: %w", filePath, err)
+	}
+	return nil
+}
+
 func (f *FileManager) moveFile(
 	ctx context.Context,
 	rootIdentifier string,
@@ -177,7 +208,7 @@ func (f *FileManager) moveFile(
 	err := blobContext.genericBlobStore.Move(ctx, tmpPath, fileStoragePath)
 
 	if err != nil {
-		log.Error().Msgf("failed to Move the file on permanent location "+
+		log.Ctx(ctx).Error().Msgf("failed to Move the file on permanent location "+
 			"with name : %s with error : %s", fileInfo.Filename, err.Error())
 		return fmt.Errorf("failed to Move the file on permanent"+
 			" location with name : %s with error : %w", fileInfo.Filename, err)
@@ -310,20 +341,47 @@ func (f *FileManager) HeadFile(
 	ctx context.Context,
 	filePath string,
 	regID int64,
-) (string, error) {
+) (string, int64, error) {
 	node, err := f.nodesDao.GetByPathAndRegistryID(ctx, regID, filePath)
 
 	if err != nil {
-		return "", fmt.Errorf("failed to get the node path mapping for path: %s, "+
+		return "", 0, fmt.Errorf("failed to get the node path mapping for path: %s, "+
 			"with error %w", filePath, err)
 	}
 	blob, err := f.genericBlobDao.FindByID(ctx, node.BlobID)
 
 	if err != nil {
-		return "", fmt.Errorf("failed to get the blob for path: %s, with blob id: %s,"+
+		return "", 0, fmt.Errorf("failed to get the blob for path: %s, with blob id: %s,"+
 			" with error %w", filePath, node.BlobID, err)
 	}
-	return blob.Sha256, nil
+	return blob.Sha256, blob.Size, nil
+}
+
+func (f *FileManager) HeadSHA256(
+	ctx context.Context,
+	sha256 string,
+	regID int64,
+	rootParentID int64,
+) (string, error) {
+	blob, err := f.genericBlobDao.FindBySha256AndRootParentID(ctx, sha256, rootParentID)
+
+	if blob == nil || err != nil {
+		log.Ctx(ctx).Error().Msgf("failed to get the blob for sha256: %s, with root parent id: %d, with error %v",
+			sha256, rootParentID, err)
+		return "", fmt.Errorf("failed to get the blob for sha256: %s, with root parent id: %d, with error %w", sha256,
+			rootParentID, err)
+	}
+
+	node, err := f.nodesDao.GetByBlobIDAndRegistryID(ctx, blob.ID, regID)
+
+	if err != nil {
+		log.Ctx(ctx).Error().Msgf("failed to get the node for blob id: %s, with registry id: %d, with error %v",
+			blob.ID, regID, err)
+		return "", fmt.Errorf("failed to get the node for blob id: %s, with registry id: %d, with error %w", blob.ID,
+			regID, err)
+	}
+
+	return node.NodePath, nil
 }
 
 func (f *FileManager) GetFileMetadata(
@@ -409,6 +467,36 @@ func (f *FileManager) UploadTempFile(
 	return fileInfo, tempFileName, nil
 }
 
+func (f *FileManager) UploadTempFileToPath(
+	ctx context.Context,
+	rootIdentifier string,
+	file multipart.File,
+	fileName string,
+	tempFileName string,
+	fileReader io.Reader,
+) (types.FileInfo, string, error) {
+	blobContext := f.GetBlobsContext(ctx, rootIdentifier)
+	fileInfo, _, err := f.uploadTempFileInternal(ctx, blobContext, rootIdentifier,
+		file, fileName, fileReader, tempFileName)
+	if err != nil {
+		return fileInfo, tempFileName, err
+	}
+	return fileInfo, tempFileName, nil
+}
+
+func (f *FileManager) FileExists(
+	ctx context.Context,
+	rootIdentifier string,
+	filePath string,
+) (bool, int64, error) {
+	blobContext := f.GetBlobsContext(ctx, rootIdentifier)
+	size, err := blobContext.genericBlobStore.Stat(ctx, filePath)
+	if err != nil {
+		return false, -1, err
+	}
+	return size > 0, size, nil
+}
+
 func (f *FileManager) uploadTempFileInternal(
 	ctx context.Context,
 	blobContext *Context,
@@ -422,7 +510,7 @@ func (f *FileManager) uploadTempFileInternal(
 	fw, err := blobContext.genericBlobStore.Create(ctx, tmpPath)
 
 	if err != nil {
-		log.Error().Msgf("failed to initiate the file upload for file with"+
+		log.Ctx(ctx).Error().Msgf("failed to initiate the file upload for file with"+
 			" name : %s with error : %s", fileName, err.Error())
 		return types.FileInfo{}, tmpPath, fmt.Errorf("failed to initiate the file upload "+
 			"for file with name : %s with error : %w", fileName, err)
@@ -431,7 +519,7 @@ func (f *FileManager) uploadTempFileInternal(
 
 	fileInfo, err := blobContext.genericBlobStore.Write(ctx, fw, file, fileReader)
 	if err != nil {
-		log.Error().Msgf("failed to upload the file on temparary location"+
+		log.Ctx(ctx).Error().Msgf("failed to upload the file on temparary location"+
 			" with name : %s with error : %s", fileName, err.Error())
 		return types.FileInfo{}, tmpPath, fmt.Errorf("failed to upload the file on temparary "+
 			"location with name : %s with error : %w", fileName, err)
@@ -468,7 +556,6 @@ func (f *FileManager) MoveTempFile(
 	// uploading the file to temporary path in file storage
 	blobContext := f.GetBlobsContext(ctx, rootIdentifier)
 	tmpPath := path.Join(rootPathString, rootIdentifier, tmp, tempFileName)
-
 	err := f.moveFile(ctx, rootIdentifier, fileInfo, blobContext, tmpPath)
 	if err != nil {
 		return err
diff --git a/registry/app/pkg/gopackage/remote_helper.go b/registry/app/pkg/gopackage/remote_helper.go
index bc8102b3d..5a4afd531 100644
--- a/registry/app/pkg/gopackage/remote_helper.go
+++ b/registry/app/pkg/gopackage/remote_helper.go
@@ -93,7 +93,7 @@ func (r *remoteRegistryHelper) GetPackageFile(
 ) (io.ReadCloser, error) {
 	// remove first / from filepath
 	filePath = strings.TrimPrefix(filePath, "/")
-	data, err := r.adapter.GetPackageFile(filePath)
+	data, err := r.adapter.GetPackageFile(ctx, filePath)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("failed to get package file: %s, %s", pkg, filePath)
 		return nil, fmt.Errorf("failed to get package file: %s, %s", pkg, filePath)
diff --git a/registry/app/pkg/huggingface/local.go b/registry/app/pkg/huggingface/local.go
new file mode 100644
index 000000000..ce4f37d0f
--- /dev/null
+++ b/registry/app/pkg/huggingface/local.go
@@ -0,0 +1,682 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"bufio"
+	"bytes"
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"net/http"
+	"path"
+	"regexp"
+	"strings"
+	"time"
+
+	"github.com/harness/gitness/app/api/request"
+	"github.com/harness/gitness/app/api/usererror"
+	urlprovider "github.com/harness/gitness/app/url"
+	apicontract "github.com/harness/gitness/registry/app/api/openapi/contracts/artifact"
+	huggingfacemetadata "github.com/harness/gitness/registry/app/metadata/huggingface"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/commons"
+	"github.com/harness/gitness/registry/app/pkg/filemanager"
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/app/storage"
+	"github.com/harness/gitness/registry/app/store"
+	"github.com/harness/gitness/registry/types"
+	"github.com/harness/gitness/store/database/dbtx"
+
+	"github.com/rs/zerolog/log"
+	"gopkg.in/yaml.v3"
+)
+
+var (
+	frontMatterRE = regexp.MustCompile(`(?s)^---\s*\n(.*?)\n---`)
+	allowedTypes  = map[string]bool{"model": true, "dataset": true}
+)
+
+const (
+	rootPathString   = "/"
+	tmp              = "tmp"
+	maxCommitEntries = 50000 // Add reasonable limit
+	contentTypeJSON  = "application/json"
+)
+
+type localRegistry struct {
+	localBase   base.LocalBase
+	fileManager filemanager.FileManager
+	proxyStore  store.UpstreamProxyConfigRepository
+	tx          dbtx.Transactor
+	registryDao store.RegistryRepository
+	imageDao    store.ImageRepository
+	artifactDao store.ArtifactRepository
+	urlProvider urlprovider.Provider
+}
+
+func (c *localRegistry) ValidateYaml(_ context.Context, _ huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+	headers *commons.ResponseHeaders, response *huggingfacetype.ValidateYamlResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": contentTypeJSON},
+	}
+	req := &huggingfacetype.ValidateYamlRequest{}
+
+	if err = json.NewDecoder(body).Decode(&req); err != nil {
+		err = usererror.BadRequest("invalid request json body")
+		headers.Code = http.StatusBadRequest
+		return headers, nil, err
+	}
+
+	if req.RepoType == nil || !allowedTypes[*req.RepoType] {
+		err = usererror.BadRequest("unsupported repoType")
+		headers.Code = http.StatusBadRequest
+		return headers, nil, err
+	}
+	if req.Content == nil || frontMatterRE.FindStringSubmatch(*req.Content) == nil {
+		return headers, &huggingfacetype.ValidateYamlResponse{
+			Errors:   &[]huggingfacetype.Debug{},
+			Warnings: &[]huggingfacetype.Debug{},
+		}, nil
+	}
+
+	// Parse YAML
+	var meta map[string]interface{}
+	if err = yaml.Unmarshal([]byte(frontMatterRE.FindStringSubmatch(*req.Content)[1]), &meta); err != nil {
+		errMsg := stringPtr(fmt.Sprintf("Invalid YAML: %v", err))
+		errors := &[]huggingfacetype.Debug{
+			{Message: errMsg},
+		}
+		response = &huggingfacetype.ValidateYamlResponse{
+			Errors:   errors,
+			Warnings: &[]huggingfacetype.Debug{},
+		}
+		headers.Code = http.StatusBadRequest
+		return headers, response, nil
+	}
+
+	// Validate fields
+	// Create a slice of validations to perform
+	validations := []struct {
+		field    string
+		validate func(map[string]interface{}, string) (*huggingfacetype.ValidateYamlResponse, bool)
+	}{
+		{"license", validateString},
+		{"pipeline_tag", validateString},
+		{"tags", validateSlice},
+		{"widget", validateSlice},
+	}
+
+	// Run all validations
+	for _, v := range validations {
+		if res, ok := v.validate(meta, v.field); !ok {
+			headers.Code = http.StatusBadRequest
+			return headers, res, nil
+		}
+	}
+	headers.Code = http.StatusOK
+	return headers,
+		&huggingfacetype.ValidateYamlResponse{
+			Errors:   &[]huggingfacetype.Debug{},
+			Warnings: &[]huggingfacetype.Debug{},
+		}, nil
+}
+
+func (c *localRegistry) PreUpload(_ context.Context, _ huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+	headers *commons.ResponseHeaders, response *huggingfacetype.PreUploadResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": contentTypeJSON},
+	}
+	req := &huggingfacetype.PreUploadRequest{}
+	if err = json.NewDecoder(body).Decode(&req); err != nil {
+		err = usererror.BadRequest("invalid request json body")
+		headers.Code = http.StatusBadRequest
+		return headers, nil, err
+	}
+	if req.Files == nil || len(*req.Files) == 0 {
+		err = usererror.BadRequest("invalid request json body")
+		headers.Code = http.StatusBadRequest
+		return
+	}
+
+	// Create the response file slice
+	files := make([]huggingfacetype.PreUploadResponseFile, 0, len(*req.Files))
+	for _, f := range *req.Files {
+		files = append(files, huggingfacetype.NewPreUploadResponseFile(f.Path))
+	}
+
+	resp := &huggingfacetype.PreUploadResponse{
+		Files: &files,
+	}
+	headers.Code = http.StatusOK
+	return headers, resp, nil
+}
+
+func (c *localRegistry) RevisionInfo(ctx context.Context, info huggingfacetype.ArtifactInfo,
+	queryParams map[string][]string) (
+	headers *commons.ResponseHeaders, response *huggingfacetype.RevisionInfoResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": contentTypeJSON},
+	}
+	expand := queryParams["expand"]
+	if len(expand) > 0 && expand[0] == "xetEnabled" {
+		headers.Code = http.StatusOK
+		return headers, &huggingfacetype.RevisionInfoResponse{
+			XetEnabled: false,
+			Metadata: huggingfacemetadata.Metadata{
+				ID: info.Repo,
+			},
+		}, nil
+	}
+
+	//todo: add logs
+	image, err := c.imageDao.GetByName(ctx, info.RegistryID, info.Repo)
+	if err != nil {
+		return headers, nil, err
+	}
+
+	artifact, err := c.artifactDao.GetByName(ctx, image.ID, info.Revision)
+	if err != nil {
+		return headers, nil, err
+	}
+
+	metadata := &huggingfacemetadata.HuggingFaceMetadata{}
+	err = json.Unmarshal(artifact.Metadata, metadata)
+	if err != nil {
+		return headers, nil, err
+	}
+	metadata.SHA = info.Revision
+
+	if metadata.ID == "" {
+		err = usererror.BadRequest("repo id not found")
+		headers.Code = http.StatusNotFound
+		return headers, nil, err
+	}
+
+	headers.Code = http.StatusOK
+	return headers, &huggingfacetype.RevisionInfoResponse{
+		XetEnabled: false,
+		Metadata:   metadata.Metadata,
+	}, nil
+}
+
+func (c *localRegistry) LfsInfo(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser,
+	token string) (headers *commons.ResponseHeaders, response *huggingfacetype.LfsInfoResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": "application/vnd.git-lfs+json"},
+	}
+	resp := &huggingfacetype.LfsInfoResponse{
+		Objects: &[]huggingfacetype.LfsObjectResponse{},
+	}
+
+	pkgURL := c.urlProvider.PackageURL(ctx, info.RootIdentifier+"/"+info.RegIdentifier, "huggingface")
+
+	req := &huggingfacetype.LfsInfoRequest{}
+	if err = json.NewDecoder(body).Decode(req); err != nil {
+		err = usererror.BadRequest("invalid LFS info body")
+		headers.Code = http.StatusBadRequest
+		return headers, nil, err
+	}
+
+	if req.Objects == nil || len(*req.Objects) == 0 {
+		headers.Code = http.StatusOK
+		return headers, resp, nil
+	}
+
+	for _, obj := range *req.Objects {
+		objResp := huggingfacetype.LfsObjectResponse{
+			Oid:  obj.Oid,
+			Size: obj.Size,
+		}
+
+		filePath, _ := c.fileManager.HeadSHA256(ctx, obj.Oid, info.RegistryID, info.RootParentID)
+
+		exists := filePath != ""
+
+		switch req.Operation {
+		case "upload":
+			if exists {
+				continue
+			}
+			objResp.Actions = &map[string]huggingfacetype.LfsAction{
+				req.Operation: lfsAction(getBlobURL(pkgURL, req.Operation, obj.Oid, token, info), obj.Oid, token),
+				"verify":      lfsAction(getBlobURL(pkgURL, "verify", obj.Oid, token, info), obj.Oid, token),
+			}
+
+		case "download":
+			if exists {
+				objResp.Actions = &map[string]huggingfacetype.LfsAction{
+					req.Operation: lfsAction(getBlobURL(pkgURL, req.Operation, obj.Oid, token, info), obj.Oid, token),
+				}
+			} else {
+				objResp.Error = &huggingfacetype.LfsError{
+					Code:    http.StatusNotFound,
+					Message: "object not found",
+				}
+			}
+
+		default:
+			objResp.Error = &huggingfacetype.LfsError{
+				Code:    http.StatusBadRequest,
+				Message: "unsupported operation: " + req.Operation,
+			}
+		}
+
+		*resp.Objects = append(*resp.Objects, objResp)
+	}
+	headers.Code = http.StatusOK
+	return headers, resp, nil
+}
+
+func (c *localRegistry) LfsUpload(ctx context.Context, info huggingfacetype.ArtifactInfo,
+	body io.ReadCloser) (headers *commons.ResponseHeaders, response *huggingfacetype.LfsUploadResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": contentTypeJSON},
+	}
+	resp := &huggingfacetype.LfsUploadResponse{}
+	tmpFileName := getTmpFileName(info, info.SHA256)
+
+	fileInfo, tmpFileName, err := c.fileManager.UploadTempFileToPath(ctx, info.RootIdentifier, nil,
+		tmpFileName, tmpFileName, body)
+	if err != nil {
+		log.Ctx(ctx).Info().Msgf("Upload failed for file %s, %v", tmpFileName, err)
+		headers.Code = http.StatusInternalServerError
+		return headers, resp, err
+	}
+	log.Ctx(ctx).Info().Msgf("Uploaded file %s to %s", tmpFileName, fileInfo.Filename)
+	resp.Success = true
+	headers.Code = http.StatusCreated
+	return headers, resp, nil
+}
+
+func (c *localRegistry) LfsVerify(ctx context.Context, info huggingfacetype.ArtifactInfo,
+	_ io.ReadCloser) (headers *commons.ResponseHeaders, response *huggingfacetype.LfsVerifyResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": contentTypeJSON},
+	}
+	resp := &huggingfacetype.LfsVerifyResponse{}
+
+	filePath, _ := c.fileManager.HeadSHA256(ctx, info.SHA256, info.RegistryID, info.RootParentID)
+	exists := c.FileExists(ctx, info)
+	if filePath == "" && !exists {
+		log.Ctx(ctx).Info().Msgf("File %s does not exist", info.SHA256)
+		return headers, nil, fmt.Errorf("file %s does not exist", info.SHA256)
+	}
+
+	resp.Success = true
+	headers.Code = http.StatusOK
+	return headers, resp, nil
+}
+
+func (c *localRegistry) CommitRevision(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+	headers *commons.ResponseHeaders, response *huggingfacetype.CommitRevisionResponse, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{"Content-Type": contentTypeJSON},
+	}
+	headerInfo := &huggingfacetype.HeaderInfo{}
+	lfsFiles := &[]huggingfacetype.LfsFileInfo{}
+	siblings := &[]huggingfacemetadata.Sibling{}
+	session, _ := request.AuthSessionFrom(ctx)
+	commitBytes, _ := io.ReadAll(body)
+	commits := string(commitBytes)
+	scanner := bufio.NewScanner(strings.NewReader(commits))
+	processedEntries := 0
+	for scanner.Scan() {
+		if processedEntries >= maxCommitEntries {
+			log.Ctx(ctx).Warn().Msgf("Reached maximum commit entries limit: %d", maxCommitEntries)
+			break
+		}
+		processedEntries++
+		line := scanner.Text()
+		var entry huggingfacetype.CommitEntry
+		if err = json.Unmarshal([]byte(line), &entry); err != nil {
+			log.Ctx(ctx).Error().Err(err).Msgf("Failed to unmarshal commit entry: %s", line)
+			continue
+		}
+		data, err2 := json.Marshal(entry.Value)
+		if err2 != nil {
+			log.Ctx(ctx).Error().Err(err).Msg("Failed to marshal header info")
+			return headers, nil, err2
+		}
+
+		switch entry.Key {
+		case "header":
+			if err = json.Unmarshal(data, &headerInfo); err != nil {
+				log.Ctx(ctx).Error().Err(err).Msg("Failed to unmarshal header info")
+				return headers, nil, err
+			}
+		case "lfsFile":
+			var lfsFile huggingfacetype.LfsFileInfo
+			if err = json.Unmarshal(data, &lfsFile); err != nil {
+				log.Ctx(ctx).Error().Err(err).Msg("Failed to unmarshal LFS file info")
+				continue
+			}
+			*lfsFiles = append(*lfsFiles, lfsFile)
+			*siblings = append(*siblings, huggingfacemetadata.Sibling{RFilename: lfsFile.Path})
+		}
+	}
+
+	if err = scanner.Err(); err != nil {
+		log.Ctx(ctx).Error().Err(err).Msg("Error reading commits string")
+		return headers, nil, err
+	}
+
+	var readme string
+	movedBlobs := make(map[string]bool)
+	for _, lfsFile := range *lfsFiles {
+		filePath := fmt.Sprintf("/%s/%s/%s/%s", info.RepoType, info.Repo, info.Revision, lfsFile.Path)
+		savedPath, _ := c.fileManager.HeadSHA256(ctx, lfsFile.Oid, info.RegistryID, info.RootParentID)
+		if savedPath == filePath {
+			movedBlobs[lfsFile.Oid] = true
+			continue
+		}
+		if savedPath != "" && !movedBlobs[lfsFile.Oid] {
+			err = c.fileManager.SaveNodes(ctx, filePath, info.RegistryID, info.RootParentID, session.Principal.ID,
+				lfsFile.Oid)
+			if err != nil {
+				log.Ctx(ctx).Info().Msgf("Failed to move file with sha %s to %s", lfsFile.Oid, lfsFile.Path)
+				return headers, nil, err
+			}
+			continue
+		}
+		tmpFileName := getTmpFileName(info, lfsFile.Oid)
+		if strings.EqualFold(lfsFile.Path, "Readme.md") {
+			readme = c.readme(ctx, info, tmpFileName, lfsFile.Size)
+		}
+		fileInfo := types.FileInfo{
+			Size:     lfsFile.Size,
+			Sha256:   lfsFile.Oid,
+			Filename: lfsFile.Path,
+		}
+		err = c.fileManager.MoveTempFile(ctx, filePath, info.RegistryID, info.RootParentID, info.RootIdentifier,
+			fileInfo, tmpFileName, session.Principal.ID)
+		movedBlobs[lfsFile.Oid] = true
+
+		if err != nil {
+			log.Ctx(ctx).Info().Msgf("Failed to move file %s to %s", tmpFileName, lfsFile.Path)
+			return headers, nil, err
+		}
+	}
+
+	readme = modifyReadme(readme)
+
+	modelMetadata := huggingfacemetadata.Metadata{
+		ID:           info.Repo,
+		ModelID:      info.Repo,
+		SHA:          "",
+		LibraryName:  "unknown",
+		Siblings:     *siblings,
+		LastModified: time.Now().UTC().Format(time.RFC3339),
+		Private:      true,
+		Readme:       readme,
+		CardData:     &huggingfacemetadata.CardData{},
+	}
+	if headerInfo.Summary != "" {
+		modelMetadata.CardData.Tags = append(modelMetadata.CardData.Tags, "summary:"+headerInfo.Summary)
+	}
+
+	modelMetadataBytes, _ := json.Marshal(modelMetadata)
+
+	err = c.tx.WithTx(
+		ctx, func(ctx context.Context) error {
+			dbImage := &types.Image{
+				Name:       info.Repo,
+				RegistryID: info.RegistryID,
+				Enabled:    true,
+			}
+			if err2 := c.imageDao.CreateOrUpdate(ctx, dbImage); err2 != nil {
+				log.Ctx(ctx).Error().Err(err2).Msgf("Failed to create image: %s", info.Repo)
+				return err2
+			}
+			dbArtifact := &types.Artifact{
+				ImageID:   dbImage.ID,
+				Version:   info.Revision,
+				Metadata:  json.RawMessage(modelMetadataBytes),
+				UpdatedAt: time.Now(),
+			}
+			if _, err2 := c.artifactDao.CreateOrUpdate(ctx, dbArtifact); err2 != nil {
+				log.Ctx(ctx).Error().Err(err2).Msgf("Failed to create artifact: %s", info.Revision)
+				return err2
+			}
+
+			return nil
+		})
+
+	if err != nil {
+		return headers, nil, err
+	}
+	commitURL := fmt.Sprintf("%s/%s/commit/%s", info.RepoType, info.Repo, info.Revision)
+
+	headers.Code = http.StatusOK
+	headers.Headers["X-Harness-Commit-Processed"] = "true"
+	resp := &huggingfacetype.CommitRevisionResponse{
+		CommitURL:         commitURL,
+		CommitMessage:     headerInfo.Summary,
+		CommitDescription: headerInfo.Description,
+		OID:               info.Revision,
+		Success:           true,
+	}
+	return headers, resp, nil
+}
+
+func (c *localRegistry) HeadFile(ctx context.Context, info huggingfacetype.ArtifactInfo, fileName string) (
+	headers *commons.ResponseHeaders, err error) {
+	headers = &commons.ResponseHeaders{
+		Headers: map[string]string{},
+	}
+	dbImage, err := c.imageDao.GetByName(ctx, info.RegistryID, info.Repo)
+	if err != nil {
+		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get image: %s", info.RepoType+"/"+info.Repo)
+		headers.Headers["Content-Type"] = contentTypeJSON
+		headers.Code = http.StatusNotFound
+		return headers, err
+	}
+
+	_, err = c.artifactDao.GetByName(ctx, dbImage.ID, info.Revision)
+	if err != nil {
+		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get artifact: %s", info.Revision)
+		headers.Headers["Content-Type"] = contentTypeJSON
+		headers.Code = http.StatusNotFound
+		return headers, err
+	}
+
+	sha256, size, err := c.fileManager.HeadFile(ctx, "/"+info.RepoType+"/"+info.Repo+"/"+info.Revision+"/"+fileName,
+		info.RegistryID)
+	if err != nil {
+		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file: %s", fileName)
+		headers.Headers["Content-Type"] = contentTypeJSON
+		headers.Code = http.StatusNotFound
+		return headers, err
+	}
+	headers.Code = http.StatusOK
+	headers.Headers["Content-Type"] = "application/octet-stream"
+	headers.Headers["Content-Length"] = fmt.Sprintf("%d", size)
+	headers.Headers["X-Repo-Commit"] = info.Revision
+	headers.Headers["ETag"] = sha256
+	return headers, nil
+}
+
+func (c *localRegistry) DownloadFile(ctx context.Context, info huggingfacetype.ArtifactInfo, fileName string) (
+	headers *commons.ResponseHeaders, body *storage.FileReader, redirectURL string, err error) {
+	headers, err = c.HeadFile(ctx, info, fileName)
+	if err != nil {
+		return headers, nil, "", err
+	}
+
+	body, _, redirectURL, err = c.fileManager.DownloadFile(ctx,
+		"/"+info.RepoType+"/"+info.Repo+"/"+info.Revision+"/"+fileName, info.RegistryID,
+		info.RegIdentifier, info.RootIdentifier, true)
+	return headers, body, redirectURL, err
+}
+
+func (c *localRegistry) FileExists(ctx context.Context, info huggingfacetype.ArtifactInfo) bool {
+	tmpFileName := getTmpFileName(info, info.SHA256)
+	tmpPath := path.Join(rootPathString, info.RootIdentifier, tmp, tmpFileName)
+	exists, _, err := c.fileManager.FileExists(ctx, info.RootIdentifier, tmpPath)
+	if err != nil {
+		log.Ctx(ctx).Error().Err(err).Msgf("Failed to check if file exists: %s", tmpPath)
+	}
+	return exists
+}
+
+func getBlobURL(pkgURL, operation, sha256, token string, info huggingfacetype.ArtifactInfo) string {
+	return fmt.Sprintf(pkgURL+"/api/%ss/%s/%s/multipart/%s/%s?sig=%s",
+		info.RepoType, info.Repo, info.Revision, operation, sha256, strings.TrimPrefix(token, "Bearer "))
+}
+
+func modifyReadme(readme string) string {
+	// Check if the README contains YAML frontmatter
+	yamlRegex := regexp.MustCompile(`(?s)^---\n(.+?)\n---\n(.+)$`)
+	matches := yamlRegex.FindStringSubmatch(readme)
+
+	if len(matches) < 3 {
+		// No YAML frontmatter found or invalid format, return original content
+		return readme
+	}
+
+	// Extract YAML and Markdown parts
+	yamlContent := matches[1]
+	markdownContent := matches[2]
+
+	// Parse YAML into a map
+	var yamlData map[string]interface{}
+	err := yaml.Unmarshal([]byte(yamlContent), &yamlData)
+	if err != nil {
+		// Failed to parse YAML, return original content
+		return readme
+	}
+
+	// Marshal YAML data back to string with pretty formatting
+	prettyYamlBytes, err := yaml.Marshal(yamlData)
+	if err != nil {
+		// Failed to marshal YAML, return original content
+		return readme
+	}
+
+	// Convert bytes to string and prepare formatted output
+	prettyYamlString := string(prettyYamlBytes)
+
+	// Create pretty output with YAML in code block followed by markdown
+	var buffer bytes.Buffer
+	buffer.WriteString("## Card details\n")
+	buffer.WriteString("```yaml\n")
+	buffer.WriteString(prettyYamlString)
+	buffer.WriteString("\n```\n\n")
+	buffer.WriteString(markdownContent)
+
+	return buffer.String()
+}
+
+func (c *localRegistry) readme(ctx context.Context, info huggingfacetype.ArtifactInfo, tmpFileName string,
+	fileSize int64) string {
+	reader, _, err := c.fileManager.DownloadTempFile(ctx, fileSize, tmpFileName, info.RootIdentifier)
+	if err != nil {
+		log.Ctx(ctx).Warn().Msgf("Failed to download readme file %s", tmpFileName)
+		return ""
+	}
+	defer reader.Close()
+	readmeBytes, err2 := io.ReadAll(reader)
+	if err2 != nil {
+		log.Ctx(ctx).Warn().Msgf("Failed to read readme file %s", tmpFileName)
+		return ""
+	}
+	return string(readmeBytes)
+}
+
+func lfsAction(blobURL, oid, token string) huggingfacetype.LfsAction {
+	return huggingfacetype.LfsAction{
+		Href: blobURL,
+		Header: map[string]string{
+			"X-Checksum-Sha256": oid,
+			"Authorization":     token,
+		},
+	}
+}
+
+func validateSlice(meta map[string]interface{}, metaKey string) (*huggingfacetype.ValidateYamlResponse, bool) {
+	if v, ok := meta[metaKey]; ok && !isSlice(v) {
+		msg := stringPtr(fmt.Sprintf(`"%s" must be an array`, metaKey))
+		warnings := &[]huggingfacetype.Debug{
+			{Message: msg},
+		}
+		return &huggingfacetype.ValidateYamlResponse{
+			Errors:   &[]huggingfacetype.Debug{},
+			Warnings: warnings,
+		}, false
+	}
+	return nil, true
+}
+
+func getTmpFileName(info huggingfacetype.ArtifactInfo, sha256 string) string {
+	return info.RootIdentifier + "/" + info.RegIdentifier + "/" + info.Repo + "/" + info.Revision + "/upload/" + sha256
+}
+
+func validateString(meta map[string]interface{}, metaKey string) (*huggingfacetype.ValidateYamlResponse, bool) {
+	if v, ok := meta[metaKey]; ok && !isString(v) {
+		msg := stringPtr(fmt.Sprintf(`"%s" must be a string`, metaKey))
+		warnings := &[]huggingfacetype.Debug{
+			{Message: msg},
+		}
+		return &huggingfacetype.ValidateYamlResponse{
+			Errors:   &[]huggingfacetype.Debug{},
+			Warnings: warnings,
+		}, false
+	}
+	return nil, true
+}
+
+type LocalRegistry interface {
+	Registry
+}
+
+func NewLocalRegistry(
+	localBase base.LocalBase,
+	fileManager filemanager.FileManager,
+	proxyStore store.UpstreamProxyConfigRepository,
+	tx dbtx.Transactor,
+	registryDao store.RegistryRepository,
+	imageDao store.ImageRepository,
+	artifactDao store.ArtifactRepository,
+	urlProvider urlprovider.Provider,
+) LocalRegistry {
+	return &localRegistry{
+		localBase:   localBase,
+		fileManager: fileManager,
+		proxyStore:  proxyStore,
+		tx:          tx,
+		registryDao: registryDao,
+		imageDao:    imageDao,
+		artifactDao: artifactDao,
+		urlProvider: urlProvider,
+	}
+}
+
+func (c *localRegistry) GetArtifactType() apicontract.RegistryType {
+	return apicontract.RegistryTypeVIRTUAL
+}
+
+func (c *localRegistry) GetPackageTypes() []apicontract.PackageType {
+	return []apicontract.PackageType{apicontract.PackageTypeHUGGINGFACE}
+}
+
+func isSlice(v interface{}) bool { _, ok := v.([]interface{}); return ok }
+
+func isString(v interface{}) bool { _, ok := v.(string); return ok }
+
+// stringPtr returns a pointer to the given string.
+func stringPtr(s string) *string {
+	return &s
+}
diff --git a/registry/app/pkg/huggingface/registry.go b/registry/app/pkg/huggingface/registry.go
new file mode 100644
index 000000000..dd2b886db
--- /dev/null
+++ b/registry/app/pkg/huggingface/registry.go
@@ -0,0 +1,59 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	"context"
+	"io"
+
+	"github.com/harness/gitness/registry/app/pkg"
+	"github.com/harness/gitness/registry/app/pkg/commons"
+	huggingfacetype "github.com/harness/gitness/registry/app/pkg/types/huggingface"
+	"github.com/harness/gitness/registry/app/storage"
+)
+
+var _ pkg.Artifact = (*localRegistry)(nil)
+var _ Registry = (*localRegistry)(nil)
+
+type Registry interface {
+	pkg.Artifact
+
+	ValidateYaml(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.ValidateYamlResponse, err error)
+
+	PreUpload(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.PreUploadResponse, err error)
+
+	RevisionInfo(ctx context.Context, info huggingfacetype.ArtifactInfo, queryParams map[string][]string) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.RevisionInfoResponse, err error)
+
+	LfsInfo(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser, token string) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.LfsInfoResponse, err error)
+
+	LfsUpload(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.LfsUploadResponse, err error)
+
+	LfsVerify(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.LfsVerifyResponse, err error)
+
+	CommitRevision(ctx context.Context, info huggingfacetype.ArtifactInfo, body io.ReadCloser) (
+		headers *commons.ResponseHeaders, response *huggingfacetype.CommitRevisionResponse, err error)
+
+	HeadFile(ctx context.Context, info huggingfacetype.ArtifactInfo, fileName string) (
+		responseHeaders *commons.ResponseHeaders, err error)
+
+	DownloadFile(ctx context.Context, info huggingfacetype.ArtifactInfo, fileName string) (
+		responseHeaders *commons.ResponseHeaders, body *storage.FileReader, redirectURL string, err error)
+}
diff --git a/registry/app/pkg/huggingface/wire.go b/registry/app/pkg/huggingface/wire.go
new file mode 100644
index 000000000..4b08f8e01
--- /dev/null
+++ b/registry/app/pkg/huggingface/wire.go
@@ -0,0 +1,47 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	urlprovider "github.com/harness/gitness/app/url"
+	"github.com/harness/gitness/registry/app/pkg/base"
+	"github.com/harness/gitness/registry/app/pkg/filemanager"
+	"github.com/harness/gitness/registry/app/store"
+	"github.com/harness/gitness/store/database/dbtx"
+
+	"github.com/google/wire"
+)
+
+// WireSet provides a wire set for the huggingface package.
+var WireSet = wire.NewSet(
+	LocalRegistryProvider,
+)
+
+// ProvideLocalRegistry provides a huggingface local registry.
+func LocalRegistryProvider(
+	localBase base.LocalBase,
+	fileManager filemanager.FileManager,
+	proxyStore store.UpstreamProxyConfigRepository,
+	tx dbtx.Transactor,
+	registryDao store.RegistryRepository,
+	imageDao store.ImageRepository,
+	artifactDao store.ArtifactRepository,
+	urlProvider urlprovider.Provider,
+) LocalRegistry {
+	registry := NewLocalRegistry(localBase, fileManager, proxyStore, tx, registryDao, imageDao, artifactDao,
+		urlProvider)
+	base.Register(registry)
+	return registry
+}
diff --git a/registry/app/pkg/maven/controller.go b/registry/app/pkg/maven/controller.go
index 9ee71b0b4..d54cac2e0 100644
--- a/registry/app/pkg/maven/controller.go
+++ b/registry/app/pkg/maven/controller.go
@@ -106,23 +106,23 @@ func NewDBStore(
 	}
 }
 
-func (c *Controller) factory(t ArtifactType) Artifact {
+func (c *Controller) factory(ctx context.Context, t ArtifactType) Artifact {
 	switch t {
 	case LocalRegistryType:
 		return TypeRegistry[t]
 	case RemoteRegistryType:
 		return TypeRegistry[t]
 	default:
-		log.Error().Stack().Msgf("Invalid artifact type %v", t)
+		log.Ctx(ctx).Error().Stack().Msgf("Invalid artifact type %v", t)
 		return nil
 	}
 }
 
-func (c *Controller) GetArtifactRegistry(registry registrytypes.Registry) Artifact {
+func (c *Controller) GetArtifactRegistry(ctx context.Context, registry registrytypes.Registry) Artifact {
 	if string(registry.Type) == string(artifact.RegistryTypeVIRTUAL) {
-		return c.factory(LocalRegistryType)
+		return c.factory(ctx, LocalRegistryType)
 	}
-	return c.factory(RemoteRegistryType)
+	return c.factory(ctx, RemoteRegistryType)
 }
 
 func (c *Controller) GetArtifact(ctx context.Context, info pkg.MavenArtifactInfo) Response {
@@ -140,7 +140,7 @@ func (c *Controller) GetArtifact(ctx context.Context, info pkg.MavenArtifactInfo
 		info.ParentID = registry.ParentID
 		r, ok := a.(Registry)
 		if !ok {
-			log.Error().Stack().Msgf("Proxy wrapper has invalid registry set")
+			log.Ctx(ctx).Error().Stack().Msgf("Proxy wrapper has invalid registry set")
 			return nil
 		}
 		headers, body, fileReader, redirectURL, e := r.GetArtifact(ctx, info) //nolint:errcheck
@@ -167,7 +167,7 @@ func (c *Controller) HeadArtifact(ctx context.Context, info pkg.MavenArtifactInf
 		info.ParentID = registry.ParentID
 		r, ok := a.(Registry)
 		if !ok {
-			log.Error().Stack().Msgf("Proxy wrapper has invalid registry set")
+			log.Ctx(ctx).Error().Stack().Msgf("Proxy wrapper has invalid registry set")
 			return nil
 		}
 		headers, e := r.HeadArtifact(ctx, info)
@@ -208,7 +208,7 @@ func (c *Controller) ProxyWrapper(
 	if repos, err := c.GetOrderedRepos(ctx, requestRepoKey, *info.BaseInfo); err == nil {
 		for _, registry := range repos {
 			log.Ctx(ctx).Info().Msgf("Using Repository: %s, Type: %s", registry.Name, registry.Type)
-			artifact, ok := c.GetArtifactRegistry(registry).(Registry)
+			artifact, ok := c.GetArtifactRegistry(ctx, registry).(Registry)
 			if !ok {
 				log.Ctx(ctx).Warn().Msgf("artifact %s is not a registry", registry.Name)
 				continue
diff --git a/registry/app/pkg/npm/local.go b/registry/app/pkg/npm/local.go
index 8e99a0664..d78e9b66f 100644
--- a/registry/app/pkg/npm/local.go
+++ b/registry/app/pkg/npm/local.go
@@ -133,7 +133,7 @@ func (c *localRegistry) GetPackageMetadata(ctx context.Context, info npm.Artifac
 	versions := make(map[string]*npm2.PackageMetadataVersion)
 	artifacts, err := c.artifactDao.GetByRegistryIDAndImage(ctx, info.RegistryID, info.Image)
 	if err != nil {
-		log.Warn().Msgf("Failed to fetch artifact for image:[%s], Reg:[%s]",
+		log.Ctx(ctx).Warn().Msgf("Failed to fetch artifact for image:[%s], Reg:[%s]",
 			info.BaseArtifactInfo().Image, info.BaseArtifactInfo().RegIdentifier)
 		return packageMetadata, usererror.ErrInternal
 	}
diff --git a/registry/app/pkg/npm/proxy.go b/registry/app/pkg/npm/proxy.go
index 07e272985..84fda39c0 100644
--- a/registry/app/pkg/npm/proxy.go
+++ b/registry/app/pkg/npm/proxy.go
@@ -224,6 +224,6 @@ func (r *proxy) putFileToLocal(ctx context.Context, info npm2.ArtifactInfo, remo
 		log.Ctx(ctx).Error().Stack().Err(err2).Msgf("uploading file %s failed, %v", info.Filename, err)
 		return err2
 	}
-	log.Info().Msgf("Successfully uploaded %s with SHA256: %s", info.Filename, sha256)
+	log.Ctx(ctx).Info().Msgf("Successfully uploaded %s with SHA256: %s", info.Filename, sha256)
 	return nil
 }
diff --git a/registry/app/pkg/nuget/proxy.go b/registry/app/pkg/nuget/proxy.go
index 17de9b1c2..f921b5190 100644
--- a/registry/app/pkg/nuget/proxy.go
+++ b/registry/app/pkg/nuget/proxy.go
@@ -509,7 +509,7 @@ func (r *proxy) putFileToLocal(ctx context.Context, info *nugettype.ArtifactInfo
 		log.Ctx(ctx).Error().Stack().Err(err2).Msgf("uploading file for pkg: %s failed, %v", info.Image, err)
 		return err2
 	}
-	log.Info().Msgf("Successfully uploaded file for pkg: %s , version: %s with SHA256: %s",
+	log.Ctx(ctx).Info().Msgf("Successfully uploaded file for pkg: %s , version: %s with SHA256: %s",
 		info.Image, info.Version, sha256)
 	return nil
 }
diff --git a/registry/app/pkg/python/proxy.go b/registry/app/pkg/python/proxy.go
index ab64dcd91..3883e0ac5 100644
--- a/registry/app/pkg/python/proxy.go
+++ b/registry/app/pkg/python/proxy.go
@@ -207,7 +207,7 @@ func (r *proxy) putFileToLocal(ctx context.Context, pkg string, filename string,
 		log.Ctx(ctx).Error().Stack().Err(err2).Msgf("uploading file %s failed, %v", filename, err)
 		return err2
 	}
-	log.Info().Msgf("Successfully uploaded %s with SHA256: %s", filename, sha256)
+	log.Ctx(ctx).Info().Msgf("Successfully uploaded %s with SHA256: %s", filename, sha256)
 	return nil
 }
 
diff --git a/registry/app/pkg/types/huggingface/types.go b/registry/app/pkg/types/huggingface/types.go
new file mode 100644
index 000000000..914a77a6e
--- /dev/null
+++ b/registry/app/pkg/types/huggingface/types.go
@@ -0,0 +1,200 @@
+// Copyright 2023 Harness, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package huggingface
+
+import (
+	huggingfacemetadata "github.com/harness/gitness/registry/app/metadata/huggingface"
+	"github.com/harness/gitness/registry/app/pkg"
+)
+
+// ArtifactInfo represents information about a Huggingface artifact.
+type ArtifactInfo struct {
+	pkg.ArtifactInfo
+	Repo     string
+	Revision string
+	RepoType string
+	SHA256   string
+}
+
+// BaseArtifactInfo implements pkg.PackageArtifactInfo interface.
+func (a ArtifactInfo) BaseArtifactInfo() pkg.ArtifactInfo {
+	return a.ArtifactInfo
+}
+
+// GetImageVersion returns the image and version information.
+func (a ArtifactInfo) GetImageVersion() (exists bool, imageVersion string) {
+	if a.Repo != "" && a.Revision != "" {
+		return true, pkg.JoinWithSeparator(":", a.Repo, a.Revision)
+	}
+	return false, ""
+}
+
+// GetVersion returns the version (revision) of the Huggingface artifact.
+func (a ArtifactInfo) GetVersion() string {
+	return a.Revision
+}
+
+func (a ArtifactInfo) GetFileName() string {
+	return a.SHA256
+}
+
+// File represents a file in a Huggingface package.
+type File struct {
+	FileURL  string
+	Name     string
+	RepoType string
+}
+
+// PackageMetadata represents metadata for a Huggingface package.
+type PackageMetadata struct {
+	RepoID   string
+	RepoType string
+	Files    []File
+}
+
+type Debug struct {
+	Message *string `json:"message"`
+	Type    *string `json:"type"`
+	Help    *string `json:"help"`
+}
+
+type ValidateYamlRequest struct {
+	Content  *string `json:"content"`
+	RepoType *string `json:"repoType"`
+}
+
+type ValidateYamlResponse struct {
+	Errors   *[]Debug `json:"errors"`
+	Warnings *[]Debug `json:"warnings"`
+}
+
+type PreUploadResponse struct {
+	Files *[]PreUploadResponseFile `json:"files"`
+}
+
+type PreUploadRequest struct {
+	Files *[]PreUploadRequestFile `json:"files"`
+}
+
+type PreUploadResponseFile struct {
+	Path         string     `json:"path"`
+	UploadMode   UploadMode `json:"uploadMode"`
+	ShouldIgnore bool       `json:"shouldIgnore"` // NEW
+}
+
+type PreUploadRequestFile struct {
+	Path   string  `json:"path"`
+	Sample *string `json:"sample"`
+	Size   int64   `json:"size"` // NEW
+}
+
+type RevisionInfoResponse struct {
+	huggingfacemetadata.Metadata
+	XetEnabled bool `json:"xetEnabled"`
+}
+
+type LfsInfoRequest struct {
+	Operation string              `json:"operation"` // "upload", "download"
+	Transfers []string            `json:"transfers"` // "basic", "multipart"
+	Objects   *[]LfsObjectRequest `json:"objects"`
+	HashAlgo  *string             `json:"hash_algo,omitempty"`
+	Ref       *LfsRefRequest      `json:"ref,omitempty"`
+}
+
+type LfsObjectRequest struct {
+	Oid  string `json:"oid"`
+	Size int64  `json:"size"`
+}
+
+type LfsRefRequest struct {
+	Name string `json:"name"`
+}
+
+type LfsInfoResponse struct {
+	Objects *[]LfsObjectResponse `json:"objects"`
+}
+
+type LfsVerifyResponse struct {
+	Success bool      `json:"success"`
+	Error   *LfsError `json:"error,omitempty"`
+}
+
+type LfsUploadResponse struct {
+	Success bool      `json:"success"`
+	Error   *LfsError `json:"error,omitempty"`
+}
+
+type CommitRevisionResponse struct {
+	CommitURL         string    `json:"commitUrl"`
+	CommitMessage     string    `json:"commitMessage"`
+	CommitDescription string    `json:"commitDescription"`
+	OID               string    `json:"commitOid"`
+	Success           bool      `json:"success"`
+	Error             *LfsError `json:"error,omitempty"`
+}
+
+type CommitEntry struct {
+	Key   string      `json:"key"`
+	Value interface{} `json:"value"` // Value can be HeaderInfo or LFSFileInfo
+}
+
+type HeaderInfo struct {
+	Summary     string `json:"summary"`
+	Description string `json:"description"`
+}
+
+type LfsFileInfo struct {
+	Path string `json:"path"`
+	Algo string `json:"algo"`
+	Oid  string `json:"oid"`
+	Size int64  `json:"size"`
+}
+
+type LfsAction struct {
+	Href      string            `json:"href"`
+	Header    map[string]string `json:"header,omitempty"`
+	ExpiresAt string            `json:"expires_at,omitempty"`
+}
+
+type LfsError struct {
+	Code    int    `json:"code"`
+	Message string `json:"message"`
+}
+
+type LfsObjectResponse struct {
+	Oid     string                `json:"oid"`
+	Size    int64                 `json:"size"`
+	Actions *map[string]LfsAction `json:"actions,omitempty"`
+	Error   *LfsError             `json:"error,omitempty"`
+}
+
+// UploadMode represents the mode for uploading files
+type UploadMode string
+
+const (
+	// Regular represents regular file upload mode
+	RegularUpload UploadMode = "regular"
+	// LFS represents Large File Storage upload mode
+	LFSUpload UploadMode = "lfs"
+)
+
+// NewPreUploadResponseFile creates a new PreUploadResponseFile with default values.
+func NewPreUploadResponseFile(path string) PreUploadResponseFile {
+	return PreUploadResponseFile{
+		Path:         path,
+		UploadMode:   LFSUpload, // Default to LFS upload mode
+		ShouldIgnore: false,
+	}
+}
diff --git a/registry/app/remote/adapter/adapter.go b/registry/app/remote/adapter/adapter.go
index a87d4d8f2..0c59d3cbd 100644
--- a/registry/app/remote/adapter/adapter.go
+++ b/registry/app/remote/adapter/adapter.go
@@ -53,38 +53,40 @@ type Adapter interface {
 
 // ArtifactRegistry defines the capabilities that an artifact registry should have.
 type ArtifactRegistry interface {
-	ManifestExist(repository, reference string) (exist bool, desc *manifest.Descriptor, err error)
+	ManifestExist(ctx context.Context, repository, reference string) (exist bool, desc *manifest.Descriptor, err error)
 	PullManifest(
+		ctx context.Context,
 		repository, reference string,
 		accepttedMediaTypes ...string,
 	) (manifest manifest.Manifest, digest string, err error)
-	PushManifest(repository, reference, mediaType string, payload []byte) (string, error)
-	DeleteManifest(
-		repository, reference string,
-	) error // the "reference" can be "tag" or "digest", the function needs to handle both
-	BlobExist(repository, digest string) (exist bool, err error)
-	PullBlob(repository, digest string) (size int64, blob io.ReadCloser, err error)
-	PullBlobChunk(repository, digest string, blobSize, start, end int64) (size int64, blob io.ReadCloser, err error)
+	PushManifest(ctx context.Context, repository, reference, mediaType string, payload []byte) (string, error)
+	DeleteManifest(ctx context.Context, repository, reference string) error
+	// the "reference" can be "tag" or "digest", the function needs to handle both
+	BlobExist(ctx context.Context, repository, digest string) (exist bool, err error)
+	PullBlob(ctx context.Context, repository, digest string) (size int64, blob io.ReadCloser, err error)
+	PullBlobChunk(ctx context.Context, repository, digest string, blobSize, start, end int64) (
+		size int64,
+		blob io.ReadCloser,
+		err error,
+	)
 	PushBlobChunk(
+		ctx context.Context,
 		repository, digest string,
 		size int64,
 		chunk io.Reader,
 		start, end int64,
 		location string,
 	) (nextUploadLocation string, endRange int64, err error)
-	PushBlob(repository, digest string, size int64, blob io.Reader) error
-	MountBlob(srcRepository, digest, dstRepository string) (err error)
-	CanBeMount(
-		digest string,
-	) (mount bool, repository string, err error) // check whether the blob can be mounted from the remote registry
-	DeleteTag(repository, tag string) error
-	ListTags(repository string) (tags []string, err error)
-
+	PushBlob(ctx context.Context, repository, digest string, size int64, blob io.Reader) error
+	MountBlob(ctx context.Context, srcRepository, digest, dstRepository string) (err error)
+	CanBeMount(ctx context.Context, digest string) (mount bool, repository string, err error)
+	// check whether the blob can be mounted from the remote registry
+	DeleteTag(ctx context.Context, repository, tag string) error
+	ListTags(ctx context.Context, repository string) (tags []string, err error)
 	// Download the file
-	GetFile(filePath string) (*commons.ResponseHeaders, io.ReadCloser, error)
-
+	GetFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, io.ReadCloser, error)
 	// Check existence of file
-	HeadFile(filePath string) (*commons.ResponseHeaders, bool, error)
+	HeadFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, bool, error)
 }
 
 // RegisterFactory registers one adapter factory to the registry.
diff --git a/registry/app/remote/adapter/awsecr/adapter.go b/registry/app/remote/adapter/awsecr/adapter.go
index ed3362df7..767596f53 100644
--- a/registry/app/remote/adapter/awsecr/adapter.go
+++ b/registry/app/remote/adapter/awsecr/adapter.go
@@ -57,7 +57,7 @@ func newAdapter(
 	}
 	var svc *awsecrapi.ECR
 	if !isPublic {
-		svc, err = getAwsSvc(accessKey, secretKey, registry)
+		svc, err = getAwsSvc(ctx, accessKey, secretKey, registry)
 		if err != nil {
 			return nil, err
 		}
diff --git a/registry/app/remote/adapter/awsecr/auth.go b/registry/app/remote/adapter/awsecr/auth.go
index d2620a149..3c8c53b3b 100644
--- a/registry/app/remote/adapter/awsecr/auth.go
+++ b/registry/app/remote/adapter/awsecr/auth.go
@@ -72,7 +72,7 @@ func (a *awsAuthCredential) Modify(req *http.Request) error {
 		return nil
 	}
 	if !a.isTokenValid() {
-		endpoint, user, pass, expiresAt, err := a.getAuthorization(req.URL.String(), req.URL.Host)
+		endpoint, user, pass, expiresAt, err := a.getAuthorization(req.Context(), req.URL.String(), req.URL.Host)
 
 		if err != nil {
 			return err
@@ -103,7 +103,7 @@ func (a *awsAuthCredential) Modify(req *http.Request) error {
 	return nil
 }
 
-func getAwsSvc(accessKey, secretKey string, reg types.UpstreamProxy) (*awsecrapi.ECR, error) {
+func getAwsSvc(ctx context.Context, accessKey, secretKey string, reg types.UpstreamProxy) (*awsecrapi.ECR, error) {
 	_, region, err := parseAccountRegion(reg.RepoURL)
 	if err != nil {
 		return nil, err
@@ -113,7 +113,7 @@ func getAwsSvc(accessKey, secretKey string, reg types.UpstreamProxy) (*awsecrapi
 		return nil, err
 	}
 	var cred *credentials.Credentials
-	log.Info().Msgf("Aws Ecr getAuthorization %s", accessKey)
+	log.Ctx(ctx).Info().Msgf("Aws Ecr getAuthorization %s", accessKey)
 	if accessKey != "" {
 		cred = credentials.NewStaticCredentials(
 			accessKey,
@@ -148,7 +148,7 @@ func getCreds(
 		return "", "", true, nil
 	}
 	if api.AuthType(reg.RepoAuthType) != api.AuthTypeAccessKeySecretKey {
-		log.Debug().Msgf("invalid auth type: %s", reg.RepoAuthType)
+		log.Ctx(ctx).Debug().Msgf("invalid auth type: %s", reg.RepoAuthType)
 		return "", "", false, nil
 	}
 	secretKey, err := getSecretValue(ctx, spaceFinder, secretService, reg.SecretSpaceID,
@@ -173,20 +173,27 @@ func getSecretValue(
 ) (string, error) {
 	spacePath, err := spaceFinder.FindByID(ctx, secretSpaceID)
 	if err != nil {
-		log.Error().Msgf("failed to find space path: %d, %v", secretSpaceID, err)
+		log.Ctx(ctx).Error().Msgf("failed to find space path: %d, %v", secretSpaceID, err)
 		return "", err
 	}
 	decryptSecret, err := secretService.DecryptSecret(ctx, spacePath.Path, secretSpacePath)
 	if err != nil {
-		log.Error().Msgf("failed to decrypt secret at path: %s, secret: %s, %v", spacePath.Path, secretSpacePath, err)
+		log.Ctx(ctx).Error().Msgf("failed to decrypt secret at path: %s, secret: %s, %v", spacePath.Path,
+			secretSpacePath, err)
 		return "", err
 	}
 	return decryptSecret, nil
 }
 
-func (a *awsAuthCredential) getAuthorization(url, host string) (string, string, string, *time.Time, error) {
+func (a *awsAuthCredential) getAuthorization(ctx context.Context, url, host string) (
+	string,
+	string,
+	string,
+	*time.Time,
+	error,
+) {
 	if a.isPublic {
-		token, err := a.getPublicECRToken(host)
+		token, err := a.getPublicECRToken(ctx, host)
 		if err != nil {
 			return "", "", "", nil, err
 		}
@@ -202,7 +209,7 @@ func (a *awsAuthCredential) getAuthorization(url, host string) (string, string,
 		input = &awsecrapi.GetAuthorizationTokenInput{RegistryIds: []*string{&id}}
 	}
 	svc := a.awssvc
-	result, err := svc.GetAuthorizationToken(input)
+	result, err := svc.GetAuthorizationTokenWithContext(ctx, input)
 	if err != nil {
 		var awsErr *awserr.Error
 
@@ -223,7 +230,7 @@ func (a *awsAuthCredential) getAuthorization(url, host string) (string, string,
 	payload, _ := base64.StdEncoding.DecodeString(*theOne.AuthorizationToken)
 	pair := strings.SplitN(string(payload), ":", 2)
 
-	log.Debug().Msgf("Aws Ecr getAuthorization %s result: %d %s...", a.accessKey, len(pair[1]), pair[1][:25])
+	log.Ctx(ctx).Debug().Msgf("Aws Ecr getAuthorization %s result: %d %s...", a.accessKey, len(pair[1]), pair[1][:25])
 
 	return *(theOne.ProxyEndpoint), pair[0], pair[1], expiresAt, nil
 }
@@ -252,11 +259,11 @@ func NewAuth(accessKey string, awssvc *awsecrapi.ECR, isPublic bool) Credential
 	}
 }
 
-func (a *awsAuthCredential) getPublicECRToken(host string) (string, error) {
+func (a *awsAuthCredential) getPublicECRToken(ctx context.Context, host string) (string, error) {
 	c := &http.Client{
 		Transport: commonhttp.GetHTTPTransport(commonhttp.WithInsecure(true)),
 	}
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, buildTokenURL(host, host), nil)
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, buildTokenURL(host, host), nil)
 	if err != nil {
 		return "", fmt.Errorf("failed to create request: %w", err)
 	}
diff --git a/registry/app/remote/adapter/commons/utils.go b/registry/app/remote/adapter/commons/utils.go
index 390d68977..bf1729624 100644
--- a/registry/app/remote/adapter/commons/utils.go
+++ b/registry/app/remote/adapter/commons/utils.go
@@ -36,7 +36,7 @@ func GetCredentials(
 		secretKey, err = getSecretValue(ctx, spaceFinder, secretService, reg.SecretSpaceID,
 			reg.SecretIdentifier)
 		if err != nil {
-			log.Error().Err(err).Msgf("failed to get secret for registry: %s", reg.RepoKey)
+			log.Ctx(ctx).Error().Err(err).Msgf("failed to get secret for registry: %s", reg.RepoKey)
 			return "", "", false, fmt.Errorf("failed to get secret for registry: %s", reg.RepoKey)
 		}
 		return reg.UserName, secretKey, false, nil
@@ -45,14 +45,14 @@ func GetCredentials(
 		accessKey, err = getSecretValue(ctx, spaceFinder, secretService, reg.UserNameSecretSpaceID,
 			reg.UserNameSecretIdentifier)
 		if err != nil {
-			log.Error().Err(err).Msgf("failed to get access secret for registry: %s", reg.RepoKey)
+			log.Ctx(ctx).Error().Err(err).Msgf("failed to get access secret for registry: %s", reg.RepoKey)
 			return "", "", false, fmt.Errorf("failed to get access key for registry: %s", reg.RepoKey)
 		}
 
 		secretKey, err = getSecretValue(ctx, spaceFinder, secretService, reg.SecretSpaceID,
 			reg.SecretIdentifier)
 		if err != nil {
-			log.Error().Err(err).Msgf("failed to get user secret for registry: %s", reg.RepoKey)
+			log.Ctx(ctx).Error().Err(err).Msgf("failed to get user secret for registry: %s", reg.RepoKey)
 			return "", "", false, fmt.Errorf("failed to get secret key for registry: %s", reg.RepoKey)
 		}
 		return accessKey, secretKey, false, nil
@@ -66,12 +66,12 @@ func getSecretValue(
 ) (string, error) {
 	spacePath, err := spaceFinder.FindByID(ctx, secretSpaceID)
 	if err != nil {
-		log.Error().Msgf("failed to find space path: %v", err)
+		log.Ctx(ctx).Error().Msgf("failed to find space path: %v", err)
 		return "", err
 	}
 	decryptSecret, err := secretService.DecryptSecret(ctx, spacePath.Path, secretSpacePath)
 	if err != nil {
-		log.Error().Msgf("failed to decrypt secret: %v", err)
+		log.Ctx(ctx).Error().Msgf("failed to decrypt secret: %v", err)
 		return "", err
 	}
 	return decryptSecret, nil
diff --git a/registry/app/remote/adapter/crates/adapter.go b/registry/app/remote/adapter/crates/adapter.go
index 9f686ef3c..c19d8efdb 100644
--- a/registry/app/remote/adapter/crates/adapter.go
+++ b/registry/app/remote/adapter/crates/adapter.go
@@ -72,8 +72,8 @@ func init() {
 	}
 }
 
-func (a *adapter) GetRegistryConfig() (*cargo.RegistryConfig, error) {
-	_, readCloser, err := a.GetFile("config.json")
+func (a *adapter) GetRegistryConfig(ctx context.Context) (*cargo.RegistryConfig, error) {
+	_, readCloser, err := a.GetFile(ctx, "config.json")
 	if err != nil {
 		return nil, err
 	}
@@ -91,8 +91,8 @@ func (a *adapter) GetRegistryConfig() (*cargo.RegistryConfig, error) {
 	return &config, nil
 }
 
-func (a *adapter) GetPackageFile(filePath string) (io.ReadCloser, error) {
-	_, readCloser, err := a.GetFile(filePath)
+func (a *adapter) GetPackageFile(ctx context.Context, filepath string) (io.ReadCloser, error) {
+	_, readCloser, err := a.GetFile(ctx, filepath)
 	if err != nil {
 		return nil, err
 	}
diff --git a/registry/app/remote/adapter/dockerhub/client.go b/registry/app/remote/adapter/dockerhub/client.go
index 2f0ef0230..f9461e969 100644
--- a/registry/app/remote/adapter/dockerhub/client.go
+++ b/registry/app/remote/adapter/dockerhub/client.go
@@ -49,10 +49,10 @@ func NewClient(_ types.UpstreamProxy) (*Client, error) {
 }
 
 // Do performs http request to DockerHub, it will set token automatically.
-func (c *Client) Do(method, path string, body io.Reader) (*http.Response, error) {
+func (c *Client) Do(ctx context.Context, method, path string, body io.Reader) (*http.Response, error) {
 	url := baseURL + path
-	log.Info().Msgf("%s %s", method, url)
-	req, err := http.NewRequestWithContext(context.TODO(), method, url, body)
+	log.Ctx(ctx).Info().Msgf("%s %s", method, url)
+	req, err := http.NewRequestWithContext(ctx, method, url, body)
 	if err != nil {
 		return nil, err
 	}
diff --git a/registry/app/remote/adapter/goproxy/adapter.go b/registry/app/remote/adapter/goproxy/adapter.go
index c22f0276c..bd76b7007 100644
--- a/registry/app/remote/adapter/goproxy/adapter.go
+++ b/registry/app/remote/adapter/goproxy/adapter.go
@@ -69,8 +69,8 @@ func init() {
 	}
 }
 
-func (a *adapter) GetPackageFile(filePath string) (io.ReadCloser, error) {
-	_, readCloser, err := a.GetFile(filePath)
+func (a *adapter) GetPackageFile(ctx context.Context, filepath string) (io.ReadCloser, error) {
+	_, readCloser, err := a.GetFile(ctx, filepath)
 	if err != nil {
 		return nil, err
 	}
diff --git a/registry/app/remote/adapter/native/adapter.go b/registry/app/remote/adapter/native/adapter.go
index 23c777e82..d5f74e5f0 100644
--- a/registry/app/remote/adapter/native/adapter.go
+++ b/registry/app/remote/adapter/native/adapter.go
@@ -57,7 +57,7 @@ func NewAdapter(
 	url := reg.RepoURL
 	accessKey, secretKey, _, err := commons.GetCredentials(ctx, spaceFinder, service, reg)
 	if err != nil {
-		log.Error().Err(err).Msgf("error getting credentials for registry: %s", reg.RepoKey)
+		log.Ctx(ctx).Error().Err(err).Msgf("error getting credentials for registry: %s", reg.RepoKey)
 		return nil
 	}
 
@@ -81,8 +81,8 @@ func (a *Adapter) HealthCheck() (string, error) {
 
 // PingSimple checks whether the proxy is available. It checks the connectivity and certificate (if TLS enabled)
 // only, regardless of 401/403 error.
-func (a *Adapter) PingSimple() error {
-	err := a.Ping()
+func (a *Adapter) PingSimple(ctx context.Context) error {
+	err := a.Ping(ctx)
 	if err == nil {
 		return nil
 	}
@@ -93,12 +93,12 @@ func (a *Adapter) PingSimple() error {
 }
 
 // DeleteTag isn't supported for docker proxy.
-func (a *Adapter) DeleteTag(_, _ string) error {
+func (a *Adapter) DeleteTag(_ context.Context, _, _ string) error {
 	return errors.New("the tag deletion isn't supported")
 }
 
 // CanBeMount isn't supported for docker proxy.
-func (a *Adapter) CanBeMount(_ string) (mount bool, repository string, err error) {
+func (a *Adapter) CanBeMount(_ context.Context, _ string) (mount bool, repository string, err error) {
 	return false, "", nil
 }
 
diff --git a/registry/app/remote/adapter/npmjs/adaptor.go b/registry/app/remote/adapter/npmjs/adaptor.go
index 4fdb09318..426c3e0b7 100644
--- a/registry/app/remote/adapter/npmjs/adaptor.go
+++ b/registry/app/remote/adapter/npmjs/adaptor.go
@@ -81,8 +81,8 @@ func init() {
 	}
 }
 
-func (a *adapter) GetPackageMetadata(_ context.Context, pkg string) (*npm.PackageMetadata, error) {
-	_, readCloser, err := a.GetFile(pkg)
+func (a *adapter) GetPackageMetadata(ctx context.Context, pkg string) (*npm.PackageMetadata, error) {
+	_, readCloser, err := a.GetFile(ctx, pkg)
 	if err != nil {
 		return nil, err
 	}
@@ -114,7 +114,7 @@ func (a *adapter) GetPackage(ctx context.Context, pkg string, version string) (i
 	}
 
 	log.Ctx(ctx).Info().Msgf("Download URL: %s", downloadURL)
-	_, closer, err := a.GetFileFromURL(downloadURL)
+	_, closer, err := a.GetFileFromURL(ctx, downloadURL)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", downloadURL)
 		return nil, err
diff --git a/registry/app/remote/adapter/nuget/adapter.go b/registry/app/remote/adapter/nuget/adapter.go
index 259caabc2..74e6644ec 100644
--- a/registry/app/remote/adapter/nuget/adapter.go
+++ b/registry/app/remote/adapter/nuget/adapter.go
@@ -85,8 +85,8 @@ func init() {
 	}
 }
 
-func (a adapter) GetServiceEndpoint() (*nuget.ServiceEndpoint, error) {
-	_, readCloser, err := a.GetFileFromURL(a.client.url)
+func (a adapter) GetServiceEndpoint(ctx context.Context) (*nuget.ServiceEndpoint, error) {
+	_, readCloser, err := a.GetFileFromURL(ctx, a.client.url)
 	if err != nil {
 		return nil, err
 	}
@@ -103,7 +103,7 @@ func (a adapter) GetPackageMetadata(ctx context.Context, pkg, proxyEndpoint stri
 	if proxyEndpoint != "" {
 		packageMetadataEndpoint = proxyEndpoint
 	} else {
-		svcEndpoints, err := a.GetServiceEndpoint()
+		svcEndpoints, err := a.GetServiceEndpoint(ctx)
 		if err != nil {
 			return nil, err
 		}
@@ -115,7 +115,7 @@ func (a adapter) GetPackageMetadata(ctx context.Context, pkg, proxyEndpoint stri
 	}
 	log.Ctx(ctx).Info().Msgf("Package Metadata URL: %s", packageMetadataEndpoint)
 
-	_, readCloser, err := a.GetFileFromURL(packageMetadataEndpoint)
+	_, readCloser, err := a.GetFileFromURL(ctx, packageMetadataEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", packageMetadataEndpoint)
 		return nil, err
@@ -129,7 +129,7 @@ func (a adapter) GetPackageVersionMetadataV2(ctx context.Context, pkg, version s
 		strings.TrimRight(baseURL, "/"), pkg, version)
 	log.Ctx(ctx).Info().Msgf("Package Version V2 Metadata URL: %s", packageVersionEndpoint)
 
-	_, readCloser, err := a.GetFileFromURL(packageVersionEndpoint)
+	_, readCloser, err := a.GetFileFromURL(ctx, packageVersionEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", packageVersionEndpoint)
 		return nil, err
@@ -142,7 +142,7 @@ func (a adapter) GetPackage(ctx context.Context, pkg, version, proxyEndpoint, fi
 	if proxyEndpoint != "" {
 		packageEndpoint = proxyEndpoint
 	} else {
-		svcEndpoints, err := a.GetServiceEndpoint()
+		svcEndpoints, err := a.GetServiceEndpoint(ctx)
 		if err != nil {
 			return nil, err
 		}
@@ -155,7 +155,7 @@ func (a adapter) GetPackage(ctx context.Context, pkg, version, proxyEndpoint, fi
 	}
 
 	log.Ctx(ctx).Info().Msgf("Package URL: %s", packageEndpoint)
-	_, closer, err := a.GetFileFromURL(packageEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, packageEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", packageEndpoint)
 		return nil, err
@@ -164,7 +164,7 @@ func (a adapter) GetPackage(ctx context.Context, pkg, version, proxyEndpoint, fi
 }
 
 func (a adapter) ListPackageVersion(ctx context.Context, pkg string) (io.ReadCloser, error) {
-	svcEndpoints, err := a.GetServiceEndpoint()
+	svcEndpoints, err := a.GetServiceEndpoint(ctx)
 	if err != nil {
 		return nil, err
 	}
@@ -174,7 +174,7 @@ func (a adapter) ListPackageVersion(ctx context.Context, pkg string) (io.ReadClo
 	}
 	versionEndpoint := fmt.Sprintf("%s/%s/index.json", strings.TrimRight(baseURL, "/"), pkg)
 	log.Ctx(ctx).Info().Msgf("List Version URL: %s", versionEndpoint)
-	_, closer, err := a.GetFileFromURL(versionEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, versionEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", versionEndpoint)
 		return nil, err
@@ -186,7 +186,7 @@ func (a adapter) ListPackageVersionV2(ctx context.Context, pkg string) (io.ReadC
 	baseURL := a.client.url
 	versionEndpoint := fmt.Sprintf("%s/FindPackagesById()?id='%s'", strings.TrimRight(baseURL, "/"), pkg)
 	log.Ctx(ctx).Info().Msgf("List Version V2 URL: %s", versionEndpoint)
-	_, closer, err := a.GetFileFromURL(versionEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, versionEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", versionEndpoint)
 		return nil, err
@@ -200,7 +200,7 @@ func (a adapter) SearchPackageV2(ctx context.Context, searchTerm string, limit,
 	searchEndpoint := fmt.Sprintf("%s/Search()?searchTerm='%s'&$skip=%d&$top=%d&semVerLevel=2.0.0",
 		strings.TrimRight(baseURL, "/"), searchTerm, offset, limit)
 	log.Ctx(ctx).Info().Msgf("Search Package V2 URL: %s", searchEndpoint)
-	_, closer, err := a.GetFileFromURL(searchEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, searchEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", searchEndpoint)
 		return nil, err
@@ -210,7 +210,7 @@ func (a adapter) SearchPackageV2(ctx context.Context, searchTerm string, limit,
 
 func (a adapter) SearchPackage(ctx context.Context, searchTerm string, limit, offset int) (io.ReadCloser, error) {
 	// For v3 API, we need to use the search service endpoint
-	endpoint, err := a.GetServiceEndpoint()
+	endpoint, err := a.GetServiceEndpoint(ctx)
 	if err != nil {
 		return nil, fmt.Errorf("failed to get service endpoint: %w", err)
 	}
@@ -223,7 +223,7 @@ func (a adapter) SearchPackage(ctx context.Context, searchTerm string, limit, of
 	searchEndpoint := fmt.Sprintf("%s?q=%s&skip=%d&take=%d",
 		strings.TrimRight(searchURL, "/"), searchTerm, offset, limit)
 	log.Ctx(ctx).Info().Msgf("Search Package V3 URL: %s", searchEndpoint)
-	_, closer, err := a.GetFileFromURL(searchEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, searchEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", searchEndpoint)
 		return nil, err
@@ -237,7 +237,7 @@ func (a adapter) CountPackageV2(ctx context.Context, searchTerm string) (int64,
 	countEndpoint := fmt.Sprintf("%s/Search()/$count?searchTerm='%s'&semVerLevel=2.0.0",
 		strings.TrimRight(baseURL, "/"), searchTerm)
 	log.Ctx(ctx).Info().Msgf("Count Package V2 URL: %s", countEndpoint)
-	_, closer, err := a.GetFileFromURL(countEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, countEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", countEndpoint)
 		return 0, err
@@ -265,7 +265,7 @@ func (a adapter) CountPackageVersionV2(ctx context.Context, pkg string) (int64,
 	countEndpoint := fmt.Sprintf("%s/FindPackagesById()/$count?id='%s'",
 		strings.TrimRight(baseURL, "/"), pkg)
 	log.Ctx(ctx).Info().Msgf("Count Package Version V2 URL: %s", countEndpoint)
-	_, closer, err := a.GetFileFromURL(countEndpoint)
+	_, closer, err := a.GetFileFromURL(ctx, countEndpoint)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", countEndpoint)
 		return 0, err
diff --git a/registry/app/remote/adapter/pypi/adapter.go b/registry/app/remote/adapter/pypi/adapter.go
index d0141ff2e..9cee5bd3f 100644
--- a/registry/app/remote/adapter/pypi/adapter.go
+++ b/registry/app/remote/adapter/pypi/adapter.go
@@ -83,17 +83,17 @@ func init() {
 	}
 }
 
-func (a *adapter) GetMetadata(_ context.Context, pkg string) (*pypi.SimpleMetadata, error) {
+func (a *adapter) GetMetadata(ctx context.Context, pkg string) (*pypi.SimpleMetadata, error) {
 	filePath := "simple/" + pkg
 	if a.registry.RepoURL != PyPiURL {
 		filePath += "/index.html"
 	}
-	_, readCloser, err := a.GetFile(filePath)
+	_, readCloser, err := a.GetFile(ctx, filePath)
 	if err != nil {
 		return nil, err
 	}
 	defer readCloser.Close()
-	response, err := ParsePyPISimple(readCloser, a.GetURL(filePath))
+	response, err := ParsePyPISimple(readCloser, a.GetURL(ctx, filePath))
 	if err != nil {
 		return nil, err
 	}
@@ -135,7 +135,7 @@ func (a *adapter) GetPackage(ctx context.Context, pkg string, filename string) (
 	}
 
 	log.Ctx(ctx).Info().Msgf("Download URL: %s", downloadURL)
-	_, closer, err := a.GetFileFromURL(downloadURL)
+	_, closer, err := a.GetFileFromURL(ctx, downloadURL)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file from URL: %s", downloadURL)
 		return nil, err
@@ -144,7 +144,7 @@ func (a *adapter) GetPackage(ctx context.Context, pkg string, filename string) (
 }
 
 func (a *adapter) GetJSON(ctx context.Context, pkg string, version string) (*python.Metadata, error) {
-	_, readCloser, err := a.GetFile(fmt.Sprintf("pypi/%s/%s/json", pkg, version))
+	_, readCloser, err := a.GetFile(ctx, fmt.Sprintf("pypi/%s/%s/json", pkg, version))
 	if err != nil {
 		return nil, err
 	}
diff --git a/registry/app/remote/adapter/rpm/adapter.go b/registry/app/remote/adapter/rpm/adapter.go
index c66346217..2a51991b1 100644
--- a/registry/app/remote/adapter/rpm/adapter.go
+++ b/registry/app/remote/adapter/rpm/adapter.go
@@ -37,7 +37,7 @@ type adapter struct {
 }
 
 func (a *adapter) GetMetadataFile(ctx context.Context, filePath string) (io.ReadCloser, error) {
-	_, closer, err := a.GetFile(filePath)
+	_, closer, err := a.GetFile(ctx, filePath)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get file: %s", filePath)
 		return nil, err
@@ -46,7 +46,7 @@ func (a *adapter) GetMetadataFile(ctx context.Context, filePath string) (io.Read
 }
 
 func (a *adapter) GetPackage(ctx context.Context, pkg string) (io.ReadCloser, error) {
-	_, closer, err := a.GetFile(pkg)
+	_, closer, err := a.GetFile(ctx, pkg)
 	if err != nil {
 		log.Ctx(ctx).Error().Err(err).Msgf("Failed to get package: %s", pkg)
 		return nil, err
diff --git a/registry/app/remote/clients/registry/auth/authorizer.go b/registry/app/remote/clients/registry/auth/authorizer.go
index 1943d040b..2b2d6de82 100644
--- a/registry/app/remote/clients/registry/auth/authorizer.go
+++ b/registry/app/remote/clients/registry/auth/authorizer.go
@@ -65,7 +65,7 @@ func (a *authorizer) Modify(req *http.Request) error {
 		// to avoid concurrent issue
 		a.Lock()
 		defer a.Unlock()
-		if err := a.initialize(req.URL); err != nil {
+		if err := a.initialize(req.Context(), req.URL); err != nil {
 			return err
 		}
 	}
@@ -80,7 +80,7 @@ func (a *authorizer) Modify(req *http.Request) error {
 	return a.authorizer.Modify(req)
 }
 
-func (a *authorizer) initialize(u *url.URL) error {
+func (a *authorizer) initialize(ctx context.Context, u *url.URL) error {
 	if a.authorizer != nil {
 		return nil
 	}
@@ -96,7 +96,7 @@ func (a *authorizer) initialize(u *url.URL) error {
 	}
 	a.url = url
 
-	req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, a.url.String(), nil)
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, a.url.String(), nil)
 	if err != nil {
 		return err
 	}
diff --git a/registry/app/remote/clients/registry/auth/bearer/authorizer.go b/registry/app/remote/clients/registry/auth/bearer/authorizer.go
index bb8d126e6..06a1cca89 100644
--- a/registry/app/remote/clients/registry/auth/bearer/authorizer.go
+++ b/registry/app/remote/clients/registry/auth/bearer/authorizer.go
@@ -60,34 +60,34 @@ func (a *authorizer) Modify(req *http.Request) error {
 	scopes := parseScopes(req)
 
 	// get token
-	token, err := a.getToken(scopes)
+	_token, err := a.getToken(req.Context(), scopes)
 	if err != nil {
 		return err
 	}
 
 	// set authorization header
-	if token != nil && len(token.Token) > 0 {
-		req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token.Token))
+	if _token != nil && len(_token.Token) > 0 {
+		req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", _token.Token))
 	}
 	return nil
 }
 
-func (a *authorizer) getToken(scopes []*scope) (*token, error) {
+func (a *authorizer) getToken(ctx context.Context, scopes []*scope) (*token, error) {
 	// get token from cache first
-	token := a.cache.get(scopes)
-	if token != nil {
-		return token, nil
+	_token := a.cache.get(scopes)
+	if _token != nil {
+		return _token, nil
 	}
 
 	// get no token from cache, fetch it from the token service
-	token, err := a.fetchToken(scopes)
+	_token, err := a.fetchToken(ctx, scopes)
 	if err != nil {
 		return nil, err
 	}
 
 	// set the token into the cache
-	a.cache.set(scopes, token)
-	return token, nil
+	a.cache.set(scopes, _token)
+	return _token, nil
 }
 
 type token struct {
@@ -97,7 +97,7 @@ type token struct {
 	IssuedAt    string `json:"issued_at"`
 }
 
-func (a *authorizer) fetchToken(scopes []*scope) (*token, error) {
+func (a *authorizer) fetchToken(ctx context.Context, scopes []*scope) (*token, error) {
 	url, err := url.Parse(a.realm)
 	if err != nil {
 		return nil, err
@@ -109,7 +109,7 @@ func (a *authorizer) fetchToken(scopes []*scope) (*token, error) {
 	}
 	url.RawQuery = query.Encode()
 
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, url.String(), nil)
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url.String(), nil)
 	if err != nil {
 		return nil, err
 	}
diff --git a/registry/app/remote/clients/registry/client.go b/registry/app/remote/clients/registry/client.go
index 7254b0a6e..f518f821a 100644
--- a/registry/app/remote/clients/registry/client.go
+++ b/registry/app/remote/clients/registry/client.go
@@ -101,32 +101,41 @@ func init() {
 // Client defines the methods that a registry client should implements.
 type Client interface {
 	// Ping the base API endpoint "/v2/"
-	Ping() (err error)
+	Ping(ctx context.Context) (err error)
 	// Catalog the repositories
-	Catalog() (repositories []string, err error)
+	Catalog(ctx context.Context) (repositories []string, err error)
 	// ListTags lists the tags under the specified repository
-	ListTags(repository string) (tags []string, err error)
+	ListTags(ctx context.Context, repository string) (tags []string, err error)
 	// ManifestExist checks the existence of the manifest
-	ManifestExist(repository, reference string) (exist bool, desc *manifest.Descriptor, err error)
+	ManifestExist(ctx context.Context, repository, reference string) (exist bool, desc *manifest.Descriptor, err error)
 	// PullManifest pulls the specified manifest
 	PullManifest(
+		ctx context.Context,
 		repository, reference string,
 		acceptedMediaTypes ...string,
 	) (manifest manifest.Manifest, digest string, err error)
 	// PushManifest pushes the specified manifest
-	PushManifest(repository, reference, mediaType string, payload []byte) (digest string, err error)
+	PushManifest(ctx context.Context, repository, reference, mediaType string, payload []byte) (
+		digest string,
+		err error,
+	)
 	// DeleteManifest deletes the specified manifest. The "reference" can be "tag" or "digest"
-	DeleteManifest(repository, reference string) (err error)
+	DeleteManifest(ctx context.Context, repository, reference string) (err error)
 	// BlobExist checks the existence of the specified blob
-	BlobExist(repository, digest string) (exist bool, err error)
+	BlobExist(ctx context.Context, repository, digest string) (exist bool, err error)
 	// PullBlob pulls the specified blob. The caller must close the returned "blob"
-	PullBlob(repository, digest string) (size int64, blob io.ReadCloser, err error)
+	PullBlob(ctx context.Context, repository, digest string) (size int64, blob io.ReadCloser, err error)
 	// PullBlobChunk pulls the specified blob, but by chunked
-	PullBlobChunk(repository, digest string, blobSize, start, end int64) (size int64, blob io.ReadCloser, err error)
+	PullBlobChunk(ctx context.Context, repository, digest string, blobSize, start, end int64) (
+		size int64,
+		blob io.ReadCloser,
+		err error,
+	)
 	// PushBlob pushes the specified blob
-	PushBlob(repository, digest string, size int64, blob io.Reader) error
+	PushBlob(ctx context.Context, repository, digest string, size int64, blob io.Reader) error
 	// PushBlobChunk pushes the specified blob, but by chunked
 	PushBlobChunk(
+		ctx context.Context,
 		repository, digest string,
 		blobSize int64,
 		chunk io.Reader,
@@ -134,25 +143,29 @@ type Client interface {
 		location string,
 	) (nextUploadLocation string, endRange int64, err error)
 	// MountBlob mounts the blob from the source repository
-	MountBlob(srcRepository, digest, dstRepository string) (err error)
+	MountBlob(ctx context.Context, srcRepository, digest, dstRepository string) (err error)
 	// DeleteBlob deletes the specified blob
-	DeleteBlob(repository, digest string) (err error)
+	DeleteBlob(ctx context.Context, repository, digest string) (err error)
 	// Copy the artifact from source repository to the destination. The "override"
 	// is used to specify whether the destination artifact will be overridden if
 	// its name is same with source but digest isn't
-	Copy(srcRepository, srcReference, dstRepository, dstReference string, override bool) (err error)
+	Copy(
+		ctx context.Context,
+		srcRepository, srcReference, dstRepository, dstReference string,
+		override bool,
+	) (err error)
 	// Do send generic HTTP requests to the target registry service
 	Do(req *http.Request) (*http.Response, error)
 
 	// GetFile Download the file
-	GetFile(filePath string) (*commons.ResponseHeaders, io.ReadCloser, error)
+	GetFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, io.ReadCloser, error)
 
 	// HeadFile Check existence of file
-	HeadFile(filePath string) (*commons.ResponseHeaders, bool, error)
+	HeadFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, bool, error)
 
 	// GetFileFromURL Download the file from URL instead of provided endpoint. Authorizer still remains the same.
-	GetFileFromURL(url string) (*commons.ResponseHeaders, io.ReadCloser, error)
-	GetURL(filePath string) string
+	GetFileFromURL(ctx context.Context, url string) (*commons.ResponseHeaders, io.ReadCloser, error)
+	GetURL(ctx context.Context, filePath string) string
 }
 
 // NewClient creates a registry client with the default authorizer which determines the auth scheme
@@ -188,8 +201,8 @@ type client struct {
 	client       *http.Client
 }
 
-func (c *client) Ping() error {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, buildPingURL(c.url), nil)
+func (c *client) Ping(ctx context.Context) error {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, buildPingURL(c.url), nil)
 	if err != nil {
 		return err
 	}
@@ -201,11 +214,11 @@ func (c *client) Ping() error {
 	return nil
 }
 
-func (c *client) Catalog() ([]string, error) {
+func (c *client) Catalog(ctx context.Context) ([]string, error) {
 	var repositories []string
 	url := buildCatalogURL(c.url)
 	for {
-		repos, next, err := c.catalog(url)
+		repos, next, err := c.catalog(ctx, url)
 		if err != nil {
 			return nil, err
 		}
@@ -224,8 +237,8 @@ func (c *client) Catalog() ([]string, error) {
 	return repositories, nil
 }
 
-func (c *client) catalog(url string) ([]string, string, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, url, nil)
+func (c *client) catalog(ctx context.Context, url string) ([]string, string, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
 	if err != nil {
 		return nil, "", err
 	}
@@ -248,11 +261,11 @@ func (c *client) catalog(url string) ([]string, string, error) {
 	return repositories.Repositories, next(resp.Header.Get("Link")), nil
 }
 
-func (c *client) ListTags(repository string) ([]string, error) {
+func (c *client) ListTags(ctx context.Context, repository string) ([]string, error) {
 	var tags []string
 	url := buildTagListURL(c.url, repository)
 	for {
-		tgs, next, err := c.listTags(url)
+		tgs, next, err := c.listTags(ctx, url)
 		if err != nil {
 			return nil, err
 		}
@@ -271,8 +284,8 @@ func (c *client) ListTags(repository string) ([]string, error) {
 	return tags, nil
 }
 
-func (c *client) listTags(url string) ([]string, string, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, url, nil)
+func (c *client) listTags(ctx context.Context, url string) ([]string, string, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
 	if err != nil {
 		return nil, "", err
 	}
@@ -295,10 +308,9 @@ func (c *client) listTags(url string) ([]string, string, error) {
 	return tgs.Tags, next(resp.Header.Get("Link")), nil
 }
 
-func (c *client) ManifestExist(repository, reference string) (bool, *manifest.Descriptor, error) {
+func (c *client) ManifestExist(ctx context.Context, repository, reference string) (bool, *manifest.Descriptor, error) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(),
-		http.MethodHead, buildManifestURL(c.url, repository, reference), nil,
+		ctx, http.MethodHead, buildManifestURL(c.url, repository, reference), nil,
 	)
 	if err != nil {
 		return false, nil, err
@@ -321,11 +333,13 @@ func (c *client) ManifestExist(repository, reference string) (bool, *manifest.De
 	return true, &manifest.Descriptor{Digest: digest.Digest(dig), MediaType: contentType, Size: int64(length)}, nil
 }
 
-func (c *client) PullManifest(repository, reference string, acceptedMediaTypes ...string) (
-	manifest.Manifest, string, error,
-) {
+func (c *client) PullManifest(
+	ctx context.Context,
+	repository, reference string,
+	acceptedMediaTypes ...string,
+) (manifest.Manifest, string, error) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(),
+		ctx,
 		http.MethodGet, buildManifestURL(
 			c.url, repository,
 			reference,
@@ -358,9 +372,12 @@ func (c *client) PullManifest(repository, reference string, acceptedMediaTypes .
 	return manifest, digest, nil
 }
 
-func (c *client) PushManifest(repository, reference, mediaType string, payload []byte) (string, error) {
+func (c *client) PushManifest(ctx context.Context, repository, reference, mediaType string, payload []byte) (
+	string,
+	error,
+) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(), http.MethodPut, buildManifestURL(c.url, repository, reference),
+		ctx, http.MethodPut, buildManifestURL(c.url, repository, reference),
 		bytes.NewReader(payload),
 	)
 	if err != nil {
@@ -375,11 +392,11 @@ func (c *client) PushManifest(repository, reference, mediaType string, payload [
 	return resp.Header.Get("Docker-Content-Digest"), nil
 }
 
-func (c *client) DeleteManifest(repository, reference string) error {
+func (c *client) DeleteManifest(ctx context.Context, repository, reference string) error {
 	_, err := digest.Parse(reference)
 	if err != nil {
 		// the reference is tag, get the digest first
-		exist, desc, err := c.ManifestExist(repository, reference)
+		exist, desc, err := c.ManifestExist(ctx, repository, reference)
 		if err != nil {
 			return err
 		}
@@ -390,7 +407,7 @@ func (c *client) DeleteManifest(repository, reference string) error {
 		reference = string(desc.Digest)
 	}
 	req, err := http.NewRequestWithContext(
-		context.TODO(), http.MethodDelete,
+		ctx, http.MethodDelete,
 		buildManifestURL(c.url, repository, reference), nil,
 	)
 	if err != nil {
@@ -404,9 +421,9 @@ func (c *client) DeleteManifest(repository, reference string) error {
 	return nil
 }
 
-func (c *client) BlobExist(repository, digest string) (bool, error) {
+func (c *client) BlobExist(ctx context.Context, repository, digest string) (bool, error) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(), http.MethodHead, buildBlobURL(c.url, repository, digest), nil,
+		ctx, http.MethodHead, buildBlobURL(c.url, repository, digest), nil,
 	)
 	if err != nil {
 		return false, err
@@ -422,8 +439,8 @@ func (c *client) BlobExist(repository, digest string) (bool, error) {
 	return true, nil
 }
 
-func (c *client) PullBlob(repository, digest string) (int64, io.ReadCloser, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, buildBlobURL(c.url, repository, digest), nil)
+func (c *client) PullBlob(ctx context.Context, repository, digest string) (int64, io.ReadCloser, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, buildBlobURL(c.url, repository, digest), nil)
 	if err != nil {
 		return 0, nil, err
 	}
@@ -451,8 +468,12 @@ func (c *client) PullBlob(repository, digest string) (int64, io.ReadCloser, erro
 // PullBlobChunk pulls the specified blob, but by chunked, refer to
 // https://github.com/opencontainers/distribution-spec/blob/main/spec.md#pull
 // for more details.
-func (c *client) PullBlobChunk(repository, digest string, _ int64, start, end int64) (int64, io.ReadCloser, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, buildBlobURL(c.url, repository, digest), nil)
+func (c *client) PullBlobChunk(ctx context.Context, repository, digest string, _ int64, start, end int64) (
+	int64,
+	io.ReadCloser,
+	error,
+) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, buildBlobURL(c.url, repository, digest), nil)
 	if err != nil {
 		return 0, nil, err
 	}
@@ -478,18 +499,19 @@ func (c *client) PullBlobChunk(repository, digest string, _ int64, start, end in
 	return size, resp.Body, nil
 }
 
-func (c *client) PushBlob(repository, digest string, size int64, blob io.Reader) error {
-	location, err := c.initiateBlobUpload(repository)
+func (c *client) PushBlob(ctx context.Context, repository, digest string, size int64, blob io.Reader) error {
+	location, err := c.initiateBlobUpload(ctx, repository)
 	if err != nil {
 		return err
 	}
-	return c.monolithicBlobUpload(location, digest, size, blob)
+	return c.monolithicBlobUpload(ctx, location, digest, size, blob)
 }
 
 // PushBlobChunk pushes the specified blob, but by chunked,
 // refer to https://github.com/opencontainers/distribution-spec/blob/main/spec.md#push
 // for more details.
 func (c *client) PushBlobChunk(
+	ctx context.Context,
 	repository, digest string,
 	blobSize int64,
 	chunk io.Reader,
@@ -499,7 +521,7 @@ func (c *client) PushBlobChunk(
 	var err error
 	// first chunk need to initialize blob upload location
 	if start == 0 {
-		location, err = c.initiateBlobUpload(repository)
+		location, err = c.initiateBlobUpload(ctx, repository)
 		if err != nil {
 			return location, end, err
 		}
@@ -517,7 +539,7 @@ func (c *client) PushBlobChunk(
 	if lastChunk {
 		method = http.MethodPut
 	}
-	req, err := http.NewRequestWithContext(context.TODO(), method, url, chunk)
+	req, err := http.NewRequestWithContext(ctx, method, url, chunk)
 	if err != nil {
 		return location, end, err
 	}
@@ -527,7 +549,7 @@ func (c *client) PushBlobChunk(
 	resp, err := c.do(req)
 	if err != nil {
 		// if push chunk error, we should query the upload progress for new location and end range.
-		newLocation, newEnd, err1 := c.getUploadStatus(location)
+		newLocation, newEnd, err1 := c.getUploadStatus(ctx, location)
 		if err1 == nil {
 			return newLocation, newEnd, err
 		}
@@ -540,8 +562,8 @@ func (c *client) PushBlobChunk(
 	return resp.Header.Get("Location"), end, nil
 }
 
-func (c *client) getUploadStatus(location string) (string, int64, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet, location, nil)
+func (c *client) getUploadStatus(ctx context.Context, location string) (string, int64, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet, location, nil)
 	if err != nil {
 		return location, -1, err
 	}
@@ -561,26 +583,9 @@ func (c *client) getUploadStatus(location string) (string, int64, error) {
 	return resp.Header.Get("Location"), end, nil
 }
 
-func parseContentRange(cr string) (int64, int64, error) {
-	ranges := strings.Split(cr, "-")
-	if len(ranges) != 2 {
-		return -1, -1, fmt.Errorf("invalid content range format, %s", cr)
-	}
-	start, err := strconv.ParseInt(ranges[0], 10, 64)
-	if err != nil {
-		return -1, -1, err
-	}
-	end, err := strconv.ParseInt(ranges[1], 10, 64)
-	if err != nil {
-		return -1, -1, err
-	}
-
-	return start, end, nil
-}
-
-func (c *client) initiateBlobUpload(repository string) (string, error) {
+func (c *client) initiateBlobUpload(ctx context.Context, repository string) (string, error) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(), http.MethodPost,
+		ctx, http.MethodPost,
 		buildInitiateBlobUploadURL(c.url, repository), nil,
 	)
 	if err != nil {
@@ -595,12 +600,12 @@ func (c *client) initiateBlobUpload(repository string) (string, error) {
 	return resp.Header.Get("Location"), nil
 }
 
-func (c *client) monolithicBlobUpload(location, digest string, size int64, data io.Reader) error {
+func (c *client) monolithicBlobUpload(ctx context.Context, location, digest string, size int64, data io.Reader) error {
 	url, err := buildMonolithicBlobUploadURL(c.url, location, digest)
 	if err != nil {
 		return err
 	}
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodPut, url, data)
+	req, err := http.NewRequestWithContext(ctx, http.MethodPut, url, data)
 	if err != nil {
 		return err
 	}
@@ -613,9 +618,9 @@ func (c *client) monolithicBlobUpload(location, digest string, size int64, data
 	return nil
 }
 
-func (c *client) MountBlob(srcRepository, digest, dstRepository string) error {
+func (c *client) MountBlob(ctx context.Context, srcRepository, digest, dstRepository string) (err error) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(), http.MethodPost,
+		ctx, http.MethodPost,
 		buildMountBlobURL(c.url, dstRepository, digest, srcRepository), nil,
 	)
 	if err != nil {
@@ -630,9 +635,9 @@ func (c *client) MountBlob(srcRepository, digest, dstRepository string) error {
 	return nil
 }
 
-func (c *client) DeleteBlob(repository, digest string) error {
+func (c *client) DeleteBlob(ctx context.Context, repository, digest string) (err error) {
 	req, err := http.NewRequestWithContext(
-		context.TODO(), http.MethodDelete, buildBlobURL(c.url, repository, digest), nil,
+		ctx, http.MethodDelete, buildBlobURL(c.url, repository, digest), nil,
 	)
 	if err != nil {
 		return err
@@ -645,15 +650,19 @@ func (c *client) DeleteBlob(repository, digest string) error {
 	return nil
 }
 
-func (c *client) Copy(srcRepo, srcRef, dstRepo, dstRef string, override bool) error {
+func (c *client) Copy(
+	ctx context.Context,
+	srcRepository, srcReference, dstRepository, dstReference string,
+	override bool,
+) (err error) {
 	// pull the manifest from the source repository
-	manifest, srcDgt, err := c.PullManifest(srcRepo, srcRef)
+	manifest, srcDgt, err := c.PullManifest(ctx, srcRepository, srcReference)
 	if err != nil {
 		return err
 	}
 
 	// check the existence of the artifact on the destination repository
-	blobExist, desc, err := c.ManifestExist(dstRepo, dstRef)
+	blobExist, desc, err := c.ManifestExist(ctx, dstRepository, dstReference)
 	if err != nil {
 		return err
 	}
@@ -679,12 +688,12 @@ func (c *client) Copy(srcRepo, srcRef, dstRepo, dstRef string, override bool) er
 		case v1.MediaTypeImageIndex, manifestlist.MediaTypeManifestList,
 			v1.MediaTypeImageManifest, schema2.MediaTypeManifest,
 			MediaTypeSignedManifest, MediaTypeManifest:
-			if err = c.Copy(srcRepo, digest, dstRepo, digest, false); err != nil {
+			if err = c.Copy(ctx, srcRepository, digest, dstRepository, digest, false); err != nil {
 				return err
 			}
 		// common layer
 		default:
-			blobExist, err = c.BlobExist(dstRepo, digest)
+			blobExist, err = c.BlobExist(ctx, dstRepository, digest)
 			if err != nil {
 				return err
 			}
@@ -693,7 +702,7 @@ func (c *client) Copy(srcRepo, srcRef, dstRepo, dstRef string, override bool) er
 				continue
 			}
 			// when the copy happens inside the same registry, use mount
-			if err = c.MountBlob(srcRepo, digest, dstRepo); err != nil {
+			if err = c.MountBlob(ctx, srcRepository, digest, dstRepository); err != nil {
 				return err
 			}
 		}
@@ -704,7 +713,7 @@ func (c *client) Copy(srcRepo, srcRef, dstRepo, dstRef string, override bool) er
 		return err
 	}
 	// push manifest to the destination repository
-	if _, err = c.PushManifest(dstRepo, dstRef, mediaType, payload); err != nil {
+	if _, err = c.PushManifest(ctx, dstRepository, dstReference, mediaType, payload); err != nil {
 		return err
 	}
 
@@ -827,8 +836,8 @@ func buildMonolithicBlobUploadURL(endpoint, location, digest string) (string, er
 	return endpoint + url.String(), nil
 }
 
-func (c *client) GetFile(filePath string) (*commons.ResponseHeaders, io.ReadCloser, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet,
+func (c *client) GetFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, io.ReadCloser, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet,
 		buildFileURL(c.url, filePath), nil)
 	if err != nil {
 		return nil, nil, err
@@ -842,8 +851,8 @@ func (c *client) GetFile(filePath string) (*commons.ResponseHeaders, io.ReadClos
 	return responseHeaders, resp.Body, nil
 }
 
-func (c *client) GetFileFromURL(url string) (*commons.ResponseHeaders, io.ReadCloser, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodGet,
+func (c *client) GetFileFromURL(ctx context.Context, url string) (*commons.ResponseHeaders, io.ReadCloser, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodGet,
 		url, nil)
 	if err != nil {
 		return nil, nil, err
@@ -857,8 +866,8 @@ func (c *client) GetFileFromURL(url string) (*commons.ResponseHeaders, io.ReadCl
 	return responseHeaders, resp.Body, nil
 }
 
-func (c *client) HeadFile(filePath string) (*commons.ResponseHeaders, bool, error) {
-	req, err := http.NewRequestWithContext(context.TODO(), http.MethodHead,
+func (c *client) HeadFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, bool, error) {
+	req, err := http.NewRequestWithContext(ctx, http.MethodHead,
 		buildFileURL(c.url, filePath), nil)
 	if err != nil {
 		return nil, false, err
@@ -877,6 +886,23 @@ func buildFileURL(endpoint, filePath string) string {
 	return fmt.Sprintf("%s/%s", endpoint, filePath)
 }
 
-func (c *client) GetURL(filePath string) string {
+func (c *client) GetURL(_ context.Context, filePath string) string {
 	return buildFileURL(c.url, filePath)
 }
+
+func parseContentRange(cr string) (int64, int64, error) {
+	ranges := strings.Split(cr, "-")
+	if len(ranges) != 2 {
+		return -1, -1, fmt.Errorf("invalid content range format, %s", cr)
+	}
+	start, err := strconv.ParseInt(ranges[0], 10, 64)
+	if err != nil {
+		return -1, -1, err
+	}
+	end, err := strconv.ParseInt(ranges[1], 10, 64)
+	if err != nil {
+		return -1, -1, err
+	}
+
+	return start, end, nil
+}
diff --git a/registry/app/remote/controller/proxy/controller.go b/registry/app/remote/controller/proxy/controller.go
index fcbaaca79..d26b1c4a6 100644
--- a/registry/app/remote/controller/proxy/controller.go
+++ b/registry/app/remote/controller/proxy/controller.go
@@ -127,7 +127,7 @@ func (c *controller) EnsureTag(
 	// Fixme: Need to properly pick tag.
 	e := c.localManifestRegistry.DBTag(ctx, mfst, desc.Digest, info.Reference, rsHeaders, info)
 	if e != nil {
-		log.Error().Err(e).Msgf("Error in ensuring tag: %s", e)
+		log.Ctx(ctx).Error().Err(e).Msgf("Error in ensuring tag: %s", e)
 	}
 	return e
 }
@@ -167,7 +167,7 @@ func (c *controller) UseLocalManifest(
 	}
 
 	remoteRepo := getRemoteRepo(art)
-	exist, desc, err := remote.ManifestExist(remoteRepo, getReference(art)) // HEAD.
+	exist, desc, err := remote.ManifestExist(ctx, remoteRepo, getReference(art)) // HEAD.
 	// TODO: Check for rate limit error.
 	if err != nil {
 		if errors.IsRateLimitError(err) { // if rate limit, use localRegistry if it exists, otherwise return error.
@@ -177,7 +177,7 @@ func (c *controller) UseLocalManifest(
 		log.Ctx(ctx).Warn().Msgf("Error in checking remote manifest exist: %v", err)
 		return false, nil, err
 	}
-	log.Info().Msgf("Manifest exist: %t %s %d %s", exist, desc.Digest.String(), desc.Size, desc.MediaType)
+	log.Ctx(ctx).Info().Msgf("Manifest exist: %t %s %d %s", exist, desc.Digest.String(), desc.Size, desc.MediaType)
 
 	// TODO: Delete if does not exist on remote. Validate this
 	if !exist || desc == nil {
@@ -187,7 +187,7 @@ func (c *controller) UseLocalManifest(
 		return false, nil, errors.NotFoundError(fmt.Errorf("registry %v, tag %v not found", art.RegIdentifier, art.Tag))
 	}
 
-	log.Info().Msgf("Manifest: %s", getReference(art))
+	log.Ctx(ctx).Info().Msgf("Manifest: %s", getReference(art))
 	mediaType, payload, _ := man.Payload()
 
 	return true, &ManifestList{payload, d.Digest.String(), mediaType}, nil
@@ -211,10 +211,10 @@ func (c *controller) ProxyManifest(
 	var man manifest.Manifest
 	remoteRepo := getRemoteRepo(art)
 	ref := getReference(art)
-	man, dig, err := remote.Manifest(remoteRepo, ref)
+	man, dig, err := remote.Manifest(ctx, remoteRepo, ref)
 	if err != nil {
 		if errors.IsNotFoundErr(err) {
-			log.Info().Msgf("TODO: Delete manifest %s from localRegistry registry", dig)
+			log.Ctx(ctx).Info().Msgf("TODO: Delete manifest %s from localRegistry registry", dig)
 			// go func() {
 			//	c.localRegistry.DeleteManifest(remoteRepo, art.Tag)
 			// }()
@@ -222,7 +222,7 @@ func (c *controller) ProxyManifest(
 		return man, err
 	}
 	ct, _, err := man.Payload()
-	log.Info().Msgf("Content type: %s", ct)
+	log.Ctx(ctx).Info().Msgf("Content type: %s", ct)
 	if err != nil {
 		return man, err
 	}
@@ -281,13 +281,13 @@ func (c *controller) ProxyManifest(
 }
 
 func (c *controller) HeadManifest(
-	_ context.Context,
+	ctx context.Context,
 	art pkg.RegistryInfo,
 	remote RemoteInterface,
 ) (bool, *manifest.Descriptor, error) {
 	remoteRepo := getRemoteRepo(art)
 	ref := getReference(art)
-	return remote.ManifestExist(remoteRepo, ref)
+	return remote.ManifestExist(ctx, remoteRepo, ref)
 }
 
 func (c *controller) ProxyBlob(
@@ -304,11 +304,11 @@ func (c *controller) ProxyBlob(
 	}
 
 	remoteImage := getRemoteRepo(art)
-	log.Debug().Msgf("The blob doesn't exist, proxy the request to the target server, url:%v", remoteImage)
+	log.Ctx(ctx).Debug().Msgf("The blob doesn't exist, proxy the request to the target server, url:%v", remoteImage)
 
-	size, bReader, err := rHelper.BlobReader(remoteImage, art.Digest)
+	size, bReader, err := rHelper.BlobReader(ctx, remoteImage, art.Digest)
 	if err != nil {
-		log.Error().Stack().Err(err).Msgf("failed to pull blob, error %v", err)
+		log.Ctx(ctx).Error().Stack().Err(err).Msgf("failed to pull blob, error %v", err)
 		return 0, nil, errcode.ErrorCodeBlobUnknown.WithDetail(art.Digest)
 	}
 	desc := manifest.Descriptor{Size: size, Digest: digest.Digest(art.Digest)}
@@ -318,7 +318,7 @@ func (c *controller) ProxyBlob(
 		// Cloning Context.
 		session, ok := request.AuthSessionFrom(ctx)
 		if !ok {
-			log.Error().Stack().Err(err).Msg("failed to get auth session from context")
+			log.Ctx(ctx).Error().Stack().Err(err).Msg("failed to get auth session from context")
 			return
 		}
 		ctx2 := request.WithAuthSession(ctx, session)
@@ -344,27 +344,27 @@ func (c *controller) putBlobToLocal(
 	desc manifest.Descriptor,
 	r RemoteInterface,
 ) error {
-	log.Debug().
+	log.Ctx(ctx).Debug().
 		Msgf(
 			"Put blob to localRegistry registry!, sourceRepo:%v, localRepo:%v, digest: %v", image, localRepo,
 			desc.Digest,
 		)
-	cl, bReader, err := r.BlobReader(image, string(desc.Digest))
+	cl, bReader, err := r.BlobReader(ctx, image, string(desc.Digest))
 	if err != nil {
-		log.Error().Stack().Err(err).Msgf("failed to create blob reader, error %v", err)
+		log.Ctx(ctx).Error().Stack().Err(err).Msgf("failed to create blob reader, error %v", err)
 		return err
 	}
 	defer bReader.Close()
 	headers, errs := c.localRegistry.InitBlobUpload(ctx, art, "", "")
 	if len(errs) > 0 {
-		log.Error().Stack().Err(err).Msgf("failed to init blob upload, error %v", errs)
+		log.Ctx(ctx).Error().Stack().Err(err).Msgf("failed to init blob upload, error %v", errs)
 		return errs[0]
 	}
 
 	location, uuid := headers.Headers["Location"], headers.Headers["Docker-Upload-UUID"]
 	parsedURL, err := url.Parse(location)
 	if err != nil {
-		log.Error().Err(err).Msgf("Error parsing URL: %s", err)
+		log.Ctx(ctx).Error().Err(err).Msgf("Error parsing URL: %s", err)
 		return err
 	}
 	stateToken := parsedURL.Query().Get("_state")
@@ -385,7 +385,7 @@ func (c *controller) waitAndPushManifest(
 	}
 	err := h.CacheContent(ctx, art, contentType, man)
 	if err != nil {
-		log.Error().Stack().Err(err).Msgf("Error in caching manifest: %s", err)
+		log.Ctx(ctx).Error().Stack().Err(err).Msgf("Error in caching manifest: %s", err)
 		return err
 	}
 	return nil
@@ -449,7 +449,7 @@ func (m *ManifestCache) CacheContent(
 		time.Sleep(maxManifestMappingIntervalSec * time.Second)
 		err = m.localManifestRegistry.AddManifestAssociation(ctx, art.RegIdentifier, digest.Digest(art.Digest), art)
 		if err != nil {
-			log.Error().Stack().Err(err).Msgf("failed to add manifest association, error %v", err)
+			log.Ctx(ctx).Error().Stack().Err(err).Msgf("failed to add manifest association, error %v", err)
 			continue
 		}
 		return nil
@@ -464,11 +464,11 @@ func (m *ManifestListCache) CacheContent(
 ) error {
 	_, payload, err := man.Payload()
 	if err != nil {
-		log.Error().Msg("failed to get payload")
+		log.Ctx(ctx).Error().Msg("failed to get payload")
 		return err
 	}
 	if len(getReference(art)) == 0 {
-		log.Error().Msg("failed to get reference, reference is empty, skip to cache manifest list")
+		log.Ctx(ctx).Error().Msg("failed to get reference, reference is empty, skip to cache manifest list")
 		return fmt.Errorf("failed to get reference, reference is empty, skip to cache manifest list")
 	}
 	// cache key should contain digest if digest exist
@@ -477,7 +477,7 @@ func (m *ManifestListCache) CacheContent(
 	}
 
 	if err = m.push(ctx, art, man, contentType); err != nil {
-		log.Error().Msgf("error when push manifest list to local :%v", err)
+		log.Ctx(ctx).Error().Msgf("error when push manifest list to local :%v", err)
 		return err
 	}
 	log.Ctx(ctx).Info().Msgf("Successfully cached manifest list for image: %s, tag: %s, digest: %s",
@@ -493,10 +493,10 @@ func (m *ManifestListCache) push(
 	}
 	_, pl, err := man.Payload()
 	if err != nil {
-		log.Error().Msgf("failed to get payload, error %v", err)
+		log.Ctx(ctx).Error().Msgf("failed to get payload, error %v", err)
 		return err
 	}
-	log.Debug().Msgf("The manifest list payload: %v", string(pl))
+	log.Ctx(ctx).Debug().Msgf("The manifest list payload: %v", string(pl))
 	newDig := digest.FromBytes(pl)
 	// Because the manifest list maybe updated, need to recheck if it is exist in local
 	_, descriptor, manifest2, _ := m.localRegistry.PullManifest(ctx, art, nil, nil)
diff --git a/registry/app/remote/controller/proxy/maven/controller.go b/registry/app/remote/controller/proxy/maven/controller.go
index 4704599f2..ef491ee47 100644
--- a/registry/app/remote/controller/proxy/maven/controller.go
+++ b/registry/app/remote/controller/proxy/maven/controller.go
@@ -81,9 +81,9 @@ func (c *controller) ProxyFile(
 	filePath = strings.Trim(filePath, "/")
 
 	if serveFile {
-		responseHeaders, body, err = rHelper.GetFile(filePath)
+		responseHeaders, body, err = rHelper.GetFile(ctx, filePath)
 	} else {
-		responseHeaders, _, err = rHelper.HeadFile(filePath)
+		responseHeaders, _, err = rHelper.HeadFile(ctx, filePath)
 	}
 
 	if err != nil {
@@ -98,7 +98,7 @@ func (c *controller) ProxyFile(
 		// Cloning Context.
 		session, ok := request.AuthSessionFrom(ctx)
 		if !ok {
-			log.Error().Stack().Err(err).Msg("failed to get auth session from context")
+			log.Ctx(ctx).Error().Stack().Err(err).Msg("failed to get auth session from context")
 			return
 		}
 		ctx2 := request.WithAuthSession(ctx, session)
@@ -125,7 +125,7 @@ func (c *controller) putFileToLocal(
 
 	filePath = strings.Trim(filePath, "/")
 
-	_, fileReader, err := r.GetFile(filePath)
+	_, fileReader, err := r.GetFile(ctx, filePath)
 	if err != nil {
 		return err
 	}
diff --git a/registry/app/remote/controller/proxy/maven/remote.go b/registry/app/remote/controller/proxy/maven/remote.go
index 035301391..3dea21892 100644
--- a/registry/app/remote/controller/proxy/maven/remote.go
+++ b/registry/app/remote/controller/proxy/maven/remote.go
@@ -35,10 +35,10 @@ const MavenCentralURL = "https://repo1.maven.org/maven2"
 // RemoteInterface defines operations related to remote repository under proxy.
 type RemoteInterface interface {
 	// Download the file
-	GetFile(filePath string) (*commons.ResponseHeaders, io.ReadCloser, error)
+	GetFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, io.ReadCloser, error)
 
 	// Check existence of file
-	HeadFile(filePath string) (*commons.ResponseHeaders, bool, error)
+	HeadFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, bool, error)
 }
 
 type remoteHelper struct {
@@ -81,16 +81,16 @@ func (r *remoteHelper) init(ctx context.Context, spaceFinder refcache.SpaceFinde
 	}
 	reg, ok := adp.(adapter.ArtifactRegistry)
 	if !ok {
-		log.Warn().Msgf("Error: adp is not of type adapter.ArtifactRegistry")
+		log.Ctx(ctx).Warn().Msgf("Error: adp is not of type adapter.ArtifactRegistry")
 	}
 	r.registry = reg
 	return nil
 }
 
-func (r *remoteHelper) GetFile(filePath string) (*commons.ResponseHeaders, io.ReadCloser, error) {
-	return r.registry.GetFile(filePath)
+func (r *remoteHelper) GetFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, io.ReadCloser, error) {
+	return r.registry.GetFile(ctx, filePath)
 }
 
-func (r *remoteHelper) HeadFile(filePath string) (*commons.ResponseHeaders, bool, error) {
-	return r.registry.HeadFile(filePath)
+func (r *remoteHelper) HeadFile(ctx context.Context, filePath string) (*commons.ResponseHeaders, bool, error) {
+	return r.registry.HeadFile(ctx, filePath)
 }
diff --git a/registry/app/remote/controller/proxy/remote.go b/registry/app/remote/controller/proxy/remote.go
index 715691782..e6c2513c4 100644
--- a/registry/app/remote/controller/proxy/remote.go
+++ b/registry/app/remote/controller/proxy/remote.go
@@ -38,13 +38,13 @@ const DockerHubURL = "https://registry-1.docker.io"
 // RemoteInterface defines operations related to remote repository under proxy.
 type RemoteInterface interface {
 	// BlobReader create a reader for remote blob.
-	BlobReader(registry, dig string) (int64, io.ReadCloser, error)
+	BlobReader(ctx context.Context, registry, dig string) (int64, io.ReadCloser, error)
 	// Manifest get manifest by reference.
-	Manifest(registry string, ref string) (manifest.Manifest, string, error)
+	Manifest(ctx context.Context, registry string, ref string) (manifest.Manifest, string, error)
 	// ManifestExist checks manifest exist, if exist, return digest.
-	ManifestExist(registry string, ref string) (bool, *manifest.Descriptor, error)
+	ManifestExist(ctx context.Context, registry string, ref string) (bool, *manifest.Descriptor, error)
 	// ListTags returns all tags of the registry.
-	ListTags(registry string) ([]string, error)
+	ListTags(ctx context.Context, registry string) ([]string, error)
 
 	GetImageName(ctx context.Context, spacePathStore refcache.SpaceFinder, imageName string) (string, error)
 }
@@ -97,26 +97,30 @@ func (r *remoteHelper) init(ctx context.Context, spaceFinder refcache.SpaceFinde
 	}
 	reg, ok := adp.(adapter.ArtifactRegistry)
 	if !ok {
-		log.Warn().Msgf("Error: adp is not of type adapter.ArtifactRegistry")
+		log.Ctx(ctx).Warn().Msgf("Error: adp is not of type adapter.ArtifactRegistry")
 	}
 	r.registry = reg
 	return nil
 }
 
-func (r *remoteHelper) BlobReader(registry, dig string) (int64, io.ReadCloser, error) {
-	return r.registry.PullBlob(registry, dig)
+func (r *remoteHelper) BlobReader(ctx context.Context, registry, dig string) (int64, io.ReadCloser, error) {
+	return r.registry.PullBlob(ctx, registry, dig)
 }
 
-func (r *remoteHelper) Manifest(registry string, ref string) (manifest.Manifest, string, error) {
-	return r.registry.PullManifest(registry, ref)
+func (r *remoteHelper) Manifest(ctx context.Context, registry string, ref string) (manifest.Manifest, string, error) {
+	return r.registry.PullManifest(ctx, registry, ref)
 }
 
-func (r *remoteHelper) ManifestExist(registry string, ref string) (bool, *manifest.Descriptor, error) {
-	return r.registry.ManifestExist(registry, ref)
+func (r *remoteHelper) ManifestExist(ctx context.Context, registry string, ref string) (
+	bool,
+	*manifest.Descriptor,
+	error,
+) {
+	return r.registry.ManifestExist(ctx, registry, ref)
 }
 
-func (r *remoteHelper) ListTags(registry string) ([]string, error) {
-	return r.registry.ListTags(registry)
+func (r *remoteHelper) ListTags(ctx context.Context, registry string) ([]string, error) {
+	return r.registry.ListTags(ctx, registry)
 }
 
 func (r *remoteHelper) GetImageName(
diff --git a/registry/app/remote/registry/cargo.go b/registry/app/remote/registry/cargo.go
index 1e14039b6..b2cf50d38 100644
--- a/registry/app/remote/registry/cargo.go
+++ b/registry/app/remote/registry/cargo.go
@@ -15,12 +15,13 @@
 package registry
 
 import (
+	"context"
 	"io"
 
 	"github.com/harness/gitness/registry/app/metadata/cargo"
 )
 
 type CargoRegistry interface {
-	GetRegistryConfig() (*cargo.RegistryConfig, error)
-	GetPackageFile(filepath string) (io.ReadCloser, error)
+	GetRegistryConfig(ctx context.Context) (*cargo.RegistryConfig, error)
+	GetPackageFile(ctx context.Context, filepath string) (io.ReadCloser, error)
 }
diff --git a/registry/app/remote/registry/gopackage.go b/registry/app/remote/registry/gopackage.go
index 70c70b2f9..ea1d96ab8 100644
--- a/registry/app/remote/registry/gopackage.go
+++ b/registry/app/remote/registry/gopackage.go
@@ -15,9 +15,10 @@
 package registry
 
 import (
+	"context"
 	"io"
 )
 
 type GoPackageRegistry interface {
-	GetPackageFile(filepath string) (io.ReadCloser, error)
+	GetPackageFile(ctx context.Context, filepath string) (io.ReadCloser, error)
 }
diff --git a/registry/app/remote/registry/nuget.go b/registry/app/remote/registry/nuget.go
index 9d44513ed..24b80021e 100644
--- a/registry/app/remote/registry/nuget.go
+++ b/registry/app/remote/registry/nuget.go
@@ -23,7 +23,7 @@ import (
 
 type NugetRegistry interface {
 	GetPackage(ctx context.Context, pkg, version, proxyEndpoint, fileName string) (io.ReadCloser, error)
-	GetServiceEndpoint() (*nuget.ServiceEndpoint, error)
+	GetServiceEndpoint(ctx context.Context) (*nuget.ServiceEndpoint, error)
 	GetPackageMetadata(ctx context.Context, pkg, proxyEndpoint string) (io.ReadCloser, error)
 	GetPackageVersionMetadataV2(ctx context.Context, pkg, version string) (io.ReadCloser, error)
 	ListPackageVersion(ctx context.Context, pkg string) (io.ReadCloser, error)
diff --git a/registry/app/storage/blobStore.go b/registry/app/storage/blobStore.go
index 18e084e9c..14af03e4f 100644
--- a/registry/app/storage/blobStore.go
+++ b/registry/app/storage/blobStore.go
@@ -157,3 +157,12 @@ func (bs *genericBlobStore) Delete(ctx context.Context, filePath string) error {
 	}
 	return nil
 }
+
+func (bs *genericBlobStore) Stat(ctx context.Context, filePath string) (int64, error) {
+	dcontext.GetLogger(ctx, log.Ctx(ctx).Debug()).Msg("(*genericBlobStore).Stat")
+	fileInfo, err := bs.driver.Stat(ctx, filePath)
+	if err != nil {
+		return -1, err
+	}
+	return fileInfo.Size(), nil
+}
diff --git a/registry/app/storage/blobs.go b/registry/app/storage/blobs.go
index ae53f86b1..93b6c4505 100644
--- a/registry/app/storage/blobs.go
+++ b/registry/app/storage/blobs.go
@@ -180,4 +180,5 @@ type GenericBlobStore interface {
 
 	Get(ctx context.Context, filePath string, size int64, filename string) (*FileReader, string, error)
 	GetWithNoRedirect(ctx context.Context, filePath string, size int64) (*FileReader, error)
+	Stat(ctx context.Context, filePath string) (int64, error)
 }
diff --git a/registry/app/storage/blobwriter_resumable.go b/registry/app/storage/blobwriter_resumable.go
index e4a05a000..433568a0e 100644
--- a/registry/app/storage/blobwriter_resumable.go
+++ b/registry/app/storage/blobwriter_resumable.go
@@ -69,7 +69,7 @@ func (bw *blobWriter) resumeDigest(ctx context.Context) error {
 
 	if hashStateMatch.offset == 0 {
 		// No need to load any state, just reset the hasher.
-		h.(hash.Hash).Reset()
+		h.(hash.Hash).Reset() //nolint:errcheck
 	} else {
 		storedState, err := bw.driver.GetContent(ctx, hashStateMatch.path)
 		if err != nil {
@@ -126,7 +126,7 @@ func (bw *blobWriter) getStoredHashStates(ctx context.Context) ([]hashStateEntry
 		// The suffix should be the offset.
 		offset, err := strconv.ParseInt(pathSuffix, 0, 64)
 		if err != nil {
-			log.Error().Msgf("unable to parse offset from upload state path %q: %s", p, err)
+			log.Ctx(ctx).Error().Msgf("unable to parse offset from upload state path %q: %s", p, err)
 		}
 
 		hashStateEntries = append(hashStateEntries, hashStateEntry{offset: offset, path: p})
diff --git a/registry/app/store/database.go b/registry/app/store/database.go
index fbe256979..015a8703e 100644
--- a/registry/app/store/database.go
+++ b/registry/app/store/database.go
@@ -122,6 +122,11 @@ type ManifestRepository interface {
 		imageName string,
 		digest types.Digest,
 	) (*types.Payload, error)
+
+	FindManifestDigestByTagName(
+		ctx context.Context, regID int64,
+		imageName string, tag string,
+	) (types.Digest, error)
 	Get(ctx context.Context, manifestID int64) (*types.Manifest, error)
 	DeleteManifest(
 		ctx context.Context, repoID int64,
@@ -330,6 +335,7 @@ type UpstreamProxyConfigRepository interface {
 
 type RegistryMetadata struct {
 	RegID         string
+	ParentID      int64
 	RegIdentifier string
 	Description   string
 	PackageType   artifact.PackageType
@@ -367,7 +373,7 @@ type RegistryRepository interface {
 
 	GetAll(
 		ctx context.Context,
-		parentID int64,
+		parentIDs []int64,
 		packageTypes []string,
 		sortByField string,
 		sortByOrder string,
@@ -375,11 +381,10 @@ type RegistryRepository interface {
 		offset int,
 		search string,
 		repoType string,
-		recursive bool,
 	) (repos *[]RegistryMetadata, err error)
 
 	CountAll(
-		ctx context.Context, parentID int64, packageTypes []string,
+		ctx context.Context, parentIDs []int64, packageTypes []string,
 		search string, repoType string,
 	) (count int64, err error)
 
@@ -610,6 +615,9 @@ type NodesRepository interface {
 		path string,
 	) (*types.Node, error)
 
+	// GetByBlobIDAndRegistryID retrieves a node by its blob ID and registry ID.
+	GetByBlobIDAndRegistryID(ctx context.Context, blobID string, registryID int64) (*types.Node, error)
+
 	GetFilesMetadataByPathAndRegistryID(
 		ctx context.Context, registryID int64, path string,
 		sortByField string,
@@ -737,8 +745,8 @@ type QuarantineArtifactRepository interface {
 	GetByFilePath(
 		ctx context.Context, filePath string,
 		registryID int64,
-		version string,
 		artifact string,
+		version string,
 	) ([]*types.QuarantineArtifact, error)
 	DeleteByRegistryIDArtifactAndFilePath(
 		ctx context.Context, registryID int64,
diff --git a/registry/app/store/database/artifact.go b/registry/app/store/database/artifact.go
index 7308b7af2..9033df601 100644
--- a/registry/app/store/database/artifact.go
+++ b/registry/app/store/database/artifact.go
@@ -602,7 +602,7 @@ func (a ArtifactDao) GetArtifactsByRepo(
 		r.registry_package_type as package_type, a.artifact_version as latest_version, 
 		a.artifact_updated_at as modified_at, i.image_labels as labels, 
 		COALESCE(t2.download_count, 0) as download_count,
-		(qp.quarantined_path_id IS NOT NULL) AS is_quarantined`,
+        (qp.quarantined_path_id IS NOT NULL) AS is_quarantined`,
 	).
 		From("artifacts a").
 		Join(
@@ -828,7 +828,8 @@ func (a ArtifactDao) GetAllVersionsByRepoAndImage(
         a.artifact_metadata ->> 'size' AS size, 
         a.artifact_metadata ->> 'file_count' AS file_count,
         a.artifact_updated_at AS modified_at,
-        (qp.quarantined_path_id IS NOT NULL) AS is_quarantined`,
+        (qp.quarantined_path_id IS NOT NULL) AS is_quarantined,
+         qp.quarantined_path_reason as quarantine_reason`,
 		)
 
 	if a.db.DriverName() == SQLITE3 {
@@ -838,7 +839,8 @@ func (a ArtifactDao) GetAllVersionsByRepoAndImage(
         json_extract(a.artifact_metadata, '$.size') AS size,
         json_extract(a.artifact_metadata, '$.file_count') AS file_count,
         a.artifact_updated_at AS modified_at,
-        (qp.quarantined_path_id IS NOT NULL) AS is_quarantined`,
+        (qp.quarantined_path_id IS NOT NULL) AS is_quarantined,
+         qp.quarantined_path_reason as quarantine_reason`,
 		)
 	}
 
@@ -1106,17 +1108,18 @@ func (a ArtifactDao) mapToArtifactMetadata(
 	dst *artifactMetadataDB,
 ) (*types.ArtifactMetadata, error) {
 	artifactMetadata := &types.ArtifactMetadata{
-		ID:            dst.ID,
-		Name:          dst.Name,
-		RepoName:      dst.RepoName,
-		DownloadCount: dst.DownloadCount,
-		PackageType:   dst.PackageType,
-		LatestVersion: dst.LatestVersion,
-		Labels:        util.StringToArr(dst.Labels.String),
-		CreatedAt:     time.UnixMilli(dst.CreatedAt),
-		ModifiedAt:    time.UnixMilli(dst.ModifiedAt),
-		Version:       dst.Version,
-		IsQuarantined: dst.IsQuarantined,
+		ID:               dst.ID,
+		Name:             dst.Name,
+		RepoName:         dst.RepoName,
+		DownloadCount:    dst.DownloadCount,
+		PackageType:      dst.PackageType,
+		LatestVersion:    dst.LatestVersion,
+		Labels:           util.StringToArr(dst.Labels.String),
+		CreatedAt:        time.UnixMilli(dst.CreatedAt),
+		ModifiedAt:       time.UnixMilli(dst.ModifiedAt),
+		Version:          dst.Version,
+		IsQuarantined:    dst.IsQuarantined,
+		QuarantineReason: dst.QuarantineReason,
 	}
 	if dst.Metadata != nil {
 		artifactMetadata.Metadata = *dst.Metadata
@@ -1137,13 +1140,14 @@ func (a ArtifactDao) mapToNonOCIMetadata(
 		fileCount = *dst.FileCount
 	}
 	return &types.NonOCIArtifactMetadata{
-		Name:          dst.Name,
-		DownloadCount: dst.DownloadCount,
-		PackageType:   dst.PackageType,
-		Size:          size,
-		FileCount:     fileCount,
-		ModifiedAt:    time.UnixMilli(dst.ModifiedAt),
-		IsQuarantined: dst.IsQuarantined,
+		Name:             dst.Name,
+		DownloadCount:    dst.DownloadCount,
+		PackageType:      dst.PackageType,
+		Size:             size,
+		FileCount:        fileCount,
+		ModifiedAt:       time.UnixMilli(dst.ModifiedAt),
+		IsQuarantined:    dst.IsQuarantined,
+		QuarantineReason: dst.QuarantineReason,
 	}
 }
 
@@ -1159,14 +1163,15 @@ func (a ArtifactDao) mapToNonOCIMetadataList(
 }
 
 type nonOCIArtifactMetadataDB struct {
-	ID            string               `db:"id"`
-	Name          string               `db:"name"`
-	Size          *string              `db:"size"`
-	PackageType   artifact.PackageType `db:"package_type"`
-	FileCount     *int64               `db:"file_count"`
-	ModifiedAt    int64                `db:"modified_at"`
-	DownloadCount int64                `db:"download_count"`
-	IsQuarantined bool                 `db:"is_quarantined"`
+	ID               string               `db:"id"`
+	Name             string               `db:"name"`
+	Size             *string              `db:"size"`
+	PackageType      artifact.PackageType `db:"package_type"`
+	FileCount        *int64               `db:"file_count"`
+	ModifiedAt       int64                `db:"modified_at"`
+	DownloadCount    int64                `db:"download_count"`
+	IsQuarantined    bool                 `db:"is_quarantined"`
+	QuarantineReason *string              `db:"quarantine_reason"`
 }
 
 type downloadCountResult struct {
diff --git a/registry/app/store/database/manifest.go b/registry/app/store/database/manifest.go
index 8d2f9722f..ccd43074b 100644
--- a/registry/app/store/database/manifest.go
+++ b/registry/app/store/database/manifest.go
@@ -535,6 +535,37 @@ func (dao manifestDao) FindManifestByTagName(
 	return dao.mapToManifest(dst)
 }
 
+// FindManifestDigestByTagName finds a manifest digest by tag name within a repository.
+func (dao manifestDao) FindManifestDigestByTagName(
+	ctx context.Context, regID int64,
+	imageName string, tag string,
+) (types.Digest, error) {
+	stmt := database.Builder.Select("manifest_digest").
+		From("manifests m").
+		Join("tags t ON t.tag_manifest_id = m.manifest_id").
+		Where(
+			"manifest_registry_id = ? AND manifest_image_name = ? AND t.tag_name = ?",
+			regID, imageName, tag,
+		)
+
+	toSQL, args, err := stmt.ToSql()
+	if err != nil {
+		return "", fmt.Errorf("failed to convert manifest digest query to sql: %w", err)
+	}
+
+	var manifestDigestBytes []byte
+	db := dbtx.GetAccessor(ctx, dao.sqlDB)
+
+	if err = db.GetContext(ctx, &manifestDigestBytes, toSQL, args...); err != nil {
+		err := database.ProcessSQLErrorf(ctx, err, "Failed to find manifest digest")
+		return "", err
+	}
+
+	// Convert byte digest to hex-encoded string
+	manifestDigest := types.Digest(util.GetHexEncodedString(manifestDigestBytes))
+	return manifestDigest, nil
+}
+
 func (dao manifestDao) GetManifestPayload(
 	ctx context.Context,
 	parentID int64,
@@ -646,7 +677,7 @@ func (dao manifestDao) ListManifestsBySubject(
 	dst := []*manifestMetadataDB{}
 	db := dbtx.GetAccessor(ctx, dao.sqlDB)
 
-	if err = db.SelectContext(ctx, dst, toSQL, args...); err != nil {
+	if err = db.SelectContext(ctx, &dst, toSQL, args...); err != nil {
 		err := database.ProcessSQLErrorf(ctx, err, "Failed to find manifest")
 		return nil, err
 	}
diff --git a/registry/app/store/database/node.go b/registry/app/store/database/node.go
index 38345adaf..1925bc4a2 100644
--- a/registry/app/store/database/node.go
+++ b/registry/app/store/database/node.go
@@ -99,6 +99,27 @@ func (n NodeDao) GetByNameAndRegistryID(ctx context.Context, registryID int64, n
 	return n.mapToNode(ctx, dst)
 }
 
+func (n NodeDao) GetByBlobIDAndRegistryID(ctx context.Context, blobID string, registryID int64) (*types.Node, error) {
+	q := databaseg.Builder.
+		Select(util.ArrToStringByDelimiter(util.GetDBTagsFromStruct(Nodes{}), ",")).
+		From("nodes").
+		Where("node_generic_blob_id = ? AND node_registry_id = ?", blobID, registryID).Limit(1)
+
+	db := dbtx.GetAccessor(ctx, n.sqlDB)
+
+	dst := new(Nodes)
+	_sql, args, err := q.ToSql()
+	if err != nil {
+		return nil, errors.Wrap(err, "Failed to convert query to sql")
+	}
+
+	if err = db.GetContext(ctx, dst, _sql, args...); err != nil {
+		return nil, databaseg.ProcessSQLErrorf(ctx, err, "Failed to find node with registry id %d", registryID)
+	}
+
+	return n.mapToNode(ctx, dst)
+}
+
 func (n NodeDao) FindByPathAndRegistryID(
 	ctx context.Context, registryID int64, path string,
 ) (*types.Node, error) {
diff --git a/registry/app/store/database/oci_image_index_mapping.go b/registry/app/store/database/oci_image_index_mapping.go
index badf779d5..205103c0f 100644
--- a/registry/app/store/database/oci_image_index_mapping.go
+++ b/registry/app/store/database/oci_image_index_mapping.go
@@ -146,7 +146,7 @@ func mapToInternalOCIMapping(ctx context.Context, in *types.OCIImageIndexMapping
 	in.UpdatedBy = session.Principal.ID
 	childBytes, err := types.GetDigestBytes(in.ChildManifestDigest)
 	if err != nil {
-		log.Error().Msgf("failed to get digest bytes: %v", err)
+		log.Ctx(ctx).Error().Msgf("failed to get digest bytes: %v", err)
 	}
 
 	return &ociImageIndexMappingDB{
diff --git a/registry/app/store/database/quarantine_artifact.go b/registry/app/store/database/quarantine_artifact.go
index b3dc2f2fa..a7ab6de5a 100644
--- a/registry/app/store/database/quarantine_artifact.go
+++ b/registry/app/store/database/quarantine_artifact.go
@@ -77,12 +77,12 @@ func (q QuarantineArtifactDao) GetByFilePath(ctx context.Context,
 	db := dbtx.GetAccessor(ctx, q.db)
 
 	dst := []*QuarantineArtifactDB{}
-	sql, args, err := stmtBuilder.ToSql()
+	sqlQuery, args, err := stmtBuilder.ToSql()
 	if err != nil {
 		return nil, errors.Wrap(err, "Failed to convert query to sql")
 	}
 
-	if err := db.SelectContext(ctx, &dst, sql, args...); err != nil {
+	if err := db.SelectContext(ctx, &dst, sqlQuery, args...); err != nil && !errors.Is(err, sql.ErrNoRows) {
 		return nil, databaseg.ProcessSQLErrorf(ctx, err, "Failed to find quarantine artifacts with the provided criteria")
 	}
 
diff --git a/registry/app/store/database/registry.go b/registry/app/store/database/registry.go
index a09f99fd8..07a971007 100644
--- a/registry/app/store/database/registry.go
+++ b/registry/app/store/database/registry.go
@@ -18,7 +18,6 @@ import (
 	"context"
 	"database/sql"
 	"fmt"
-	"github.com/google/uuid"
 	"time"
 
 	"github.com/harness/gitness/app/api/request"
@@ -33,6 +32,7 @@ import (
 	"github.com/harness/gitness/store/database/dbtx"
 
 	sq "github.com/Masterminds/squirrel"
+	"github.com/google/uuid"
 	"github.com/jmoiron/sqlx"
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog/log"
@@ -239,6 +239,7 @@ func (r registryDao) GetByIDIn(ctx context.Context, ids []int64) (*[]types.Regis
 
 type RegistryMetadataDB struct {
 	RegID         string                `db:"registry_id"`
+	ParentID      int64                 `db:"parent_id"`
 	RegIdentifier string                `db:"reg_identifier"`
 	Description   sql.NullString        `db:"description"`
 	PackageType   artifact.PackageType  `db:"package_type"`
@@ -253,7 +254,7 @@ type RegistryMetadataDB struct {
 
 func (r registryDao) GetAll(
 	ctx context.Context,
-	parentID int64,
+	parentIDs []int64,
 	packageTypes []string,
 	sortByField string,
 	sortByOrder string,
@@ -261,13 +262,13 @@ func (r registryDao) GetAll(
 	offset int,
 	search string,
 	repoType string,
-	recursive bool,
 ) (repos *[]store.RegistryMetadata, err error) {
 	if limit < 0 || offset < 0 {
 		return nil, fmt.Errorf("limit and offset must be non-negative")
 	}
 	selectFields := `
 		r.registry_id AS registry_id,
+		r.registry_parent_id AS parent_id,
 		r.registry_name AS reg_identifier,
 		COALESCE(r.registry_description, '') AS description, 
 		r.registry_package_type AS package_type,
@@ -314,37 +315,20 @@ func (r registryDao) GetAll(
 	`
 
 	var query sq.SelectBuilder
-	if recursive {
-		query = databaseg.Builder.
-			Select(selectFields).
-			From("registry_hierarchy_u rh").
-			InnerJoin("registries r ON rh.registry_id = r.registry_id").
-			LeftJoin("upstream_proxy_configs u ON r.registry_id = u.upstream_proxy_config_registry_id").
-			LeftJoin(fmt.Sprintf("(%s) AS artifact_count ON r.registry_id = artifact_count.image_registry_id",
-				artifactCountSubquery)).
-			LeftJoin(fmt.Sprintf("(%s) AS blob_sizes ON r.registry_id = blob_sizes.rblob_registry_id",
-				blobSizesSubquery)).
-			//nolint:lll
-			LeftJoin(fmt.Sprintf("(%s) AS generic_blob_sizes ON r.registry_id = generic_blob_sizes.node_registry_id",
-				genericBlobSizesSubquery)).
-			LeftJoin(fmt.Sprintf("(%s) AS download_stats ON r.registry_id = download_stats.registry_id",
-				downloadStatsSubquery))
-	} else {
-		query = databaseg.Builder.
-			Select(selectFields).
-			From("registries r").
-			LeftJoin("upstream_proxy_configs u ON r.registry_id = u.upstream_proxy_config_registry_id").
-			LeftJoin(fmt.Sprintf("(%s) AS artifact_count ON r.registry_id = artifact_count.image_registry_id",
-				artifactCountSubquery)).
-			LeftJoin(fmt.Sprintf("(%s) AS blob_sizes ON r.registry_id = blob_sizes.rblob_registry_id",
-				blobSizesSubquery)).
-			//nolint:lll
-			LeftJoin(fmt.Sprintf("(%s) AS generic_blob_sizes ON r.registry_id = generic_blob_sizes.node_registry_id",
-				genericBlobSizesSubquery)).
-			LeftJoin(fmt.Sprintf("(%s) AS download_stats ON r.registry_id = download_stats.registry_id",
-				downloadStatsSubquery)).
-			Where("r.registry_parent_id = ?", parentID)
-	}
+	query = databaseg.Builder.
+		Select(selectFields).
+		From("registries r").
+		LeftJoin("upstream_proxy_configs u ON r.registry_id = u.upstream_proxy_config_registry_id").
+		LeftJoin(fmt.Sprintf("(%s) AS artifact_count ON r.registry_id = artifact_count.image_registry_id",
+			artifactCountSubquery)).
+		LeftJoin(fmt.Sprintf("(%s) AS blob_sizes ON r.registry_id = blob_sizes.rblob_registry_id",
+			blobSizesSubquery)).
+		//nolint:lll
+		LeftJoin(fmt.Sprintf("(%s) AS generic_blob_sizes ON r.registry_id = generic_blob_sizes.node_registry_id",
+			genericBlobSizesSubquery)).
+		LeftJoin(fmt.Sprintf("(%s) AS download_stats ON r.registry_id = download_stats.registry_id",
+			downloadStatsSubquery)).
+		Where(sq.Eq{"r.registry_parent_id": parentIDs})
 	// Apply search filter
 	if search != "" {
 		query = query.Where("r.registry_name LIKE ?", "%"+search+"%")
@@ -379,16 +363,6 @@ func (r registryDao) GetAll(
 		return nil, errors.Wrap(err, "Failed to convert query to SQL")
 	}
 
-	if recursive {
-		var cte string
-		if r.db.DriverName() == SQLITE3 {
-			cte = buildCTESqlite(parentID)
-		} else {
-			cte = buildCTE(parentID)
-		}
-		// Add CTE to the query
-		sql = cte + sql
-	}
 	// Log the final query
 	finalQuery := util.ConstructQuery(sql, args)
 	log.Ctx(ctx).Debug().
@@ -406,113 +380,13 @@ func (r registryDao) GetAll(
 	return r.mapToRegistryMetadataList(ctx, dst)
 }
 
-// buildCTE constructs a Common Table Expression (CTE) query in SQL for traversing
-// a hierarchical structure of spaces and retrieving relevant registry IDs.
-//
-// Parameters:
-// - parentID (int64): The starting space ID for the hierarchy traversal.
-//
-// Returns:
-// - A formatted SQL string representing the CTE.
-//
-// Explanation:
-// 1. The CTE is recursive and consists of two parts:
-//    - Base case: Selects the initial node (space) with the given space_id (`parentID`).
-//      It initializes the recursion level and tracks the path of visited nodes.
-//    - Recursive step: Traverses the hierarchy upwards by joining the parent ID of
-//      the current level with the space ID of the next level.
-//      It ensures nodes are not revisited (`NOT s.space_id = ANY(sh.path)`), the recursion
-//      doesn't exceed a depth of 10 (`sh.recursion_level < 10`), and parent IDs are valid.
-//
-// 2. Once the hierarchy is built, a second CTE (`registry_hierarchy_u`) selects unique
-//    registry IDs from the `registries` table where `registry_parent_id` matches any
-//    `space_id` from the hierarchical result.
-//
-// 3. The function uses `fmt.Sprintf` to inject the `parentID` into the SQL query template
-//    before returning the final query string.
-
-func buildCTE(parentID int64) string {
-	cte := `
-	WITH RECURSIVE space_hierarchy AS (
-		-- Base case: Start with nodes having registry_parent_id = $1
-		SELECT
-			s.space_id,
-			s.space_parent_id,
-			CAST(1 AS INTEGER) AS recursion_level, -- Initialize recursion level
-			ARRAY[s.space_id] AS path -- Track visited nodes
-		FROM
-			spaces s
-		WHERE
-			s.space_id = %d
-		UNION 
-		-- Recursive step: Traverse the hierarchy upward to the root
-		SELECT
-			s.space_id,
-			s.space_parent_id,
-			sh.recursion_level + 1 AS recursion_level, -- Increment recursion level
-			sh.path || s.space_id -- Append current node to the path
-		FROM
-			spaces s
-		INNER JOIN
-			space_hierarchy sh ON sh.space_parent_id = s.space_id -- Match parent to child
-		WHERE
-			NOT s.space_id = ANY(sh.path) -- Avoid revisiting nodes	
-			AND sh.space_parent_id IS NOT NULL
-			AND sh.recursion_level < 10 -- Limit recursion depth
-	),
-	registry_hierarchy_u AS (
-		SELECT DISTINCT registry_id FROM registries where registry_parent_id IN (
-		  SELECT DISTINCT space_id FROM space_hierarchy))
-`
-	cte = fmt.Sprintf(cte, parentID)
-	return cte
-}
-
-// buildCTESqlite is equivalent to buildCTE but for SQLite.
-func buildCTESqlite(parentID int64) string {
-	cte := `
-	WITH RECURSIVE space_hierarchy AS (
-		-- Base case: Start with nodes having registry_parent_id = %d
-		SELECT
-			s.space_id,
-			s.space_parent_id,
-			CAST(1 AS INTEGER) AS recursion_level, -- Initialize recursion level
-			json_array(s.space_id) AS path -- Track visited nodes
-		FROM
-			spaces s
-		WHERE
-			s.space_id = %d
-		UNION 
-		-- Recursive step: Traverse the hierarchy upward to the root
-		SELECT
-			s.space_id,
-			s.space_parent_id,
-			sh.recursion_level + 1 AS recursion_level, -- Increment recursion level
-			json(sh.path || ',' || json(s.space_id)) -- Append current node to the path
-		FROM
-			spaces s
-		INNER JOIN
-			space_hierarchy sh ON sh.space_parent_id = s.space_id -- Match parent to child
-		WHERE
-			s.space_id NOT IN (SELECT value FROM json_each(sh.path)) -- Avoid revisiting nodes
-			AND sh.space_parent_id IS NOT NULL
-			AND sh.recursion_level < 10 -- Limit recursion depth
-	),
-	registry_hierarchy_u AS (
-		SELECT DISTINCT registry_id FROM registries where registry_parent_id IN (
-		  SELECT DISTINCT space_id FROM space_hierarchy))
-	`
-	// Correctly format the string using parentID
-	return fmt.Sprintf(cte, parentID, parentID)
-}
-
 func (r registryDao) CountAll(
-	ctx context.Context, parentID int64,
+	ctx context.Context, parentIDs []int64,
 	packageTypes []string, search string, repoType string,
 ) (int64, error) {
 	stmt := databaseg.Builder.Select("COUNT(*)").
 		From("registries").
-		Where("registry_parent_id = ?", parentID)
+		Where(sq.Eq{"registry_parent_id": parentIDs})
 
 	if !commons.IsEmpty(search) {
 		stmt = stmt.Where("registry_name LIKE ?", "%"+search+"%")
@@ -786,6 +660,7 @@ func (r registryDao) mapToRegistryMetadataList(
 func (r registryDao) mapToRegistryMetadata(_ context.Context, dst *RegistryMetadataDB) *store.RegistryMetadata {
 	return &store.RegistryMetadata{
 		RegID:         dst.RegID,
+		ParentID:      dst.ParentID,
 		RegIdentifier: dst.RegIdentifier,
 		Description:   dst.Description.String,
 		PackageType:   dst.PackageType,
diff --git a/registry/app/store/database/tag.go b/registry/app/store/database/tag.go
index 414bfc82f..a47acd19a 100644
--- a/registry/app/store/database/tag.go
+++ b/registry/app/store/database/tag.go
@@ -74,19 +74,20 @@ type tagDB struct {
 }
 
 type artifactMetadataDB struct {
-	ID            int64                `db:"artifact_id"`
-	Name          string               `db:"name"`
-	RepoName      string               `db:"repo_name"`
-	DownloadCount int64                `db:"download_count"`
-	PackageType   artifact.PackageType `db:"package_type"`
-	Labels        sql.NullString       `db:"labels"`
-	LatestVersion string               `db:"latest_version"`
-	CreatedAt     int64                `db:"created_at"`
-	ModifiedAt    int64                `db:"modified_at"`
-	Tag           *string              `db:"tag"`
-	Version       string               `db:"version"`
-	Metadata      *json.RawMessage     `db:"metadata"`
-	IsQuarantined bool                 `db:"is_quarantined"`
+	ID               int64                `db:"artifact_id"`
+	Name             string               `db:"name"`
+	RepoName         string               `db:"repo_name"`
+	DownloadCount    int64                `db:"download_count"`
+	PackageType      artifact.PackageType `db:"package_type"`
+	Labels           sql.NullString       `db:"labels"`
+	LatestVersion    string               `db:"latest_version"`
+	CreatedAt        int64                `db:"created_at"`
+	ModifiedAt       int64                `db:"modified_at"`
+	Tag              *string              `db:"tag"`
+	Version          string               `db:"version"`
+	Metadata         *json.RawMessage     `db:"metadata"`
+	IsQuarantined    bool                 `db:"is_quarantined"`
+	QuarantineReason *string              `db:"quarantine_reason"`
 }
 
 type tagMetadataDB struct {
@@ -374,7 +375,8 @@ func (t tagDao) GetAllArtifactsByParentID(
 
 	// Combine q1 and q2 with UNION ALL
 	finalQuery := fmt.Sprintf(`
-    SELECT repo_name, name, package_type, version, modified_at, labels, download_count
+    SELECT repo_name, name, package_type, version, modified_at,
+           labels, download_count, is_quarantined, quarantine_reason
     FROM (%s UNION ALL %s) AS combined
 `, q1SQL, q2SQL)
 
@@ -414,7 +416,9 @@ func (t tagDao) GetAllArtifactsQueryByParentIDForOCI(
 		t.tag_name as version, 
 		t.tag_updated_at as modified_at, 
 		i.image_labels as labels, 
-		COALESCE(t2.download_count,0) as download_count `,
+		COALESCE(t2.download_count,0) as download_count,
+		false as is_quarantined,
+		'' as quarantine_reason `,
 	).
 		From("tags t").
 		Join("registries r ON t.tag_registry_id = r.registry_id").
@@ -471,7 +475,8 @@ func (t tagDao) GetAllArtifactOnParentIDQueryForNonOCI(
 		ar.artifact_updated_at as modified_at, 
 		i.image_labels as labels, 
 		COALESCE(t2.download_count, 0) as download_count,
-		(qp.quarantined_path_id IS NOT NULL) AS is_quarantined`,
+		(qp.quarantined_path_id IS NOT NULL) AS is_quarantined,
+	     qp.quarantined_path_reason as quarantine_reason`,
 	).
 		From("artifacts ar").
 		Join("images i ON i.image_id = ar.artifact_image_id").
@@ -1177,16 +1182,17 @@ func (t tagDao) mapToArtifactMetadata(
 		version = *dst.Tag
 	}
 	return &types.ArtifactMetadata{
-		Name:          dst.Name,
-		RepoName:      dst.RepoName,
-		DownloadCount: dst.DownloadCount,
-		PackageType:   dst.PackageType,
-		LatestVersion: dst.LatestVersion,
-		Labels:        util.StringToArr(dst.Labels.String),
-		CreatedAt:     time.UnixMilli(dst.CreatedAt),
-		ModifiedAt:    time.UnixMilli(dst.ModifiedAt),
-		Version:       version,
-		IsQuarantined: dst.IsQuarantined,
+		Name:             dst.Name,
+		RepoName:         dst.RepoName,
+		DownloadCount:    dst.DownloadCount,
+		PackageType:      dst.PackageType,
+		LatestVersion:    dst.LatestVersion,
+		Labels:           util.StringToArr(dst.Labels.String),
+		CreatedAt:        time.UnixMilli(dst.CreatedAt),
+		ModifiedAt:       time.UnixMilli(dst.ModifiedAt),
+		Version:          version,
+		IsQuarantined:    dst.IsQuarantined,
+		QuarantineReason: dst.QuarantineReason,
 	}, nil
 }
 
diff --git a/registry/services/webhook/helper.go b/registry/services/webhook/helper.go
index ee4709c5f..89a94942a 100644
--- a/registry/services/webhook/helper.go
+++ b/registry/services/webhook/helper.go
@@ -45,7 +45,7 @@ func GetArtifactCreatedPayload(
 		ArtifactType: info.PackageType,
 	}
 	artifactURL := urlProvider.RegistryURL(ctx, info.RootIdentifier, regIdentifier) + "/" + info.Image + ":" + tag
-	urlWithoutProtocol := GetRepoURLWithoutProtocol(artifactURL)
+	urlWithoutProtocol := GetRepoURLWithoutProtocol(ctx, artifactURL)
 	baseArtifact := registryevents.BaseArtifact{
 		Name: info.Image,
 		Ref:  fmt.Sprintf("%s:%s", info.Image, tag),
@@ -86,7 +86,7 @@ func GetArtifactDeletedPayload(
 		ArtifactType: packageType,
 	}
 	artifactURL := urlProvider.RegistryURL(ctx, rootIdentifier, regIdentifier) + "/" + image + ":" + tag
-	urlWithoutProtocol := GetRepoURLWithoutProtocol(artifactURL)
+	urlWithoutProtocol := GetRepoURLWithoutProtocol(ctx, artifactURL)
 
 	baseArtifact := registryevents.BaseArtifact{
 		Name: image,
@@ -154,11 +154,11 @@ func GetArtifactDeletedPayloadForCommonArtifacts(
 	}
 }
 
-func GetRepoURLWithoutProtocol(registryURL string) string {
+func GetRepoURLWithoutProtocol(ctx context.Context, registryURL string) string {
 	repoURL := registryURL
 	parsedURL, err := url.Parse(repoURL)
 	if err != nil {
-		log.Error().Stack().Err(err).Msg("Error parsing URL: ")
+		log.Ctx(ctx).Error().Stack().Err(err).Msg("Error parsing URL: ")
 		return ""
 	}
 
diff --git a/registry/types/artifact.go b/registry/types/artifact.go
index dc9a39e64..7a1347129 100644
--- a/registry/types/artifact.go
+++ b/registry/types/artifact.go
@@ -35,12 +35,13 @@ type Artifact struct {
 }
 
 type NonOCIArtifactMetadata struct {
-	ID            string
-	Name          string
-	Size          string
-	PackageType   artifact.PackageType
-	FileCount     int64
-	ModifiedAt    time.Time
-	DownloadCount int64
-	IsQuarantined bool
+	ID               string
+	Name             string
+	Size             string
+	PackageType      artifact.PackageType
+	FileCount        int64
+	ModifiedAt       time.Time
+	DownloadCount    int64
+	IsQuarantined    bool
+	QuarantineReason *string
 }
diff --git a/registry/types/tag.go b/registry/types/tag.go
index 2970a41c5..9fa00ff3f 100644
--- a/registry/types/tag.go
+++ b/registry/types/tag.go
@@ -35,18 +35,19 @@ type Tag struct {
 }
 
 type ArtifactMetadata struct {
-	ID            int64
-	Name          string
-	RepoName      string
-	DownloadCount int64
-	PackageType   artifact.PackageType
-	Labels        []string
-	LatestVersion string
-	CreatedAt     time.Time
-	ModifiedAt    time.Time
-	Version       string
-	Metadata      json.RawMessage
-	IsQuarantined bool
+	ID               int64
+	Name             string
+	RepoName         string
+	DownloadCount    int64
+	PackageType      artifact.PackageType
+	Labels           []string
+	LatestVersion    string
+	CreatedAt        time.Time
+	ModifiedAt       time.Time
+	Version          string
+	Metadata         json.RawMessage
+	IsQuarantined    bool
+	QuarantineReason *string
 }
 
 type ImageMetadata struct {
diff --git a/types/gitspace.go b/types/gitspace.go
index 0f451627c..258e0b08a 100644
--- a/types/gitspace.go
+++ b/types/gitspace.go
@@ -100,6 +100,14 @@ type GitspaceFilter struct {
 	Deleted              *bool // not nil when we want to add this filter
 	MarkedForDeletion    *bool // not nil when we want to add this filter
 	GitspaceInstanceFilter
+	ScopeFilter
+}
+
+type ScopeFilter struct {
+	// each org will be of the format "orgID"
+	Orgs []string
+	// each project will be of the format "orgID/projectID"
+	Projects []string
 }
 
 type GitspaceInstanceFilter struct {
diff --git a/types/webhook.go b/types/webhook.go
index 82f6c12e2..f600ad272 100644
--- a/types/webhook.go
+++ b/types/webhook.go
@@ -23,13 +23,13 @@ import (
 // Webhook represents a webhook.
 type Webhook struct {
 	// TODO [CODE-1364]: Hide once UID/Identifier migration is completed.
-	ID         int64              `json:"id"`
-	Version    int64              `json:"version"`
-	ParentID   int64              `json:"parent_id"`
-	ParentType enum.WebhookParent `json:"parent_type"`
-	CreatedBy  int64              `json:"created_by"`
-	Created    int64              `json:"created"`
-	Updated    int64              `json:"updated"`
+	ID         int64              `json:"id" yaml:"id"`
+	Version    int64              `json:"version" yaml:"-"`
+	ParentID   int64              `json:"parent_id" yaml:"-"`
+	ParentType enum.WebhookParent `json:"parent_type" yaml:"-"`
+	CreatedBy  int64              `json:"created_by" yaml:"created_by"`
+	Created    int64              `json:"created" yaml:"created"`
+	Updated    int64              `json:"updated" yaml:"updated"`
 	Type       enum.WebhookType   `json:"-"`
 
 	// scope 0 indicates repo; scope > 0 indicates space depth level
@@ -37,14 +37,14 @@ type Webhook struct {
 
 	Identifier string `json:"identifier"`
 	// TODO [CODE-1364]: Remove once UID/Identifier migration is completed.
-	DisplayName           string                       `json:"display_name"`
-	Description           string                       `json:"description"`
-	URL                   string                       `json:"url"`
-	Secret                string                       `json:"-"`
-	Enabled               bool                         `json:"enabled"`
-	Insecure              bool                         `json:"insecure"`
-	Triggers              []enum.WebhookTrigger        `json:"triggers"`
-	LatestExecutionResult *enum.WebhookExecutionResult `json:"latest_execution_result,omitempty"`
+	DisplayName           string                       `json:"display_name" yaml:"display_name"`
+	Description           string                       `json:"description" yaml:"description"`
+	URL                   string                       `json:"url" yaml:"url"`
+	Secret                string                       `json:"-" yaml:"-"`
+	Enabled               bool                         `json:"enabled" yaml:"enabled"`
+	Insecure              bool                         `json:"insecure" yaml:"insecure"`
+	Triggers              []enum.WebhookTrigger        `json:"triggers" yaml:"triggers"`
+	LatestExecutionResult *enum.WebhookExecutionResult `json:"latest_execution_result,omitempty" yaml:"-"`
 }
 
 // MarshalJSON overrides the default json marshaling for `Webhook` allowing us to inject the `HasSecret` field.
@@ -69,6 +69,26 @@ func (w *Webhook) MarshalJSON() ([]byte, error) {
 	})
 }
 
+// Clone makes a deep copy of the webhook object.
+func (w Webhook) Clone() Webhook {
+	webhook := w
+
+	// Deep copy the LatestExecutionResult pointer if it exists
+	if w.LatestExecutionResult != nil {
+		result := *w.LatestExecutionResult
+		webhook.LatestExecutionResult = &result
+	}
+
+	// Deep copy the Triggers slice
+	if len(w.Triggers) > 0 {
+		triggers := make([]enum.WebhookTrigger, len(w.Triggers))
+		copy(triggers, w.Triggers)
+		webhook.Triggers = triggers
+	}
+
+	return webhook
+}
+
 type WebhookCreateInput struct {
 	// TODO [CODE-1363]: remove after identifier migration.
 	UID        string `json:"uid" deprecated:"true"`
diff --git a/web/package.json b/web/package.json
index 1df97fea1..8e5e45278 100644
--- a/web/package.json
+++ b/web/package.json
@@ -50,8 +50,8 @@
     "@codemirror/state": "^6.2.0",
     "@codemirror/view": "^6.9.6",
     "@harnessio/design-system": "^2.1.1",
-    "@harnessio/icons": "^2.1.12",
-    "@harnessio/react-har-service-client": "^0.22.0",
+    "@harnessio/icons": "^2.1.13",
+    "@harnessio/react-har-service-client": "^0.25.0",
     "@harnessio/react-ng-manager-client": "^1.40.0",
     "@harnessio/react-ssca-manager-client": "^0.65.0",
     "@harnessio/uicore": "^4.3.4",
diff --git a/web/src/ar/MFEAppTypes.ts b/web/src/ar/MFEAppTypes.ts
index f12ca6c13..965b3b7ab 100644
--- a/web/src/ar/MFEAppTypes.ts
+++ b/web/src/ar/MFEAppTypes.ts
@@ -23,6 +23,7 @@ import type NGBreadcrumbs from '@ar/__mocks__/components/NGBreadcrumbs'
 import type DependencyView from '@ar/__mocks__/components/DependencyView'
 import type SecretFormInput from '@ar/__mocks__/components/SecretFormInput'
 import type VulnerabilityView from '@ar/__mocks__/components/VulnerabilityView'
+import type PolicySetFixedTypeSelector from '@ar/__mocks__/components/PolicySetFixedTypeSelector'
 import type {
   ModalProvider,
   useConfirmationDialog,
@@ -102,6 +103,7 @@ export interface CustomComponents {
   SecretFormInput: typeof SecretFormInput
   VulnerabilityView: typeof VulnerabilityView
   DependencyView: typeof DependencyView
+  PolicySetFixedTypeSelector: typeof PolicySetFixedTypeSelector
 }
 
 export interface CustomUtils {
@@ -112,6 +114,7 @@ export interface CustomUtils {
   getRouteToPipelineExecutionView?: (params: Scope & PipelineExecutionPathProps) => string
   getRouteToServiceDetailsView?: (params: Scope & ServiceDetailsPathProps) => string
   routeToMode?: (params: Scope & { module: string }) => string
+  routeToRegistryDetails: (params: Scope & { module: string; repositoryIdentifier: string }) => string
 }
 
 export interface MFEAppProps {
@@ -135,5 +138,9 @@ export interface MFEAppProps {
 export enum FeatureFlags {
   HAR_TRIGGERS = 'HAR_TRIGGERS',
   HAR_GO_PACKAGE_TYPE_ENABLED = 'HAR_GO_PACKAGE_TYPE_ENABLED',
-  HAR_TREE_VIEW_ENABLED = 'HAR_TREE_VIEW_ENABLED'
+  HAR_TREE_VIEW_ENABLED = 'HAR_TREE_VIEW_ENABLED',
+  HAR_CUSTOM_METADATA_ENABLED = 'HAR_CUSTOM_METADATA_ENABLED',
+  HAR_REGISTRY_SCOPE_FILTER = 'HAR_REGISTRY_SCOPE_FILTER',
+  HAR_HUGGINGFACE_PACKAGE_TYPE_ENABLED = 'HAR_HUGGINGFACE_PACKAGE_TYPE_ENABLED',
+  HAR_ARTIFACT_QUARANTINE_ENABLED = 'HAR_ARTIFACT_QUARANTINE_ENABLED'
 }
diff --git a/web/src/ar/__mocks__/components/PolicySetFixedTypeSelector.tsx b/web/src/ar/__mocks__/components/PolicySetFixedTypeSelector.tsx
new file mode 100644
index 000000000..1c1bd6da2
--- /dev/null
+++ b/web/src/ar/__mocks__/components/PolicySetFixedTypeSelector.tsx
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import type { IFormGroupProps } from '@blueprintjs/core'
+import type { FormikContextType } from 'formik'
+import type { ButtonProps } from '@harnessio/uicore'
+
+interface PolicySetFixedTypeSelectorProps<T> extends IFormGroupProps {
+  name: string
+  policySetIds: string[]
+  formik?: FormikContextType<T>
+  policyType?: string
+  policyAction?: string
+  buttonProps?: ButtonProps
+}
+
+export default function PolicySetFixedTypeSelector<T>(_props: PolicySetFixedTypeSelectorProps<T>): React.ReactElement {
+  return <>Mock PolicySetFixedTypeSelector</>
+}
diff --git a/web/src/ar/common/constants.ts b/web/src/ar/common/constants.ts
index 3d20987a8..2d1ec9bf5 100644
--- a/web/src/ar/common/constants.ts
+++ b/web/src/ar/common/constants.ts
@@ -15,7 +15,7 @@
  */
 
 import type { StringsMap } from '@ar/frameworks/strings'
-import { EnvironmentType, RepositoryConfigType } from './types'
+import { EntityScope, EnvironmentType, RepositoryConfigType, RepositoryScopeType } from './types'
 
 interface EnvironmentTypeListItem {
   label: keyof StringsMap
@@ -51,3 +51,32 @@ export const RepositoryConfigTypes: RepositoryConfigTypesListItem[] = [
     value: RepositoryConfigType.UPSTREAM
   }
 ]
+
+interface RepositoryScopeTypesListItem {
+  label: keyof StringsMap
+  value: RepositoryScopeType
+  scope: EntityScope
+}
+
+export const RepositoryScopeTypes: RepositoryScopeTypesListItem[] = [
+  {
+    label: 'repositoryList.scope.accountOnly',
+    value: RepositoryScopeType.NONE,
+    scope: EntityScope.ACCOUNT
+  },
+  {
+    label: 'repositoryList.scope.orgOnly',
+    value: RepositoryScopeType.NONE,
+    scope: EntityScope.ORG
+  },
+  {
+    label: 'repositoryList.scope.accountRecursive',
+    value: RepositoryScopeType.DESCENDANTS,
+    scope: EntityScope.ACCOUNT
+  },
+  {
+    label: 'repositoryList.scope.orgRecursive',
+    value: RepositoryScopeType.DESCENDANTS,
+    scope: EntityScope.ORG
+  }
+]
diff --git a/web/src/ar/common/types.ts b/web/src/ar/common/types.ts
index b233833ed..34c9b4711 100644
--- a/web/src/ar/common/types.ts
+++ b/web/src/ar/common/types.ts
@@ -57,7 +57,8 @@ export enum RepositoryPackageType {
   GO = 'GO',
   DEBIAN = 'DEBIAN',
   CARGO = 'CARGO',
-  ALPINE = 'ALPINE'
+  ALPINE = 'ALPINE',
+  HUGGINGFACE = 'HUGGINGFACE'
 }
 
 export enum RepositoryConfigType {
@@ -75,3 +76,15 @@ export enum Scanners {
   AQUA_TRIVY = 'AQUA_TRIVY',
   GRYPE = 'GRYPE'
 }
+
+export enum EntityScope {
+  ACCOUNT = 'ACCOUNT',
+  ORG = 'ORG',
+  PROJECT = 'PROJECT'
+}
+
+export enum RepositoryScopeType {
+  NONE = 'none',
+  ANCESTORS = 'ancestors',
+  DESCENDANTS = 'descendants'
+}
diff --git a/web/src/ar/components/Badge/Badge.module.scss b/web/src/ar/components/Badge/Badge.module.scss
index 433edffaa..5fe79b218 100644
--- a/web/src/ar/components/Badge/Badge.module.scss
+++ b/web/src/ar/components/Badge/Badge.module.scss
@@ -29,3 +29,9 @@
   flex-shrink: 0;
   text-transform: uppercase;
 }
+
+.quarantineBadge {
+  background-color: var(--orange-200) !important;
+  border-color: var(--orange-200) !important;
+  --intent-color: var(--orange-900) !important;
+}
diff --git a/web/src/ar/components/Badge/Badge.module.scss.d.ts b/web/src/ar/components/Badge/Badge.module.scss.d.ts
index 7d2bdb7ea..d29854a8e 100644
--- a/web/src/ar/components/Badge/Badge.module.scss.d.ts
+++ b/web/src/ar/components/Badge/Badge.module.scss.d.ts
@@ -17,3 +17,4 @@
 /* eslint-disable */
 // This is an auto-generated file
 export declare const badge: string
+export declare const quarantineBadge: string
diff --git a/web/src/ar/components/Badge/Badge.tsx b/web/src/ar/components/Badge/Badge.tsx
index a25785d96..7f4289eb2 100644
--- a/web/src/ar/components/Badge/Badge.tsx
+++ b/web/src/ar/components/Badge/Badge.tsx
@@ -15,13 +15,14 @@
  */
 
 import React, { FC, PropsWithChildren } from 'react'
+import classNames from 'classnames'
 import { Text, TextProps } from '@harnessio/uicore'
 
 import css from './Badge.module.scss'
 
-const Badge: FC<PropsWithChildren<TextProps>> = ({ children, ...rest }) => {
+const Badge: FC<PropsWithChildren<TextProps>> = ({ children, className, ...rest }) => {
   return (
-    <Text className={css.badge} tag="span" {...rest}>
+    <Text className={classNames(css.badge, className)} tag="span" {...rest}>
       {children}
     </Text>
   )
diff --git a/web/src/ar/components/Badge/QuarantineBadge.tsx b/web/src/ar/components/Badge/QuarantineBadge.tsx
new file mode 100644
index 000000000..dc14cc13e
--- /dev/null
+++ b/web/src/ar/components/Badge/QuarantineBadge.tsx
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { Color } from '@harnessio/design-system'
+import { Position } from '@blueprintjs/core'
+
+import { useStrings } from '@ar/frameworks/strings/String'
+import Badge from './Badge'
+import css from './Badge.module.scss'
+
+interface QuarantineBadgeProps {
+  reason?: string
+}
+
+function QuarantineBadge({ reason }: QuarantineBadgeProps): JSX.Element {
+  const { getString } = useStrings()
+  return (
+    <Badge
+      className={css.quarantineBadge}
+      icon="warning-icon"
+      iconProps={{
+        color: Color.ORANGE_900,
+        size: 16
+      }}
+      color={Color.ORANGE_900}
+      tooltip={reason}
+      tooltipProps={{
+        position: Position.BOTTOM,
+        disabled: !reason
+      }}>
+      {getString('badges.quarantined')}
+    </Badge>
+  )
+}
+
+export default QuarantineBadge
diff --git a/web/src/ar/components/Badge/ScopeBadge.tsx b/web/src/ar/components/Badge/ScopeBadge.tsx
new file mode 100644
index 000000000..2843c6168
--- /dev/null
+++ b/web/src/ar/components/Badge/ScopeBadge.tsx
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React from 'react'
+import type { IconName } from '@harnessio/icons'
+import { Color } from '@harnessio/design-system'
+
+import { EntityScope } from '@ar/common/types'
+import type { StringsMap } from '@ar/strings/types'
+import { useStrings } from '@ar/frameworks/strings/String'
+
+import Badge from './Badge'
+
+interface BadgeConfig {
+  icon: IconName
+  label: keyof StringsMap
+  color: Color
+}
+
+const EntityScopeToBadgetMapping: Record<EntityScope, BadgeConfig> = {
+  [EntityScope.ACCOUNT]: { icon: 'Account', label: 'badges.accountScope', color: Color.PRIMARY_7 },
+  [EntityScope.ORG]: { icon: 'nav-organization', label: 'badges.orgScope', color: Color.PRIMARY_7 },
+  [EntityScope.PROJECT]: { icon: 'nav-project', label: 'badges.projectScope', color: Color.PRIMARY_7 }
+}
+
+const UnknownScopeBadgeConfig: BadgeConfig = {
+  icon: 'nav-project',
+  label: 'badges.projectScope',
+  color: Color.PRIMARY_7
+}
+
+interface ScopeBadgeProps {
+  scope: EntityScope
+  helperText?: string
+}
+
+function ScopeBadge({ scope, helperText }: ScopeBadgeProps): JSX.Element {
+  const { getString } = useStrings()
+  const badgeConfig = EntityScopeToBadgetMapping[scope] || UnknownScopeBadgeConfig
+  return (
+    <Badge tooltip={helperText} icon={badgeConfig.icon} iconProps={{ size: 16 }} color={badgeConfig.color}>
+      {getString(badgeConfig.label)}
+    </Badge>
+  )
+}
+
+export default ScopeBadge
diff --git a/web/src/ar/components/ManageMetadata/DropdownLabelSelector.tsx b/web/src/ar/components/ManageMetadata/DropdownLabelSelector.tsx
new file mode 100644
index 000000000..ec4af8295
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/DropdownLabelSelector.tsx
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useState } from 'react'
+import { PopoverPosition } from '@blueprintjs/core'
+import { Button, ButtonSize, ButtonVariation } from '@harnessio/uicore'
+import type { TypesLabel, TypesLabelValue } from '@harnessio/react-har-service-client'
+
+import { useStrings } from '@ar/frameworks/strings'
+
+import PopoverContent from './PopoverContent'
+
+interface DropdownLabelSelectorProps {
+  getItems: (searchTerm: string) => Promise<Array<TypesLabel>>
+  getValues: (label: TypesLabel, searchTerm: string) => Promise<Array<TypesLabelValue>>
+  onSelect: (label: TypesLabel, value?: TypesLabelValue) => void
+  disabled?: boolean
+}
+
+function DropdownLabelSelector(props: DropdownLabelSelectorProps) {
+  const { getItems, onSelect, getValues, disabled } = props
+  const [isOpen, setIsOpen] = useState(false)
+  const { getString } = useStrings()
+
+  const handleSelect = (label: TypesLabel, value?: TypesLabelValue): void => {
+    onSelect(label, value)
+    setIsOpen(false)
+  }
+
+  return (
+    <Button
+      variation={ButtonVariation.TERTIARY}
+      size={ButtonSize.SMALL}
+      icon="plus"
+      text={getString('labels.addLabel')}
+      tooltipProps={{
+        interactionKind: 'click',
+        isOpen: disabled ? false : isOpen,
+        usePortal: true,
+        minimal: true,
+        position: PopoverPosition.BOTTOM_RIGHT,
+        onInteraction: nxtState => setIsOpen(nxtState)
+      }}
+      disabled={disabled}
+      tooltip={<PopoverContent getLabels={getItems} getValues={getValues} onSelect={handleSelect} />}
+    />
+  )
+}
+
+export default DropdownLabelSelector
diff --git a/web/src/ar/components/ManageMetadata/DropdownList.tsx b/web/src/ar/components/ManageMetadata/DropdownList.tsx
new file mode 100644
index 000000000..db5dadb04
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/DropdownList.tsx
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useEffect, useMemo, useState } from 'react'
+import { Menu, MenuItem } from '@blueprintjs/core'
+import { getErrorInfoFromErrorObject, Layout } from '@harnessio/uicore'
+
+import { useDebouncedValue } from '@ar/hooks'
+import { useStrings } from '@ar/frameworks/strings'
+
+import SearchInput from './SearchInput'
+
+import css from './ManageMetadata.module.scss'
+
+interface DropdownListProps<T> {
+  getItems: (searchTerm: string) => Promise<Array<T>>
+  renderItem: (item: T, index: number) => React.ReactNode
+  renderNewItem?: (item: string) => React.ReactNode
+  getRowId: (item: T) => string
+  getRowValue: (item: T) => string
+  onSelect: (item: T) => void
+  shouldAllowCreateNewOption?: boolean
+  onCreateNewOption?: (optionName: string) => void
+  placeholder?: string
+  leftElement?: React.ReactNode
+}
+
+function DropdownList<T>(props: DropdownListProps<T>) {
+  const [query, setQuery] = useState('')
+  const [options, setOptions] = useState<Array<T>>([])
+  const [loading, setLoading] = useState(false)
+  const [error, setError] = useState<string | null>(null)
+
+  const debouncedQuery = useDebouncedValue(query, 500)
+
+  const { getString } = useStrings()
+
+  const handleSearch = async (searchTerm: string) => {
+    setLoading(true)
+    setQuery(searchTerm)
+    try {
+      const res = await props.getItems(searchTerm)
+      setOptions(res)
+      setError(null)
+    } catch (e: any) {
+      setError(getErrorInfoFromErrorObject(e))
+    } finally {
+      setLoading(false)
+    }
+  }
+
+  const shouldShowCreateNewOption = useMemo(() => {
+    if (!props.shouldAllowCreateNewOption) return false
+    if (!query) return false
+    if (options.length === 0) return true
+    return !options.some(each => props.getRowValue(each).toLowerCase() === query.toLowerCase())
+  }, [options, query, props.shouldAllowCreateNewOption])
+
+  useEffect(() => {
+    handleSearch(debouncedQuery)
+  }, [debouncedQuery])
+
+  return (
+    <Layout.Vertical padding="small" spacing="small">
+      <SearchInput
+        autoFocus
+        placeholder={props.placeholder || getString('search')}
+        onChange={setQuery}
+        value={query}
+        leftElement={props.leftElement}
+      />
+      <Menu className={css.menuContainer}>
+        {loading && <MenuItem disabled text={getString('loading')} />}
+        {error && <MenuItem disabled text={error} />}
+        {!loading && !error && options.length === 0 && !shouldShowCreateNewOption && (
+          <MenuItem disabled text={getString('noResultsFound')} />
+        )}
+        {!loading &&
+          !error &&
+          options.map((each, index) => (
+            <MenuItem
+              key={props.getRowId(each)}
+              text={props.renderItem(each, index)}
+              onClick={() => props.onSelect(each)}
+              shouldDismissPopover={false}
+            />
+          ))}
+        {!loading && !error && shouldShowCreateNewOption && (
+          <MenuItem
+            text={
+              props.renderNewItem
+                ? props.renderNewItem(query)
+                : getString('labels.addNewValueDynamic', { value: query })
+            }
+            onClick={() => props.onCreateNewOption?.(query)}
+            shouldDismissPopover={false}
+          />
+        )}
+      </Menu>
+    </Layout.Vertical>
+  )
+}
+
+export default DropdownList
diff --git a/web/src/ar/components/ManageMetadata/ManageMetadata.module.scss b/web/src/ar/components/ManageMetadata/ManageMetadata.module.scss
new file mode 100644
index 000000000..3cb118129
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/ManageMetadata.module.scss
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.container {
+  margin-top: 44px;
+  width: 100%;
+}
+
+.popoverContainer {
+  min-width: 280px;
+}
+
+.menuContainer {
+  padding: 0;
+  :global {
+    .bp3-menu-item:hover {
+      background: var(--grey-100) !important;
+      color: var(--grey-1000) !important;
+    }
+
+    .bp3-menu-item.bp3-active {
+      background: var(--grey-100) !important;
+      color: var(--grey-1000) !important;
+    }
+  }
+}
+
+.searchInputContainer {
+  border: 1px solid var(--grey-200);
+  border-radius: 4px;
+  padding: 0 var(--spacing-xsmall) !important;
+
+  .searchInput {
+    flex: 1;
+    margin: 0;
+
+    & input {
+      border: none !important;
+      box-shadow: none !important;
+    }
+  }
+}
diff --git a/web/src/ar/components/ManageMetadata/ManageMetadata.module.scss.d.ts b/web/src/ar/components/ManageMetadata/ManageMetadata.module.scss.d.ts
new file mode 100644
index 000000000..e0b4741db
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/ManageMetadata.module.scss.d.ts
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2023 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint-disable */
+// This is an auto-generated file
+export declare const container: string
+export declare const menuContainer: string
+export declare const popoverContainer: string
+export declare const searchInput: string
+export declare const searchInputContainer: string
diff --git a/web/src/ar/components/ManageMetadata/ManageMetadataLabels.tsx b/web/src/ar/components/ManageMetadata/ManageMetadataLabels.tsx
new file mode 100644
index 000000000..78995c0e8
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/ManageMetadataLabels.tsx
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { FontVariation } from '@harnessio/design-system'
+import { Card, Layout, Text } from '@harnessio/uicore'
+import {
+  listSpaceLabels,
+  listSpaceLabelValues,
+  TypesLabelValue,
+  type TypesLabel
+} from '@harnessio/react-har-service-client'
+
+import { useGetSpaceRef } from '@ar/hooks'
+import { useStrings } from '@ar/frameworks/strings'
+
+import DropdownLabelSelector from './DropdownLabelSelector'
+
+import css from './ManageMetadata.module.scss'
+
+interface ManageMetadataLabelsProps {
+  selectedLabels: any[] // update when we get type from BE
+  onLabelSelect: (label: TypesLabel, value?: TypesLabelValue) => void
+  disabled?: boolean
+}
+
+export default function ManageMetadataLabels(props: ManageMetadataLabelsProps) {
+  const { getString } = useStrings()
+  const spaceRef = useGetSpaceRef('')
+
+  const getLabels = async (searchTerm: string): Promise<Array<TypesLabel>> => {
+    return listSpaceLabels({
+      space_ref: spaceRef,
+      queryParams: {
+        query: searchTerm,
+        limit: 100,
+        page: 1,
+        inherited: false
+      }
+    }).then(response => response.content)
+  }
+
+  const getValues = async (label: TypesLabel, searchTerm: string): Promise<Array<TypesLabelValue>> => {
+    return listSpaceLabelValues({
+      space_ref: spaceRef,
+      key: label.key ?? '',
+      queryParams: {
+        query: searchTerm,
+        limit: 100,
+        page: 1,
+        inherited: false
+      }
+    }).then(response => response.content)
+  }
+
+  return (
+    <Card className={css.container}>
+      <Layout.Vertical flex={{ alignItems: 'flex-start' }} spacing="medium">
+        <Text font={{ variation: FontVariation.BODY, weight: 'bold' }}>{getString('labels.title')}</Text>
+        {/* TODO: render selected labels here... */}
+        <DropdownLabelSelector getItems={getLabels} getValues={getValues} onSelect={props.onLabelSelect} />
+      </Layout.Vertical>
+    </Card>
+  )
+}
diff --git a/web/src/ar/components/ManageMetadata/PopoverContent.tsx b/web/src/ar/components/ManageMetadata/PopoverContent.tsx
new file mode 100644
index 000000000..a3a7efb8e
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/PopoverContent.tsx
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { useState } from 'react'
+import { Container, Layout, Text } from '@harnessio/uicore'
+import { Color, FontVariation } from '@harnessio/design-system'
+import type { TypesLabel, TypesLabelValue } from '@harnessio/react-har-service-client'
+
+import { ColorName, LabelType } from 'utils/Utils'
+import { Label, LabelTitle } from 'components/Label/Label'
+
+import { useStrings } from '@ar/frameworks/strings'
+
+import DropdownList from './DropdownList'
+
+import css from './ManageMetadata.module.scss'
+
+interface PopoverContentProps {
+  getLabels: (searchTerm: string) => Promise<Array<TypesLabel>>
+  getValues: (label: TypesLabel, searchTerm: string) => Promise<Array<TypesLabelValue>>
+  onSelect: (label: TypesLabel, value?: TypesLabelValue) => void
+}
+
+function PopoverContent({ getLabels, getValues, onSelect }: PopoverContentProps) {
+  const [selectedLabel, setSelectedLabel] = useState<TypesLabel | null>(null)
+  const { getString } = useStrings()
+
+  const renderLabel = (option: TypesLabel) => {
+    return (
+      <LabelTitle
+        name={option.key as string}
+        value_count={option.value_count}
+        label_color={option.color as ColorName}
+        scope={option.scope}
+      />
+    )
+  }
+
+  const renderLabelValue = (label: string, option: TypesLabelValue) => {
+    return (
+      <Label
+        name={label}
+        label_value={{
+          name: option.value,
+          color: option.color as ColorName
+        }}
+      />
+    )
+  }
+
+  const renderNewItem = (item: string) => {
+    if (!selectedLabel) return null
+    return (
+      <Layout.Horizontal spacing="small">
+        <Text font={{ variation: FontVariation.BODY, weight: 'bold' }} color={Color.PRIMARY_7}>
+          {getString('labels.addNewValue')}
+        </Text>
+        {renderLabelValue(selectedLabel.key as string, { value: item, color: selectedLabel.color })}
+      </Layout.Horizontal>
+    )
+  }
+
+  return (
+    <Container className={css.popoverContainer}>
+      {selectedLabel ? (
+        <DropdownList<TypesLabelValue>
+          key="values"
+          getItems={q => getValues(selectedLabel, q)}
+          getRowId={each => `${selectedLabel.key}-${each.value}`}
+          getRowValue={each => each.value as string}
+          renderItem={item => renderLabelValue(selectedLabel.key as string, item)}
+          onSelect={item => {
+            onSelect(selectedLabel, item)
+          }}
+          onCreateNewOption={item => {
+            onSelect(selectedLabel, {
+              value: item,
+              label_id: selectedLabel.id,
+              color: selectedLabel.color
+            })
+          }}
+          renderNewItem={renderNewItem}
+          shouldAllowCreateNewOption={selectedLabel?.type === LabelType.DYNAMIC}
+          placeholder={
+            selectedLabel?.type === LabelType.DYNAMIC
+              ? getString('labels.findOrAddValue')
+              : getString('labels.findAValue')
+          }
+          leftElement={
+            <Label
+              name={selectedLabel.key as string}
+              label_color={selectedLabel.color as ColorName}
+              scope={selectedLabel.scope}
+            />
+          }
+        />
+      ) : (
+        <DropdownList<TypesLabel>
+          key="labels"
+          getItems={q => getLabels(q)}
+          getRowId={each => each.key as string}
+          getRowValue={each => each.key as string}
+          renderItem={renderLabel}
+          shouldAllowCreateNewOption={false}
+          placeholder={getString('labels.findALabel')}
+          onSelect={item => {
+            if (item.value_count && item.value_count > 0) {
+              setSelectedLabel(item)
+            } else {
+              onSelect(item)
+            }
+          }}
+        />
+      )}
+    </Container>
+  )
+}
+
+export default PopoverContent
diff --git a/web/src/ar/components/ManageMetadata/SearchInput.tsx b/web/src/ar/components/ManageMetadata/SearchInput.tsx
new file mode 100644
index 000000000..cc0d57f89
--- /dev/null
+++ b/web/src/ar/components/ManageMetadata/SearchInput.tsx
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useRef } from 'react'
+import { Button, ButtonVariation, Layout, TextInput } from '@harnessio/uicore'
+import type { TextInputProps } from '@harnessio/uicore/dist/components/TextInput/TextInput'
+
+import { useStrings } from '@ar/frameworks/strings'
+
+import css from './ManageMetadata.module.scss'
+
+interface SeachInputProps extends Omit<TextInputProps, 'onChange' | 'rightElement' | 'leftElement'> {
+  onChange: (query: string) => void
+  rightElement?: React.ReactNode
+  leftElement?: React.ReactNode
+}
+
+function SearchInput(props: SeachInputProps) {
+  const { rightElement, leftElement, value, ...rest } = props
+  const inputRef = useRef<HTMLInputElement | null>(null)
+  const { getString } = useStrings()
+
+  const handleChangeQuery = (e: React.ChangeEvent<HTMLInputElement>) => {
+    const _value = e.currentTarget.value || ''
+    props.onChange(_value)
+  }
+
+  return (
+    <Layout.Horizontal
+      className={css.searchInputContainer}
+      spacing="xsmall"
+      flex={{ alignItems: 'center', justifyContent: 'flex-start' }}>
+      {leftElement}
+      <TextInput
+        {...rest}
+        inputRef={ref => {
+          // Using callback ref pattern which is safe and supported by TextInput
+          if (ref) {
+            inputRef.current = ref
+          }
+        }}
+        value={value}
+        wrapperClassName={css.searchInput}
+        autoFocus
+        placeholder={props.placeholder || getString('search')}
+        onChange={handleChangeQuery}
+      />
+      {value && (
+        <Button
+          variation={ButtonVariation.ICON}
+          icon="code-close"
+          onClick={() => {
+            props.onChange('')
+            inputRef.current?.focus()
+          }}
+        />
+      )}
+    </Layout.Horizontal>
+  )
+}
+
+export default SearchInput
diff --git a/web/src/ar/components/TableCells/TableCells.tsx b/web/src/ar/components/TableCells/TableCells.tsx
index 131869b43..16e6892b8 100644
--- a/web/src/ar/components/TableCells/TableCells.tsx
+++ b/web/src/ar/components/TableCells/TableCells.tsx
@@ -19,9 +19,10 @@ import classNames from 'classnames'
 import { defaultTo } from 'lodash-es'
 import copy from 'clipboard-copy'
 import { Link } from 'react-router-dom'
+import { Position } from '@blueprintjs/core'
 import type { TableExpandedToggleProps } from 'react-table'
-import { Button, ButtonProps, ButtonVariation, Layout, Text, TextProps } from '@harnessio/uicore'
-import type { IconName, IconProps } from '@harnessio/icons'
+import { Button, ButtonProps, ButtonVariation, Layout, Popover, Text, TextProps } from '@harnessio/uicore'
+import { Icon, type IconName, type IconProps } from '@harnessio/icons'
 import { Color, FontVariation } from '@harnessio/design-system'
 
 import { killEvent } from '@ar/common/utils'
@@ -298,6 +299,22 @@ export const VulnerabilityCell = ({ critical, high, medium, low }: Vulnerability
   )
 }
 
+interface QuarantineIconProps {
+  reason?: string
+}
+
+export const QuarantineIcon = ({ reason }: QuarantineIconProps) => {
+  return (
+    <Popover
+      content={<Text padding="small">{reason}</Text>}
+      interactionKind="hover"
+      position={Position.TOP}
+      disabled={!reason}>
+      <Icon name="warning-icon" size={20} color={Color.ORANGE_900} />
+    </Popover>
+  )
+}
+
 export default {
   UrlCell,
   SizeCell,
@@ -311,5 +328,6 @@ export default {
   LastModifiedCell,
   ToggleAccordionCell,
   RepositoryLocationBadgeCell,
-  VulnerabilityCell
+  VulnerabilityCell,
+  QuarantineIcon
 }
diff --git a/web/src/ar/frameworks/RepositoryStep/Repository.tsx b/web/src/ar/frameworks/RepositoryStep/Repository.tsx
index 69e1c62bb..f1c75c468 100644
--- a/web/src/ar/frameworks/RepositoryStep/Repository.tsx
+++ b/web/src/ar/frameworks/RepositoryStep/Repository.tsx
@@ -16,6 +16,7 @@
 
 import type { IconName } from '@harnessio/icons'
 import type { RegistryMetadata } from '@harnessio/react-har-service-client'
+import { LocalArtifactType, RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import type { UpstreamRepositoryURLInputSource } from '@ar/pages/upstream-proxy-details/types'
 import type { FormikFowardRef, RepositoryPackageType, RepositoryConfigType, PageType, Scanners } from '@ar/common/types'
 import type { StringKeys } from '../strings'
@@ -65,8 +66,9 @@ export abstract class RepositoryStep<T, U = unknown> {
   protected repositoryIconSize?: number
   protected supportedScanners?: Scanners[]
   protected supportedUpstreamURLSources?: UpstreamRepositoryURLInputSource[]
+  supportedRepositoryTabs?: RepositoryDetailsTab[]
+  supportedArtifactTypes?: LocalArtifactType[]
   enterpriseAdvancedOptionSubTitle?: StringKeys
-  ossAdvancedOptionSubTitle?: StringKeys
 
   getPackageType(): string {
     return this.packageType
@@ -76,6 +78,20 @@ export abstract class RepositoryStep<T, U = unknown> {
     return this.supportedScanners ?? []
   }
 
+  getSupportedRepositoryTabs(): RepositoryDetailsTab[] {
+    return (
+      this.supportedRepositoryTabs ?? [
+        RepositoryDetailsTab.PACKAGES,
+        RepositoryDetailsTab.CONFIGURATION,
+        RepositoryDetailsTab.WEBHOOKS
+      ]
+    )
+  }
+
+  getSupportedArtifactTypes(): LocalArtifactType[] {
+    return this.supportedArtifactTypes ?? [LocalArtifactType.ARTIFACTS]
+  }
+
   getSupportedUpstreamURLSources(): UpstreamRepositoryURLInputSource[] {
     return this.supportedUpstreamURLSources ?? []
   }
diff --git a/web/src/ar/gitness/ArApp.tsx b/web/src/ar/gitness/ArApp.tsx
index f0094bf25..dd7b83dd0 100644
--- a/web/src/ar/gitness/ArApp.tsx
+++ b/web/src/ar/gitness/ArApp.tsx
@@ -18,6 +18,7 @@ import React from 'react'
 import { RouteComponentProps, withRouter } from 'react-router-dom'
 
 import GitnessApp from '@ar/app/GitnessApp'
+import { normalizePath } from '@ar/routes/utils'
 import type { CustomComponents, CustomUtils, ParentContextObj } from '@ar/MFEAppTypes'
 
 import { handle401 } from 'AppUtils'
@@ -42,6 +43,12 @@ function ArApp(props: RouteComponentProps<Record<string, string>>) {
     })
   }
 
+  const routeToRegistryDetails: CustomUtils['routeToRegistryDetails'] = routeParams => {
+    const route = getARRouteDefinitions(params)
+    const toRegistryDetails = route.toARRepositoryDetails(routeParams)
+    return normalizePath(`${url}${toRegistryDetails}`)
+  }
+
   return (
     <ArAppProvider>
       <GitnessApp
@@ -62,7 +69,8 @@ function ArApp(props: RouteComponentProps<Record<string, string>>) {
         customUtils={
           {
             getRouteDefinitions: getARRouteDefinitions,
-            generateToken
+            generateToken,
+            routeToRegistryDetails
           } as CustomUtils
         }
       />
diff --git a/web/src/ar/gitness/utils/getARRouteDefinitions.ts b/web/src/ar/gitness/utils/getARRouteDefinitions.ts
index 74e5db9f1..a2ef0e8fe 100644
--- a/web/src/ar/gitness/utils/getARRouteDefinitions.ts
+++ b/web/src/ar/gitness/utils/getARRouteDefinitions.ts
@@ -41,21 +41,21 @@ export default function getARRouteDefinitions(routeParams: Record<string, string
     toARRepositories: routeDefinitionWithMode(() => '/'),
     toARRepositoryDetails: routeDefinitionWithMode(params => `/${params?.repositoryIdentifier}`),
     toARRepositoryDetailsTab: routeDefinitionWithMode(params => `/${params?.repositoryIdentifier}/${params?.tab}`),
-    toARArtifacts: routeDefinitionWithMode(() => `/${routeParams?.repositoryIdentifier}/packages`),
+    toARArtifacts: routeDefinitionWithMode(() => `/${routeParams?.repositoryIdentifier}`),
     toARArtifactDetails: routeDefinitionWithMode(
-      params => `/${params?.repositoryIdentifier}/artifacts/${params?.artifactIdentifier}`
+      params => `/${params?.repositoryIdentifier}/${params?.artifactType}/${params?.artifactIdentifier}`
     ),
     toARVersionDetails: routeDefinitionWithMode(
       params =>
-        `/${params?.repositoryIdentifier}/artifacts/${params?.artifactIdentifier}/versions/${params?.versionIdentifier}`
+        `/${params?.repositoryIdentifier}/${params?.artifactType}/${params?.artifactIdentifier}/versions/${params?.versionIdentifier}`
     ),
     // anything random, as this route will not be used in gitness
     toARVersionDetailsTab: routeDefinitionWithMode(params => {
-      let route = `/${params.repositoryIdentifier}/artifacts/${params.artifactIdentifier}/versions/${params.versionIdentifier}`
+      let route = `/${params.repositoryIdentifier}/${params?.artifactType}/${params?.artifactIdentifier}/versions/${params.versionIdentifier}`
       if (params.orgIdentifier) route += `/orgs/${params.orgIdentifier}`
       if (params.projectIdentifier) route += `/projects/${params.projectIdentifier}`
       if (params.sourceId && params.artifactId) {
-        route += `/artifact-sources/${params.sourceId}/artifacts/${params.artifactId}`
+        route += `/artifact-sources/${params.sourceId}/${params?.artifactType}/${params.artifactId}`
       }
       if (params.pipelineIdentifier && params.executionIdentifier) {
         route += `/pipelines/${params.pipelineIdentifier}/executions/${params.executionIdentifier}`
diff --git a/web/src/ar/hooks/index.ts b/web/src/ar/hooks/index.ts
index f775e957c..35b169fb5 100644
--- a/web/src/ar/hooks/index.ts
+++ b/web/src/ar/hooks/index.ts
@@ -27,3 +27,5 @@ export { useLicenseStore } from './useLicenseStore'
 export { useFeatureFlags, useFeatureFlag } from './useFeatureFlag'
 export { useGetUpstreamRepositoryPackageTypes } from './useGetUpstreamRepositoryPackageTypes'
 export { useGetRepositoryListViewType } from './useGetRepositoryListViewType'
+export { useDebouncedValue } from './useDebouncedValue'
+export { useConfirmationDialog } from './useConfirmationDialog'
diff --git a/web/src/ar/hooks/useConfirmationDialog.tsx b/web/src/ar/hooks/useConfirmationDialog.tsx
new file mode 100644
index 000000000..2317fc3d7
--- /dev/null
+++ b/web/src/ar/hooks/useConfirmationDialog.tsx
@@ -0,0 +1,97 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { Intent } from '@blueprintjs/core'
+import { ButtonProps, ConfirmationDialog } from '@harnessio/uicore'
+import { useParentHooks } from './useParentHooks'
+
+export interface UseConfirmationDialogProps {
+  titleText: React.ReactNode
+  contentText: React.ReactNode
+  cancelButtonText?: React.ReactNode
+  intent?: Intent
+  buttonIntent?: ButtonProps['intent']
+  confirmButtonText?: React.ReactNode
+  onCloseDialog?: (isConfirmed: boolean) => void
+  customButtons?: React.ReactNode
+  showCloseButton?: boolean
+  canOutsideClickClose?: boolean
+  canEscapeKeyClose?: boolean
+  children?: JSX.Element
+  className?: string
+  buttonDisabled?: boolean
+}
+
+export interface UseConfirmationDialogReturn {
+  openDialog: () => void
+  closeDialog: () => void
+}
+
+export const useConfirmationDialog = (props: UseConfirmationDialogProps): UseConfirmationDialogReturn => {
+  const {
+    titleText,
+    contentText,
+    cancelButtonText,
+    intent = Intent.NONE,
+    buttonIntent = Intent.PRIMARY,
+    confirmButtonText,
+    onCloseDialog,
+    customButtons,
+    showCloseButton,
+    canOutsideClickClose,
+    canEscapeKeyClose,
+    children,
+    className,
+    buttonDisabled
+  } = props
+
+  const { useModalHook } = useParentHooks()
+
+  const [showModal, hideModal] = useModalHook(() => {
+    return (
+      <ConfirmationDialog
+        isOpen
+        titleText={titleText}
+        contentText={contentText}
+        confirmButtonText={confirmButtonText}
+        className={className}
+        onClose={onClose}
+        cancelButtonText={cancelButtonText}
+        intent={intent}
+        buttonIntent={buttonIntent}
+        customButtons={customButtons}
+        showCloseButton={showCloseButton}
+        canOutsideClickClose={canOutsideClickClose}
+        canEscapeKeyClose={canEscapeKeyClose}
+        buttonDisabled={buttonDisabled}>
+        {children}
+      </ConfirmationDialog>
+    )
+  }, [props])
+
+  const onClose = React.useCallback(
+    (isConfirmed: boolean): void => {
+      onCloseDialog?.(isConfirmed)
+    },
+    [onCloseDialog]
+  )
+
+  return {
+    openDialog: () => showModal(),
+    closeDialog: () => hideModal()
+  }
+}
diff --git a/web/src/ar/hooks/useDebouncedValue.ts b/web/src/ar/hooks/useDebouncedValue.ts
new file mode 100644
index 000000000..0379026db
--- /dev/null
+++ b/web/src/ar/hooks/useDebouncedValue.ts
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { useEffect, useState } from 'react'
+
+export function useDebouncedValue<T>(value: T, delay: number) {
+  const [debouncedValue, setDebouncedValue] = useState(value)
+  useEffect(() => {
+    const handler = setTimeout(() => {
+      setDebouncedValue(value)
+    }, delay)
+    return () => clearTimeout(handler)
+  }, [value, delay])
+  return debouncedValue
+}
diff --git a/web/src/ar/hooks/useGetPageScope.tsx b/web/src/ar/hooks/useGetPageScope.tsx
new file mode 100644
index 000000000..2a4f23a11
--- /dev/null
+++ b/web/src/ar/hooks/useGetPageScope.tsx
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import type { Scope } from '@ar/MFEAppTypes'
+import { EntityScope } from '@ar/common/types'
+import { useAppStore } from './useAppStore'
+
+export const getEntityScopeType = (scope: Scope): EntityScope => {
+  return scope.projectIdentifier ? EntityScope.PROJECT : scope.orgIdentifier ? EntityScope.ORG : EntityScope.ACCOUNT
+}
+
+function useGetPageScope() {
+  const { scope } = useAppStore()
+  return getEntityScopeType(scope)
+}
+
+export default useGetPageScope
diff --git a/web/src/ar/hooks/useGetRepositoryTypes.ts b/web/src/ar/hooks/useGetRepositoryTypes.ts
index 1149d02c5..a10106b46 100644
--- a/web/src/ar/hooks/useGetRepositoryTypes.ts
+++ b/web/src/ar/hooks/useGetRepositoryTypes.ts
@@ -104,6 +104,15 @@ const RepositoryTypes: RepositoryTypeListItem[] = [
     tag: ThumbnailTagEnum.ComingSoon,
     featureFlag: FeatureFlags.HAR_GO_PACKAGE_TYPE_ENABLED
   },
+  {
+    label: 'repositoryTypes.huggingface',
+    value: RepositoryPackageType.HUGGINGFACE,
+    icon: 'huggingface',
+    tooltip: 'Coming Soon!',
+    disabled: true,
+    tag: ThumbnailTagEnum.ComingSoon,
+    featureFlag: FeatureFlags.HAR_HUGGINGFACE_PACKAGE_TYPE_ENABLED
+  },
   {
     label: 'repositoryTypes.debian',
     value: RepositoryPackageType.DEBIAN,
diff --git a/web/src/ar/hooks/useGetUpstreamRepositoryPackageTypes.ts b/web/src/ar/hooks/useGetUpstreamRepositoryPackageTypes.ts
index dc47f5ed4..c7470251e 100644
--- a/web/src/ar/hooks/useGetUpstreamRepositoryPackageTypes.ts
+++ b/web/src/ar/hooks/useGetUpstreamRepositoryPackageTypes.ts
@@ -101,6 +101,15 @@ export const UpstreamProxyPackageTypeList: UpstreamRepositoryPackageTypeListItem
     tag: ThumbnailTagEnum.ComingSoon,
     featureFlag: FeatureFlags.HAR_GO_PACKAGE_TYPE_ENABLED
   },
+  {
+    label: 'repositoryTypes.huggingface',
+    value: UpstreamProxyPackageType.HUGGINGFACE,
+    icon: 'huggingface',
+    tooltip: 'Coming Soon!',
+    disabled: true,
+    tag: ThumbnailTagEnum.ComingSoon,
+    featureFlag: FeatureFlags.HAR_HUGGINGFACE_PACKAGE_TYPE_ENABLED
+  },
   {
     label: 'repositoryTypes.debian',
     value: UpstreamProxyPackageType.DEBIAN,
diff --git a/web/src/ar/pages/artifact-details/components/ArtifactActions/DeleteArtifactMenuItem.tsx b/web/src/ar/pages/artifact-details/components/ArtifactActions/DeleteArtifactMenuItem.tsx
index a3f11a2b1..83536d78a 100644
--- a/web/src/ar/pages/artifact-details/components/ArtifactActions/DeleteArtifactMenuItem.tsx
+++ b/web/src/ar/pages/artifact-details/components/ArtifactActions/DeleteArtifactMenuItem.tsx
@@ -20,14 +20,13 @@ import { useHistory } from 'react-router-dom'
 import { useStrings } from '@ar/frameworks/strings'
 import { queryClient } from '@ar/utils/queryClient'
 import { useParentComponents, useRoutes } from '@ar/hooks'
-import { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import { PermissionIdentifier, ResourceType } from '@ar/common/permissionTypes'
 
 import type { ArtifactActionProps } from './types'
 import useDeleteArtifactModal from '../../hooks/useDeleteArtifactModal/useDeleteArtifactModal'
 
 export default function DeleteArtifactMenuItem(props: ArtifactActionProps): JSX.Element {
-  const { artifactKey, repoKey, readonly, onClose } = props
+  const { artifactKey, repoKey, readonly, onClose, data } = props
   const { getString } = useStrings()
   const { RbacMenuItem } = useParentComponents()
   const history = useHistory()
@@ -37,9 +36,8 @@ export default function DeleteArtifactMenuItem(props: ArtifactActionProps): JSX.
     onClose?.()
     queryClient.invalidateQueries(['GetAllArtifactsByRegistry'])
     history.push(
-      routes.toARRepositoryDetailsTab({
-        repositoryIdentifier: repoKey,
-        tab: RepositoryDetailsTab.PACKAGES
+      routes.toARRepositoryDetails({
+        repositoryIdentifier: repoKey
       })
     )
   }
@@ -47,7 +45,8 @@ export default function DeleteArtifactMenuItem(props: ArtifactActionProps): JSX.
   const { triggerDelete } = useDeleteArtifactModal({
     artifactKey,
     repoKey,
-    onSuccess: handleAfterDeleteRepository
+    onSuccess: handleAfterDeleteRepository,
+    artifactType: data?.artifactType
   })
 
   const handleDeleteService = (): void => {
diff --git a/web/src/ar/pages/artifact-details/context/ArtifactProvider.tsx b/web/src/ar/pages/artifact-details/context/ArtifactProvider.tsx
index 8c38946b1..7f6f7af7a 100644
--- a/web/src/ar/pages/artifact-details/context/ArtifactProvider.tsx
+++ b/web/src/ar/pages/artifact-details/context/ArtifactProvider.tsx
@@ -21,6 +21,7 @@ import { PageError, PageSpinner } from '@harnessio/uicore'
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import { useDecodedParams, useGetSpaceRef } from '@ar/hooks'
 import type { ArtifactDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 export interface ArtifactProviderProps {
   data: ArtifactSummary | undefined
@@ -35,7 +36,7 @@ const ArtifactProvider: FC<PropsWithChildren<{ repoKey?: string; artifact?: stri
   repoKey,
   artifact
 }): JSX.Element => {
-  const { repositoryIdentifier, artifactIdentifier } = useDecodedParams<ArtifactDetailsPathParams>()
+  const { repositoryIdentifier, artifactIdentifier, artifactType } = useDecodedParams<ArtifactDetailsPathParams>()
   const spaceRef = useGetSpaceRef(repoKey ?? repositoryIdentifier)
   const {
     data,
@@ -44,7 +45,10 @@ const ArtifactProvider: FC<PropsWithChildren<{ repoKey?: string; artifact?: stri
     refetch
   } = useGetArtifactSummaryQuery({
     registry_ref: spaceRef,
-    artifact: encodeRef(artifact ?? artifactIdentifier)
+    artifact: encodeRef(artifact ?? artifactIdentifier),
+    queryParams: {
+      artifact_type: artifactType === LocalArtifactType.ARTIFACTS ? undefined : artifactType
+    }
   })
 
   const responseData = data?.content?.data
diff --git a/web/src/ar/pages/artifact-details/hooks/useDeleteArtifactModal/useDeleteArtifactModal.tsx b/web/src/ar/pages/artifact-details/hooks/useDeleteArtifactModal/useDeleteArtifactModal.tsx
index 33bd6e8a6..3ef037240 100644
--- a/web/src/ar/pages/artifact-details/hooks/useDeleteArtifactModal/useDeleteArtifactModal.tsx
+++ b/web/src/ar/pages/artifact-details/hooks/useDeleteArtifactModal/useDeleteArtifactModal.tsx
@@ -16,7 +16,7 @@
 
 import { Intent } from '@blueprintjs/core'
 import { getErrorInfoFromErrorObject, useToaster } from '@harnessio/uicore'
-import { useDeleteArtifactMutation } from '@harnessio/react-har-service-client'
+import { ArtifactType, useDeleteArtifactMutation } from '@harnessio/react-har-service-client'
 
 import { useGetSpaceRef, useParentHooks } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
@@ -25,10 +25,11 @@ import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 interface useDeleteArtifactModalProps {
   repoKey: string
   artifactKey: string
+  artifactType?: ArtifactType
   onSuccess: () => void
 }
 export default function useDeleteArtifactModal(props: useDeleteArtifactModalProps) {
-  const { repoKey, onSuccess, artifactKey } = props
+  const { repoKey, onSuccess, artifactKey, artifactType } = props
   const { getString } = useStrings()
   const { showSuccess, showError, clear } = useToaster()
   const { useConfirmationDialog } = useParentHooks()
@@ -41,7 +42,10 @@ export default function useDeleteArtifactModal(props: useDeleteArtifactModalProp
       try {
         const response = await deleteArtifact({
           registry_ref: spaceRef,
-          artifact: encodeRef(artifactKey)
+          artifact: encodeRef(artifactKey),
+          queryParams: {
+            artifact_type: artifactType
+          }
         })
         if (response.content.status === 'SUCCESS') {
           clear()
diff --git a/web/src/ar/pages/artifact-list/RegistryArtifactListPage.tsx b/web/src/ar/pages/artifact-list/RegistryArtifactListPage.tsx
index 83f0ce747..4436401a6 100644
--- a/web/src/ar/pages/artifact-list/RegistryArtifactListPage.tsx
+++ b/web/src/ar/pages/artifact-list/RegistryArtifactListPage.tsx
@@ -22,13 +22,16 @@ import { ExpandingSearchInput, Page, type ExpandingSearchInputHandle, Button, Bu
 import { useGetAllArtifactsByRegistryQuery } from '@harnessio/react-har-service-client'
 
 import { useStrings } from '@ar/frameworks/strings'
+import type { RepositoryDetailsTabPathParams } from '@ar/routes/types'
 import { DEFAULT_PAGE_INDEX, PreferenceScope } from '@ar/constants'
-import { useGetSpaceRef, useParentHooks } from '@ar/hooks'
+import { useDecodedParams, useGetSpaceRef, useParentHooks } from '@ar/hooks'
+
+import { RepositoryTabToArtifactTypeMap } from './constants'
+import RegistryArtifactListTable from './components/RegistryArtifactListTable/RegistryArtifactListTable'
 import {
   useRegistryArtifactListQueryParamOptions,
   type RegistryArtifactListPageQueryParams
 } from './components/RegistryArtifactListTable/utils'
-import RegistryArtifactListTable from './components/RegistryArtifactListTable/RegistryArtifactListTable'
 
 import css from './ArtifactListPage.module.scss'
 
@@ -40,6 +43,7 @@ function RegistryArtifactListPage({ pageBodyClassName }: RegistryArtifactListPag
   const { getString } = useStrings()
   const { useQueryParams, useUpdateQueryParams, usePreferenceStore } = useParentHooks()
   const searchRef = useRef({} as ExpandingSearchInputHandle)
+  const { tab } = useDecodedParams<RepositoryDetailsTabPathParams>()
   const { updateQueryParams } = useUpdateQueryParams<Partial<RegistryArtifactListPageQueryParams>>()
   const queryParams = useQueryParams<RegistryArtifactListPageQueryParams>(useRegistryArtifactListQueryParamOptions())
   const { searchTerm, isDeployedArtifacts, packageTypes, page, size, labels } = queryParams
@@ -68,7 +72,8 @@ function RegistryArtifactListPage({ pageBodyClassName }: RegistryArtifactListPag
       size,
       search_term: searchTerm,
       sort_field: sortField,
-      sort_order: sortOrder
+      sort_order: sortOrder,
+      artifact_type: RepositoryTabToArtifactTypeMap[tab]
     },
     stringifyQueryParamsOptions: {
       arrayFormat: 'repeat'
diff --git a/web/src/ar/pages/artifact-list/components/ArtifactListTable/ArtifactListTableCell.tsx b/web/src/ar/pages/artifact-list/components/ArtifactListTable/ArtifactListTableCell.tsx
index 39043a94c..1d869af9d 100644
--- a/web/src/ar/pages/artifact-list/components/ArtifactListTable/ArtifactListTableCell.tsx
+++ b/web/src/ar/pages/artifact-list/components/ArtifactListTable/ArtifactListTableCell.tsx
@@ -15,18 +15,16 @@
  */
 
 import React from 'react'
-import QueryString from 'qs'
 import { defaultTo } from 'lodash-es'
 import { Link } from 'react-router-dom'
 import { Position } from '@blueprintjs/core'
-import { Color, FontVariation } from '@harnessio/design-system'
-import { Button, ButtonVariation, Layout, Text } from '@harnessio/uicore'
-import type { ArtifactMetadata, StoDigestMetadata } from '@harnessio/react-har-service-client'
+import { Color } from '@harnessio/design-system'
+import { Layout, Text } from '@harnessio/uicore'
+import type { ArtifactMetadata } from '@harnessio/react-har-service-client'
 import type { Cell, CellValue, ColumnInstance, Renderer, Row, TableInstance, UseExpandedRowProps } from 'react-table'
 
 import { useRoutes } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
-import { getShortDigest } from '@ar/pages/digest-list/utils'
 import TableCells from '@ar/components/TableCells/TableCells'
 import versionFactory from '@ar/frameworks/Version/VersionFactory'
 import { PageType, RepositoryPackageType } from '@ar/common/types'
@@ -35,8 +33,7 @@ import { useGetRepositoryTypes } from '@ar/hooks/useGetRepositoryTypes'
 import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon'
 import VersionActionsWidget from '@ar/frameworks/Version/VersionActionsWidget'
 import { VersionDetailsTab } from '@ar/pages/version-details/components/VersionDetailsTabs/constants'
-
-import css from './ArtifactListTable.module.scss'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 type CellTypeWithActions<D extends Record<string, any>, V = any> = TableInstance<D> & {
   column: ColumnInstance<D>
@@ -84,17 +81,32 @@ export const ArtifactNameCell: Renderer<{
   const { original } = row
   const { onClickLabel } = column
   const routes = useRoutes()
-  const { name: value, version, packageType, registryIdentifier } = original
+  const {
+    name: value,
+    version,
+    packageType,
+    registryIdentifier,
+    artifactType,
+    isQuarantined,
+    quarantineReason
+  } = original
   return (
     <Layout.Vertical>
       <TableCells.LinkCell
-        prefix={<RepositoryIcon packageType={original.packageType as RepositoryPackageType} />}
+        prefix={
+          isQuarantined ? (
+            <TableCells.QuarantineIcon reason={quarantineReason} />
+          ) : (
+            <RepositoryIcon packageType={original.packageType as RepositoryPackageType} />
+          )
+        }
         linkTo={routes.toARRedirect({
           packageType: packageType as RepositoryPackageType,
           registryId: registryIdentifier,
           artifactId: value,
           versionId: version,
-          versionDetailsTab: VersionDetailsTab.OVERVIEW
+          versionDetailsTab: VersionDetailsTab.OVERVIEW,
+          artifactType
         })}
         label={value}
         subLabel={version}
@@ -144,7 +156,7 @@ export const ArtifactDeploymentsCell: CellType = ({ row }) => {
 export const ArtifactListPullCommandCell: CellType = ({ value, row }) => {
   const { original } = row
   const routes = useRoutes()
-  const { packageType } = original
+  const { packageType, artifactType } = original
   const { getString } = useStrings()
   switch (packageType) {
     case RepositoryPackageType.MAVEN:
@@ -155,7 +167,8 @@ export const ArtifactListPullCommandCell: CellType = ({ value, row }) => {
             repositoryIdentifier: original.registryIdentifier,
             artifactIdentifier: original.name,
             versionIdentifier: original.version as string,
-            versionTab: VersionDetailsTab.ARTIFACT_DETAILS
+            versionTab: VersionDetailsTab.ARTIFACT_DETAILS,
+            artifactType: (artifactType ?? LocalArtifactType.ARTIFACTS) as LocalArtifactType
           })}
           label={getString('artifactList.viewArtifactDetails')}
         />
@@ -165,85 +178,17 @@ export const ArtifactListPullCommandCell: CellType = ({ value, row }) => {
   }
 }
 
-interface ScannedDigestListProps {
-  list: StoDigestMetadata[]
-  metadata: ArtifactMetadata
-}
-
-const ScannedDigestList = (props: ScannedDigestListProps) => {
-  const { list, metadata } = props
-  const routes = useRoutes()
-  return (
-    <Layout.Vertical width={450}>
-      {list.map(each => (
-        <Layout.Horizontal
-          padding="small"
-          spacing="medium"
-          flex={{ alignItems: 'center', justifyContent: 'space-between' }}
-          key={each.digest}>
-          <TableCells.LinkCell
-            linkTo={
-              routes.toARVersionDetailsTab({
-                repositoryIdentifier: metadata.registryIdentifier,
-                artifactIdentifier: metadata.name,
-                versionIdentifier: metadata.version,
-                versionTab: VersionDetailsTab.OVERVIEW
-              }) + `?${QueryString.stringify({ digest: each.digest }, { skipNulls: true })}`
-            }
-            label={getShortDigest(each.digest || '')}
-          />
-          <TableCells.TextCell value={each.osArch} />
-          <TableCells.VulnerabilityCell
-            critical={each.stoDetails?.critical}
-            high={each.stoDetails?.high}
-            low={each.stoDetails?.low}
-            medium={each.stoDetails?.medium}
-          />
-        </Layout.Horizontal>
-      ))}
-    </Layout.Vertical>
-  )
-}
-
-export const ArtifactListVulnerabilitiesCell: CellType = ({ row }) => {
-  const { original } = row
-  const { stoMetadata } = original
-  const { scannedCount, totalCount, digestMetadata } = stoMetadata || {}
-  const { getString } = useStrings()
-
-  if (!scannedCount) {
-    return <Text>{getString('artifactList.table.actions.VulnerabilityStatus.nonScanned')}</Text>
-  }
-
-  return (
-    <Button className={css.cellBtn} variation={ButtonVariation.LINK}>
-      <Text
-        font={{ variation: FontVariation.BODY }}
-        color={Color.PRIMARY_7}
-        tooltipProps={{
-          interactionKind: 'click',
-          position: Position.BOTTOM
-        }}
-        tooltip={<ScannedDigestList list={digestMetadata || []} metadata={original} />}>
-        {getString('artifactList.table.actions.VulnerabilityStatus.partiallyScanned', {
-          total: defaultTo(totalCount, 0),
-          scanned: defaultTo(scannedCount, 0)
-        })}
-      </Text>
-    </Button>
-  )
-}
-
 export const ScanStatusCell: CellType = ({ row }) => {
   const { original } = row
   const router = useRoutes()
-  const { version = '', name, registryIdentifier } = original
+  const { version = '', name, registryIdentifier, artifactType } = original
   const { getString } = useStrings()
   const linkTo = router.toARVersionDetailsTab({
     repositoryIdentifier: registryIdentifier,
     artifactIdentifier: name,
     versionIdentifier: version,
-    versionTab: VersionDetailsTab.OVERVIEW
+    versionTab: VersionDetailsTab.OVERVIEW,
+    artifactType: (artifactType ?? LocalArtifactType.ARTIFACTS) as LocalArtifactType
   })
   return (
     <Link to={linkTo} target="_blank">
diff --git a/web/src/ar/pages/artifact-list/components/RegistryArtifactListTable/RegistryArtifactListTableCell.tsx b/web/src/ar/pages/artifact-list/components/RegistryArtifactListTable/RegistryArtifactListTableCell.tsx
index a92f32fdb..0bc69a54e 100644
--- a/web/src/ar/pages/artifact-list/components/RegistryArtifactListTable/RegistryArtifactListTableCell.tsx
+++ b/web/src/ar/pages/artifact-list/components/RegistryArtifactListTable/RegistryArtifactListTableCell.tsx
@@ -29,7 +29,7 @@ import TableCells from '@ar/components/TableCells/TableCells'
 import LabelsPopover from '@ar/components/LabelsPopover/LabelsPopover'
 import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon'
 import { PageType, type RepositoryPackageType } from '@ar/common/types'
-import { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import { LocalArtifactType, RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import ArtifactActionsWidget from '@ar/frameworks/Version/ArtifactActionsWidget'
 import { VersionDetailsTab } from '@ar/pages/version-details/components/VersionDetailsTabs/constants'
 
@@ -56,10 +56,17 @@ export const RegistryArtifactNameCell: Renderer<{
   const value = original.name
   return (
     <TableCells.LinkCell
-      prefix={<RepositoryIcon packageType={original.packageType as RepositoryPackageType} />}
+      prefix={
+        original.isQuarantined ? (
+          <TableCells.QuarantineIcon reason={original.quarantineReason} />
+        ) : (
+          <RepositoryIcon packageType={original.packageType as RepositoryPackageType} />
+        )
+      }
       linkTo={routes.toARArtifactDetails({
         repositoryIdentifier: original.registryIdentifier,
-        artifactIdentifier: value
+        artifactIdentifier: value,
+        artifactType: (original.artifactType ?? LocalArtifactType.ARTIFACTS) as LocalArtifactType
       })}
       label={value}
       postfix={
diff --git a/web/src/ar/pages/artifact-list/constants.ts b/web/src/ar/pages/artifact-list/constants.ts
index 3833efc91..d3c6a4c50 100644
--- a/web/src/ar/pages/artifact-list/constants.ts
+++ b/web/src/ar/pages/artifact-list/constants.ts
@@ -14,7 +14,16 @@
  * limitations under the License.
  */
 
+import type { ArtifactType } from '@harnessio/react-har-service-client'
+
+import { RepositoryDetailsTab } from '../repository-details/constants'
+
 export enum ArtifactListVersionFilter {
   LATEST_VERSION = 'latest_version',
   ALL_VERSION = 'all_version'
 }
+
+export const RepositoryTabToArtifactTypeMap: Partial<Record<RepositoryDetailsTab, ArtifactType>> = {
+  [RepositoryDetailsTab.DATASETS]: 'DATASET',
+  [RepositoryDetailsTab.MODELS]: 'MODEL'
+}
diff --git a/web/src/ar/pages/digest-list/components/DigestListTable/DigestTableCells.tsx b/web/src/ar/pages/digest-list/components/DigestListTable/DigestTableCells.tsx
index 56c79c6e0..85829bbcf 100644
--- a/web/src/ar/pages/digest-list/components/DigestListTable/DigestTableCells.tsx
+++ b/web/src/ar/pages/digest-list/components/DigestListTable/DigestTableCells.tsx
@@ -24,6 +24,7 @@ import { useRoutes } from '@ar/hooks'
 import { getShortDigest } from '@ar/pages/digest-list/utils'
 import TableCells from '@ar/components/TableCells/TableCells'
 import { VersionDetailsTab } from '@ar/pages/version-details/components/VersionDetailsTabs/constants'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 type CellTypeWithActions<D extends Record<string, any>, V = any> = TableInstance<D> & {
   column: ColumnInstance<D>
@@ -53,9 +54,16 @@ export const DigestNameCell: Renderer<{
     repositoryIdentifier,
     artifactIdentifier,
     versionIdentifier,
-    versionTab: VersionDetailsTab.OVERVIEW
+    versionTab: VersionDetailsTab.OVERVIEW,
+    artifactType: LocalArtifactType.ARTIFACTS
   })
-  return <TableCells.LinkCell label={getShortDigest(value)} linkTo={`${linkTo}?digest=${value}`} />
+  return (
+    <TableCells.LinkCell
+      prefix={original.isQuarantined ? <TableCells.QuarantineIcon reason={original.quarantineReason} /> : <></>}
+      label={getShortDigest(value)}
+      linkTo={`${linkTo}?digest=${value}`}
+    />
+  )
 }
 
 export const OsArchCell: CellType = ({ value }) => {
diff --git a/web/src/ar/pages/repository-details/DockerRepository/DockerRedirectPage/DockerRedirectPage.tsx b/web/src/ar/pages/repository-details/DockerRepository/DockerRedirectPage/DockerRedirectPage.tsx
index 743b0b903..0be5af8c6 100644
--- a/web/src/ar/pages/repository-details/DockerRepository/DockerRedirectPage/DockerRedirectPage.tsx
+++ b/web/src/ar/pages/repository-details/DockerRepository/DockerRedirectPage/DockerRedirectPage.tsx
@@ -24,6 +24,7 @@ import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import { useQueryParams } from 'hooks/useQueryParams'
 
 import type { DockerRedirectPageQueryParams } from './types'
+import { LocalArtifactType } from '../../constants'
 
 export default function DockerRedirectPage() {
   const { registryId, artifactId, versionId, digest, versionDetailsTab } =
@@ -61,7 +62,8 @@ export default function DockerRedirectPage() {
         repositoryIdentifier: registryId,
         artifactIdentifier: artifactId,
         versionIdentifier: versionId,
-        versionTab: versionDetailsTab
+        versionTab: versionDetailsTab,
+        artifactType: LocalArtifactType.ARTIFACTS
       })
       return `${url}?digest=${defaultDigest}`
     }
@@ -70,14 +72,16 @@ export default function DockerRedirectPage() {
       const url = routes.toARVersionDetails({
         repositoryIdentifier: registryId,
         artifactIdentifier: artifactId,
-        versionIdentifier: versionId
+        versionIdentifier: versionId,
+        artifactType: LocalArtifactType.ARTIFACTS
       })
       return `${url}?digest=${defaultDigest}`
     }
     if (registryId && artifactId) {
       return routes.toARArtifactDetails({
         repositoryIdentifier: registryId,
-        artifactIdentifier: artifactId
+        artifactIdentifier: artifactId,
+        artifactType: LocalArtifactType.ARTIFACTS
       })
     }
     if (registryId) {
diff --git a/web/src/ar/pages/repository-details/HuggingfaceRepositoryType/HuggingfaceRepositoryType.tsx b/web/src/ar/pages/repository-details/HuggingfaceRepositoryType/HuggingfaceRepositoryType.tsx
new file mode 100644
index 000000000..a8d4f0ae3
--- /dev/null
+++ b/web/src/ar/pages/repository-details/HuggingfaceRepositoryType/HuggingfaceRepositoryType.tsx
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import type { IconName } from '@harnessio/icons'
+
+import { RepositoryConfigType, RepositoryPackageType } from '@ar/common/types'
+import UpstreamProxyActions from '@ar/pages/upstream-proxy-details/components/UpstreamProxyActions/UpstreamProxyActions'
+import UpstreamProxyConfigurationForm from '@ar/pages/upstream-proxy-details/components/Forms/UpstreamProxyConfigurationForm'
+import UpstreamProxyCreateFormContent from '@ar/pages/upstream-proxy-details/components/FormContent/UpstreamProxyCreateFormContent'
+import UpstreamProxyDetailsHeader from '@ar/pages/upstream-proxy-details/components/UpstreamProxyDetailsHeader/UpstreamProxyDetailsHeader'
+import {
+  type CreateRepositoryFormProps,
+  type RepositoryActionsProps,
+  type RepositoryConfigurationFormProps,
+  type RepositoryDetailsHeaderProps,
+  RepositoryStep,
+  type RepositoryTreeNodeProps,
+  type RepositoySetupClientProps
+} from '@ar/frameworks/RepositoryStep/Repository'
+import {
+  UpstreamProxyAuthenticationMode,
+  type UpstreamRegistryRequest,
+  UpstreamRepositoryURLInputSource
+} from '@ar/pages/upstream-proxy-details/types'
+
+import RepositoryDetails from '../RepositoryDetails'
+import type { Repository, VirtualRegistryRequest } from '../types'
+import RepositoryActions from '../components/Actions/RepositoryActions'
+import RedirectPageView from '../components/RedirectPageView/RedirectPageView'
+import SetupClientContent from '../components/SetupClientContent/SetupClientContent'
+import RepositoryTreeNode from '../components/RepositoryTreeNode/RepositoryTreeNode'
+import RepositoryConfigurationForm from '../components/Forms/RepositoryConfigurationForm'
+import RepositoryCreateFormContent from '../components/FormContent/RepositoryCreateFormContent'
+import RepositoryDetailsHeader from '../components/RepositoryDetailsHeader/RepositoryDetailsHeader'
+import { LocalArtifactType, RepositoryDetailsTab } from '../constants'
+
+export class HuggingfaceRepositoryType extends RepositoryStep<VirtualRegistryRequest> {
+  protected packageType = RepositoryPackageType.HUGGINGFACE
+  protected repositoryName = 'Huggingface Repository'
+  protected repositoryIcon: IconName = 'huggingface'
+  protected supportedScanners = []
+  protected supportsUpstreamProxy = true
+  protected supportedUpstreamURLSources = [
+    UpstreamRepositoryURLInputSource.HuggingFace,
+    UpstreamRepositoryURLInputSource.Custom
+  ]
+  supportedArtifactTypes: LocalArtifactType[] = [LocalArtifactType.DATASET, LocalArtifactType.MODEL]
+  supportedRepositoryTabs = [
+    RepositoryDetailsTab.DATASETS,
+    RepositoryDetailsTab.MODELS,
+    RepositoryDetailsTab.CONFIGURATION,
+    RepositoryDetailsTab.WEBHOOKS
+  ]
+
+  protected defaultValues: VirtualRegistryRequest = {
+    packageType: RepositoryPackageType.HUGGINGFACE,
+    identifier: '',
+    config: {
+      type: RepositoryConfigType.VIRTUAL
+    },
+    scanners: []
+  }
+
+  protected defaultUpstreamProxyValues: UpstreamRegistryRequest = {
+    packageType: RepositoryPackageType.HUGGINGFACE,
+    identifier: '',
+    config: {
+      type: RepositoryConfigType.UPSTREAM,
+      source: UpstreamRepositoryURLInputSource.HuggingFace,
+      authType: UpstreamProxyAuthenticationMode.ANONYMOUS,
+      url: ''
+    },
+    cleanupPolicy: [],
+    scanners: []
+  }
+
+  renderCreateForm(props: CreateRepositoryFormProps): JSX.Element {
+    const { type } = props
+    if (type === RepositoryConfigType.VIRTUAL) {
+      return <RepositoryCreateFormContent isEdit={false} />
+    } else {
+      return <UpstreamProxyCreateFormContent isEdit={false} readonly={false} />
+    }
+  }
+
+  renderCofigurationForm(props: RepositoryConfigurationFormProps<Repository>): JSX.Element {
+    const { type } = props
+    if (type === RepositoryConfigType.VIRTUAL) {
+      return <RepositoryConfigurationForm ref={props.formikRef} readonly={props.readonly} />
+    } else {
+      return <UpstreamProxyConfigurationForm ref={props.formikRef} readonly={props.readonly} />
+    }
+  }
+
+  renderActions(props: RepositoryActionsProps<Repository>): JSX.Element {
+    if (props.type === RepositoryConfigType.VIRTUAL) {
+      return <RepositoryActions data={props.data} readonly={props.readonly} pageType={props.pageType} />
+    }
+    return <UpstreamProxyActions data={props.data} readonly={props.readonly} pageType={props.pageType} />
+  }
+
+  renderSetupClient(props: RepositoySetupClientProps): JSX.Element {
+    const { repoKey, onClose, artifactKey, versionKey } = props
+    return (
+      <SetupClientContent
+        repoKey={repoKey}
+        artifactKey={artifactKey}
+        versionKey={versionKey}
+        onClose={onClose}
+        packageType={RepositoryPackageType.HUGGINGFACE}
+      />
+    )
+  }
+
+  renderRepositoryDetailsHeader(props: RepositoryDetailsHeaderProps<Repository>): JSX.Element {
+    const { type } = props
+    if (type === RepositoryConfigType.VIRTUAL) {
+      return <RepositoryDetailsHeader data={props.data} />
+    } else {
+      return <UpstreamProxyDetailsHeader data={props.data} />
+    }
+  }
+
+  renderRedirectPage(): JSX.Element {
+    return <RedirectPageView />
+  }
+
+  renderTreeNodeView(props: RepositoryTreeNodeProps): JSX.Element {
+    return <RepositoryTreeNode {...props} icon={this.repositoryIcon} />
+  }
+
+  renderTreeNodeDetails(): JSX.Element {
+    return <RepositoryDetails />
+  }
+}
diff --git a/web/src/ar/pages/repository-details/RepositoryDetails.tsx b/web/src/ar/pages/repository-details/RepositoryDetails.tsx
index 113047036..aa430a296 100644
--- a/web/src/ar/pages/repository-details/RepositoryDetails.tsx
+++ b/web/src/ar/pages/repository-details/RepositoryDetails.tsx
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-import React, { useContext, useState } from 'react'
+import React, { useContext, useMemo, useState } from 'react'
 import type { FormikProps } from 'formik'
 import { Expander } from '@blueprintjs/core'
 import { Redirect, Switch, useHistory } from 'react-router-dom'
@@ -32,6 +32,7 @@ import {
   useRoutes
 } from '@ar/hooks'
 import { PermissionIdentifier, ResourceType } from '@ar/common/permissionTypes'
+import repositoryFactory from '@ar/frameworks/RepositoryStep/RepositoryFactory'
 import { repositoryDetailsPathProps, repositoryDetailsTabPathProps } from '@ar/routes/RouteDestinations'
 
 import { RepositoryDetailsTab, RepositoryDetailsTabs } from './constants'
@@ -55,6 +56,16 @@ export default function RepositoryDetails(): JSX.Element | null {
 
   const { isDirty, data, isUpdating } = useContext(RepositoryProviderContext)
 
+  const repositoryTabs = useMemo(() => {
+    if (!data) return []
+    const repositoryType = repositoryFactory.getRepositoryType(data?.packageType)
+    const tabs = repositoryType?.getSupportedRepositoryTabs() || []
+    return RepositoryDetailsTabs.filter(each => tabs.includes(each.value))
+      .filter(each => !each.featureFlag || featureFlags[each.featureFlag])
+      .filter(each => !each.type || each.type === data?.config.type)
+      .filter(each => !each.mode || each.mode === repositoryListViewType)
+  }, [data, featureFlags, repositoryListViewType])
+
   const handleTabChange = (nextTab: RepositoryDetailsTab): void => {
     setActiveTab(nextTab)
     history.push(routes.toARRepositoryDetailsTab({ ...pathParams, tab: nextTab }))
@@ -100,20 +111,16 @@ export default function RepositoryDetails(): JSX.Element | null {
     <>
       <TabsContainer className={css.tabsContainer}>
         <Tabs id="repositoryTabDetails" selectedTabId={activeTab} onChange={handleTabChange}>
-          {RepositoryDetailsTabs.filter(each => !each.featureFlag || featureFlags[each.featureFlag])
-            .filter(each => !each.packageType || each.packageType === data.packageType)
-            .filter(each => !each.type || each.type === data.config.type)
-            .filter(each => !each.mode || each.mode === repositoryListViewType)
-            .map(each => (
-              <Tab key={each.value} id={each.value} title={getString(each.label)} />
-            ))}
+          {repositoryTabs.map(each => (
+            <Tab key={each.value} id={each.value} title={getString(each.label)} />
+          ))}
           <Expander />
           {activeTab === RepositoryDetailsTab.CONFIGURATION && renderActionBtns()}
         </Tabs>
       </TabsContainer>
       <Switch>
         <RouteProvider exact path={routeDefinitions.toARRepositoryDetails({ ...repositoryDetailsPathProps })}>
-          <Redirect to={routes.toARRepositoryDetailsTab({ ...pathParams, tab: RepositoryDetailsTab.CONFIGURATION })} />
+          <Redirect to={routes.toARRepositoryDetailsTab({ ...pathParams, tab: repositoryTabs[0].value })} />
         </RouteProvider>
         <RouteProvider exact path={[routeDefinitions.toARRepositoryDetailsTab({ ...repositoryDetailsTabPathProps })]}>
           <RepositoryDetailsTabPage
diff --git a/web/src/ar/pages/repository-details/RepositoryDetailsTabPage.tsx b/web/src/ar/pages/repository-details/RepositoryDetailsTabPage.tsx
index 5abf836bf..7aa588ff8 100644
--- a/web/src/ar/pages/repository-details/RepositoryDetailsTabPage.tsx
+++ b/web/src/ar/pages/repository-details/RepositoryDetailsTabPage.tsx
@@ -16,10 +16,10 @@
 
 import React, { useContext } from 'react'
 import { useEffect } from 'react'
-import { Text } from '@harnessio/uicore'
+import { Layout, Text } from '@harnessio/uicore'
 import type { FormikProps } from 'formik'
 
-import { useDecodedParams } from '@ar/hooks'
+import { useDecodedParams, useFeatureFlags } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
 import type { RepositoryDetailsTabPathParams } from '@ar/routes/types'
 import type { RepositoryConfigType, RepositoryPackageType } from '@ar/common/types'
@@ -29,6 +29,7 @@ import { RepositoryDetailsTab } from './constants'
 import WebhookListPage from '../webhook-list/WebhookListPage'
 import { RepositoryProviderContext } from './context/RepositoryProvider'
 import RegistryArtifactListPage from '../artifact-list/RegistryArtifactListPage'
+import ManageRepositoryMetadata from './components/ManageRepositoryMetadata/ManageRepositoryMetadata'
 
 import css from './RepositoryDetailsPage.module.scss'
 
@@ -42,6 +43,7 @@ export default function RepositoryDetailsTabPage(props: RepositoryDetailsTabPage
   const { getString } = useStrings()
   const { tab } = useDecodedParams<RepositoryDetailsTabPathParams>()
   const { data, isReadonly } = useContext(RepositoryProviderContext)
+  const { HAR_CUSTOM_METADATA_ENABLED } = useFeatureFlags()
 
   useEffect(() => {
     onInit(tab)
@@ -49,15 +51,23 @@ export default function RepositoryDetailsTabPage(props: RepositoryDetailsTabPage
 
   switch (tab) {
     case RepositoryDetailsTab.PACKAGES:
+    case RepositoryDetailsTab.DATASETS:
+    case RepositoryDetailsTab.MODELS:
       return <RegistryArtifactListPage pageBodyClassName={css.packagesPageBody} />
     case RepositoryDetailsTab.CONFIGURATION:
       return (
-        <RepositoryConfigurationFormWidget
-          packageType={data?.packageType as RepositoryPackageType}
-          type={data?.config.type as RepositoryConfigType}
-          ref={stepRef}
-          readonly={isReadonly}
-        />
+        <Layout.Horizontal
+          padding="xlarge"
+          spacing="medium"
+          flex={{ justifyContent: 'space-between', alignItems: 'flex-start' }}>
+          <RepositoryConfigurationFormWidget
+            packageType={data?.packageType as RepositoryPackageType}
+            type={data?.config.type as RepositoryConfigType}
+            ref={stepRef}
+            readonly={isReadonly}
+          />
+          {HAR_CUSTOM_METADATA_ENABLED && <ManageRepositoryMetadata />}
+        </Layout.Horizontal>
       )
     case RepositoryDetailsTab.WEBHOOKS:
       return <WebhookListPage />
diff --git a/web/src/ar/pages/repository-details/RepositoryFactory.tsx b/web/src/ar/pages/repository-details/RepositoryFactory.tsx
index f83860082..5f4f80253 100644
--- a/web/src/ar/pages/repository-details/RepositoryFactory.tsx
+++ b/web/src/ar/pages/repository-details/RepositoryFactory.tsx
@@ -25,6 +25,7 @@ import { NuGetRepositoryType } from './NuGetRepository/NuGetRepositoryType'
 import { RPMRepositoryType } from './RPMRepository/RPMRepositoryType'
 import { CargoRepositoryType } from './CargoRepository/CargoRepositoryType'
 import { GoRepositoryType } from './GoRepository/GoRepositoryType'
+import { HuggingfaceRepositoryType } from './HuggingfaceRepositoryType/HuggingfaceRepositoryType'
 
 repositoryFactory.registerStep(new DockerRepositoryType())
 repositoryFactory.registerStep(new HelmRepositoryType())
@@ -36,3 +37,4 @@ repositoryFactory.registerStep(new NuGetRepositoryType())
 repositoryFactory.registerStep(new RPMRepositoryType())
 repositoryFactory.registerStep(new CargoRepositoryType())
 repositoryFactory.registerStep(new GoRepositoryType())
+repositoryFactory.registerStep(new HuggingfaceRepositoryType())
diff --git a/web/src/ar/pages/repository-details/components/FormContent/FormContent.module.scss b/web/src/ar/pages/repository-details/components/FormContent/FormContent.module.scss
index 460b38818..09c02816d 100644
--- a/web/src/ar/pages/repository-details/components/FormContent/FormContent.module.scss
+++ b/web/src/ar/pages/repository-details/components/FormContent/FormContent.module.scss
@@ -19,8 +19,9 @@
 }
 
 .cardContainer {
-  width: 60%;
-  min-width: 1024px;
+  width: 80%;
+  min-width: 900px;
+  max-width: 1024px;
   padding: var(--spacing-7) !important;
   background-color: var(--white);
 }
@@ -30,7 +31,8 @@
 }
 
 .upstreamProxiesContainer {
-  max-width: 80%;
+  width: 95%;
+  max-width: 1024px;
 }
 
 .upstreamProxiesWrapper {
diff --git a/web/src/ar/pages/repository-details/components/FormContent/RepositoryConfigurationFormContent.tsx b/web/src/ar/pages/repository-details/components/FormContent/RepositoryConfigurationFormContent.tsx
index 5a8006abe..af4222d42 100644
--- a/web/src/ar/pages/repository-details/components/FormContent/RepositoryConfigurationFormContent.tsx
+++ b/web/src/ar/pages/repository-details/components/FormContent/RepositoryConfigurationFormContent.tsx
@@ -14,13 +14,13 @@
  * limitations under the License.
  */
 
-import React, { useContext, useEffect, useState } from 'react'
+import React, { useContext, useEffect, useMemo, useState } from 'react'
 import classNames from 'classnames'
 import { FormikContextType, connect } from 'formik'
 import { FontVariation } from '@harnessio/design-system'
 import { Card, Container, Text } from '@harnessio/uicore'
 
-import { useAppStore } from '@ar/hooks'
+import { useAppStore, useFeatureFlags } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
 import { Separator } from '@ar/components/Separator/Separator'
 import { Parent, RepositoryPackageType } from '@ar/common/types'
@@ -30,6 +30,7 @@ import repositoryFactory from '@ar/frameworks/RepositoryStep/RepositoryFactory'
 
 import RepositoryDetailsFormContent from './RepositoryDetailsFormContent'
 import { RepositoryProviderContext } from '../../context/RepositoryProvider'
+import RepositoryOpaPolicySelectorContent from './RepositoryOpaPolicySelectorContent'
 import SelectContainerScannersFormSection from './SelectContainerScannersFormSection'
 import RepositoryUpstreamProxiesFormContent from './RepositoryUpstreamProxiesFormContent'
 import RepositoryCleanupPoliciesFormContent from './RepositoryCleanupPoliciesFormContent'
@@ -48,6 +49,7 @@ function RepositoryConfigurationFormContent(
   const { getString } = useStrings()
   const { setIsDirty } = useContext(RepositoryProviderContext)
   const { parent } = useAppStore()
+  const { HAR_ARTIFACT_QUARANTINE_ENABLED } = useFeatureFlags()
   const { dirty, values } = formik
   const { packageType } = values
   const [isCollapsedAdvancedConfig] = useState(getInitialStateOfCollapse())
@@ -70,8 +72,26 @@ function RepositoryConfigurationFormContent(
     return true
   }
 
+  const advancedOptionsTitle = useMemo(() => {
+    return getString(
+      repositoryType?.enterpriseAdvancedOptionSubTitle ??
+        'repositoryDetails.repositoryForm.enterpriseAdvancedOptionsSubTitle',
+      {
+        entities: [
+          getString('repositoryDetails.repositoryForm.upstreamProxiesTitle'),
+          parent === Parent.Enterprise &&
+            HAR_ARTIFACT_QUARANTINE_ENABLED &&
+            getString('repositoryDetails.repositoryForm.opaPolicy.title'),
+          parent === Parent.Enterprise && getString('repositoryDetails.repositoryForm.cleanupPoliciesTitle')
+        ]
+          .filter(Boolean)
+          .join(', ')
+      }
+    )
+  }, [])
+
   return (
-    <Container padding="xxlarge">
+    <Container>
       <Container>
         <Text className={css.cardHeading} font={{ variation: FontVariation.CARD_TITLE }}>
           {getString('repositoryDetails.repositoryForm.title')}
@@ -99,17 +119,7 @@ function RepositoryConfigurationFormContent(
         <CollapseContainer
           className={css.marginTopLarge}
           title={getString('repositoryDetails.repositoryForm.advancedOptionsTitle')}
-          subTitle={
-            parent === Parent.Enterprise
-              ? getString(
-                  repositoryType?.enterpriseAdvancedOptionSubTitle ??
-                    'repositoryDetails.repositoryForm.enterpriseAdvancedOptionsSubTitle'
-                )
-              : getString(
-                  repositoryType?.ossAdvancedOptionSubTitle ??
-                    'repositoryDetails.repositoryForm.ossAdvancedOptionsSubTitle'
-                )
-          }
+          subTitle={advancedOptionsTitle}
           initialState={isCollapsedAdvancedConfig}>
           <Card className={classNames(css.cardContainer)}>
             {repositoryType?.getSupportsUpstreamProxy() && (
@@ -119,6 +129,14 @@ function RepositoryConfigurationFormContent(
             )}
             {parent === Parent.Enterprise && (
               <>
+                {HAR_ARTIFACT_QUARANTINE_ENABLED && (
+                  <>
+                    <Separator />
+                    <Container className={css.upstreamProxiesContainer}>
+                      <RepositoryOpaPolicySelectorContent disabled={readonly} />
+                    </Container>
+                  </>
+                )}
                 <Separator />
                 <Container className={css.upstreamProxiesContainer}>
                   <RepositoryCleanupPoliciesFormContent isEdit disabled />
diff --git a/web/src/ar/pages/repository-details/components/FormContent/RepositoryOpaPolicySelectorContent.tsx b/web/src/ar/pages/repository-details/components/FormContent/RepositoryOpaPolicySelectorContent.tsx
new file mode 100644
index 000000000..919bc6d01
--- /dev/null
+++ b/web/src/ar/pages/repository-details/components/FormContent/RepositoryOpaPolicySelectorContent.tsx
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { get } from 'lodash-es'
+import { Container, Layout, Text } from '@harnessio/uicore'
+import { connect, type FormikContextType } from 'formik'
+import { Color, FontVariation } from '@harnessio/design-system'
+
+import { useParentComponents } from '@ar/hooks'
+import { useStrings } from '@ar/frameworks/strings'
+import type { VirtualRegistryRequest } from '@ar/pages/repository-details/types'
+
+import { POLICY_ACTION, POLICY_TYPE } from '../../constants'
+
+interface RepositoryOpaPolicySelectorContentProps {
+  disabled: boolean
+}
+
+function RepositoryOpaPolicySelectorContent(
+  props: RepositoryOpaPolicySelectorContentProps & { formik: FormikContextType<VirtualRegistryRequest> }
+): JSX.Element {
+  const { disabled, formik } = props
+  const { getString } = useStrings()
+  const { PolicySetFixedTypeSelector } = useParentComponents()
+  const { values } = formik
+  const policies = get(values, 'config.policyRef', []) || []
+  return (
+    <Layout.Vertical spacing="xsmall">
+      <Text font={{ variation: FontVariation.H6 }}>
+        {getString('repositoryDetails.repositoryForm.opaPolicy.title')}
+      </Text>
+      <Text font={{ variation: FontVariation.SMALL }} color={Color.GREY_500}>
+        {getString('repositoryDetails.repositoryForm.opaPolicy.subTitle')}
+      </Text>
+      {PolicySetFixedTypeSelector && (
+        <Container padding={{ top: 'small' }}>
+          <PolicySetFixedTypeSelector
+            formik={formik}
+            name="config.policyRef"
+            policySetIds={policies}
+            policyType={POLICY_TYPE}
+            policyAction={POLICY_ACTION}
+            disabled={disabled}
+            buttonProps={{
+              text: getString('repositoryDetails.repositoryForm.opaPolicy.addTitle'),
+              icon: 'plus',
+              font: { variation: FontVariation.FORM_LABEL },
+              withoutCurrentColor: false
+            }}
+          />
+        </Container>
+      )}
+    </Layout.Vertical>
+  )
+}
+
+export default connect<RepositoryOpaPolicySelectorContentProps, VirtualRegistryRequest>(
+  RepositoryOpaPolicySelectorContent
+)
diff --git a/web/src/ar/pages/repository-details/components/ManageRepositoryMetadata/ManageRepositoryMetadata.tsx b/web/src/ar/pages/repository-details/components/ManageRepositoryMetadata/ManageRepositoryMetadata.tsx
new file mode 100644
index 000000000..f09a894ca
--- /dev/null
+++ b/web/src/ar/pages/repository-details/components/ManageRepositoryMetadata/ManageRepositoryMetadata.tsx
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import ManageMetadataLabels from '@ar/components/ManageMetadata/ManageMetadataLabels'
+
+function ManageRepositoryMetadata() {
+  return (
+    <ManageMetadataLabels
+      selectedLabels={[]}
+      onLabelSelect={(_label, _value) => {
+        // TODO: handle update repository metadata
+      }}
+    />
+  )
+}
+
+export default ManageRepositoryMetadata
diff --git a/web/src/ar/pages/repository-details/components/RedirectPageView/RedirectPageView.tsx b/web/src/ar/pages/repository-details/components/RedirectPageView/RedirectPageView.tsx
index e4d26b036..8bff72fac 100644
--- a/web/src/ar/pages/repository-details/components/RedirectPageView/RedirectPageView.tsx
+++ b/web/src/ar/pages/repository-details/components/RedirectPageView/RedirectPageView.tsx
@@ -16,19 +16,23 @@
 
 import React from 'react'
 import { useEffect } from 'react'
+import { defaultTo } from 'lodash-es'
 import { useHistory } from 'react-router-dom'
 
 import { useRoutes } from '@ar/hooks'
 import type { RedirectPageQueryParams } from '@ar/routes/types'
 
 import { useQueryParams } from 'hooks/useQueryParams'
+import { LocalArtifactType } from '../../constants'
 
 export default function RedirectPageView() {
-  const { registryId, artifactId, versionId, versionDetailsTab } = useQueryParams<RedirectPageQueryParams>()
+  const { registryId, artifactId, versionId, versionDetailsTab, artifactType } =
+    useQueryParams<RedirectPageQueryParams>()
 
   const history = useHistory()
 
   const routes = useRoutes()
+  const type = defaultTo(artifactType, LocalArtifactType.ARTIFACTS) as LocalArtifactType
 
   const getRedirectLink = async () => {
     if (registryId && artifactId && versionId && versionDetailsTab) {
@@ -36,20 +40,23 @@ export default function RedirectPageView() {
         repositoryIdentifier: registryId,
         artifactIdentifier: artifactId,
         versionIdentifier: versionId,
-        versionTab: versionDetailsTab
+        versionTab: versionDetailsTab,
+        artifactType: type || LocalArtifactType.ARTIFACTS
       })
     }
     if (registryId && artifactId && versionId) {
       return routes.toARVersionDetails({
         repositoryIdentifier: registryId,
         artifactIdentifier: artifactId,
-        versionIdentifier: versionId
+        versionIdentifier: versionId,
+        artifactType: type || LocalArtifactType.ARTIFACTS
       })
     }
     if (registryId && artifactId) {
       return routes.toARArtifactDetails({
         repositoryIdentifier: registryId,
-        artifactIdentifier: artifactId
+        artifactIdentifier: artifactId,
+        artifactType: type || LocalArtifactType.ARTIFACTS
       })
     }
     if (registryId) {
diff --git a/web/src/ar/pages/repository-details/components/UpstreamProxiesSelect/index.tsx b/web/src/ar/pages/repository-details/components/UpstreamProxiesSelect/index.tsx
index dc220adc8..280af6df5 100644
--- a/web/src/ar/pages/repository-details/components/UpstreamProxiesSelect/index.tsx
+++ b/web/src/ar/pages/repository-details/components/UpstreamProxiesSelect/index.tsx
@@ -26,7 +26,7 @@ import { useGetAllRegistriesQuery } from '@harnessio/react-har-service-client'
 import { useGetSpaceRef } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
 import { queryClient } from '@ar/utils/queryClient'
-import { RepositoryConfigType } from '@ar/common/types'
+import { RepositoryConfigType, RepositoryScopeType } from '@ar/common/types'
 import ReorderSelect from '@ar/components/ReorderSelect/ReorderSelect'
 import type { VirtualRegistryRequest } from '@ar/pages/repository-details/types'
 import type { UpstreamProxyPackageType } from '@ar/pages/upstream-proxy-details/types'
@@ -64,7 +64,7 @@ function UpstreamProxiesSelect(props: UpstreamProxiesSelectProps): JSX.Element {
         package_type: [packageType],
         type: RepositoryConfigType.UPSTREAM,
         search_term: searchTerm,
-        recursive: true
+        scope: RepositoryScopeType.ANCESTORS
       },
       stringifyQueryParamsOptions: {
         arrayFormat: 'comma'
diff --git a/web/src/ar/pages/repository-details/constants.ts b/web/src/ar/pages/repository-details/constants.ts
index b0fac192b..243aae390 100644
--- a/web/src/ar/pages/repository-details/constants.ts
+++ b/web/src/ar/pages/repository-details/constants.ts
@@ -22,12 +22,23 @@ import type { StringKeys } from '@ar/frameworks/strings'
 import { RepositoryListViewTypeEnum } from '@ar/contexts/AppStoreContext'
 import { RepositoryConfigType, RepositoryPackageType, Scanners } from '@ar/common/types'
 
+export const POLICY_TYPE = 'securityTests'
+export const POLICY_ACTION = 'onstep'
+
 export enum RepositoryDetailsTab {
   PACKAGES = 'packages',
+  DATASETS = 'datasets',
+  MODELS = 'models',
   CONFIGURATION = 'configuration',
   WEBHOOKS = 'webhooks'
 }
 
+export enum LocalArtifactType {
+  ARTIFACTS = 'artifacts',
+  DATASET = 'DATASET',
+  MODEL = 'MODEL'
+}
+
 export interface ScannerConfigSpec {
   icon: IconName
   label: string
@@ -51,6 +62,7 @@ export const ContainerScannerConfig: Record<Scanners, ScannerConfigSpec> = {
 interface RepositoryDetailsTabSpec {
   label: StringKeys
   value: RepositoryDetailsTab
+  artifactType?: LocalArtifactType
   packageType?: RepositoryPackageType
   type?: RepositoryConfigType
   mode?: RepositoryListViewTypeEnum
@@ -61,7 +73,20 @@ export const RepositoryDetailsTabs: RepositoryDetailsTabSpec[] = [
   {
     label: 'repositoryDetails.tabs.packages',
     value: RepositoryDetailsTab.PACKAGES,
-    mode: RepositoryListViewTypeEnum.LIST
+    mode: RepositoryListViewTypeEnum.LIST,
+    artifactType: LocalArtifactType.ARTIFACTS
+  },
+  {
+    label: 'repositoryDetails.tabs.datasets',
+    value: RepositoryDetailsTab.DATASETS,
+    mode: RepositoryListViewTypeEnum.LIST,
+    artifactType: LocalArtifactType.DATASET
+  },
+  {
+    label: 'repositoryDetails.tabs.models',
+    value: RepositoryDetailsTab.MODELS,
+    mode: RepositoryListViewTypeEnum.LIST,
+    artifactType: LocalArtifactType.MODEL
   },
   {
     label: 'repositoryDetails.tabs.configuration',
diff --git a/web/src/ar/pages/repository-details/hooks/useGetScopeFromRegistryPath/useGetScopeFromRegistryPath.tsx b/web/src/ar/pages/repository-details/hooks/useGetScopeFromRegistryPath/useGetScopeFromRegistryPath.tsx
new file mode 100644
index 000000000..96652aa68
--- /dev/null
+++ b/web/src/ar/pages/repository-details/hooks/useGetScopeFromRegistryPath/useGetScopeFromRegistryPath.tsx
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import type { Scope } from '@ar/MFEAppTypes'
+
+export default function useGetScopeFromRegistryPath() {
+  const getScopeFromRegistryPath = (path = ''): Scope => {
+    if (typeof path !== 'string') {
+      return {
+        accountId: '',
+        orgIdentifier: '',
+        projectIdentifier: '',
+        space: ''
+      }
+    }
+    const space = path.split('/').slice(0, -1)
+    const [accountId, orgIdentifier, projectIdentifier] = space
+    return {
+      accountId,
+      orgIdentifier,
+      projectIdentifier,
+      space: space.join('/')
+    }
+  }
+  return { getScopeFromRegistryPath }
+}
diff --git a/web/src/ar/pages/repository-details/strings/strings.en.yaml b/web/src/ar/pages/repository-details/strings/strings.en.yaml
index ad6a8dc8f..f4fd770a3 100644
--- a/web/src/ar/pages/repository-details/strings/strings.en.yaml
+++ b/web/src/ar/pages/repository-details/strings/strings.en.yaml
@@ -10,7 +10,7 @@ repositoryForm:
   newEnvironment: New Environment
   advancedOptionsTitle: Advanced (Optional)
   ossAdvancedOptionsSubTitle: Configure Upstream Proxies.
-  enterpriseAdvancedOptionsSubTitle: Configure Upstream Proxies and Cleanup policies for the Artifact Registry.
+  enterpriseAdvancedOptionsSubTitle: Configure {{entities}} for the Artifact Registry.
   enterpriseAdvancedWithoutUpstreamOptionsSubTitle: Configure Cleanup policies for the Artifact Registry.
   includeExcludePatternsTitle: Artifact Filtering Rules
   includeExcludePatternsSubTitle: Define patterns to control which artifacts are allowed or blocked in this registry.
@@ -37,9 +37,15 @@ repositoryForm:
       cardSubTitle: Container scanners detect vulnerabilities in your container images. Select scanner(s) below to add them in your pipeline.
       scannerNoteForRequiredConfiguration: To enable scanning for account level or org level registries, please create a project with id set to <b>default_project</b> in your <b>{{orgName}}</b> org.
       scannerNoteForRequiredLicense: You need a valid license of Supply Chain Security and Security Testing Orchestration to enabled scanning.
+  opaPolicy:
+    title: OPA Policies
+    subTitle: Assign OPA policy to be evaluated against the artifact
+    addTitle: Add OPA Policy
 tabs:
   configuration: Configuration
   packages: '{{ $.artifactList.pageHeading }}'
+  datasets: Datasets
+  models: Models
   webhooks: Webhooks
 upstreamProxiesSelectList:
   selectList:
diff --git a/web/src/ar/pages/repository-list/RepositoryListPage.tsx b/web/src/ar/pages/repository-list/RepositoryListPage.tsx
index 161012d6e..0a088d463 100644
--- a/web/src/ar/pages/repository-list/RepositoryListPage.tsx
+++ b/web/src/ar/pages/repository-list/RepositoryListPage.tsx
@@ -32,6 +32,8 @@ import { useGetAllRegistriesQuery } from '@harnessio/react-har-service-client'
 import { useStrings } from '@ar/frameworks/strings'
 import { DEFAULT_PAGE_INDEX, PreferenceScope } from '@ar/constants'
 import { RepositoryListViewTypeEnum } from '@ar/contexts/AppStoreContext'
+import { EntityScope, Parent, RepositoryScopeType } from '@ar/common/types'
+import useGetPageScope from '@ar/hooks/useGetPageScope'
 import {
   useParentComponents,
   useParentHooks,
@@ -47,6 +49,7 @@ import { RepositoryListTable } from './components/RepositoryListTable'
 import { useArtifactRepositoriesQueryParamOptions } from './utils'
 import type { ArtifactRepositoryListPageQueryParams } from './utils'
 import RepositoryTypeSelector from './components/RepositoryTypeSelector/RepositoryTypeSelector'
+import RepositoryScopeSelector from './components/RepositoryScopeSelector/RepositoryScopeSelector'
 
 import css from './RepositoryListPage.module.scss'
 
@@ -55,15 +58,17 @@ function RepositoryListPage(): JSX.Element {
   const { getString } = useStrings()
   const { NGBreadcrumbs } = useParentComponents()
   const { useQueryParams, useUpdateQueryParams, usePreferenceStore } = useParentHooks()
-  const { HAR_TREE_VIEW_ENABLED } = useFeatureFlags()
+  const { HAR_TREE_VIEW_ENABLED, HAR_REGISTRY_SCOPE_FILTER } = useFeatureFlags()
   const { updateQueryParams } = useUpdateQueryParams<Partial<ArtifactRepositoryListPageQueryParams>>()
-  const { setRepositoryListViewType } = useAppStore()
+  const { setRepositoryListViewType, parent } = useAppStore()
   const repositoryListViewType = useGetRepositoryListViewType()
 
   const spaceRef = useGetSpaceRef()
   const queryParamOptions = useArtifactRepositoriesQueryParamOptions()
   const queryParams = useQueryParams<ArtifactRepositoryListPageQueryParams>(queryParamOptions)
-  const { searchTerm, page, size, repositoryTypes, configType } = queryParams
+  const { searchTerm, page, size, repositoryTypes, configType, scope } = queryParams
+
+  const pageScope = useGetPageScope()
 
   const { preference: sortingPreference, setPreference: setSortingPreference } = usePreferenceStore<string | undefined>(
     PreferenceScope.USER,
@@ -90,7 +95,8 @@ function RepositoryListPage(): JSX.Element {
       sort_order: sortOrder,
       package_type: repositoryTypes,
       search_term: searchTerm,
-      type: configType
+      type: configType,
+      scope: scope
     },
     stringifyQueryParamsOptions: {
       arrayFormat: 'repeat'
@@ -103,7 +109,8 @@ function RepositoryListPage(): JSX.Element {
       page: undefined,
       searchTerm: undefined,
       repositoryTypes: undefined,
-      configType: undefined
+      configType: undefined,
+      scope: undefined
     })
   }
 
@@ -138,6 +145,18 @@ function RepositoryListPage(): JSX.Element {
               updateQueryParams({ repositoryTypes: val, page: DEFAULT_PAGE_INDEX })
             }}
           />
+          {parent === Parent.Enterprise && HAR_REGISTRY_SCOPE_FILTER && pageScope !== EntityScope.PROJECT && (
+            <RepositoryScopeSelector
+              scope={pageScope}
+              value={scope}
+              onChange={val => {
+                updateQueryParams({
+                  scope: val,
+                  page: DEFAULT_PAGE_INDEX
+                })
+              }}
+            />
+          )}
           <Expander />
           <ExpandingSearchInput
             alwaysExpanded
@@ -188,6 +207,7 @@ function RepositoryListPage(): JSX.Element {
               updateQueryParams({ sort: sortArray, page: DEFAULT_PAGE_INDEX })
             }}
             sortBy={sort}
+            showScope={scope !== RepositoryScopeType.NONE}
           />
         )}
       </Page.Body>
diff --git a/web/src/ar/pages/repository-list/__tests__/RepositoryListPage.test.tsx b/web/src/ar/pages/repository-list/__tests__/RepositoryListPage.test.tsx
index 4e56ba8a8..8fe3bae3c 100644
--- a/web/src/ar/pages/repository-list/__tests__/RepositoryListPage.test.tsx
+++ b/web/src/ar/pages/repository-list/__tests__/RepositoryListPage.test.tsx
@@ -138,7 +138,8 @@ describe('Test Registry List Page', () => {
           page: 0,
           size: 50,
           sort_field: 'updatedAt',
-          sort_order: 'DESC'
+          sort_order: 'DESC',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -167,7 +168,8 @@ describe('Test Registry List Page', () => {
           page: 0,
           size: 50,
           sort_field: 'updatedAt',
-          sort_order: 'DESC'
+          sort_order: 'DESC',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -185,7 +187,8 @@ describe('Test Registry List Page', () => {
           size: 50,
           sort_field: 'updatedAt',
           sort_order: 'DESC',
-          type: 'VIRTUAL'
+          type: 'VIRTUAL',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -203,7 +206,8 @@ describe('Test Registry List Page', () => {
           size: 50,
           sort_field: 'updatedAt',
           sort_order: 'DESC',
-          type: 'VIRTUAL'
+          type: 'VIRTUAL',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -223,7 +227,8 @@ describe('Test Registry List Page', () => {
           sort_field: 'updatedAt',
           sort_order: 'DESC',
           type: 'VIRTUAL',
-          search_term: '1234'
+          search_term: '1234',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -242,7 +247,8 @@ describe('Test Registry List Page', () => {
           sort_field: 'identifier',
           sort_order: 'ASC',
           type: 'VIRTUAL',
-          search_term: '1234'
+          search_term: '1234',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -261,7 +267,8 @@ describe('Test Registry List Page', () => {
           sort_field: 'identifier',
           sort_order: 'ASC',
           type: 'VIRTUAL',
-          search_term: '1234'
+          search_term: '1234',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
@@ -281,7 +288,8 @@ describe('Test Registry List Page', () => {
           sort_field: 'identifier',
           sort_order: 'ASC',
           type: 'VIRTUAL',
-          search_term: '1234'
+          search_term: '1234',
+          scope: 'none'
         },
         space_ref: 'undefined/+',
         stringifyQueryParamsOptions: { arrayFormat: 'repeat' }
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx
index 809461973..94f3f3f1f 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListCells.tsx
@@ -21,13 +21,16 @@ import { Layout, Text } from '@harnessio/uicore'
 import type { RegistryMetadata } from '@harnessio/react-har-service-client'
 import type { Cell, CellValue, ColumnInstance, Renderer, Row, TableInstance } from 'react-table'
 
-import { PageType, type RepositoryConfigType, type RepositoryPackageType } from '@ar/common/types'
+import ScopeBadge from '@ar/components/Badge/ScopeBadge'
 import { useStrings } from '@ar/frameworks/strings/String'
 import TableCells from '@ar/components/TableCells/TableCells'
+import { getEntityScopeType } from '@ar/hooks/useGetPageScope'
 import LabelsPopover from '@ar/components/LabelsPopover/LabelsPopover'
-import DescriptionPopover from '@ar/components/DescriptionPopover/DescriptionPopover'
 import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon'
+import DescriptionPopover from '@ar/components/DescriptionPopover/DescriptionPopover'
 import RepositoryActionsWidget from '@ar/frameworks/RepositoryStep/RepositoryActionsWidget'
+import { PageType, type RepositoryConfigType, type RepositoryPackageType } from '@ar/common/types'
+import useGetScopeFromRegistryPath from '@ar/pages/repository-details/hooks/useGetScopeFromRegistryPath/useGetScopeFromRegistryPath'
 
 import css from './RepositoryListTable.module.scss'
 
@@ -55,6 +58,17 @@ export const RepositoryNameCell: CellType = ({ value, row }) => {
   )
 }
 
+export const RepositoryScopeCell: CellType = ({ row }) => {
+  const { original } = row
+  const { path } = original
+  const { getScopeFromRegistryPath } = useGetScopeFromRegistryPath()
+
+  const scope = getScopeFromRegistryPath(path)
+  const entityScope = getEntityScopeType(scope)
+  const helperText = [scope.orgIdentifier, scope.projectIdentifier].filter(Boolean).join('/')
+  return <ScopeBadge scope={entityScope} helperText={helperText} />
+}
+
 export const RepositoryLocationBadgeCell: CellType = ({ value }) => {
   return <TableCells.RepositoryLocationBadgeCell value={value} />
 }
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss
index f8728cd85..ec1f79f40 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss
@@ -33,6 +33,27 @@
   }
 }
 
+.scopeColumn {
+  div[class*='TableV2--cells'],
+  div[class*='TableV2--header'] {
+    grid-template-columns: minmax(var(--har-table-name-column-min-width), 1fr) 10rem 10rem 8rem 9rem 10rem 10rem 10rem 50px;
+  }
+  div[class*='TableV2--header'],
+  div[class*='TableV2--cells'] {
+    & > div[class*='TableV2--cell'] {
+      &:nth-child(4),
+      &:nth-child(5),
+      &:nth-child(6) {
+        display: flex;
+        justify-content: flex-end;
+      }
+      &:nth-child(6) {
+        padding-right: var(--spacing-large);
+      }
+    }
+  }
+}
+
 .alignColumns {
   div[class*='TableV2--header'] > div[class*='TableV2--cell'] {
     &:nth-child(3),
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss.d.ts b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss.d.ts
index b93d7106c..5b63bcf6e 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss.d.ts
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTable/RepositoryListTable.module.scss.d.ts
@@ -18,5 +18,6 @@
 // This is an auto-generated file
 export declare const alignColumns: string
 export declare const nameCellContainer: string
+export declare const scopeColumn: string
 export declare const table: string
 export declare const tableRow: string
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTable/__tests__/RepositoryListTable.test.tsx b/web/src/ar/pages/repository-list/components/RepositoryListTable/__tests__/RepositoryListTable.test.tsx
index a6fd04d4f..99d4e788f 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTable/__tests__/RepositoryListTable.test.tsx
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTable/__tests__/RepositoryListTable.test.tsx
@@ -141,7 +141,7 @@ describe('Verify Reppository List Table', () => {
     const tableRow = getTableRow(1)
     await userEvent.click(tableRow!)
     await waitFor(() => {
-      expect(mockHistoryPush).toHaveBeenCalledWith('/registries/repo1/packages')
+      expect(mockHistoryPush).toHaveBeenCalledWith('/registries/repo1')
     })
   })
 
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTable/index.tsx b/web/src/ar/pages/repository-list/components/RepositoryListTable/index.tsx
index ba5e47556..b8d7a52a7 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTable/index.tsx
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTable/index.tsx
@@ -21,9 +21,10 @@ import type { Column } from 'react-table'
 import { TableV2, type PaginationProps } from '@harnessio/uicore'
 import type { ListRegistry, RegistryMetadata } from '@harnessio/react-har-service-client'
 
-import { useParentHooks, useRoutes } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
-import { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import { useFeatureFlags, useParentHooks, useRoutes } from '@ar/hooks'
+import { useParentUtils } from '@ar/hooks/useParentUtils'
+import useGetScopeFromRegistryPath from '@ar/pages/repository-details/hooks/useGetScopeFromRegistryPath/useGetScopeFromRegistryPath'
 
 import {
   LastModifiedCell,
@@ -32,6 +33,7 @@ import {
   RepositoryDownloadsCell,
   RepositoryLocationBadgeCell,
   RepositoryNameCell,
+  RepositoryScopeCell,
   RepositorySizeCell,
   RepositoryUrlCell
 } from './RepositoryListCells'
@@ -48,14 +50,17 @@ export interface RepositoryListTableProps extends RepositoryListColumnActions {
   setSortBy: (sortBy: string[]) => void
   sortBy: string[]
   minimal?: boolean
+  showScope?: boolean
 }
 
 export function RepositoryListTable(props: RepositoryListTableProps): JSX.Element {
-  const { data, gotoPage, onPageSizeChange, sortBy, setSortBy } = props
+  const { data, gotoPage, onPageSizeChange, sortBy, setSortBy, showScope } = props
+  const { HAR_REGISTRY_SCOPE_FILTER } = useFeatureFlags()
   const { useDefaultPaginationProps } = useParentHooks()
+  const { routeToRegistryDetails } = useParentUtils()
+  const routes = useRoutes()
   const { getString } = useStrings()
   const history = useHistory()
-  const routes = useRoutes()
 
   const { registries, itemCount = 0, pageCount = 0, pageIndex, pageSize = 0 } = data
   const paginationProps = useDefaultPaginationProps({
@@ -68,6 +73,26 @@ export function RepositoryListTable(props: RepositoryListTableProps): JSX.Elemen
   })
   const [currentSort, currentOrder] = sortBy
 
+  const { getScopeFromRegistryPath } = useGetScopeFromRegistryPath()
+
+  const handleNavigateToRegistryDetails = (rowDetails: RegistryMetadata) => {
+    if (HAR_REGISTRY_SCOPE_FILTER) {
+      history.push(
+        routeToRegistryDetails({
+          ...getScopeFromRegistryPath(rowDetails.path),
+          module: 'har',
+          repositoryIdentifier: rowDetails.identifier
+        })
+      )
+    } else {
+      history.push(
+        routes.toARRepositoryDetails({
+          repositoryIdentifier: rowDetails.identifier
+        })
+      )
+    }
+  }
+
   const columns: Column<RegistryMetadata>[] = React.useMemo(() => {
     const getServerSortProps = (id: string) => {
       return {
@@ -86,6 +111,13 @@ export function RepositoryListTable(props: RepositoryListTableProps): JSX.Elemen
         Cell: RepositoryNameCell,
         serverSortProps: getServerSortProps('identifier')
       },
+      showScope &&
+        HAR_REGISTRY_SCOPE_FILTER && {
+          Header: '',
+          accessor: 'path',
+          Cell: RepositoryScopeCell,
+          disableSortBy: true
+        },
       {
         Header: getString('repositoryList.table.columns.type'),
         accessor: 'type',
@@ -129,24 +161,19 @@ export function RepositoryListTable(props: RepositoryListTableProps): JSX.Elemen
         disableSortBy: true
       }
     ].filter(Boolean) as unknown as Column<RegistryMetadata>[]
-  }, [currentOrder, currentSort, getString])
+  }, [currentOrder, currentSort, getString, showScope, HAR_REGISTRY_SCOPE_FILTER])
 
   return (
     <TableV2
-      className={cx(css.table, css.alignColumns)}
+      className={cx(css.table, css.alignColumns, {
+        [css.scopeColumn]: showScope
+      })}
       columns={columns}
       data={registries}
       pagination={paginationProps}
       sortable
       getRowClassName={() => css.tableRow}
-      onRowClick={rowDetails =>
-        history.push(
-          routes.toARRepositoryDetailsTab({
-            repositoryIdentifier: rowDetails.identifier,
-            tab: RepositoryDetailsTab.PACKAGES
-          })
-        )
-      }
+      onRowClick={handleNavigateToRegistryDetails}
     />
   )
 }
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx
index 10966d6df..64710eb6f 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/RepositoryListTreeView.tsx
@@ -48,6 +48,7 @@ import RepositoryTreeNodeViewWidget from '@ar/frameworks/RepositoryStep/Reposito
 
 import { Split } from 'components/Split/Split'
 
+import { TreeNodeEntityEnum } from './types'
 import { useRepositoryTreeViewUtils } from './utils'
 import { TreeViewSortingOptions } from '../../constants'
 import { type TreeViewRepositoryQueryParams, useTreeViewRepositoriesQueryParamOptions } from '../../utils'
@@ -95,6 +96,7 @@ export default function RepositoryListTreeView() {
     const initialActivePath = lodashCompact([
       ROOT_NODE_ID,
       values.repositoryIdentifier,
+      values.artifactType,
       values.artifactIdentifier ? encodeURIComponent(values.artifactIdentifier) : '',
       values.versionIdentifier,
       digest
@@ -105,86 +107,103 @@ export default function RepositoryListTreeView() {
 
   const handleFetchTreeNodesByPath = async (node: ITreeNode): Promise<Array<INode>> => {
     const { metadata } = node
-    const { repositoryIdentifier, artifactIdentifier, versionIdentifier } = metadata || {}
-    if (versionIdentifier) {
-      return RepositoryTreeViewUtils.fetchDockerDigestList(node, node.metadata)
-    } else if (artifactIdentifier) {
-      return RepositoryTreeViewUtils.fetchArtifactVersionList(node, node.metadata)
-    } else if (repositoryIdentifier) {
-      return RepositoryTreeViewUtils.fetchArtifactList(node, node.metadata)
-    } else {
-      return RepositoryTreeViewUtils.fetchRegistryList(node, node.metadata)
+    const { entityType, artifactType } = metadata || {}
+    switch (entityType) {
+      case TreeNodeEntityEnum.REGISTRY: {
+        if (artifactType) {
+          return RepositoryTreeViewUtils.fetchArtifactList(node, node.metadata)
+        }
+        return RepositoryTreeViewUtils.fetchArtifactTypeList(node, node.metadata)
+      }
+      case TreeNodeEntityEnum.ARTIFACT_TYPE:
+        return RepositoryTreeViewUtils.fetchArtifactList(node, node.metadata)
+      case TreeNodeEntityEnum.ARTIFACT:
+        return RepositoryTreeViewUtils.fetchArtifactVersionList(node, node.metadata)
+      case TreeNodeEntityEnum.VERSION:
+        return RepositoryTreeViewUtils.fetchDockerDigestList(node, node.metadata)
+      default:
+        return RepositoryTreeViewUtils.fetchRegistryList(node, node.metadata)
     }
   }
 
   const handleClickNode = (node: ITreeNode) => {
     const { id: pathId, metadata } = node
-    const { repositoryIdentifier, artifactIdentifier, versionIdentifier, digestIdentifier } = metadata || {}
+    const { entityType } = metadata || {}
     setActivePath(pathId)
-    if (digestIdentifier) {
-      return RepositoryTreeViewUtils.handleNavigateToDigestDetails(node)
-    } else if (versionIdentifier) {
-      return RepositoryTreeViewUtils.handleNavigateToVersionDetails(node)
-    } else if (artifactIdentifier) {
-      return RepositoryTreeViewUtils.handleNavigateToArtifactDetials(node)
-    } else if (repositoryIdentifier) {
-      return RepositoryTreeViewUtils.handleNavigateToRepositoryDetials(node)
+    switch (entityType) {
+      case TreeNodeEntityEnum.REGISTRY:
+        return RepositoryTreeViewUtils.handleNavigateToRepositoryDetials(node)
+      case TreeNodeEntityEnum.ARTIFACT:
+        return RepositoryTreeViewUtils.handleNavigateToArtifactDetials(node)
+      case TreeNodeEntityEnum.VERSION:
+        return RepositoryTreeViewUtils.handleNavigateToVersionDetails(node)
+      case TreeNodeEntityEnum.DIGEST:
+        return RepositoryTreeViewUtils.handleNavigateToDigestDetails(node)
+      case TreeNodeEntityEnum.ARTIFACT_TYPE:
+      default:
+        return
     }
   }
 
   const renderNodeAction = (node: ITreeNode): JSX.Element => {
     const { metadata } = node
-    const { repositoryIdentifier, artifactIdentifier, versionIdentifier, digestIdentifier } = metadata || {}
-    if (digestIdentifier) {
-      return <></>
-    } else if (versionIdentifier) {
-      return (
-        <VersionActionsWidget
-          packageType={metadata.packageType}
-          data={node.metadata}
-          repoKey={repositoryIdentifier}
-          artifactKey={artifactIdentifier}
-          versionKey={versionIdentifier}
-          pageType={PageType.GlobalList}
-        />
-      )
-    } else if (artifactIdentifier) {
-      return (
-        <ArtifactActionsWidget
-          packageType={metadata.packageType}
-          data={node.metadata}
-          repoKey={repositoryIdentifier}
-          artifactKey={artifactIdentifier}
-          pageType={PageType.Table}
-        />
-      )
-    } else if (repositoryIdentifier) {
-      return (
-        <RepositoryActionsWidget
-          packageType={metadata.packageType}
-          data={node.metadata}
-          pageType={PageType.Table}
-          type={metadata.type}
-          readonly={false}
-        />
-      )
+    const { entityType, repositoryIdentifier, artifactIdentifier, versionIdentifier } = metadata || {}
+    switch (entityType) {
+      case TreeNodeEntityEnum.REGISTRY:
+        return (
+          <RepositoryActionsWidget
+            packageType={metadata.packageType}
+            data={node.metadata}
+            pageType={PageType.Table}
+            type={metadata.type}
+            readonly={false}
+          />
+        )
+      case TreeNodeEntityEnum.ARTIFACT:
+        return (
+          <ArtifactActionsWidget
+            packageType={metadata.packageType}
+            data={node.metadata}
+            repoKey={repositoryIdentifier}
+            artifactKey={artifactIdentifier}
+            pageType={PageType.Table}
+          />
+        )
+      case TreeNodeEntityEnum.VERSION:
+        return (
+          <VersionActionsWidget
+            packageType={metadata.packageType}
+            data={node.metadata}
+            repoKey={repositoryIdentifier}
+            artifactKey={artifactIdentifier}
+            versionKey={versionIdentifier}
+            pageType={PageType.GlobalList}
+          />
+        )
+      case TreeNodeEntityEnum.ARTIFACT_TYPE:
+      case TreeNodeEntityEnum.DIGEST:
+      default:
+        return <></>
     }
-    return <></>
   }
 
   const renderNodeLabel = (node: ITreeNode): JSX.Element => {
     const { metadata } = node
-    const { repositoryIdentifier, artifactIdentifier, versionIdentifier, digestIdentifier } = metadata || {}
-    if (digestIdentifier) {
-      return <TreeNodeContent label={node.label} compact={compact} />
-    } else if (versionIdentifier) {
-      return <VersionTreeNodeViewWidget data={node.metadata} packageType={node.metadata.packageType} />
-    } else if (artifactIdentifier) {
-      return <ArtifactTreeNodeViewWidget data={node.metadata} packageType={node.metadata.packageType} />
-    } else if (repositoryIdentifier) {
-      return <RepositoryTreeNodeViewWidget data={node.metadata} packageType={node.metadata.packageType} />
+    const { entityType } = metadata || {}
+    switch (entityType) {
+      case TreeNodeEntityEnum.REGISTRY:
+        return <RepositoryTreeNodeViewWidget data={node.metadata} packageType={node.metadata.packageType} />
+      case TreeNodeEntityEnum.ARTIFACT_TYPE:
+        return <TreeNodeContent icon="folder" label={node.label} compact={compact} />
+      case TreeNodeEntityEnum.ARTIFACT:
+        return <ArtifactTreeNodeViewWidget data={node.metadata} packageType={node.metadata.packageType} />
+      case TreeNodeEntityEnum.VERSION:
+        return <VersionTreeNodeViewWidget data={node.metadata} packageType={node.metadata.packageType} />
+      case TreeNodeEntityEnum.DIGEST:
+        return <TreeNodeContent label={node.label} compact={compact} />
+      default:
+        return <TreeNodeContent label={node.label} compact={compact} />
     }
-    return <></>
   }
 
   return (
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/types.ts b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/types.ts
index 331f1576f..d4c620452 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/types.ts
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/types.ts
@@ -35,3 +35,11 @@ export interface APIQueryParams {
   versionIdentifier?: string
   digest?: string
 }
+
+export enum TreeNodeEntityEnum {
+  REGISTRY = 'REGISTRY',
+  ARTIFACT_TYPE = 'ARTIFACT_TYPE',
+  ARTIFACT = 'ARTIFACT',
+  VERSION = 'VERSION',
+  DIGEST = 'DIGEST'
+}
diff --git a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/utils.ts b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/utils.ts
index f2629b5f9..d61e1c5e2 100644
--- a/web/src/ar/pages/repository-list/components/RepositoryListTreeView/utils.ts
+++ b/web/src/ar/pages/repository-list/components/RepositoryListTreeView/utils.ts
@@ -29,11 +29,12 @@ import { RepositoryPackageType } from '@ar/common/types'
 import { getShortDigest } from '@ar/pages/digest-list/utils'
 import { encodeRef, getSpaceRef } from '@ar/hooks/useGetSpaceRef'
 import { useAppStore, useRoutes } from '@ar/hooks'
-import { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import { LocalArtifactType, RepositoryDetailsTab, RepositoryDetailsTabs } from '@ar/pages/repository-details/constants'
 import { VersionDetailsTab } from '@ar/pages/version-details/components/VersionDetailsTabs/constants'
 import { ITreeNode, NodeTypeEnum, INode } from '@ar/components/TreeView/types'
+import repositoryFactory from '@ar/frameworks/RepositoryStep/RepositoryFactory'
 
-import type { APIQueryParams } from './types'
+import { TreeNodeEntityEnum, type APIQueryParams } from './types'
 import type { TreeViewRepositoryQueryParams } from '../../utils'
 
 const getLoadMoreNodeConfig = (parentNode: ITreeNode, metadata: APIQueryParams): INode => {
@@ -98,6 +99,7 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
         type: NodeTypeEnum.File,
         metadata: {
           ...each,
+          entityType: TreeNodeEntityEnum.DIGEST,
           repositoryIdentifier,
           artifactIdentifier,
           versionIdentifier: value,
@@ -133,6 +135,7 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
         type: each.packageType === RepositoryPackageType.DOCKER ? NodeTypeEnum.Folder : NodeTypeEnum.File,
         metadata: {
           ...each,
+          entityType: TreeNodeEntityEnum.VERSION,
           repositoryIdentifier,
           artifactIdentifier: value,
           versionIdentifier: each.name
@@ -156,8 +159,9 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
   }
 
   const fetchArtifactList = async (node: ITreeNode, filters?: APIQueryParams): Promise<INode[]> => {
-    const { id: pathId, value } = node
-    const registryRef = getSpaceRef(filters?.space ?? space, filters?.repositoryIdentifier ?? value)
+    const { id: pathId, metadata } = node
+    const { repositoryIdentifier } = metadata || {}
+    const registryRef = getSpaceRef(filters?.space ?? space, filters?.repositoryIdentifier ?? repositoryIdentifier)
     try {
       const response = await getAllArtifactsByRegistry({
         registry_ref: registryRef,
@@ -176,7 +180,8 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
         type: NodeTypeEnum.Folder,
         metadata: {
           ...each,
-          repositoryIdentifier: value,
+          entityType: TreeNodeEntityEnum.ARTIFACT,
+          repositoryIdentifier,
           artifactIdentifier: each.name
         }
       }))
@@ -187,7 +192,7 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
             ...filters,
             page: pageIndex + 1,
             size: DEFAULT_PAGE_SIZE,
-            repositoryIdentifier: filters?.repositoryIdentifier ?? value
+            repositoryIdentifier: filters?.repositoryIdentifier ?? repositoryIdentifier
           })
         )
       }
@@ -197,6 +202,27 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
     }
   }
 
+  const fetchArtifactTypeList = async (node: ITreeNode, _filters?: APIQueryParams): Promise<INode[]> => {
+    const { metadata, id: pathId } = node
+    const { packageType } = metadata || {}
+    const repositoryType = repositoryFactory.getRepositoryType(packageType)
+    const supportedArtifactTypes = repositoryType?.getSupportedArtifactTypes() || []
+    const tabs = RepositoryDetailsTabs.filter(
+      each => each.artifactType && supportedArtifactTypes?.includes(each.artifactType)
+    )
+    return tabs.map(each => ({
+      id: `${pathId}/${each.artifactType ?? each.value}`,
+      label: getString(each.label),
+      value: each.artifactType ?? each.value,
+      type: NodeTypeEnum.Folder,
+      metadata: {
+        ...metadata,
+        entityType: TreeNodeEntityEnum.ARTIFACT_TYPE,
+        artifactType: each.artifactType
+      }
+    }))
+  }
+
   const fetchRegistryList = async (node: ITreeNode, filters?: APIQueryParams): Promise<INode[]> => {
     const { id: pathId } = node
     const registryRef = getSpaceRef(filters?.space ?? space)
@@ -220,16 +246,25 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
       })
       const registryList = response.content.data.registries || []
       const { pageIndex = 0, pageCount = 1, itemCount = 0 } = response.content.data
-      const data: Array<INode> = registryList.map(each => ({
-        id: `${pathId}/${each.identifier}`,
-        label: each.identifier,
-        value: each.identifier,
-        type: NodeTypeEnum.Folder,
-        metadata: {
-          ...each,
-          repositoryIdentifier: each.identifier
+      const data: Array<INode> = registryList.map(each => {
+        const repositoryType = repositoryFactory.getRepositoryType(each.packageType)
+        const allowedArtifactTypes = repositoryType?.getSupportedArtifactTypes() || []
+        const defaultArtifactType = allowedArtifactTypes.length === 1 ? allowedArtifactTypes[0] : undefined
+        return {
+          id: defaultArtifactType
+            ? `${pathId}/${each.identifier}/${defaultArtifactType}`
+            : `${pathId}/${each.identifier}`,
+          label: each.identifier,
+          value: each.identifier,
+          type: NodeTypeEnum.Folder,
+          metadata: {
+            ...each,
+            repositoryIdentifier: each.identifier,
+            entityType: TreeNodeEntityEnum.REGISTRY,
+            artifactType: defaultArtifactType
+          }
         }
-      }))
+      })
       if (pageNumber === 0) {
         data.unshift(getTotalCountNodeConfig(node, itemCount))
       }
@@ -260,35 +295,38 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
 
   const handleNavigateToArtifactDetials = (node: ITreeNode) => {
     const { value, metadata } = node
-    const { repositoryIdentifier } = metadata
+    const { repositoryIdentifier, artifactType } = metadata
     const newRoute = routes.toARArtifactDetails({
       repositoryIdentifier,
-      artifactIdentifier: value
+      artifactIdentifier: value,
+      artifactType: artifactType ?? LocalArtifactType.ARTIFACTS
     })
     history.push(newRoute)
   }
 
   const handleNavigateToVersionDetails = (node: ITreeNode) => {
     const { value, metadata } = node
-    const { artifactIdentifier, repositoryIdentifier } = metadata
+    const { artifactIdentifier, repositoryIdentifier, artifactType } = metadata
     const newRoute = routes.toARVersionDetailsTab({
       repositoryIdentifier,
       artifactIdentifier,
       versionIdentifier: value,
-      versionTab: VersionDetailsTab.OVERVIEW
+      versionTab: VersionDetailsTab.OVERVIEW,
+      artifactType: artifactType ?? LocalArtifactType.ARTIFACTS
     })
     history.push(newRoute)
   }
 
   const handleNavigateToDigestDetails = (node: ITreeNode) => {
     const { value, metadata } = node
-    const { artifactIdentifier, repositoryIdentifier, versionIdentifier } = metadata
+    const { artifactIdentifier, repositoryIdentifier, versionIdentifier, artifactType } = metadata
     const newRoute = routes.toARVersionDetailsTab(
       {
         repositoryIdentifier,
         artifactIdentifier,
         versionIdentifier,
-        versionTab: VersionDetailsTab.OVERVIEW
+        versionTab: VersionDetailsTab.OVERVIEW,
+        artifactType: artifactType ?? LocalArtifactType.ARTIFACTS
       },
       {
         queryParams: { digest: value }
@@ -301,6 +339,7 @@ export function useRepositoryTreeViewUtils(queryParams: TreeViewRepositoryQueryP
     fetchDockerDigestList,
     fetchArtifactVersionList,
     fetchArtifactList,
+    fetchArtifactTypeList,
     fetchRegistryList,
     handleNavigateToRepositoryDetials,
     handleNavigateToArtifactDetials,
diff --git a/web/src/ar/pages/repository-list/components/RepositoryScopeSelector/RepositoryScopeSelector.tsx b/web/src/ar/pages/repository-list/components/RepositoryScopeSelector/RepositoryScopeSelector.tsx
new file mode 100644
index 000000000..5798593cd
--- /dev/null
+++ b/web/src/ar/pages/repository-list/components/RepositoryScopeSelector/RepositoryScopeSelector.tsx
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useMemo } from 'react'
+import { FiltersSelectDropDown } from '@harnessio/uicore'
+
+import { useStrings } from '@ar/frameworks/strings'
+import { RepositoryScopeTypes } from '@ar/common/constants'
+import type { EntityScope, RepositoryScopeType } from '@ar/common/types'
+
+interface RepositoryScopeSelectorProps {
+  scope: EntityScope
+  value?: RepositoryScopeType
+  onChange: (val: RepositoryScopeType) => void
+}
+export default function RepositoryScopeSelector(props: RepositoryScopeSelectorProps): JSX.Element {
+  const { value, onChange, scope } = props
+  const { getString } = useStrings()
+  const options = useMemo(
+    () =>
+      RepositoryScopeTypes.filter(each => each.scope === scope).map(each => ({
+        ...each,
+        label: getString(each.label)
+      })),
+    [scope, getString]
+  )
+  const selectedOption = options.find(each => each.value === value)
+  return (
+    <FiltersSelectDropDown
+      width={200}
+      usePortal
+      buttonTestId="registry-scope-select"
+      items={options}
+      value={selectedOption}
+      onChange={option => {
+        onChange(option.value as RepositoryScopeType)
+      }}
+      placeholder={getString('repositoryList.selectScope')}
+      allowClearSelection={false}
+    />
+  )
+}
diff --git a/web/src/ar/pages/repository-list/strings/strings.en.yaml b/web/src/ar/pages/repository-list/strings/strings.en.yaml
index 0e703f6ce..6254e5e45 100644
--- a/web/src/ar/pages/repository-list/strings/strings.en.yaml
+++ b/web/src/ar/pages/repository-list/strings/strings.en.yaml
@@ -11,6 +11,12 @@ upstreamProxy:
 selectEnvironments: Environments
 selectPackageTypes: Package Types
 selectRegistryType: Registry Type
+selectScope: Scope
+scope:
+  accountOnly: Account Only
+  orgOnly: Organization Only
+  accountRecursive: Account, Organizations, and Projects
+  orgRecursive: Organization and Projects
 selectLabels: '{{ $.artifactList.table.columns.tags }}'
 compact: Compact View
 deleteModal:
diff --git a/web/src/ar/pages/repository-list/utils.ts b/web/src/ar/pages/repository-list/utils.ts
index a4518414d..b6fe7ec8e 100644
--- a/web/src/ar/pages/repository-list/utils.ts
+++ b/web/src/ar/pages/repository-list/utils.ts
@@ -18,7 +18,7 @@ import { useMemo } from 'react'
 
 import { useParentHooks } from '@ar/hooks'
 import { DEFAULT_PAGE_INDEX, DEFAULT_PAGE_SIZE, DEFAULT_PIPELINE_LIST_TABLE_SORT } from '@ar/constants'
-import type { RepositoryConfigType, RepositoryPackageType } from '@ar/common/types'
+import { RepositoryConfigType, RepositoryPackageType, RepositoryScopeType } from '@ar/common/types'
 import type { UseQueryParamsOptions } from '@ar/__mocks__/hooks'
 
 type GetArtifactRepositoryQueryParams = {
@@ -27,6 +27,7 @@ type GetArtifactRepositoryQueryParams = {
   projectIdentifier: string
   page: number
   size: number
+  scope: RepositoryScopeType
   sort: string[]
   searchTerm?: string
   registrySearchTerm?: string
@@ -49,6 +50,7 @@ export const useArtifactRepositoriesQueryParamOptions =
         page: DEFAULT_PAGE_INDEX,
         size: DEFAULT_PAGE_SIZE,
         sort: DEFAULT_PIPELINE_LIST_TABLE_SORT,
+        scope: RepositoryScopeType.NONE,
         repositoryTypes: [],
         compact: false
       },
diff --git a/web/src/ar/pages/upstream-proxy-details/components/AuthenticationFormInput/constants.tsx b/web/src/ar/pages/upstream-proxy-details/components/AuthenticationFormInput/constants.tsx
index 3ca09e345..5e8459d6d 100644
--- a/web/src/ar/pages/upstream-proxy-details/components/AuthenticationFormInput/constants.tsx
+++ b/web/src/ar/pages/upstream-proxy-details/components/AuthenticationFormInput/constants.tsx
@@ -78,5 +78,9 @@ export const URLSourceToSupportedAuthTypesMapping: Record<
   [UpstreamRepositoryURLInputSource.GoProxy]: [
     UpstreamProxyAuthenticationMode.USER_NAME_AND_PASSWORD,
     UpstreamProxyAuthenticationMode.ANONYMOUS
+  ],
+  [UpstreamRepositoryURLInputSource.HuggingFace]: [
+    UpstreamProxyAuthenticationMode.USER_NAME_AND_PASSWORD,
+    UpstreamProxyAuthenticationMode.ANONYMOUS
   ]
 }
diff --git a/web/src/ar/pages/upstream-proxy-details/components/FormContent/UpstreamProxyConfigurationFormContent.tsx b/web/src/ar/pages/upstream-proxy-details/components/FormContent/UpstreamProxyConfigurationFormContent.tsx
index 14be90a7a..c83fd3779 100644
--- a/web/src/ar/pages/upstream-proxy-details/components/FormContent/UpstreamProxyConfigurationFormContent.tsx
+++ b/web/src/ar/pages/upstream-proxy-details/components/FormContent/UpstreamProxyConfigurationFormContent.tsx
@@ -14,19 +14,20 @@
  * limitations under the License.
  */
 
-import React, { useContext, useEffect, useState } from 'react'
+import React, { useContext, useEffect, useMemo, useState } from 'react'
 import type { FormikProps } from 'formik'
 import classNames from 'classnames'
 import { FontVariation } from '@harnessio/design-system'
 import { Card, Container, Layout, Text } from '@harnessio/uicore'
 
-import { useAppStore } from '@ar/hooks'
+import { useAppStore, useFeatureFlags } from '@ar/hooks'
 import { Parent, RepositoryPackageType } from '@ar/common/types'
 import { useStrings } from '@ar/frameworks/strings'
 import { Separator } from '@ar/components/Separator/Separator'
 import CollapseContainer from '@ar/components/CollapseContainer/CollapseContainer'
 import { RepositoryProviderContext } from '@ar/pages/repository-details/context/RepositoryProvider'
 import SelectContainerScannersFormSection from '@ar/pages/repository-details/components/FormContent/SelectContainerScannersFormSection'
+import RepositoryOpaPolicySelectorContent from '@ar/pages/repository-details/components/FormContent/RepositoryOpaPolicySelectorContent'
 
 import UpstreamProxyDetailsFormContent from './UpstreamProxyDetailsFormContent'
 import UpstreamProxyAuthenticationFormContent from './UpstreamProxyAuthenticationFormContent'
@@ -35,7 +36,6 @@ import UpstreamProxyCleanupPoliciesFormContent from './UpstreamProxyCleanupPolic
 import type { UpstreamRegistryRequest } from '../../types'
 
 import css from './FormContent.module.scss'
-
 interface UpstreamProxyConfigurationFormContentProps {
   formikProps: FormikProps<UpstreamRegistryRequest>
   readonly: boolean
@@ -50,6 +50,7 @@ export default function UpstreamProxyConfigurationFormContent(
   const { setIsDirty } = useContext(RepositoryProviderContext)
   const { dirty, values } = formikProps
   const [isCollapsedAdvancedConfig] = useState(getInitialStateOfCollapse())
+  const { HAR_ARTIFACT_QUARANTINE_ENABLED } = useFeatureFlags()
 
   useEffect(() => {
     setIsDirty(dirty)
@@ -60,8 +61,19 @@ export default function UpstreamProxyConfigurationFormContent(
     return isCleanupPoliciesAdded
   }
 
+  const advancedOptionsTitle = useMemo(() => {
+    return getString('upstreamProxyDetails.editForm.enterpriseAdvancedOptionsSubTitle', {
+      entities: [
+        HAR_ARTIFACT_QUARANTINE_ENABLED ? getString('repositoryDetails.repositoryForm.opaPolicy.title') : '',
+        getString('repositoryDetails.repositoryForm.cleanupPoliciesTitle')
+      ]
+        .filter(Boolean)
+        .join(', ')
+    })
+  }, [])
+
   return (
-    <Container padding="xxlarge">
+    <Container>
       <Container>
         <Text className={css.cardHeading} font={{ variation: FontVariation.CARD_TITLE }}>
           {getString('upstreamProxyDetails.form.title')}
@@ -91,9 +103,17 @@ export default function UpstreamProxyConfigurationFormContent(
           <CollapseContainer
             className={css.marginTopLarge}
             title={getString('repositoryDetails.repositoryForm.advancedOptionsTitle')}
-            subTitle={getString('upstreamProxyDetails.editForm.enterpriseAdvancedOptionsSubTitle')}
+            subTitle={advancedOptionsTitle}
             initialState={isCollapsedAdvancedConfig}>
             <Card className={classNames(css.cardContainer)}>
+              {HAR_ARTIFACT_QUARANTINE_ENABLED && (
+                <>
+                  <Container className={css.cleanupPoliciesContainer}>
+                    <RepositoryOpaPolicySelectorContent disabled={readonly} />
+                  </Container>
+                  <Separator />
+                </>
+              )}
               <Container className={css.cleanupPoliciesContainer}>
                 <UpstreamProxyCleanupPoliciesFormContent formikProps={formikProps} isEdit disabled />
               </Container>
diff --git a/web/src/ar/pages/upstream-proxy-details/components/RepositoryUrlInput/constants.ts b/web/src/ar/pages/upstream-proxy-details/components/RepositoryUrlInput/constants.ts
index e1b54fd9f..6e9f38cfc 100644
--- a/web/src/ar/pages/upstream-proxy-details/components/RepositoryUrlInput/constants.ts
+++ b/web/src/ar/pages/upstream-proxy-details/components/RepositoryUrlInput/constants.ts
@@ -57,5 +57,9 @@ export const UpstreamURLSourceConfig: Record<UpstreamRepositoryURLInputSource, R
   [UpstreamRepositoryURLInputSource.GoProxy]: {
     label: 'upstreamProxyDetails.createForm.source.goproxy',
     value: UpstreamRepositoryURLInputSource.GoProxy
+  },
+  [UpstreamRepositoryURLInputSource.HuggingFace]: {
+    label: 'upstreamProxyDetails.createForm.source.huggingface',
+    value: UpstreamRepositoryURLInputSource.HuggingFace
   }
 }
diff --git a/web/src/ar/pages/upstream-proxy-details/strings/strings.en.yaml b/web/src/ar/pages/upstream-proxy-details/strings/strings.en.yaml
index b3498a45f..d63090298 100644
--- a/web/src/ar/pages/upstream-proxy-details/strings/strings.en.yaml
+++ b/web/src/ar/pages/upstream-proxy-details/strings/strings.en.yaml
@@ -18,6 +18,7 @@ createForm:
     nugetOrg: NuGet.org
     crates: Crates.io
     goproxy: GoProxy
+    huggingface: Huggingface
   authentication:
     title: Authentication
     userNameAndPassword: Username and Password
@@ -32,7 +33,7 @@ createForm:
 editForm:
   title: Update Upstream Proxy
   update: '{{ $.upstreamProxyDetails.editForm.title }}'
-  enterpriseAdvancedOptionsSubTitle: Configure Cleanup policies for the Artifact Registry.
+  enterpriseAdvancedOptionsSubTitle: 'Configure {{entities}} for the Artifact Registry.'
 actions:
   delete:
     title: Delete Upstream Registry
diff --git a/web/src/ar/pages/upstream-proxy-details/types.ts b/web/src/ar/pages/upstream-proxy-details/types.ts
index 41178db24..32e4f19dc 100644
--- a/web/src/ar/pages/upstream-proxy-details/types.ts
+++ b/web/src/ar/pages/upstream-proxy-details/types.ts
@@ -29,7 +29,8 @@ export enum UpstreamProxyPackageType {
   GO = 'GO',
   DEBIAN = 'DEBIAN',
   CARGO = 'CARGO',
-  ALPINE = 'ALPINE'
+  ALPINE = 'ALPINE',
+  HUGGINGFACE = 'HUGGINGFACE'
 }
 
 export enum UpstreamRepositoryURLInputSource {
@@ -41,7 +42,8 @@ export enum UpstreamRepositoryURLInputSource {
   PyPi = 'PyPi',
   NugetOrg = 'NugetOrg',
   Crates = 'Crates',
-  GoProxy = 'GoProxy'
+  GoProxy = 'GoProxy',
+  HuggingFace = 'HuggingFace'
 }
 
 export enum UpstreamProxyAuthenticationMode {
diff --git a/web/src/ar/pages/version-details/CargoVersion/CargoVersionType.tsx b/web/src/ar/pages/version-details/CargoVersion/CargoVersionType.tsx
index 76415c64b..5082eabba 100644
--- a/web/src/ar/pages/version-details/CargoVersion/CargoVersionType.tsx
+++ b/web/src/ar/pages/version-details/CargoVersion/CargoVersionType.tsx
@@ -73,7 +73,8 @@ export class CargoVersionType extends VersionStep<ArtifactVersionSummary> {
   protected allowedActionsOnVersion = [
     VersionAction.Delete,
     VersionAction.SetupClient,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
   protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
diff --git a/web/src/ar/pages/version-details/DockerVersion/DockerVersionHeader.tsx b/web/src/ar/pages/version-details/DockerVersion/DockerVersionHeader.tsx
index eac373301..99a7f9ea6 100644
--- a/web/src/ar/pages/version-details/DockerVersion/DockerVersionHeader.tsx
+++ b/web/src/ar/pages/version-details/DockerVersion/DockerVersionHeader.tsx
@@ -23,6 +23,7 @@ import type { ArtifactVersionSummary } from '@harnessio/react-har-service-client
 import { PageType, RepositoryPackageType } from '@ar/common/types'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
 import { useDecodedParams, useParentHooks, useRoutes } from '@ar/hooks'
+import QuarantineBadge from '@ar/components/Badge/QuarantineBadge'
 import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon'
 import VersionActionsWidget from '@ar/frameworks/Version/VersionActionsWidget'
 import SetupClientButton from '@ar/components/SetupClientButton/SetupClientButton'
@@ -37,7 +38,7 @@ interface DockerVersionHeaderProps {
 
 export default function DockerVersionHeader(props: DockerVersionHeaderProps): JSX.Element {
   const { iconSize = 40, data } = props
-  const { imageName: name, version, packageType } = data
+  const { imageName: name, version, packageType, isQuarantined, quarantineReason } = data
   const pathParams = useDecodedParams<VersionDetailsPathParams>()
   const { useUpdateQueryParams, useQueryParams } = useParentHooks()
   const { updateQueryParams } = useUpdateQueryParams()
@@ -50,7 +51,8 @@ export default function DockerVersionHeader(props: DockerVersionHeaderProps): JS
       routes.toARVersionDetails({
         repositoryIdentifier: pathParams.repositoryIdentifier,
         artifactIdentifier: pathParams.artifactIdentifier,
-        versionIdentifier: newVersion
+        versionIdentifier: newVersion,
+        artifactType: pathParams.artifactType
       })
     )
   }
@@ -72,6 +74,7 @@ export default function DockerVersionHeader(props: DockerVersionHeaderProps): JS
         onChangeDigest={handleChangeDigest}
         isLatestVersion={false}
       />
+      {isQuarantined && <QuarantineBadge reason={quarantineReason} />}
       <Expander />
       <SetupClientButton
         repositoryIdentifier={pathParams.repositoryIdentifier}
diff --git a/web/src/ar/pages/version-details/DockerVersion/DockerVersionType.tsx b/web/src/ar/pages/version-details/DockerVersion/DockerVersionType.tsx
index b1aea5a66..afb122170 100644
--- a/web/src/ar/pages/version-details/DockerVersion/DockerVersionType.tsx
+++ b/web/src/ar/pages/version-details/DockerVersion/DockerVersionType.tsx
@@ -65,10 +65,11 @@ export class DockerVersionType extends VersionStep<ArtifactVersionSummary> {
     VersionAction.Delete,
     VersionAction.SetupClient,
     VersionAction.DownloadCommand,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <DockerVersionListTable {...props} />
diff --git a/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerArtifactListPage.test.tsx b/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerArtifactListPage.test.tsx
index 2a235562e..9793b8a63 100644
--- a/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerArtifactListPage.test.tsx
+++ b/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerArtifactListPage.test.tsx
@@ -318,7 +318,10 @@ describe('Test Registry Artifact List Page', () => {
     await waitFor(() => {
       expect(deleteArtifact).toHaveBeenCalledWith({
         artifact: 'podinfo-artifact/+',
-        registry_ref: 'undefined/docker-repo/+'
+        registry_ref: 'undefined/docker-repo/+',
+        queryParams: {
+          artifact_type: undefined
+        }
       })
     })
   })
diff --git a/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerVersionHeader.test.tsx b/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerVersionHeader.test.tsx
index 28fdfbb91..50edcdb8e 100644
--- a/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerVersionHeader.test.tsx
+++ b/web/src/ar/pages/version-details/DockerVersion/__tests__/DockerVersionHeader.test.tsx
@@ -115,7 +115,7 @@ describe('Verify DockerVersionHeader component render', () => {
 
   test('verify version selector: Success Case', async () => {
     const { container } = render(
-      <ArTestWrapper>
+      <ArTestWrapper path="/registries/:artifactType/versions" pathParams={{ artifactType: 'artifacts' }}>
         <VersionDetailsPage />
       </ArTestWrapper>
     )
@@ -272,6 +272,8 @@ describe('Verify DockerVersionHeader component render', () => {
   test('verify tab navigation with ssca and sto data', async () => {
     const { container } = render(
       <ArTestWrapper
+        path="/registries/:artifactType/versions/overview"
+        pathParams={{ artifactType: 'artifacts' }}
         queryParams={{
           digest: 'sha256:144cdab68a435424250fe06e9a4f8a5f6b6b8a8a55d257bc6ee77476a6ec520d'
         }}>
@@ -313,6 +315,8 @@ describe('Verify DockerVersionHeader component render', () => {
     }))
     const { container } = render(
       <ArTestWrapper
+        path="/registries/:artifactType/versions/overview"
+        pathParams={{ artifactType: 'artifacts' }}
         queryParams={{
           digest: 'sha256:144cdab68a435424250fe06e9a4f8a5f6b6b8a8a55d257bc6ee77476a6ec520d'
         }}>
diff --git a/web/src/ar/pages/version-details/GenericVersion/GenericVersionType.tsx b/web/src/ar/pages/version-details/GenericVersion/GenericVersionType.tsx
index 53aac32e9..744f033bc 100644
--- a/web/src/ar/pages/version-details/GenericVersion/GenericVersionType.tsx
+++ b/web/src/ar/pages/version-details/GenericVersion/GenericVersionType.tsx
@@ -68,9 +68,10 @@ export class GenericVersionType extends VersionStep<ArtifactVersionSummary> {
   protected allowedActionsOnVersion = [
     VersionAction.Delete,
     VersionAction.SetupClient,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/GenericVersion/__tests__/GenericVersionHeader.test.tsx b/web/src/ar/pages/version-details/GenericVersion/__tests__/GenericVersionHeader.test.tsx
index 35c8bd3ab..4968539b0 100644
--- a/web/src/ar/pages/version-details/GenericVersion/__tests__/GenericVersionHeader.test.tsx
+++ b/web/src/ar/pages/version-details/GenericVersion/__tests__/GenericVersionHeader.test.tsx
@@ -93,7 +93,7 @@ describe('Verify GenericVersionHeader component render', () => {
 
   test('verify version selector: Success Case', async () => {
     const { container } = render(
-      <ArTestWrapper>
+      <ArTestWrapper path="/registries/:artifactType/versions" pathParams={{ artifactType: 'artifacts' }}>
         <VersionDetailsPage />
       </ArTestWrapper>
     )
diff --git a/web/src/ar/pages/version-details/GenericVersion/pages/artifact-details/GenericArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/GenericVersion/pages/artifact-details/GenericArtifactDetailsPage.tsx
index e33b89753..f8e25554a 100644
--- a/web/src/ar/pages/version-details/GenericVersion/pages/artifact-details/GenericArtifactDetailsPage.tsx
+++ b/web/src/ar/pages/version-details/GenericVersion/pages/artifact-details/GenericArtifactDetailsPage.tsx
@@ -26,6 +26,7 @@ import {
   type ArtifactFileListPageQueryParams,
   useArtifactFileListQueryParamOptions
 } from '@ar/pages/version-details/components/ArtifactFileListTable/utils'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 import ArtifactFileListTable from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFileListTable'
 import versionDetailsPageCss from '../../styles.module.scss'
 
@@ -54,7 +55,8 @@ export default function GenericArtifactDetailsPage() {
       page,
       size,
       sort_field: sortField,
-      sort_order: sortOrder
+      sort_order: sortOrder,
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
     }
   })
   const response = data?.content
diff --git a/web/src/ar/pages/version-details/GenericVersion/pages/oss-details/OSSGeneralInfoContent.tsx b/web/src/ar/pages/version-details/GenericVersion/pages/oss-details/OSSGeneralInfoContent.tsx
index a5470853b..f4f86db0d 100644
--- a/web/src/ar/pages/version-details/GenericVersion/pages/oss-details/OSSGeneralInfoContent.tsx
+++ b/web/src/ar/pages/version-details/GenericVersion/pages/oss-details/OSSGeneralInfoContent.tsx
@@ -21,6 +21,7 @@ import { useGetArtifactDetailsQuery } from '@harnessio/react-har-service-client'
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import { useDecodedParams, useGetSpaceRef } from '@ar/hooks'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 import type { GenericArtifactDetails } from '../../types'
 import GeneralInformationCard from '../overview/GeneralInformationCard'
@@ -39,7 +40,9 @@ export default function OSSGeneralInfoContent() {
     registry_ref: spaceRef,
     artifact: encodeRef(pathParams.artifactIdentifier),
     version: pathParams.versionIdentifier,
-    queryParams: {}
+    queryParams: {
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
+    }
   })
 
   const response = data?.content?.data as GenericArtifactDetails
diff --git a/web/src/ar/pages/version-details/GoVersion/GoVersionType.tsx b/web/src/ar/pages/version-details/GoVersion/GoVersionType.tsx
index 2da0e7d3b..476b89e25 100644
--- a/web/src/ar/pages/version-details/GoVersion/GoVersionType.tsx
+++ b/web/src/ar/pages/version-details/GoVersion/GoVersionType.tsx
@@ -73,10 +73,11 @@ export class GoVersionType extends VersionStep<ArtifactVersionSummary> {
   protected allowedActionsOnVersion = [
     VersionAction.Delete,
     VersionAction.SetupClient,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/HelmVersion/HelmVersionType.tsx b/web/src/ar/pages/version-details/HelmVersion/HelmVersionType.tsx
index 993ac83a7..f4bbae6c5 100644
--- a/web/src/ar/pages/version-details/HelmVersion/HelmVersionType.tsx
+++ b/web/src/ar/pages/version-details/HelmVersion/HelmVersionType.tsx
@@ -68,10 +68,11 @@ export class HelmVersionType extends VersionStep<ArtifactVersionSummary> {
     VersionAction.Delete,
     VersionAction.SetupClient,
     VersionAction.DownloadCommand,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmArtifactListPage.test.tsx b/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmArtifactListPage.test.tsx
index 200a5a8c3..e64112a97 100644
--- a/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmArtifactListPage.test.tsx
+++ b/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmArtifactListPage.test.tsx
@@ -318,7 +318,10 @@ describe('Test Registry Artifact List Page', () => {
     await waitFor(() => {
       expect(deleteArtifact).toHaveBeenCalledWith({
         artifact: 'podinfo-artifact/+',
-        registry_ref: 'undefined/helm-repo/+'
+        registry_ref: 'undefined/helm-repo/+',
+        queryParams: {
+          artifact_type: undefined
+        }
       })
     })
   })
diff --git a/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmVersionHeader.test.tsx b/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmVersionHeader.test.tsx
index 84203fe18..369d78987 100644
--- a/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmVersionHeader.test.tsx
+++ b/web/src/ar/pages/version-details/HelmVersion/__tests__/HelmVersionHeader.test.tsx
@@ -93,7 +93,7 @@ describe('Verify HelmVersionHeader component render', () => {
 
   test('verify version selector: Success Case', async () => {
     const { container } = render(
-      <ArTestWrapper>
+      <ArTestWrapper path="/registries/:artifactType/versions" pathParams={{ artifactType: 'artifacts' }}>
         <VersionDetailsPage />
       </ArTestWrapper>
     )
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersion.module.scss b/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersion.module.scss
new file mode 100644
index 000000000..106f7cdc3
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersion.module.scss
@@ -0,0 +1,23 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.cardContainer {
+  width: 60% !important;
+  min-width: 1040px;
+  padding: var(--spacing-7) !important;
+  background-color: var(--white);
+  margin: var(--spacing-large);
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersion.module.scss.d.ts b/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersion.module.scss.d.ts
new file mode 100644
index 000000000..f39ae0981
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersion.module.scss.d.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2023 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint-disable */
+// This is an auto-generated file
+export declare const cardContainer: string
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersionType.tsx b/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersionType.tsx
new file mode 100644
index 000000000..95f7c1b9a
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/HuggingfaceVersionType.tsx
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { Layout } from '@harnessio/uicore'
+import type { ArtifactVersionSummary } from '@harnessio/react-har-service-client'
+
+import { String } from '@ar/frameworks/strings'
+import { PageType, RepositoryPackageType } from '@ar/common/types'
+import { VersionListColumnEnum } from '@ar/pages/version-list/components/VersionListTable/types'
+import ArtifactActions from '@ar/pages/artifact-details/components/ArtifactActions/ArtifactActions'
+import ArtifactTreeNode from '@ar/pages/artifact-details/components/ArtifactTreeNode/ArtifactTreeNode'
+import ArtifactTreeNodeDetailsContent from '@ar/pages/artifact-details/components/ArtifactTreeNode/ArtifactTreeNodeDetailsContent'
+import VersionListTable, {
+  type CommonVersionListTableProps
+} from '@ar/pages/version-list/components/VersionListTable/VersionListTable'
+import {
+  type ArtifactActionProps,
+  type ArtifactRowSubComponentProps,
+  type ArtifactTreeNodeViewProps,
+  type VersionActionProps,
+  type VersionDetailsHeaderProps,
+  type VersionDetailsTabProps,
+  type VersionListTableProps,
+  VersionStep,
+  VersionTreeNodeViewProps
+} from '@ar/frameworks/Version/Version'
+
+import VersionFilesProvider from '../context/VersionFilesProvider'
+import { VersionAction } from '../components/VersionActions/types'
+import VersionActions from '../components/VersionActions/VersionActions'
+import VersionOverviewProvider from '../context/VersionOverviewProvider'
+import HuggingfaceVersionOverviewPage from './pages/overview/HuggingfaceVersionOverviewPage'
+import { VersionDetailsTab } from '../components/VersionDetailsTabs/constants'
+import ArtifactFilesContent from '../components/ArtifactFileListTable/ArtifactFilesContent'
+import HuggingfaceVersionArtifactDetailsPage from './pages/artifact-dertails/HuggingfaceVersionArtifactDetailsPage'
+import VersionDetailsHeaderContent from '../components/VersionDetailsHeaderContent/VersionDetailsHeaderContent'
+import VersionTreeNode from '../components/VersionTreeNode/VersionTreeNode'
+import VersionDetailsTabs from '../components/VersionDetailsTabs/VersionDetailsTabs'
+
+export class HuggingfaceVersionType extends VersionStep<ArtifactVersionSummary> {
+  protected packageType = RepositoryPackageType.HUGGINGFACE
+  protected hasArtifactRowSubComponent = true
+  protected allowedVersionDetailsTabs: VersionDetailsTab[] = [
+    VersionDetailsTab.OVERVIEW,
+    VersionDetailsTab.ARTIFACT_DETAILS,
+    VersionDetailsTab.CODE
+  ]
+
+  versionListTableColumnConfig: CommonVersionListTableProps['columnConfigs'] = {
+    [VersionListColumnEnum.Name]: { width: '150%' },
+    [VersionListColumnEnum.Size]: { width: '100%' },
+    [VersionListColumnEnum.FileCount]: { width: '100%' },
+    [VersionListColumnEnum.DownloadCount]: { width: '100%' },
+    [VersionListColumnEnum.LastModified]: { width: '100%' },
+    [VersionListColumnEnum.Actions]: { width: '30%' }
+  }
+
+  protected allowedActionsOnVersion = [
+    VersionAction.Delete,
+    VersionAction.SetupClient,
+    VersionAction.ViewVersionDetails
+  ]
+
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+
+  renderVersionListTable(props: VersionListTableProps): JSX.Element {
+    return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
+  }
+
+  renderVersionDetailsHeader(props: VersionDetailsHeaderProps<ArtifactVersionSummary>): JSX.Element {
+    return <VersionDetailsHeaderContent {...props} />
+  }
+
+  renderVersionDetailsTab(props: VersionDetailsTabProps): JSX.Element {
+    switch (props.tab) {
+      case VersionDetailsTab.OVERVIEW:
+        return (
+          <VersionOverviewProvider>
+            <HuggingfaceVersionOverviewPage />
+          </VersionOverviewProvider>
+        )
+      case VersionDetailsTab.ARTIFACT_DETAILS:
+        return (
+          <VersionOverviewProvider>
+            <HuggingfaceVersionArtifactDetailsPage />
+          </VersionOverviewProvider>
+        )
+      case VersionDetailsTab.OSS:
+        return (
+          <VersionOverviewProvider>
+            <Layout.Vertical spacing="xlarge">
+              <HuggingfaceVersionOverviewPage />
+              <HuggingfaceVersionArtifactDetailsPage />
+            </Layout.Vertical>
+          </VersionOverviewProvider>
+        )
+      default:
+        return <String stringID="tabNotFound" />
+    }
+  }
+
+  renderArtifactActions(props: ArtifactActionProps): JSX.Element {
+    return <ArtifactActions {...props} />
+  }
+
+  renderVersionActions(props: VersionActionProps): JSX.Element {
+    switch (props.pageType) {
+      case PageType.Details:
+        return <VersionActions {...props} allowedActions={this.allowedActionsOnVersionDetailsPage} />
+      case PageType.Table:
+      case PageType.GlobalList:
+      default:
+        return <VersionActions {...props} allowedActions={this.allowedActionsOnVersion} />
+    }
+  }
+
+  renderArtifactRowSubComponent(props: ArtifactRowSubComponentProps): JSX.Element {
+    return (
+      <VersionFilesProvider
+        repositoryIdentifier={props.data.registryIdentifier}
+        artifactIdentifier={props.data.name}
+        versionIdentifier={props.data.version}
+        shouldUseLocalParams>
+        <ArtifactFilesContent minimal />
+      </VersionFilesProvider>
+    )
+  }
+
+  renderArtifactTreeNodeView(props: ArtifactTreeNodeViewProps): JSX.Element {
+    return <ArtifactTreeNode {...props} icon="store-artifact-bundle" />
+  }
+
+  renderArtifactTreeNodeDetails(): JSX.Element {
+    return <ArtifactTreeNodeDetailsContent />
+  }
+
+  renderVersionTreeNodeView(props: VersionTreeNodeViewProps): JSX.Element {
+    return <VersionTreeNode {...props} icon="container" />
+  }
+
+  renderVersionTreeNodeDetails(): JSX.Element {
+    return <VersionDetailsTabs />
+  }
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/pages/artifact-dertails/HuggingfaceVersionArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/artifact-dertails/HuggingfaceVersionArtifactDetailsPage.tsx
new file mode 100644
index 000000000..947f0b591
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/artifact-dertails/HuggingfaceVersionArtifactDetailsPage.tsx
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useCallback } from 'react'
+import { Container, Layout } from '@harnessio/uicore'
+
+import { useParentHooks } from '@ar/hooks'
+import { useStrings } from '@ar/frameworks/strings'
+import { ButtonTab, ButtonTabs } from '@ar/components/ButtonTabs/ButtonTabs'
+import VersionFilesProvider from '@ar/pages/version-details/context/VersionFilesProvider'
+import ReadmeFileContent from '@ar/pages/version-details/components/ReadmeFileContent/ReadmeFileContent'
+import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider'
+import ArtifactFilesContent from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFilesContent'
+
+import HuggingfaceVersionDependencyContent from './HuggingfaceVersionDependencyContent'
+import {
+  HuggingfaceArtifactDetails,
+  HuggingfaceArtifactDetailsTabEnum,
+  type HuggingfaceVersionDetailsQueryParams
+} from '../../types'
+
+export default function HuggingfaceVersionArtifactDetailsPage() {
+  const { getString } = useStrings()
+  const { useUpdateQueryParams, useQueryParams } = useParentHooks()
+  const { updateQueryParams } = useUpdateQueryParams()
+  const { detailsTab = HuggingfaceArtifactDetailsTabEnum.ReadMe } =
+    useQueryParams<HuggingfaceVersionDetailsQueryParams>()
+
+  const { data } = useVersionOverview<HuggingfaceArtifactDetails>()
+  const { metadata } = data
+
+  const handleTabChange = useCallback(
+    (nextTab: HuggingfaceArtifactDetailsTabEnum): void => {
+      updateQueryParams({ detailsTab: nextTab })
+    },
+    [updateQueryParams]
+  )
+
+  return (
+    <Layout.Vertical padding="large" spacing="large">
+      <ButtonTabs small bold selectedTabId={detailsTab} onChange={handleTabChange}>
+        <ButtonTab
+          id={HuggingfaceArtifactDetailsTabEnum.ReadMe}
+          icon="document"
+          iconProps={{ size: 12 }}
+          panel={
+            <Container>
+              <ReadmeFileContent source={metadata?.Readme || getString('noReadme')} />
+            </Container>
+          }
+          title={getString('versionDetails.artifactDetails.tabs.readme')}
+        />
+        <ButtonTab
+          id={HuggingfaceArtifactDetailsTabEnum.Files}
+          icon="document"
+          iconProps={{ size: 12 }}
+          panel={
+            <VersionFilesProvider>
+              <ArtifactFilesContent />
+            </VersionFilesProvider>
+          }
+          title={getString('versionDetails.artifactDetails.tabs.files')}
+        />
+        <ButtonTab
+          id={HuggingfaceArtifactDetailsTabEnum.Dependencies}
+          icon="layers"
+          iconProps={{ size: 12 }}
+          panel={<HuggingfaceVersionDependencyContent />}
+          title={getString('versionDetails.artifactDetails.tabs.dependencies')}
+        />
+      </ButtonTabs>
+    </Layout.Vertical>
+  )
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/pages/artifact-dertails/HuggingfaceVersionDependencyContent.tsx b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/artifact-dertails/HuggingfaceVersionDependencyContent.tsx
new file mode 100644
index 000000000..325e04c89
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/artifact-dertails/HuggingfaceVersionDependencyContent.tsx
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useMemo } from 'react'
+
+import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider'
+import ArtifactDependencyListTable from '@ar/pages/version-details/components/ArtifactDependencyListTable/ArtifactDependencyListTable'
+
+import type { HuggingfaceArtifactDetails } from '../../types'
+
+export default function HuggingfaceVersionDependencyContent() {
+  const { data } = useVersionOverview<HuggingfaceArtifactDetails>()
+  const { metadata } = data
+
+  const dependencies = useMemo(() => {
+    const _dependencies = metadata?.Dependencies || []
+    return _dependencies.map(dep => {
+      const { Name, Version } = dep
+      return { name: Name, version: Version }
+    })
+  }, [metadata])
+
+  return <ArtifactDependencyListTable data={dependencies} />
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/HuggingfaceVersionGeneralInfo.tsx b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/HuggingfaceVersionGeneralInfo.tsx
new file mode 100644
index 000000000..0ff348a25
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/HuggingfaceVersionGeneralInfo.tsx
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+import { defaultTo } from 'lodash-es'
+import { FontVariation } from '@harnessio/design-system'
+import { Card, Container, Layout, Text } from '@harnessio/uicore'
+
+import { useStrings } from '@ar/frameworks/strings'
+import { LabelValueTypeEnum } from '@ar/pages/version-details/components/LabelValueContent/type'
+import { useVersionOverview } from '@ar/pages/version-details/context/VersionOverviewProvider'
+import { LabelValueContent } from '@ar/pages/version-details/components/LabelValueContent/LabelValueContent'
+
+import type { HuggingfaceArtifactDetails } from '../../types'
+import css from './overview.module.scss'
+
+interface HuggingfaceVersionGeneralInfoProps {
+  className?: string
+}
+
+export default function HuggingfaceVersionGeneralInfo(props: HuggingfaceVersionGeneralInfoProps) {
+  const { className } = props
+  const { data } = useVersionOverview<HuggingfaceArtifactDetails>()
+  const { getString } = useStrings()
+  return (
+    <Card
+      data-testid="general-information-card"
+      className={className}
+      title={getString('versionDetails.overview.generalInformation.title')}>
+      <Layout.Vertical spacing="medium">
+        <Text font={{ variation: FontVariation.CARD_TITLE }}>
+          {getString('versionDetails.overview.generalInformation.title')}
+        </Text>
+        <Layout.Horizontal
+          margin={{ top: 'medium' }}
+          spacing="xlarge"
+          flex={{ alignItems: 'flex-start', justifyContent: 'flex-start' }}>
+          <Container className={css.gridContainer}>
+            <LabelValueContent
+              label={getString('versionDetails.overview.generalInformation.packageType')}
+              value={getString('packageTypes.huggingfacePackage')}
+              type={LabelValueTypeEnum.PackageType}
+              icon="huggingface"
+            />
+            <LabelValueContent
+              label={getString('versionDetails.overview.generalInformation.size')}
+              value={data.size}
+              type={LabelValueTypeEnum.Text}
+            />
+            <LabelValueContent
+              label={getString('versionDetails.overview.generalInformation.downloads')}
+              value={defaultTo(data.downloadCount?.toLocaleString(), 0)}
+              type={LabelValueTypeEnum.Text}
+            />
+            {data.metadata?.Origin?.VCS && (
+              <LabelValueContent
+                label={getString('versionDetails.overview.generalInformation.vcs')}
+                value={data.metadata.Origin.VCS}
+                type={LabelValueTypeEnum.Text}
+              />
+            )}
+            {data.metadata?.Origin?.URL && (
+              <LabelValueContent
+                label={getString('versionDetails.overview.generalInformation.url')}
+                value={data.metadata.Origin.URL}
+                type={LabelValueTypeEnum.Text}
+              />
+            )}
+            {data.metadata?.Origin?.Ref && (
+              <LabelValueContent
+                label={getString('versionDetails.overview.generalInformation.ref')}
+                value={data.metadata.Origin.Ref}
+                type={LabelValueTypeEnum.Text}
+              />
+            )}
+            {data.metadata?.Origin?.Hash && (
+              <LabelValueContent
+                label={getString('versionDetails.overview.generalInformation.hash')}
+                value={data.metadata.Origin.Hash}
+                type={LabelValueTypeEnum.Text}
+              />
+            )}
+          </Container>
+        </Layout.Horizontal>
+      </Layout.Vertical>
+    </Card>
+  )
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/HuggingfaceVersionOverviewPage.tsx b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/HuggingfaceVersionOverviewPage.tsx
new file mode 100644
index 000000000..03852eb7c
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/HuggingfaceVersionOverviewPage.tsx
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+
+import HuggingfaceVersionGeneralInfo from './HuggingfaceVersionGeneralInfo'
+
+import genericStyles from '../../HuggingfaceVersion.module.scss'
+
+export default function HuggingfaceVersionOverviewPage() {
+  return <HuggingfaceVersionGeneralInfo className={genericStyles.cardContainer} />
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/overview.module.scss b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/overview.module.scss
new file mode 100644
index 000000000..3c52e3121
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/overview.module.scss
@@ -0,0 +1,24 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+.gridContainer {
+  align-items: center;
+  display: grid;
+  grid-template-columns: max-content auto;
+  row-gap: var(--spacing-medium);
+  column-gap: 30px;
+  flex: 1;
+}
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/overview.module.scss.d.ts b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/overview.module.scss.d.ts
new file mode 100644
index 000000000..9f8083f63
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/pages/overview/overview.module.scss.d.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2023 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint-disable */
+// This is an auto-generated file
+export declare const gridContainer: string
diff --git a/web/src/ar/pages/version-details/HuggingfaceVersion/types.ts b/web/src/ar/pages/version-details/HuggingfaceVersion/types.ts
new file mode 100644
index 000000000..1413440dd
--- /dev/null
+++ b/web/src/ar/pages/version-details/HuggingfaceVersion/types.ts
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import type { ArtifactDetail } from '@harnessio/react-har-service-client'
+import type { VersionDetailsQueryParams } from '../types'
+
+export enum HuggingfaceArtifactDetailsTabEnum {
+  ReadMe = 'readme',
+  Files = 'files',
+  Dependencies = 'dependencies'
+}
+export interface HuggingfaceVersionDetailsQueryParams extends VersionDetailsQueryParams {
+  detailsTab: HuggingfaceArtifactDetailsTabEnum
+}
+
+export type HuggingfaceArtifactDependency = {
+  Name: string
+  Version: string
+}
+
+export type LocalHuggingfaceArtifactDetailConfig = {
+  metadata?: {
+    name: string
+    version: string
+    size: number
+    Readme: string
+    description: string
+    license: string
+    Dependencies: HuggingfaceArtifactDependency[]
+    Origin?: {
+      VCS?: string
+      URL?: string
+      Ref?: string
+      Hash?: string
+    }
+  }
+}
+
+export type HuggingfaceArtifactDetails = ArtifactDetail & LocalHuggingfaceArtifactDetailConfig
diff --git a/web/src/ar/pages/version-details/MavenVersion/MavenVersion.tsx b/web/src/ar/pages/version-details/MavenVersion/MavenVersion.tsx
index b53c02fc2..7697bb99c 100644
--- a/web/src/ar/pages/version-details/MavenVersion/MavenVersion.tsx
+++ b/web/src/ar/pages/version-details/MavenVersion/MavenVersion.tsx
@@ -70,9 +70,10 @@ export class MavenVersionType extends VersionStep<ArtifactVersionSummary> {
   protected allowedActionsOnVersion = [
     VersionAction.Delete,
     VersionAction.SetupClient,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/MavenVersion/__tests__/MavenVersionHeader.test.tsx b/web/src/ar/pages/version-details/MavenVersion/__tests__/MavenVersionHeader.test.tsx
index ede92a14a..dbdc7d6ae 100644
--- a/web/src/ar/pages/version-details/MavenVersion/__tests__/MavenVersionHeader.test.tsx
+++ b/web/src/ar/pages/version-details/MavenVersion/__tests__/MavenVersionHeader.test.tsx
@@ -93,7 +93,7 @@ describe('Verify MavenVersionHeader component render', () => {
 
   test('verify version selector: Success Case', async () => {
     const { container } = render(
-      <ArTestWrapper>
+      <ArTestWrapper path="/registries/:artifactType/versions" pathParams={{ artifactType: 'artifacts' }}>
         <VersionDetailsPage />
       </ArTestWrapper>
     )
diff --git a/web/src/ar/pages/version-details/MavenVersion/pages/artifact-details/MavenArtifactDetailsPage.tsx b/web/src/ar/pages/version-details/MavenVersion/pages/artifact-details/MavenArtifactDetailsPage.tsx
index 4c5a9112a..446b4d5da 100644
--- a/web/src/ar/pages/version-details/MavenVersion/pages/artifact-details/MavenArtifactDetailsPage.tsx
+++ b/web/src/ar/pages/version-details/MavenVersion/pages/artifact-details/MavenArtifactDetailsPage.tsx
@@ -26,6 +26,7 @@ import {
   type ArtifactFileListPageQueryParams,
   useArtifactFileListQueryParamOptions
 } from '@ar/pages/version-details/components/ArtifactFileListTable/utils'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 import ArtifactFileListTable from '@ar/pages/version-details/components/ArtifactFileListTable/ArtifactFileListTable'
 import versionDetailsPageCss from '../../MavenVersion.module.scss'
 
@@ -54,7 +55,8 @@ export default function MavenArtifactDetailsPage() {
       page,
       size,
       sort_field: sortField,
-      sort_order: sortOrder
+      sort_order: sortOrder,
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
     }
   })
   const response = data?.content
diff --git a/web/src/ar/pages/version-details/MavenVersion/pages/oss-details/OSSGeneralInfoContent.tsx b/web/src/ar/pages/version-details/MavenVersion/pages/oss-details/OSSGeneralInfoContent.tsx
index 3b8ad19e2..fd41af999 100644
--- a/web/src/ar/pages/version-details/MavenVersion/pages/oss-details/OSSGeneralInfoContent.tsx
+++ b/web/src/ar/pages/version-details/MavenVersion/pages/oss-details/OSSGeneralInfoContent.tsx
@@ -21,6 +21,7 @@ import { ArtifactDetail, useGetArtifactDetailsQuery } from '@harnessio/react-har
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import { useDecodedParams, useGetSpaceRef } from '@ar/hooks'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 import MavnGeneralInformationCard from '../overview/MavnGeneralInformationCard'
 
@@ -38,7 +39,9 @@ export default function OSSGeneralInfoContent() {
     registry_ref: spaceRef,
     artifact: encodeRef(pathParams.artifactIdentifier),
     version: pathParams.versionIdentifier,
-    queryParams: {}
+    queryParams: {
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
+    }
   })
 
   const response = data?.content?.data as ArtifactDetail
diff --git a/web/src/ar/pages/version-details/MavenVersion/pages/overview/MavenArtifactOverviewPage.tsx b/web/src/ar/pages/version-details/MavenVersion/pages/overview/MavenArtifactOverviewPage.tsx
index c78339897..55bafa3a4 100644
--- a/web/src/ar/pages/version-details/MavenVersion/pages/overview/MavenArtifactOverviewPage.tsx
+++ b/web/src/ar/pages/version-details/MavenVersion/pages/overview/MavenArtifactOverviewPage.tsx
@@ -21,6 +21,7 @@ import { type ArtifactDetail, useGetArtifactDetailsQuery } from '@harnessio/reac
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import { useDecodedParams, useGetSpaceRef } from '@ar/hooks'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 import MavnGeneralInformationCard from './MavnGeneralInformationCard'
 
@@ -39,7 +40,9 @@ export default function MavenArtifactOverviewPage() {
     registry_ref: spaceRef,
     artifact: encodeRef(pathParams.artifactIdentifier),
     version: pathParams.versionIdentifier,
-    queryParams: {}
+    queryParams: {
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
+    }
   })
 
   const response = data?.content?.data as ArtifactDetail
diff --git a/web/src/ar/pages/version-details/NpmVersion/NpmVersionType.tsx b/web/src/ar/pages/version-details/NpmVersion/NpmVersionType.tsx
index aa56c20e6..83b07c24b 100644
--- a/web/src/ar/pages/version-details/NpmVersion/NpmVersionType.tsx
+++ b/web/src/ar/pages/version-details/NpmVersion/NpmVersionType.tsx
@@ -72,10 +72,11 @@ export class NpmVersionType extends VersionStep<ArtifactVersionSummary> {
     VersionAction.Delete,
     VersionAction.SetupClient,
     VersionAction.DownloadCommand,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/NuGetVersion/NuGetVersionType.tsx b/web/src/ar/pages/version-details/NuGetVersion/NuGetVersionType.tsx
index f740501d4..07a03ef75 100644
--- a/web/src/ar/pages/version-details/NuGetVersion/NuGetVersionType.tsx
+++ b/web/src/ar/pages/version-details/NuGetVersion/NuGetVersionType.tsx
@@ -73,10 +73,11 @@ export class NuGetVersionType extends VersionStep<ArtifactVersionSummary> {
     VersionAction.Delete,
     VersionAction.SetupClient,
     VersionAction.DownloadCommand,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/OSSVersionDetailsPage.tsx b/web/src/ar/pages/version-details/OSSVersionDetailsPage.tsx
index 9f338f885..cbe49c3ac 100644
--- a/web/src/ar/pages/version-details/OSSVersionDetailsPage.tsx
+++ b/web/src/ar/pages/version-details/OSSVersionDetailsPage.tsx
@@ -36,7 +36,8 @@ export default function OSSVersionDetailsPage() {
     history.push(
       routes.toARArtifactDetails({
         repositoryIdentifier: pathParams.repositoryIdentifier,
-        artifactIdentifier: pathParams.artifactIdentifier
+        artifactIdentifier: pathParams.artifactIdentifier,
+        artifactType: pathParams.artifactType
       })
     )
   }
diff --git a/web/src/ar/pages/version-details/PythonVersion/PythonVersionType.tsx b/web/src/ar/pages/version-details/PythonVersion/PythonVersionType.tsx
index 3205b8dea..62349e871 100644
--- a/web/src/ar/pages/version-details/PythonVersion/PythonVersionType.tsx
+++ b/web/src/ar/pages/version-details/PythonVersion/PythonVersionType.tsx
@@ -73,10 +73,11 @@ export class PythonVersionType extends VersionStep<ArtifactVersionSummary> {
     VersionAction.Delete,
     VersionAction.SetupClient,
     VersionAction.DownloadCommand,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/RPMVersion/RPMVersionType.tsx b/web/src/ar/pages/version-details/RPMVersion/RPMVersionType.tsx
index 333385b5a..b2705a5c7 100644
--- a/web/src/ar/pages/version-details/RPMVersion/RPMVersionType.tsx
+++ b/web/src/ar/pages/version-details/RPMVersion/RPMVersionType.tsx
@@ -72,10 +72,11 @@ export class RPMVersionType extends VersionStep<ArtifactVersionSummary> {
   protected allowedActionsOnVersion = [
     VersionAction.Delete,
     VersionAction.SetupClient,
-    VersionAction.ViewVersionDetails
+    VersionAction.ViewVersionDetails,
+    VersionAction.Quarantine
   ]
 
-  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete]
+  protected allowedActionsOnVersionDetailsPage = [VersionAction.Delete, VersionAction.Quarantine]
 
   renderVersionListTable(props: VersionListTableProps): JSX.Element {
     return <VersionListTable {...props} columnConfigs={this.versionListTableColumnConfig} />
diff --git a/web/src/ar/pages/version-details/VersionFactory.tsx b/web/src/ar/pages/version-details/VersionFactory.tsx
index f46de5de3..b852c55f1 100644
--- a/web/src/ar/pages/version-details/VersionFactory.tsx
+++ b/web/src/ar/pages/version-details/VersionFactory.tsx
@@ -25,6 +25,7 @@ import { NuGetVersionType } from './NuGetVersion/NuGetVersionType'
 import { RPMVersionType } from './RPMVersion/RPMVersionType'
 import { CargoVersionType } from './CargoVersion/CargoVersionType'
 import { GoVersionType } from './GoVersion/GoVersionType'
+import { HuggingfaceVersionType } from './HuggingfaceVersion/HuggingfaceVersionType'
 
 versionFactory.registerStep(new DockerVersionType())
 versionFactory.registerStep(new HelmVersionType())
@@ -36,3 +37,4 @@ versionFactory.registerStep(new NuGetVersionType())
 versionFactory.registerStep(new RPMVersionType())
 versionFactory.registerStep(new CargoVersionType())
 versionFactory.registerStep(new GoVersionType())
+versionFactory.registerStep(new HuggingfaceVersionType())
diff --git a/web/src/ar/pages/version-details/components/OverviewCards/OverviewCards.tsx b/web/src/ar/pages/version-details/components/OverviewCards/OverviewCards.tsx
index 03b16dd7c..d238ad566 100644
--- a/web/src/ar/pages/version-details/components/OverviewCards/OverviewCards.tsx
+++ b/web/src/ar/pages/version-details/components/OverviewCards/OverviewCards.tsx
@@ -81,6 +81,7 @@ export default function VersionOverviewCards(props: VersionOverviewCardsProps) {
       versionIdentifier: pathParams.versionIdentifier,
       artifactIdentifier: pathParams.artifactIdentifier,
       repositoryIdentifier: pathParams.repositoryIdentifier,
+      artifactType: pathParams.artifactType,
       versionTab: tab,
       ...options
     })
diff --git a/web/src/ar/pages/version-details/components/QuarantineForm/QuarantineForm.tsx b/web/src/ar/pages/version-details/components/QuarantineForm/QuarantineForm.tsx
new file mode 100644
index 000000000..4d12b9629
--- /dev/null
+++ b/web/src/ar/pages/version-details/components/QuarantineForm/QuarantineForm.tsx
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { forwardRef } from 'react'
+import * as Yup from 'yup'
+import { Formik, FormikForm, FormInput } from '@harnessio/uicore'
+
+import { useStrings } from '@ar/frameworks/strings'
+import { setFormikRef } from '@ar/common/utils'
+import type { FormikFowardRef } from '@ar/common/types'
+
+import type { QuarantineVersionFormData } from './type'
+
+interface QuarantineVersionFormProps {
+  onSubmit: (values: QuarantineVersionFormData) => void
+}
+
+function QuarantineVersionForm(
+  props: QuarantineVersionFormProps,
+  formikRef: FormikFowardRef<QuarantineVersionFormData>
+) {
+  const { onSubmit } = props
+  const { getString } = useStrings()
+  return (
+    <Formik<QuarantineVersionFormData>
+      validationSchema={Yup.object({
+        reason: Yup.string().required(
+          getString('validationMessages.entityRequired', {
+            entity: getString('versionDetails.quarantineVersionModal.reasonField')
+          })
+        )
+      })}
+      initialValues={{ reason: '' }}
+      onSubmit={onSubmit}
+      formName="quarantineVersion">
+      {formik => {
+        setFormikRef(formikRef, formik)
+        return (
+          <FormikForm>
+            <FormInput.TextArea
+              label={getString('versionDetails.quarantineVersionModal.reasonField')}
+              name="reason"
+              placeholder={getString('enterPlaceholder', {
+                name: getString('versionDetails.quarantineVersionModal.reasonField')
+              })}
+            />
+          </FormikForm>
+        )
+      }}
+    </Formik>
+  )
+}
+
+export default forwardRef(QuarantineVersionForm)
diff --git a/web/src/ar/pages/version-details/components/QuarantineForm/type.ts b/web/src/ar/pages/version-details/components/QuarantineForm/type.ts
new file mode 100644
index 000000000..f285593a7
--- /dev/null
+++ b/web/src/ar/pages/version-details/components/QuarantineForm/type.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export interface QuarantineVersionFormData {
+  reason: string
+}
diff --git a/web/src/ar/pages/version-details/components/VersionActions/DeleteVersionMenuItem.tsx b/web/src/ar/pages/version-details/components/VersionActions/DeleteVersionMenuItem.tsx
index 69330e727..34b6bbaea 100644
--- a/web/src/ar/pages/version-details/components/VersionActions/DeleteVersionMenuItem.tsx
+++ b/web/src/ar/pages/version-details/components/VersionActions/DeleteVersionMenuItem.tsx
@@ -25,7 +25,7 @@ import useDeleteVersionModal from '../../hooks/useDeleteVersionModal'
 import { useUtilsForDeleteVersion } from '../../hooks/useUtilsForDeleteVersion'
 
 export default function DeleteVersionMenuItem(props: VersionActionProps): JSX.Element {
-  const { artifactKey, repoKey, readonly, onClose, versionKey, pageType } = props
+  const { artifactKey, repoKey, readonly, onClose, versionKey, pageType, data } = props
   const { getString } = useStrings()
   const { RbacMenuItem } = useParentComponents()
 
@@ -40,6 +40,7 @@ export default function DeleteVersionMenuItem(props: VersionActionProps): JSX.El
     artifactKey,
     repoKey,
     versionKey,
+    artifactType: data?.artifactType,
     onSuccess: handleAfterDeleteVersion
   })
 
diff --git a/web/src/ar/pages/version-details/components/VersionActions/QuarantineMenuItem.tsx b/web/src/ar/pages/version-details/components/VersionActions/QuarantineMenuItem.tsx
new file mode 100644
index 000000000..5cedae0d7
--- /dev/null
+++ b/web/src/ar/pages/version-details/components/VersionActions/QuarantineMenuItem.tsx
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+
+import { useParentComponents } from '@ar/hooks'
+import { useStrings } from '@ar/frameworks/strings'
+import { queryClient } from '@ar/utils/queryClient'
+import { ResourceType } from '@ar/common/permissionTypes'
+import { PermissionIdentifier } from '@ar/common/permissionTypes'
+
+import type { VersionActionProps } from './types'
+import useQuarantineVersion from '../../hooks/useQuarantineVersion'
+
+function QuarantineMenuItem(props: VersionActionProps) {
+  const { artifactKey, readonly, onClose, versionKey, repoKey } = props
+  const { getString } = useStrings()
+  const { RbacMenuItem } = useParentComponents()
+
+  const handleAfterQuarantineVersion = () => {
+    queryClient.invalidateQueries(['GetAllArtifactVersions'])
+    queryClient.invalidateQueries(['GetAllHarnessArtifacts'])
+    queryClient.invalidateQueries(['GetArtifactVersionSummary'])
+    onClose?.()
+  }
+
+  const { triggerQuarantine } = useQuarantineVersion({
+    artifactKey,
+    repoKey,
+    versionKey,
+    onSuccess: handleAfterQuarantineVersion
+  })
+
+  const handleQuarantine = (): void => {
+    triggerQuarantine()
+  }
+
+  return (
+    <RbacMenuItem
+      icon="error-tracking"
+      text={getString('versionList.actions.quarantine')}
+      onClick={handleQuarantine}
+      disabled={readonly}
+      permission={{
+        resource: {
+          resourceType: ResourceType.ARTIFACT_REGISTRY,
+          resourceIdentifier: artifactKey
+        },
+        permission: PermissionIdentifier.DELETE_ARTIFACT
+      }}
+    />
+  )
+}
+
+export default QuarantineMenuItem
diff --git a/web/src/ar/pages/version-details/components/VersionActions/RemoveQurantineMenuItem.tsx b/web/src/ar/pages/version-details/components/VersionActions/RemoveQurantineMenuItem.tsx
new file mode 100644
index 000000000..242f3a04d
--- /dev/null
+++ b/web/src/ar/pages/version-details/components/VersionActions/RemoveQurantineMenuItem.tsx
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React from 'react'
+
+import { useParentComponents } from '@ar/hooks'
+import { useStrings } from '@ar/frameworks/strings'
+import { queryClient } from '@ar/utils/queryClient'
+import { ResourceType } from '@ar/common/permissionTypes'
+import { PermissionIdentifier } from '@ar/common/permissionTypes'
+
+import type { VersionActionProps } from './types'
+import useRemoveQuarantineVersion from '../../hooks/useRemoveQuarantineVersion'
+
+function RemoveQurantineMenuItem(props: VersionActionProps) {
+  const { artifactKey, readonly, onClose, versionKey, repoKey } = props
+  const { getString } = useStrings()
+  const { RbacMenuItem } = useParentComponents()
+
+  const handleAfterQuarantineVersion = () => {
+    queryClient.invalidateQueries(['GetAllArtifactVersions'])
+    queryClient.invalidateQueries(['GetAllHarnessArtifacts'])
+    queryClient.invalidateQueries(['GetArtifactVersionSummary'])
+    onClose?.()
+  }
+
+  const { triggerRemoveQuarantine } = useRemoveQuarantineVersion({
+    artifactKey,
+    repoKey,
+    versionKey,
+    onSuccess: handleAfterQuarantineVersion
+  })
+
+  const handleRemoveFromQuarantine = (): void => {
+    triggerRemoveQuarantine()
+  }
+
+  return (
+    <RbacMenuItem
+      icon="error-tracking"
+      text={getString('versionList.actions.removeQuarantine')}
+      onClick={handleRemoveFromQuarantine}
+      disabled={readonly}
+      permission={{
+        resource: {
+          resourceType: ResourceType.ARTIFACT_REGISTRY,
+          resourceIdentifier: artifactKey
+        },
+        permission: PermissionIdentifier.DELETE_ARTIFACT
+      }}
+    />
+  )
+}
+
+export default RemoveQurantineMenuItem
diff --git a/web/src/ar/pages/version-details/components/VersionActions/VersionActions.tsx b/web/src/ar/pages/version-details/components/VersionActions/VersionActions.tsx
index ca9df5b1f..acc3d2546 100644
--- a/web/src/ar/pages/version-details/components/VersionActions/VersionActions.tsx
+++ b/web/src/ar/pages/version-details/components/VersionActions/VersionActions.tsx
@@ -17,16 +17,19 @@
 import React, { useState } from 'react'
 import { get } from 'lodash-es'
 
-import { useRoutes } from '@ar/hooks'
+import { useFeatureFlags, useRoutes } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
 import ActionButton from '@ar/components/ActionButton/ActionButton'
 import CopyMenuItem from '@ar/components/MenuItemTypes/CopyMenuItem'
 import LinkMenuItem from '@ar/components/MenuItemTypes/LinkMenuItem'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
+import QuarantineMenuItem from './QuarantineMenuItem'
 import SetupClientMenuItem from './SetupClientMenuItem'
 import DeleteVersionMenuItem from './DeleteVersionMenuItem'
 import { type VersionActionProps, VersionAction } from './types'
 import { VersionDetailsTab } from '../VersionDetailsTabs/constants'
+import RemoveQurantineMenuItem from './RemoveQurantineMenuItem'
 
 export default function VersionActions({
   data,
@@ -41,6 +44,7 @@ export default function VersionActions({
   const [open, setOpen] = useState(false)
   const routes = useRoutes()
   const { getString } = useStrings()
+  const { HAR_ARTIFACT_QUARANTINE_ENABLED } = useFeatureFlags()
 
   const isAllowed = (action: VersionAction): boolean => {
     if (!allowedActions) return true
@@ -85,11 +89,40 @@ export default function VersionActions({
             repositoryIdentifier: repoKey,
             artifactIdentifier: artifactKey,
             versionIdentifier: versionKey,
-            versionTab: VersionDetailsTab.OVERVIEW
+            versionTab: VersionDetailsTab.OVERVIEW,
+            artifactType: (data?.artifactType ?? LocalArtifactType.ARTIFACTS) as LocalArtifactType
           })}>
           {getString('view')}
         </LinkMenuItem>
       )}
+      {isAllowed(VersionAction.Quarantine) && HAR_ARTIFACT_QUARANTINE_ENABLED && !data.isQuarantined && (
+        <QuarantineMenuItem
+          artifactKey={artifactKey}
+          repoKey={repoKey}
+          versionKey={versionKey}
+          data={data}
+          pageType={pageType}
+          readonly={readonly}
+          onClose={() => {
+            setOpen(false)
+            onClose?.()
+          }}
+        />
+      )}
+      {isAllowed(VersionAction.Quarantine) && HAR_ARTIFACT_QUARANTINE_ENABLED && data.isQuarantined && (
+        <RemoveQurantineMenuItem
+          artifactKey={artifactKey}
+          repoKey={repoKey}
+          versionKey={versionKey}
+          data={data}
+          pageType={pageType}
+          readonly={readonly}
+          onClose={() => {
+            setOpen(false)
+            onClose?.()
+          }}
+        />
+      )}
     </ActionButton>
   )
 }
diff --git a/web/src/ar/pages/version-details/components/VersionActions/types.ts b/web/src/ar/pages/version-details/components/VersionActions/types.ts
index e7b7e7db2..34289db02 100644
--- a/web/src/ar/pages/version-details/components/VersionActions/types.ts
+++ b/web/src/ar/pages/version-details/components/VersionActions/types.ts
@@ -32,5 +32,6 @@ export enum VersionAction {
   Delete = 'delete',
   SetupClient = 'setupClient',
   DownloadCommand = 'downloadCommand',
-  ViewVersionDetails = 'viewVersionDetails'
+  ViewVersionDetails = 'viewVersionDetails',
+  Quarantine = 'quarantine'
 }
diff --git a/web/src/ar/pages/version-details/components/VersionDetailsHeader/VersionDetailsHeader.tsx b/web/src/ar/pages/version-details/components/VersionDetailsHeader/VersionDetailsHeader.tsx
index f64fb2449..c2f6f29ac 100644
--- a/web/src/ar/pages/version-details/components/VersionDetailsHeader/VersionDetailsHeader.tsx
+++ b/web/src/ar/pages/version-details/components/VersionDetailsHeader/VersionDetailsHeader.tsx
@@ -25,7 +25,7 @@ import { useParentComponents, useDecodedParams, useRoutes } from '@ar/hooks'
 import { getIdentifierStringForBreadcrumb } from '@ar/common/utils'
 import { VersionProviderContext } from '@ar/pages/version-details/context/VersionProvider'
 
-import { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import { LocalArtifactType, RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import VersionDetailsHeaderWidget from '@ar/frameworks/Version/VersionDetailsHeaderWidget'
 import css from './VersionDetailsHeader.module.scss'
 
@@ -58,7 +58,8 @@ export function VersionDetailsHeader(props: VersionDetailsHeaderProps): JSX.Elem
             {
               url: routes.toARArtifactDetails({
                 repositoryIdentifier,
-                artifactIdentifier
+                artifactIdentifier,
+                artifactType: (data?.artifactType ?? LocalArtifactType.ARTIFACTS) as LocalArtifactType
               }),
               label: getIdentifierStringForBreadcrumb(getString('breadcrumbs.artifacts'), artifactIdentifier)
             }
diff --git a/web/src/ar/pages/version-details/components/VersionDetailsHeaderContent/VersionDetailsHeaderContent.tsx b/web/src/ar/pages/version-details/components/VersionDetailsHeaderContent/VersionDetailsHeaderContent.tsx
index 5a96315e0..99107796c 100644
--- a/web/src/ar/pages/version-details/components/VersionDetailsHeaderContent/VersionDetailsHeaderContent.tsx
+++ b/web/src/ar/pages/version-details/components/VersionDetailsHeaderContent/VersionDetailsHeaderContent.tsx
@@ -23,6 +23,7 @@ import type { ArtifactVersionSummary } from '@harnessio/react-har-service-client
 import { useDecodedParams, useRoutes } from '@ar/hooks'
 import { PageType, type RepositoryPackageType } from '@ar/common/types'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import QuarantineBadge from '@ar/components/Badge/QuarantineBadge'
 import RepositoryIcon from '@ar/frameworks/RepositoryStep/RepositoryIcon'
 import VersionActionsWidget from '@ar/frameworks/Version/VersionActionsWidget'
 import SetupClientButton from '@ar/components/SetupClientButton/SetupClientButton'
@@ -46,7 +47,8 @@ export default function VersionDetailsHeaderContent(props: VersionDetailsHeaderC
       routes.toARVersionDetails({
         repositoryIdentifier: pathParams.repositoryIdentifier,
         artifactIdentifier: pathParams.artifactIdentifier,
-        versionIdentifier: newVersion
+        versionIdentifier: newVersion,
+        artifactType: pathParams.artifactType
       })
     )
   }
@@ -60,6 +62,7 @@ export default function VersionDetailsHeaderContent(props: VersionDetailsHeaderC
         onChangeVersion={handleChangeVersion}
         isLatestVersion={false}
       />
+      {data.isQuarantined && <QuarantineBadge reason={data.quarantineReason} />}
       <Expander />
       <SetupClientButton
         repositoryIdentifier={pathParams.repositoryIdentifier}
diff --git a/web/src/ar/pages/version-details/components/VersionDetailsTabs/VersionDetailsTabs.tsx b/web/src/ar/pages/version-details/components/VersionDetailsTabs/VersionDetailsTabs.tsx
index edde03cea..22ab219fe 100644
--- a/web/src/ar/pages/version-details/components/VersionDetailsTabs/VersionDetailsTabs.tsx
+++ b/web/src/ar/pages/version-details/components/VersionDetailsTabs/VersionDetailsTabs.tsx
@@ -74,6 +74,7 @@ export default function VersionDetailsTabs(): JSX.Element {
               versionIdentifier: pathParams.versionIdentifier,
               artifactIdentifier: pathParams.artifactIdentifier,
               repositoryIdentifier: pathParams.repositoryIdentifier,
+              artifactType: pathParams.artifactType,
               versionTab: nextTab,
               sourceId: data?.sscaArtifactSourceId,
               artifactId: data?.sscaArtifactId,
@@ -89,6 +90,7 @@ export default function VersionDetailsTabs(): JSX.Element {
               versionIdentifier: pathParams.versionIdentifier,
               artifactIdentifier: pathParams.artifactIdentifier,
               repositoryIdentifier: pathParams.repositoryIdentifier,
+              artifactType: pathParams.artifactType,
               versionTab: nextTab,
               executionIdentifier: data?.stoExecutionId,
               pipelineIdentifier: data?.stoPipelineId,
@@ -104,6 +106,7 @@ export default function VersionDetailsTabs(): JSX.Element {
               versionIdentifier: pathParams.versionIdentifier,
               artifactIdentifier: pathParams.artifactIdentifier,
               repositoryIdentifier: pathParams.repositoryIdentifier,
+              artifactType: pathParams.artifactType,
               versionTab: nextTab
             },
             { queryParams }
@@ -132,6 +135,7 @@ export default function VersionDetailsTabs(): JSX.Element {
               versionIdentifier: pathParams.versionIdentifier,
               artifactIdentifier: pathParams.artifactIdentifier,
               repositoryIdentifier: pathParams.repositoryIdentifier,
+              artifactType: pathParams.artifactType,
               versionTab: VersionDetailsTab.OVERVIEW
             })}
           />
diff --git a/web/src/ar/pages/version-details/context/VersionDependencyListProvider.tsx b/web/src/ar/pages/version-details/context/VersionDependencyListProvider.tsx
index fd1109f96..c57348547 100644
--- a/web/src/ar/pages/version-details/context/VersionDependencyListProvider.tsx
+++ b/web/src/ar/pages/version-details/context/VersionDependencyListProvider.tsx
@@ -20,6 +20,7 @@ import { type FileDetailResponseResponse, useGetArtifactFilesQuery } from '@harn
 
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 import { useDecodedParams, useGetSpaceRef, useParentHooks } from '@ar/hooks'
 import type { UseUpdateQueryParamsReturn } from '@ar/__mocks__/hooks/useUpdateQueryParams'
 
@@ -66,7 +67,8 @@ const VersionDependencyListProvider = (props: PropsWithChildren<unknown>) => {
       page,
       size,
       sort_field: sortField,
-      sort_order: sortOrder
+      sort_order: sortOrder,
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
     }
   })
   const responseData = data?.content
diff --git a/web/src/ar/pages/version-details/context/VersionFilesProvider.tsx b/web/src/ar/pages/version-details/context/VersionFilesProvider.tsx
index e411f4631..8d66276f1 100644
--- a/web/src/ar/pages/version-details/context/VersionFilesProvider.tsx
+++ b/web/src/ar/pages/version-details/context/VersionFilesProvider.tsx
@@ -20,6 +20,7 @@ import { type FileDetailResponseResponse, useGetArtifactFilesQuery } from '@harn
 
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 import { useDecodedParams, useGetSpaceRef, useParentHooks } from '@ar/hooks'
 import type { UseUpdateQueryParamsReturn } from '@ar/__mocks__/hooks/useUpdateQueryParams'
 import { DEFAULT_ARTIFACT_LIST_TABLE_SORT, DEFAULT_PAGE_INDEX, DEFAULT_PAGE_SIZE } from '@ar/constants'
@@ -78,7 +79,8 @@ const VersionFilesProvider = (props: PropsWithChildren<IVersionFilesProviderProp
       page,
       size,
       sort_field: sortField,
-      sort_order: sortOrder
+      sort_order: sortOrder,
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
     }
   })
   const responseData = data?.content
diff --git a/web/src/ar/pages/version-details/context/VersionOverviewProvider.tsx b/web/src/ar/pages/version-details/context/VersionOverviewProvider.tsx
index 3c9bb22cf..eb248a682 100644
--- a/web/src/ar/pages/version-details/context/VersionOverviewProvider.tsx
+++ b/web/src/ar/pages/version-details/context/VersionOverviewProvider.tsx
@@ -21,6 +21,7 @@ import { type ArtifactDetail, useGetArtifactDetailsQuery } from '@harnessio/reac
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import { useDecodedParams, useGetSpaceRef } from '@ar/hooks'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 
 interface VersionOverviewProviderProps<T = ArtifactDetail> {
   data: T
@@ -49,7 +50,9 @@ const VersionOverviewProvider = (props: PropsWithChildren<unknown>) => {
     registry_ref: spaceRef,
     artifact: encodeRef(pathParams.artifactIdentifier),
     version: pathParams.versionIdentifier,
-    queryParams: {}
+    queryParams: {
+      artifact_type: pathParams.artifactType === LocalArtifactType.ARTIFACTS ? undefined : pathParams.artifactType
+    }
   })
   const responseData = data?.content?.data
 
diff --git a/web/src/ar/pages/version-details/context/VersionProvider.tsx b/web/src/ar/pages/version-details/context/VersionProvider.tsx
index b5c08bd0e..22aa56118 100644
--- a/web/src/ar/pages/version-details/context/VersionProvider.tsx
+++ b/web/src/ar/pages/version-details/context/VersionProvider.tsx
@@ -20,6 +20,7 @@ import { ArtifactVersionSummary, useGetArtifactVersionSummaryQuery } from '@harn
 
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 import type { VersionDetailsPathParams } from '@ar/routes/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 import { useDecodedParams, useGetSpaceRef, useParentHooks } from '@ar/hooks'
 
 import type { DockerVersionDetailsQueryParams } from '../DockerVersion/types'
@@ -46,7 +47,8 @@ const VersionProvider: FC<PropsWithChildren<VersionProviderSpcs>> = ({
 }): JSX.Element => {
   const { useQueryParams } = useParentHooks()
   const { digest } = useQueryParams<DockerVersionDetailsQueryParams>()
-  const { repositoryIdentifier, artifactIdentifier, versionIdentifier } = useDecodedParams<VersionDetailsPathParams>()
+  const { repositoryIdentifier, artifactIdentifier, versionIdentifier, artifactType } =
+    useDecodedParams<VersionDetailsPathParams>()
 
   const spaceRef = useGetSpaceRef(repoKey ?? repositoryIdentifier)
   const {
@@ -59,7 +61,8 @@ const VersionProvider: FC<PropsWithChildren<VersionProviderSpcs>> = ({
     artifact: encodeRef(artifactKey ?? artifactIdentifier),
     version: versionKey ?? versionIdentifier,
     queryParams: {
-      digest
+      digest,
+      artifact_type: artifactType === LocalArtifactType.ARTIFACTS ? undefined : artifactType
     }
   })
 
diff --git a/web/src/ar/pages/version-details/hooks/useDeleteVersionModal.tsx b/web/src/ar/pages/version-details/hooks/useDeleteVersionModal.tsx
index 13ede3e48..743bdb3a4 100644
--- a/web/src/ar/pages/version-details/hooks/useDeleteVersionModal.tsx
+++ b/web/src/ar/pages/version-details/hooks/useDeleteVersionModal.tsx
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
+import { useState } from 'react'
 import { Intent } from '@blueprintjs/core'
 import { getErrorInfoFromErrorObject, useToaster } from '@harnessio/uicore'
-import { useDeleteArtifactVersionMutation } from '@harnessio/react-har-service-client'
+import { ArtifactType, useDeleteArtifactVersionMutation } from '@harnessio/react-har-service-client'
 
-import { useGetSpaceRef, useParentHooks } from '@ar/hooks'
+import { useConfirmationDialog, useGetSpaceRef } from '@ar/hooks'
 import { useStrings } from '@ar/frameworks/strings'
 import { encodeRef } from '@ar/hooks/useGetSpaceRef'
 
@@ -26,43 +27,52 @@ interface useDeleteVersionModalProps {
   repoKey: string
   artifactKey: string
   versionKey: string
+  artifactType?: ArtifactType
   onSuccess: () => void
 }
 export default function useDeleteVersionModal(props: useDeleteVersionModalProps) {
-  const { repoKey, onSuccess, artifactKey, versionKey } = props
+  const { repoKey, onSuccess, artifactKey, versionKey, artifactType } = props
+  const [submitting, setSubmitting] = useState(false)
   const { getString } = useStrings()
   const { showSuccess, showError, clear } = useToaster()
-  const { useConfirmationDialog } = useParentHooks()
   const spaceRef = useGetSpaceRef(repoKey)
 
   const { mutateAsync: deleteVersion } = useDeleteArtifactVersionMutation()
 
   const handleDeleteVersion = async (isConfirmed: boolean): Promise<void> => {
     if (isConfirmed) {
+      setSubmitting(true)
       try {
         const response = await deleteVersion({
           registry_ref: spaceRef,
           artifact: encodeRef(artifactKey),
-          version: versionKey
+          version: versionKey,
+          queryParams: {
+            artifact_type: artifactType
+          }
         })
         if (response.content.status === 'SUCCESS') {
           clear()
           showSuccess(getString('versionDetails.versionDeleted'))
           onSuccess()
+          closeDialog()
         }
       } catch (e: any) {
         showError(getErrorInfoFromErrorObject(e, true))
+      } finally {
+        setSubmitting(false)
       }
     }
   }
 
-  const { openDialog } = useConfirmationDialog({
+  const { openDialog, closeDialog } = useConfirmationDialog({
     titleText: getString('versionDetails.deleteVersionModal.title'),
     contentText: getString('versionDetails.deleteVersionModal.contentText'),
     confirmButtonText: getString('delete'),
     cancelButtonText: getString('cancel'),
     intent: Intent.DANGER,
-    onCloseDialog: handleDeleteVersion
+    onCloseDialog: handleDeleteVersion,
+    buttonDisabled: submitting
   })
 
   return { triggerDelete: openDialog }
diff --git a/web/src/ar/pages/version-details/hooks/useQuarantineVersion.tsx b/web/src/ar/pages/version-details/hooks/useQuarantineVersion.tsx
new file mode 100644
index 000000000..5108bf019
--- /dev/null
+++ b/web/src/ar/pages/version-details/hooks/useQuarantineVersion.tsx
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { useRef, useState } from 'react'
+import { Intent } from '@blueprintjs/core'
+import { useQuarantineFilePathMutation } from '@harnessio/react-har-service-client'
+import { getErrorInfoFromErrorObject, Layout, Text, useToaster } from '@harnessio/uicore'
+
+import type { FormikRef } from '@ar/common/types'
+import { useStrings } from '@ar/frameworks/strings'
+import { useConfirmationDialog, useGetSpaceRef } from '@ar/hooks'
+import type { QuarantineVersionFormData } from '../components/QuarantineForm/type'
+import QuarantineVersionForm from '../components/QuarantineForm/QuarantineForm'
+
+interface useQuarantineVersionProps {
+  repoKey: string
+  artifactKey: string
+  versionKey: string
+  onSuccess: () => void
+}
+
+function useQuarantineVersion(props: useQuarantineVersionProps) {
+  const { repoKey, artifactKey, versionKey, onSuccess } = props
+  const [submitting, setSubmitting] = useState(false)
+  const formikRef = useRef<FormikRef<QuarantineVersionFormData>>(null)
+  const { getString } = useStrings()
+  const { showSuccess, showError, clear } = useToaster()
+  const spaceRef = useGetSpaceRef(repoKey)
+
+  const { mutateAsync: quarantineVersion } = useQuarantineFilePathMutation()
+
+  const handleSubmitQuarantineVersion = async (values: QuarantineVersionFormData): Promise<void> => {
+    setSubmitting(true)
+    try {
+      const response = await quarantineVersion({
+        body: {
+          artifact: artifactKey,
+          version: versionKey,
+          reason: values.reason
+        },
+        registry_ref: spaceRef
+      })
+      if (response.content.status === 'SUCCESS') {
+        clear()
+        showSuccess(getString('versionDetails.quarantineVersionModal.versionQuarantined'))
+        onSuccess()
+        closeDialog()
+      }
+    } catch (e: any) {
+      showError(getErrorInfoFromErrorObject(e, true))
+    } finally {
+      setSubmitting(false)
+    }
+  }
+
+  const handleModalButtonClick = (isConfirmed: boolean) => {
+    if (isConfirmed) {
+      formikRef.current?.submitForm()
+    } else {
+      closeDialog()
+    }
+  }
+
+  const { openDialog, closeDialog } = useConfirmationDialog({
+    titleText: getString('versionDetails.quarantineVersionModal.title'),
+    contentText: (
+      <Layout.Vertical spacing="medium">
+        <Text>{getString('versionDetails.quarantineVersionModal.contentText')}</Text>
+        <QuarantineVersionForm onSubmit={handleSubmitQuarantineVersion} ref={formikRef} />
+      </Layout.Vertical>
+    ),
+    confirmButtonText: getString('versionDetails.quarantineVersionModal.confirmButtonText'),
+    cancelButtonText: getString('versionDetails.quarantineVersionModal.cancelButtonText'),
+    intent: Intent.WARNING,
+    onCloseDialog: handleModalButtonClick,
+    buttonDisabled: submitting
+  })
+
+  return { triggerQuarantine: openDialog }
+}
+
+export default useQuarantineVersion
diff --git a/web/src/ar/pages/version-details/hooks/useRemoveQuarantineVersion.tsx b/web/src/ar/pages/version-details/hooks/useRemoveQuarantineVersion.tsx
new file mode 100644
index 000000000..0483309fc
--- /dev/null
+++ b/web/src/ar/pages/version-details/hooks/useRemoveQuarantineVersion.tsx
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2024 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { useState } from 'react'
+import { Intent } from '@blueprintjs/core'
+import { useDeleteQuarantineFilePathMutation } from '@harnessio/react-har-service-client'
+import { getErrorInfoFromErrorObject, useToaster } from '@harnessio/uicore'
+
+import { useStrings } from '@ar/frameworks/strings'
+import { useConfirmationDialog, useGetSpaceRef } from '@ar/hooks'
+
+interface useRemoveQuarantineVersionProps {
+  repoKey: string
+  artifactKey: string
+  versionKey: string
+  onSuccess: () => void
+}
+
+function useRemoveQuarantineVersion(props: useRemoveQuarantineVersionProps) {
+  const { repoKey, artifactKey, versionKey, onSuccess } = props
+  const [submitting, setSubmitting] = useState(false)
+  const { getString } = useStrings()
+  const { showSuccess, showError, clear } = useToaster()
+  const spaceRef = useGetSpaceRef(repoKey)
+
+  const { mutateAsync: removeQuarantineVersion } = useDeleteQuarantineFilePathMutation()
+
+  const handleSubmitRemoveQuarantineVersion = async (): Promise<void> => {
+    setSubmitting(true)
+    try {
+      const response = await removeQuarantineVersion({
+        queryParams: {
+          artifact: artifactKey,
+          version: versionKey
+        },
+        registry_ref: spaceRef
+      })
+      if (response.content.status === 'SUCCESS') {
+        clear()
+        showSuccess(getString('versionDetails.removeFromQuarantineModal.versionRemovedFromQuarantine'))
+        onSuccess()
+        closeDialog()
+      }
+    } catch (e: any) {
+      showError(getErrorInfoFromErrorObject(e, true))
+    } finally {
+      setSubmitting(false)
+    }
+  }
+
+  const handleModalButtonClick = (isConfirmed: boolean) => {
+    if (isConfirmed) {
+      handleSubmitRemoveQuarantineVersion()
+    } else {
+      closeDialog()
+    }
+  }
+
+  const { openDialog, closeDialog } = useConfirmationDialog({
+    titleText: getString('versionDetails.removeFromQuarantineModal.title'),
+    contentText: getString('versionDetails.removeFromQuarantineModal.contentText'),
+    confirmButtonText: getString('versionDetails.removeFromQuarantineModal.confirmButtonText'),
+    cancelButtonText: getString('versionDetails.removeFromQuarantineModal.cancelButtonText'),
+    intent: Intent.WARNING,
+    onCloseDialog: handleModalButtonClick,
+    buttonDisabled: submitting
+  })
+
+  return { triggerRemoveQuarantine: openDialog }
+}
+
+export default useRemoveQuarantineVersion
diff --git a/web/src/ar/pages/version-details/hooks/useUtilsForDeleteVersion.tsx b/web/src/ar/pages/version-details/hooks/useUtilsForDeleteVersion.tsx
index 25bc9c291..34ad47ab6 100644
--- a/web/src/ar/pages/version-details/hooks/useUtilsForDeleteVersion.tsx
+++ b/web/src/ar/pages/version-details/hooks/useUtilsForDeleteVersion.tsx
@@ -21,14 +21,14 @@ import { useRoutes } from '@ar/hooks'
 import { PageType } from '@ar/common/types'
 import type { ArtifactDetailsPathParams } from '@ar/routes/types'
 import { encodeRef, useGetSpaceRef } from '@ar/hooks/useGetSpaceRef'
-import { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import { LocalArtifactType, RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import { queryClient } from '@ar/utils/queryClient'
 
 export function useUtilsForDeleteVersion() {
   const routes = useRoutes()
   const history = useHistory()
   const registryRef = useGetSpaceRef()
-  const { repositoryIdentifier, artifactIdentifier } = useParams<ArtifactDetailsPathParams>()
+  const { repositoryIdentifier, artifactIdentifier, artifactType } = useParams<ArtifactDetailsPathParams>()
 
   async function handleRedirectToVersionListURL(): Promise<void> {
     try {
@@ -43,7 +43,8 @@ export function useUtilsForDeleteVersion() {
       history.push(
         routes.toARArtifactDetails({
           repositoryIdentifier,
-          artifactIdentifier
+          artifactIdentifier,
+          artifactType: artifactType ?? LocalArtifactType.ARTIFACTS
         })
       )
     } catch (e) {
diff --git a/web/src/ar/pages/version-details/strings/strings.en.yaml b/web/src/ar/pages/version-details/strings/strings.en.yaml
index 1c1e5e95a..f920a9f85 100644
--- a/web/src/ar/pages/version-details/strings/strings.en.yaml
+++ b/web/src/ar/pages/version-details/strings/strings.en.yaml
@@ -110,3 +110,16 @@ versionDeleted: Artifact version deleted successfully!
 deleteVersionModal:
   title: Delete Artifact Version
   contentText: Are you sure you want to delete the artifact version?
+quarantineVersionModal:
+  title: Add to Quarantine
+  contentText: Proceeding will put this artifact to quarantine, making it not generally accessible. Please provide a reason for this action.
+  reasonField: Reason
+  versionQuarantined: Artifact version quarantined successfully!
+  confirmButtonText: Quarantine
+  cancelButtonText: Cancel
+removeFromQuarantineModal:
+  title: Remove from Quarantine
+  contentText: Proceeding will remove this artifact from quarantine, making it generally accessible. Please provide a reason for this action.
+  confirmButtonText: Remove from Quarantine
+  cancelButtonText: Cancel
+  versionRemovedFromQuarantine: Artifact version removed from quarantine successfully!
diff --git a/web/src/ar/pages/version-list/components/VersionListTable/VersionListCell.tsx b/web/src/ar/pages/version-list/components/VersionListTable/VersionListCell.tsx
index ffd138104..823a7682c 100644
--- a/web/src/ar/pages/version-list/components/VersionListTable/VersionListCell.tsx
+++ b/web/src/ar/pages/version-list/components/VersionListTable/VersionListCell.tsx
@@ -28,6 +28,7 @@ import { useDecodedParams, useRoutes } from '@ar/hooks'
 import TableCells from '@ar/components/TableCells/TableCells'
 import type { ArtifactDetailsPathParams } from '@ar/routes/types'
 import { PageType, type RepositoryPackageType } from '@ar/common/types'
+import { LocalArtifactType } from '@ar/pages/repository-details/constants'
 import VersionActionsWidget from '@ar/frameworks/Version/VersionActionsWidget'
 import { VersionDetailsTab } from '@ar/pages/version-details/components/VersionDetailsTabs/constants'
 
@@ -61,18 +62,25 @@ export const ToggleAccordionCell: Renderer<{
   )
 }
 
-export const VersionNameCell: CellType = ({ value }) => {
+export const VersionNameCell: CellType = ({ value, row }) => {
+  const { original } = row
   const routes = useRoutes()
+  const { isQuarantined, quarantineReason } = original
   const pathParams = useDecodedParams<ArtifactDetailsPathParams>()
   return (
     <Layout.Horizontal className={css.nameCellContainer} spacing="small">
-      <Icon name="store-artifact-bundle" size={24} />
+      {isQuarantined ? (
+        <TableCells.QuarantineIcon reason={quarantineReason} />
+      ) : (
+        <Icon name="store-artifact-bundle" size={24} />
+      )}
       <Link
         to={routes.toARVersionDetailsTab({
           repositoryIdentifier: pathParams.repositoryIdentifier,
           artifactIdentifier: pathParams.artifactIdentifier,
           versionIdentifier: value,
-          versionTab: VersionDetailsTab.OVERVIEW
+          versionTab: VersionDetailsTab.OVERVIEW,
+          artifactType: (original.artifactType ?? LocalArtifactType.ARTIFACTS) as LocalArtifactType
         })}>
         <Text lineClamp={1} color={Color.PRIMARY_7} font={{ variation: FontVariation.SMALL }}>
           {value}
diff --git a/web/src/ar/pages/version-list/strings/strings.en.yaml b/web/src/ar/pages/version-list/strings/strings.en.yaml
index 3c2d05358..7bc2d00b0 100644
--- a/web/src/ar/pages/version-list/strings/strings.en.yaml
+++ b/web/src/ar/pages/version-list/strings/strings.en.yaml
@@ -13,3 +13,5 @@ table:
     deployments: '{{ $.versionDetails.tabs.deployments }}'
 actions:
   deleteVersion: Delete Version
+  quarantine: Quarantine
+  removeQuarantine: Remove From Quarantine
diff --git a/web/src/ar/routes/RouteDefinitions.ts b/web/src/ar/routes/RouteDefinitions.ts
index a10b02738..058349d18 100644
--- a/web/src/ar/routes/RouteDefinitions.ts
+++ b/web/src/ar/routes/RouteDefinitions.ts
@@ -54,7 +54,8 @@ export const routeDefinitions: ARRouteDefinitionsReturn = {
         registryId: defaultTo(params?.registryId, ''),
         artifactId: defaultTo(params?.artifactId, ''),
         versionId: defaultTo(params?.versionId, ''),
-        versionDetailsTab: defaultTo(params?.versionDetailsTab, '')
+        versionDetailsTab: defaultTo(params?.versionDetailsTab, ''),
+        artifactType: defaultTo(params?.artifactType, '')
       })
       return `/redirect?${queryParams.toString()}`
     }
@@ -69,14 +70,14 @@ export const routeDefinitions: ARRouteDefinitionsReturn = {
   ),
   toARArtifacts: routeDefinitionWithMode(() => '/artifacts'),
   toARArtifactDetails: routeDefinitionWithMode(
-    params => `/registries/${params?.repositoryIdentifier}/artifacts/${params?.artifactIdentifier}`
+    params => `/registries/${params?.repositoryIdentifier}/${params?.artifactType}/${params?.artifactIdentifier}`
   ),
   toARVersionDetails: routeDefinitionWithMode(
     params =>
-      `/registries/${params?.repositoryIdentifier}/artifacts/${params?.artifactIdentifier}/versions/${params?.versionIdentifier}`
+      `/registries/${params?.repositoryIdentifier}/${params?.artifactType}/${params?.artifactIdentifier}/versions/${params?.versionIdentifier}`
   ),
   toARVersionDetailsTab: routeDefinitionWithMode(params => {
-    let route = `/registries/${params?.repositoryIdentifier}/artifacts/${params?.artifactIdentifier}/versions/${params?.versionIdentifier}`
+    let route = `/registries/${params?.repositoryIdentifier}/${params?.artifactType}/${params?.artifactIdentifier}/versions/${params?.versionIdentifier}`
     if (params.orgIdentifier) route += `/orgs/${params.orgIdentifier}`
     if (params.projectIdentifier) route += `/projects/${params.projectIdentifier}`
     if (params.sourceId && params.artifactId) {
diff --git a/web/src/ar/routes/RouteDestinations.tsx b/web/src/ar/routes/RouteDestinations.tsx
index 8648bef49..bfb2fcd8a 100644
--- a/web/src/ar/routes/RouteDestinations.tsx
+++ b/web/src/ar/routes/RouteDestinations.tsx
@@ -22,7 +22,7 @@ import { useAppStore, useGetRepositoryListViewType, useRoutes } from '@ar/hooks'
 import RedirectPage from '@ar/pages/redirect-page/RedirectPage'
 import { RepositoryListViewTypeEnum } from '@ar/contexts/AppStoreContext'
 import type { WebhookDetailsTab } from '@ar/pages/webhook-details/constants'
-import type { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import type { LocalArtifactType, RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import type { ManageRegistriesDetailsTab } from '@ar/pages/manage-registries/constants'
 
 import type {
@@ -62,7 +62,8 @@ export const repositoryDetailsTabPathProps: RepositoryDetailsTabPathParams = {
 
 export const artifactDetailsPathProps: ArtifactDetailsPathParams = {
   ...repositoryDetailsPathProps,
-  artifactIdentifier: ':artifactIdentifier'
+  artifactIdentifier: ':artifactIdentifier',
+  artifactType: ':artifactType' as LocalArtifactType
 }
 
 export const versionDetailsPathParams: VersionDetailsPathParams = {
@@ -138,6 +139,9 @@ const RouteDestinations = (): JSX.Element => {
           <RepositoryListPage />
         </RouteProvider>
       )}
+      <RouteProvider path={routes.toARRepositoryWebhookDetails({ ...repositoryWebhookDetailsPathParams })}>
+        <WebhookDetailsPage />
+      </RouteProvider>
       {/* IF Enterprise then will use different route for version details page
        * IF repositoryListViewType = DIRECTORY then will use different route for version details page
        * IF OSS then will use version details as sub route for artifact details page
@@ -161,9 +165,6 @@ const RouteDestinations = (): JSX.Element => {
           <VersionDetailsPage />
         </RouteProvider>
       )}
-      <RouteProvider path={routes.toARRepositoryWebhookDetails({ ...repositoryWebhookDetailsPathParams })}>
-        <WebhookDetailsPage />
-      </RouteProvider>
       <RouteProvider path={routes.toARRepositoryDetails({ ...repositoryDetailsPathProps })}>
         <RepositoryDetailsPage />
       </RouteProvider>
diff --git a/web/src/ar/routes/types.ts b/web/src/ar/routes/types.ts
index 4c4c2a105..f767b59a1 100644
--- a/web/src/ar/routes/types.ts
+++ b/web/src/ar/routes/types.ts
@@ -14,9 +14,10 @@
  * limitations under the License.
  */
 
+import type { ArtifactType } from '@harnessio/react-har-service-client'
 import type { RepositoryPackageType } from '@ar/common/types'
 import type { ManageRegistriesDetailsTab } from '@ar/pages/manage-registries/constants'
-import type { RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
+import type { LocalArtifactType, RepositoryDetailsTab } from '@ar/pages/repository-details/constants'
 import type { VersionDetailsTab } from '@ar/pages/version-details/components/VersionDetailsTabs/constants'
 import type { WebhookDetailsTab } from '@ar/pages/webhook-details/constants'
 
@@ -34,6 +35,7 @@ export interface RepositoryDetailsTabPathParams extends RepositoryDetailsPathPar
 
 export interface ArtifactDetailsPathParams extends RepositoryDetailsPathParams {
   artifactIdentifier: string
+  artifactType: LocalArtifactType
 }
 
 export interface VersionDetailsPathParams extends ArtifactDetailsPathParams {
@@ -59,6 +61,7 @@ export interface RedirectPageQueryParams {
   artifactId?: string
   versionId?: string
   versionDetailsTab?: VersionDetailsTab
+  artifactType?: ArtifactType
 }
 
 export interface RepositoryWebhookDetailsPathParams extends RepositoryDetailsPathParams {
diff --git a/web/src/ar/strings/strings.en.yaml b/web/src/ar/strings/strings.en.yaml
index a4c706fb3..3d9df0cc4 100644
--- a/web/src/ar/strings/strings.en.yaml
+++ b/web/src/ar/strings/strings.en.yaml
@@ -88,6 +88,7 @@ packageTypes:
   rpmPackage: RPM Package
   cargoPackage: Cargo Package
   goPackage: Go Package
+  huggingfacePackage: Huggingface Package
 repositoryTypes:
   docker: Docker
   helm: Helm
@@ -102,6 +103,7 @@ repositoryTypes:
   debian: Debian
   cargo: Cargo
   alpine: Alpine
+  huggingface: Huggingface
 sideNav:
   repositories: '{{ $.repositoryList.pageHeading }}'
   artifacts: '{{ $.artifactList.pageHeading }}'
@@ -109,6 +111,10 @@ sideNav:
 badges:
   artifactRegistry: '{{ $.repositoryList.artifactRegistry.label }}'
   upstreamProxy: '{{ $.repositoryList.upstreamProxy.label }}'
+  projectScope: Project
+  orgScope: Organization
+  accountScope: Account
+  quarantined: Quarantined
 validationMessages:
   required: Required
   repokeyRegExMessage: Registry name must start with letter and can only contain lowercase alphanumerics, _, . and -
@@ -135,3 +141,11 @@ vulnerabilityStatus:
   high: 'H {{count}}'
   medium: 'M {{count}}'
   low: 'L {{count}}'
+labels:
+  title: Labels
+  addLabel: Add Label
+  addNewValue: Add New Value
+  addNewValueDynamic: 'Add New Value {{value}}'
+  findALabel: Find a Label
+  findAValue: Find a Value
+  findOrAddValue: Find or Add Value
diff --git a/web/src/ar/strings/types.ts b/web/src/ar/strings/types.ts
index 154819267..a3bf93d45 100644
--- a/web/src/ar/strings/types.ts
+++ b/web/src/ar/strings/types.ts
@@ -115,6 +115,9 @@ export interface StringsMap {
   'repositoryDetails.repositoryForm.newExcludePattern': string
   'repositoryDetails.repositoryForm.newIncludePattern': string
   'repositoryDetails.repositoryForm.newUpstreamProxy': string
+  'repositoryDetails.repositoryForm.opaPolicy.addTitle': string
+  'repositoryDetails.repositoryForm.opaPolicy.subTitle': string
+  'repositoryDetails.repositoryForm.opaPolicy.title': string
   'repositoryDetails.repositoryForm.ossAdvancedOptionsSubTitle': string
   'repositoryDetails.repositoryForm.repositoryCreated': string
   'repositoryDetails.repositoryForm.repositoryDeleted': string
@@ -129,6 +132,8 @@ export interface StringsMap {
   'repositoryDetails.repositoryForm.upstreamProxiesSubTitle': string
   'repositoryDetails.repositoryForm.upstreamProxiesTitle': string
   'repositoryDetails.tabs.configuration': string
+  'repositoryDetails.tabs.datasets': string
+  'repositoryDetails.tabs.models': string
   'repositoryDetails.tabs.packages': string
   'repositoryDetails.tabs.webhooks': string
   'repositoryDetails.upstreamProxiesSelectList.addUpstreamProxies': string
@@ -146,10 +151,15 @@ export interface StringsMap {
   'repositoryList.newRepository': string
   'repositoryList.pageHeading': string
   'repositoryList.registryCount': string
+  'repositoryList.scope.accountOnly': string
+  'repositoryList.scope.accountRecursive': string
+  'repositoryList.scope.orgOnly': string
+  'repositoryList.scope.orgRecursive': string
   'repositoryList.selectEnvironments': string
   'repositoryList.selectLabels': string
   'repositoryList.selectPackageTypes': string
   'repositoryList.selectRegistryType': string
+  'repositoryList.selectScope': string
   'repositoryList.table.columns.artifacts': string
   'repositoryList.table.columns.downloads': string
   'repositoryList.table.columns.lastModified': string
@@ -186,6 +196,7 @@ export interface StringsMap {
   'upstreamProxyDetails.createForm.source.dockerHub': string
   'upstreamProxyDetails.createForm.source.ecr': string
   'upstreamProxyDetails.createForm.source.goproxy': string
+  'upstreamProxyDetails.createForm.source.huggingface': string
   'upstreamProxyDetails.createForm.source.mavenCentral': string
   'upstreamProxyDetails.createForm.source.npmjs': string
   'upstreamProxyDetails.createForm.source.nugetOrg': string
@@ -282,6 +293,17 @@ export interface StringsMap {
   'versionDetails.overview.generalInformation.vendor': string
   'versionDetails.overview.generalInformation.version': string
   'versionDetails.page': string
+  'versionDetails.quarantineVersionModal.cancelButtonText': string
+  'versionDetails.quarantineVersionModal.confirmButtonText': string
+  'versionDetails.quarantineVersionModal.contentText': string
+  'versionDetails.quarantineVersionModal.reasonField': string
+  'versionDetails.quarantineVersionModal.title': string
+  'versionDetails.quarantineVersionModal.versionQuarantined': string
+  'versionDetails.removeFromQuarantineModal.cancelButtonText': string
+  'versionDetails.removeFromQuarantineModal.confirmButtonText': string
+  'versionDetails.removeFromQuarantineModal.contentText': string
+  'versionDetails.removeFromQuarantineModal.title': string
+  'versionDetails.removeFromQuarantineModal.versionRemovedFromQuarantine': string
   'versionDetails.selectDigestPlaceholder': string
   'versionDetails.tabs.artifactDetails': string
   'versionDetails.tabs.code': string
@@ -291,6 +313,8 @@ export interface StringsMap {
   'versionDetails.tabs.supplyChain': string
   'versionDetails.versionDeleted': string
   'versionList.actions.deleteVersion': string
+  'versionList.actions.quarantine': string
+  'versionList.actions.removeQuarantine': string
   'versionList.page': string
   'versionList.table.columns.activelyDeployed': string
   'versionList.table.columns.deployments': string
@@ -359,7 +383,11 @@ export interface StringsMap {
   'actions.setupClient': string
   add: string
   all: string
+  'badges.accountScope': string
   'badges.artifactRegistry': string
+  'badges.orgScope': string
+  'badges.projectScope': string
+  'badges.quarantined': string
   'badges.upstreamProxy': string
   beta: string
   'breadcrumbs.artifacts': string
@@ -395,6 +423,13 @@ export interface StringsMap {
   harLabel: string
   harnessAI: string
   id: string
+  'labels.addLabel': string
+  'labels.addNewValue': string
+  'labels.addNewValueDynamic': string
+  'labels.findALabel': string
+  'labels.findAValue': string
+  'labels.findOrAddValue': string
+  'labels.title': string
   lastUpdated: string
   loadMore: string
   loading: string
@@ -414,6 +449,7 @@ export interface StringsMap {
   'packageTypes.genericPackage': string
   'packageTypes.goPackage': string
   'packageTypes.helmPackage': string
+  'packageTypes.huggingfacePackage': string
   'packageTypes.mavenPackage': string
   'packageTypes.npmPackage': string
   'packageTypes.nugetPackage': string
@@ -431,6 +467,7 @@ export interface StringsMap {
   'repositoryTypes.go': string
   'repositoryTypes.gradle': string
   'repositoryTypes.helm': string
+  'repositoryTypes.huggingface': string
   'repositoryTypes.maven': string
   'repositoryTypes.npm': string
   'repositoryTypes.nuget': string
diff --git a/web/src/ar/utils/testUtils/utils.ts b/web/src/ar/utils/testUtils/utils.ts
index 8b4727919..d0feaefda 100644
--- a/web/src/ar/utils/testUtils/utils.ts
+++ b/web/src/ar/utils/testUtils/utils.ts
@@ -26,6 +26,7 @@ import DependencyView from '@ar/__mocks__/components/DependencyView'
 import SecretFormInput from '@ar/__mocks__/components/SecretFormInput'
 import VulnerabilityView from '@ar/__mocks__/components/VulnerabilityView'
 import { usePreferenceStore } from '@ar/__mocks__/contexts/PreferenceStoreContext'
+import PolicySetFixedTypeSelector from '@ar/__mocks__/components/PolicySetFixedTypeSelector'
 import {
   ModalProvider,
   useConfirmationDialog,
@@ -67,14 +68,16 @@ MockTestUtils.components = {
   SecretFormInput,
   VulnerabilityView,
   DependencyView,
-  ModalProvider
+  ModalProvider,
+  PolicySetFixedTypeSelector
 }
 
 MockTestUtils.utils = {
   getCustomHeaders,
   getApiBaseUrl,
   generateToken: jest.fn(),
-  getRouteToPipelineExecutionView: jest.fn()
+  getRouteToPipelineExecutionView: jest.fn(),
+  routeToRegistryDetails: jest.fn()
 }
 
 export const MockLicenseContext = createContext({
diff --git a/web/src/cde-gitness/components/CDEAnyGitImport/CDEAnyGitImport.tsx b/web/src/cde-gitness/components/CDEAnyGitImport/CDEAnyGitImport.tsx
index bf31320d7..d65bdb41f 100644
--- a/web/src/cde-gitness/components/CDEAnyGitImport/CDEAnyGitImport.tsx
+++ b/web/src/cde-gitness/components/CDEAnyGitImport/CDEAnyGitImport.tsx
@@ -182,7 +182,7 @@ export const CDEAnyGitImport = () => {
                 code_repo_url: response.url,
                 ...branchValue,
                 identifier: getRepoIdFromURL(response.url),
-                name: '',
+                name: prvValues.name,
                 code_repo_type: values?.code_repo_type
               }
             })
@@ -209,7 +209,7 @@ export const CDEAnyGitImport = () => {
                 code_repo_url: url,
                 ...branchValue,
                 identifier: getRepoIdFromURL(url),
-                name: '',
+                name: prvValues.name,
                 code_repo_type: values?.code_repo_type
               }
             })
@@ -308,7 +308,7 @@ export const CDEAnyGitImport = () => {
                                 code_repo_url: data,
                                 branch: item.default_branch,
                                 identifier: getRepoIdFromURL(item.name),
-                                name: '',
+                                name: prvValues.name,
                                 code_repo_type: values?.code_repo_type
                               }
                             })
@@ -321,7 +321,7 @@ export const CDEAnyGitImport = () => {
                                 code_repo_url: item.clone_url,
                                 branch: item.default_branch,
                                 identifier: getRepoIdFromURL(item.clone_url),
-                                name: '',
+                                name: prvValues.name,
                                 code_repo_type: values?.code_repo_type
                               }
                             })
diff --git a/web/src/cde-gitness/components/CDEAnyGitImport/CDEUnknownSCM.tsx b/web/src/cde-gitness/components/CDEAnyGitImport/CDEUnknownSCM.tsx
index 068d12cc4..e78a37c57 100644
--- a/web/src/cde-gitness/components/CDEAnyGitImport/CDEUnknownSCM.tsx
+++ b/web/src/cde-gitness/components/CDEAnyGitImport/CDEUnknownSCM.tsx
@@ -82,7 +82,7 @@ export const CDEUnknownSCM = () => {
                 code_repo_url: response.url,
                 branch: undefined,
                 identifier: undefined,
-                name: undefined,
+                name: prvValues.name,
                 code_repo_type: values?.code_repo_type
               }
             })
@@ -97,7 +97,7 @@ export const CDEUnknownSCM = () => {
                 code_repo_url: response.url,
                 ...branchValue,
                 identifier: getRepoIdFromURL(response.url),
-                name: '',
+                name: prvValues.name,
                 code_repo_type: values?.code_repo_type
               }
             })
diff --git a/web/src/cde-gitness/components/CustomInput/CustomInput.tsx b/web/src/cde-gitness/components/CustomInput/CustomInput.tsx
index 61ef340ed..0a4eaeedb 100644
--- a/web/src/cde-gitness/components/CustomInput/CustomInput.tsx
+++ b/web/src/cde-gitness/components/CustomInput/CustomInput.tsx
@@ -11,9 +11,10 @@ interface CustomInputProps {
   placeholder?: string
   error: any
   type: string
+  autoComplete?: string
 }
 
-function CustomInput({ label, name, value, onChange, placeholder, error, type }: CustomInputProps) {
+function CustomInput({ label, name, value, onChange, placeholder, error, type, autoComplete }: CustomInputProps) {
   return (
     <Container className={css.mb15}>
       <Text className={css.inputLabel}>{label}</Text>
@@ -23,6 +24,7 @@ function CustomInput({ label, name, value, onChange, placeholder, error, type }:
         value={value}
         type={type}
         className={error ? css.errorClass : ''}
+        autoComplete={autoComplete}
         onChange={(e: React.FormEvent) => onChange(e.target)}
       />
       <FormError message={error} />
diff --git a/web/src/cde-gitness/components/GitspaceListing/ListGitspaces.tsx b/web/src/cde-gitness/components/GitspaceListing/ListGitspaces.tsx
index bbaf7d14d..6a0836f80 100644
--- a/web/src/cde-gitness/components/GitspaceListing/ListGitspaces.tsx
+++ b/web/src/cde-gitness/components/GitspaceListing/ListGitspaces.tsx
@@ -124,7 +124,7 @@ export const RenderGitspaceName: Renderer<
   const ideItem = getIDEOption(ide, getString)
   return standalone ? (
     <Layout.Horizontal spacing={'small'} flex={{ alignItems: 'center', justifyContent: 'start' }}>
-      <img src={ideItem?.icon} height={20} width={20} />
+      <img src={ideItem?.icon} height={20} width={20} style={{ marginRight: '2px' }} />
       <Text
         lineClamp={1}
         color={Color.BLACK}
@@ -136,7 +136,7 @@ export const RenderGitspaceName: Renderer<
   ) : (
     <Layout.Vertical spacing={'medium'} className={css.gitspaceIdContainer}>
       <Layout.Horizontal spacing={'small'} flex={{ alignItems: 'center', justifyContent: 'start' }}>
-        <img src={ideItem?.icon} height={20} width={20} />
+        <img src={ideItem?.icon} height={20} width={20} style={{ marginRight: '2px' }} />
         <Text
           width="90%"
           lineClamp={1}
@@ -147,7 +147,7 @@ export const RenderGitspaceName: Renderer<
         </Text>
       </Layout.Horizontal>
       <Layout.Horizontal spacing={'xsmall'} flex={{ alignItems: 'center', justifyContent: 'start' }}>
-        <Text font={{ size: 'small' }}>
+        <Text font={{ size: 'small' }} lineClamp={1}>
           {getString('cde.id')}: {identifier}
         </Text>
         <CopyButton value={identifier} className={css.copyBtn} />
diff --git a/web/src/cde-gitness/components/MachineModal/AwsMachineModal.tsx b/web/src/cde-gitness/components/MachineModal/AwsMachineModal.tsx
index d48134348..64e379c35 100644
--- a/web/src/cde-gitness/components/MachineModal/AwsMachineModal.tsx
+++ b/web/src/cde-gitness/components/MachineModal/AwsMachineModal.tsx
@@ -36,7 +36,6 @@ interface AwsMachineModalForm {
   disk_type: string
   boot_size: string
   machine_type: string
-  identifier: string
   disk_size: string
   boot_type: string
   zone: string
@@ -78,14 +77,13 @@ function AwsMachineModal({
 
   const onSubmitHandler = async (values: AwsMachineModalForm) => {
     try {
-      const { name, disk_type, boot_size, machine_type, identifier, disk_size, boot_type, zone, vm_image_name } = values
+      const { name, disk_type, boot_size, machine_type, disk_size, boot_type, zone, vm_image_name } = values
       const payload: any = [
         {
-          identifier,
           name,
           infra_provider_type: HYBRID_VM_AWS,
           region: regionIdentifier,
-          disk: disk_type,
+          disk: disk_size,
           metadata: {
             persistent_disk_type: disk_type,
             boot_disk_size: boot_size,
@@ -136,11 +134,7 @@ function AwsMachineModal({
           return (
             <FormikForm>
               <Layout.Vertical spacing="normal" className={css.formContainer}>
-                <FormInput.InputWithIdentifier
-                  inputLabel={getString('cde.configureInfra.name')}
-                  inputName="name"
-                  isIdentifierEditable={true}
-                />
+                <FormInput.Text label={getString('cde.configureInfra.name')} name="name" />
                 <CustomSelectDropdown
                   options={zoneOptions?.map(options => getStringDropdownOptions(options))}
                   value={{ value: zone, label: zone }}
@@ -168,9 +162,14 @@ function AwsMachineModal({
                   label={getString('cde.gitspaceInfraHome.diskSize')}
                   name="disk_size"
                   placeholder="e.g 100"
-                  type="number"
+                  type="text"
                   value={disk_size}
-                  onChange={(form: { value: string }) => formik.setFieldValue('disk_size', form.value)}
+                  autoComplete="off"
+                  onChange={(form: { value: string }) => {
+                    if (form.value === '' || (/\d+/.test(form.value) && parseInt(form.value, 10) >= 0)) {
+                      formik.setFieldValue('disk_size', form.value)
+                    }
+                  }}
                   error={formik?.submitCount ? get(formik?.errors, 'disk_size') : ''}
                 />
                 <CustomSelectDropdown
@@ -187,9 +186,14 @@ function AwsMachineModal({
                   label={getString('cde.gitspaceInfraHome.bootDiskSize')}
                   name="boot_size"
                   placeholder="e.g 100"
-                  type="number"
+                  type="text"
+                  autoComplete="off"
                   value={boot_size}
-                  onChange={(form: { value: string }) => formik.setFieldValue('boot_size', form.value)}
+                  onChange={(form: { value: string }) => {
+                    if (form.value === '' || (/\d+/.test(form.value) && parseInt(form.value, 10) >= 0)) {
+                      formik.setFieldValue('boot_size', form.value)
+                    }
+                  }}
                   error={formik?.submitCount ? get(formik?.errors, 'boot_size') : ''}
                 />
                 <CustomSelectDropdown
diff --git a/web/src/cde-gitness/components/MachineModal/MachineModal.tsx b/web/src/cde-gitness/components/MachineModal/MachineModal.tsx
index 9fa2e7a28..b592ced65 100644
--- a/web/src/cde-gitness/components/MachineModal/MachineModal.tsx
+++ b/web/src/cde-gitness/components/MachineModal/MachineModal.tsx
@@ -64,14 +64,13 @@ function MachineModal({
 
   const onSubmitHandler = async (values: MachineModalForm) => {
     try {
-      const { name, disk_type, boot_size, machine_type, identifier, disk_size, boot_type, zone, image_name } = values
+      const { name, disk_type, boot_size, machine_type, disk_size, boot_type, zone, image_name } = values
       const payload: any = [
         {
-          identifier,
           name,
           infra_provider_type: HYBRID_VM_GCP,
           region: regionIdentifier,
-          disk: disk_type,
+          disk: disk_size,
           metadata: {
             persistent_disk_type: disk_type,
             boot_disk_size: boot_size,
@@ -122,11 +121,7 @@ function MachineModal({
           return (
             <FormikForm>
               <Layout.Vertical spacing="normal" className={css.formContainer}>
-                <FormInput.InputWithIdentifier
-                  inputLabel={getString('cde.configureInfra.name')}
-                  inputName="name"
-                  isIdentifierEditable={true}
-                />
+                <FormInput.Text label={getString('cde.configureInfra.name')} name="name" />
                 <CustomSelectDropdown
                   options={zoneOptions?.map(options => getStringDropdownOptions(options))}
                   value={{ value: zone, label: zone }}
@@ -156,9 +151,14 @@ function MachineModal({
                   label={getString('cde.gitspaceInfraHome.diskSize')}
                   name="disk_size"
                   placeholder="e.g 100"
-                  type="number"
+                  type="text"
                   value={disk_size}
-                  onChange={(form: { value: string }) => formik.setFieldValue('disk_size', form.value)}
+                  autoComplete="off"
+                  onChange={(form: { value: string }) => {
+                    if (form.value === '' || (/\d+/.test(form.value) && parseInt(form.value, 10) >= 0)) {
+                      formik.setFieldValue('disk_size', form.value)
+                    }
+                  }}
                   error={formik?.submitCount ? get(formik?.errors, 'disk_size') : ''}
                 />
                 <CustomSelectDropdown
@@ -175,9 +175,14 @@ function MachineModal({
                   label={getString('cde.gitspaceInfraHome.bootSize')}
                   name="boot_size"
                   placeholder="e.g 100"
-                  type="number"
+                  type="text"
+                  autoComplete="off"
                   value={boot_size}
-                  onChange={(form: { value: string }) => formik.setFieldValue('boot_size', form.value)}
+                  onChange={(form: { value: string }) => {
+                    if (form.value === '' || (/\d+/.test(form.value) && parseInt(form.value, 10) >= 0)) {
+                      formik.setFieldValue('boot_size', form.value)
+                    }
+                  }}
                   error={formik?.submitCount ? get(formik?.errors, 'boot_size') : ''}
                 />
                 <CustomSelectDropdown
diff --git a/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.module.scss b/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.module.scss
new file mode 100644
index 000000000..a8e88473b
--- /dev/null
+++ b/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.module.scss
@@ -0,0 +1,5 @@
+.iconTextStyle {
+  display: flex;
+  align-items: center;
+  gap: 4px;
+}
diff --git a/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.module.scss.d.ts b/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.module.scss.d.ts
new file mode 100644
index 000000000..3a2eb8b1a
--- /dev/null
+++ b/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.module.scss.d.ts
@@ -0,0 +1,19 @@
+/*
+ * Copyright 2023 Harness, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* eslint-disable */
+// This is an auto-generated file
+export declare const iconTextStyle: string
diff --git a/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.tsx b/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.tsx
index f5d5d4e69..43b2cf50a 100644
--- a/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.tsx
+++ b/web/src/cde-gitness/components/ResourceDetails/ResourceDetails.tsx
@@ -1,24 +1,29 @@
 import React from 'react'
-import { Container, Layout, Text } from '@harnessio/uicore'
+import { Layout, Text } from '@harnessio/uicore'
 import { Cpu } from 'iconoir-react'
 import RegionIcon from 'cde-gitness/assests/globe.svg?url'
 import { useStrings } from 'framework/strings'
 import type { TypesInfraProviderResource } from 'services/cde'
+import css from './ResourceDetails.module.scss'
 
 const ResourceDetails = ({ resource }: { resource?: TypesInfraProviderResource }) => {
   const { getString } = useStrings()
   const { region, name } = resource || {}
   return (
-    <Layout.Horizontal spacing="small">
-      <Layout.Horizontal spacing={'xsmall'} flex={{ alignItems: 'center' }}>
-        <img height={12} width={12} src={RegionIcon} />{' '}
-        <Text font={{ size: 'small' }}>{region?.toUpperCase() || getString('cde.na')}</Text>
-      </Layout.Horizontal>
-      <Container width={'5px'} />
-      <Layout.Horizontal spacing={'xsmall'} flex={{ alignItems: 'center' }}>
-        <Cpu height={12} width={12} /> <Text font={{ size: 'small' }}>{name || getString('cde.na')}</Text>
-      </Layout.Horizontal>
-    </Layout.Horizontal>
+    <Layout.Vertical spacing="small">
+      <span className={css.iconTextStyle}>
+        <img height={12} width={12} src={RegionIcon} />
+        <Text font={{ size: 'small' }} lineClamp={1}>
+          {region?.toUpperCase() || getString('cde.na')}
+        </Text>
+      </span>
+      <span className={css.iconTextStyle}>
+        <Cpu height={12} width={12} />
+        <Text font={{ size: 'small' }} lineClamp={1}>
+          {name || getString('cde.na')}
+        </Text>
+      </span>
+    </Layout.Vertical>
   )
 }
 
diff --git a/web/src/cde-gitness/components/SelectMachine/SelectMachine.tsx b/web/src/cde-gitness/components/SelectMachine/SelectMachine.tsx
index 7d5c60a6d..239aabaca 100644
--- a/web/src/cde-gitness/components/SelectMachine/SelectMachine.tsx
+++ b/web/src/cde-gitness/components/SelectMachine/SelectMachine.tsx
@@ -48,14 +48,15 @@ export const SelectMachine = ({ options, defaultValue }: SelectMachineInterface)
   const { gitspaceId = '' } = useParams<{ gitspaceId?: string }>()
 
   const machineTypes = options.map(item => {
-    const { cpu, disk, memory, identifier, name, space_path } = item
+    const { cpu, disk, memory, identifier, name, space_path, metadata } = item
     return {
       identifier,
       label: name,
       cpu,
       disk,
       memory,
-      space_path
+      space_path,
+      disk_type: metadata?.persistent_disk_type
     }
   })
 
@@ -108,10 +109,11 @@ export const SelectMachine = ({ options, defaultValue }: SelectMachineInterface)
                                 {getString('cde.cpu')}: {item.cpu?.toUpperCase()}
                               </Text>
                               <Text padding={'small'} className={css.tags} font={{ variation: FontVariation.SMALL }}>
-                                {getString('cde.memory')}: {item.memory?.toUpperCase()}
+                                {getString('cde.memory')}: {item.memory?.toUpperCase()}GB
                               </Text>
                               <Text padding={'small'} className={css.tags} font={{ variation: FontVariation.SMALL }}>
-                                {getString('cde.disk')}: {item.disk?.toUpperCase()}
+                                {getString('cde.disk')}: {item.disk?.toUpperCase()}GB{' '}
+                                {item.disk_type ? `(${item.disk_type})` : ''}
                               </Text>
                             </Layout.Horizontal>
                           </Layout.Vertical>
diff --git a/web/src/cde-gitness/hooks/useInfraDetailAPI.tsx b/web/src/cde-gitness/hooks/useInfraDetailAPI.tsx
index 8105b1ca7..42538a5b6 100644
--- a/web/src/cde-gitness/hooks/useInfraDetailAPI.tsx
+++ b/web/src/cde-gitness/hooks/useInfraDetailAPI.tsx
@@ -28,7 +28,8 @@ export const useGetInfraDetails = ({
   const infraDetails = useGetInfraProvider({
     accountIdentifier,
     infraprovider_identifier,
-    queryParams
+    queryParams,
+    lazy: !infraprovider_identifier
   })
 
   return infraDetails
diff --git a/web/src/cde-gitness/pages/GitspaceCreate/CDECreateGitspace.tsx b/web/src/cde-gitness/pages/GitspaceCreate/CDECreateGitspace.tsx
index ac3dd1900..9fab7a693 100644
--- a/web/src/cde-gitness/pages/GitspaceCreate/CDECreateGitspace.tsx
+++ b/web/src/cde-gitness/pages/GitspaceCreate/CDECreateGitspace.tsx
@@ -171,7 +171,7 @@ export const CDECreateGitspace = ({ gitspaceSettings }: CDECreateGitspaceProps)
       setrepoURLviaQueryParam(prv => {
         return {
           ...prv,
-          name: '',
+          name: prv.name,
           identifier: '',
           branch: queryParamBranch,
           codeRepoURL,
@@ -294,7 +294,7 @@ export const CDECreateGitspace = ({ gitspaceSettings }: CDECreateGitspaceProps)
                                   code_repo_url: undefined,
                                   branch: undefined,
                                   identifier: undefined,
-                                  name: undefined,
+                                  name: prvValues.name,
                                   code_repo_type: item.value
                                 }
                               })
diff --git a/web/src/cde-gitness/pages/GitspaceCreate/GitspaceCreate.module.scss b/web/src/cde-gitness/pages/GitspaceCreate/GitspaceCreate.module.scss
index f517a8caf..957a8ce32 100644
--- a/web/src/cde-gitness/pages/GitspaceCreate/GitspaceCreate.module.scss
+++ b/web/src/cde-gitness/pages/GitspaceCreate/GitspaceCreate.module.scss
@@ -21,8 +21,10 @@
   margin-top: 4% !important;
 
   .titleContainer {
-    width: 50%;
+    width: 72.2%;
     margin-bottom: var(--spacing-medium) !important;
+    align-self: flex-start;
+    padding-left: calc((100% - 72.2%) / 2);
 
     h2 {
       font-size: 24px !important;
diff --git a/web/src/cde-gitness/pages/GitspaceInfra/MachineLocationContent/MachineLocationContent.tsx b/web/src/cde-gitness/pages/GitspaceInfra/MachineLocationContent/MachineLocationContent.tsx
index e720875e4..80b953039 100644
--- a/web/src/cde-gitness/pages/GitspaceInfra/MachineLocationContent/MachineLocationContent.tsx
+++ b/web/src/cde-gitness/pages/GitspaceInfra/MachineLocationContent/MachineLocationContent.tsx
@@ -127,6 +127,11 @@ function MachineLocationContent({
     )
   }
 
+  function CustomMemoryColumn(row: Unknown) {
+    const { memory } = row?.row?.original?.metadata
+    return <Text color={Color.GREY_1000}>{memory}GB</Text>
+  }
+
   function CustomImageColumn(row: Unknown) {
     const { vm_image_name, image_name } = row?.row?.original?.metadata
     const displayValue = vm_image_name || image_name || ''
@@ -243,6 +248,7 @@ function MachineLocationContent({
           </Layout.Horizontal>
         ),
         accessor: 'memory',
+        Cell: CustomMemoryColumn,
         width: '11%'
       },
       {
diff --git a/web/src/cde-gitness/pages/GitspaceInfra/panels/AwsInfrastructurePanel.tsx b/web/src/cde-gitness/pages/GitspaceInfra/panels/AwsInfrastructurePanel.tsx
index f92565075..ac475f236 100644
--- a/web/src/cde-gitness/pages/GitspaceInfra/panels/AwsInfrastructurePanel.tsx
+++ b/web/src/cde-gitness/pages/GitspaceInfra/panels/AwsInfrastructurePanel.tsx
@@ -52,7 +52,7 @@ const AwsInfrastructurePanel: React.FC<AwsInfrastructurePanelProps> = ({ listRes
 
   const { data: infraDetailsData, loading: infraDetailsLoading } = useGetInfraDetails({
     accountIdentifier: accountInfo?.identifier,
-    infraprovider_identifier: awsInfraDetails?.identifier ?? 'undefined',
+    infraprovider_identifier: awsInfraDetails?.identifier ?? '',
     queryParams: {}
   })
 
@@ -142,7 +142,7 @@ const AwsInfrastructurePanel: React.FC<AwsInfrastructurePanelProps> = ({ listRes
               <Text font={{ variation: FontVariation.SMALL }} color={Color.GREY_500}>
                 {getString('cde.awsInfrastructureName')}
               </Text>
-              <Text font={{ variation: FontVariation.H4 }}>{awsInfraDetails?.metadata?.name}</Text>
+              <Text font={{ variation: FontVariation.H4 }}>{awsInfraDetails?.name}</Text>
             </Layout.Vertical>
           </Layout.Horizontal>
           <Layout.Horizontal spacing={'medium'}>
diff --git a/web/src/cde-gitness/pages/GitspaceInfra/panels/GcpInfrastructurePanel.tsx b/web/src/cde-gitness/pages/GitspaceInfra/panels/GcpInfrastructurePanel.tsx
index 33f2f415d..c1e22e0a9 100644
--- a/web/src/cde-gitness/pages/GitspaceInfra/panels/GcpInfrastructurePanel.tsx
+++ b/web/src/cde-gitness/pages/GitspaceInfra/panels/GcpInfrastructurePanel.tsx
@@ -53,7 +53,7 @@ const GcpInfrastructurePanel: React.FC<GcpInfrastructurePanelProps> = ({ listRes
 
   const { data: infraDetailsData, loading: infraDetailsLoading } = useGetInfraDetails({
     accountIdentifier: accountInfo?.identifier,
-    infraprovider_identifier: gcpInfraDetails?.identifier ?? 'undefined',
+    infraprovider_identifier: gcpInfraDetails?.identifier ?? '',
     queryParams: {}
   })
 
@@ -143,7 +143,7 @@ const GcpInfrastructurePanel: React.FC<GcpInfrastructurePanelProps> = ({ listRes
               <Text font={{ variation: FontVariation.SMALL }} color={Color.GREY_500}>
                 {getString('cde.gcpInfrastructureName')}
               </Text>
-              <Text font={{ variation: FontVariation.H4 }}>{gcpInfraDetails?.metadata?.name}</Text>
+              <Text font={{ variation: FontVariation.H4 }}>{gcpInfraDetails?.name}</Text>
             </Layout.Vertical>
           </Layout.Horizontal>
           <Layout.Horizontal spacing={'medium'}>
diff --git a/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/AwsInfraDetails.tsx b/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/AwsInfraDetails.tsx
index 9244a27f4..e2590dd3f 100644
--- a/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/AwsInfraDetails.tsx
+++ b/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/AwsInfraDetails.tsx
@@ -53,7 +53,7 @@ const AwsInfraDetails = () => {
   const { infraprovider_identifier } = useParams<RouteParamsProps>()
   const [infraDetails, setInfraDetails] = useState<InfraDetailsFormikProps>({})
   const { data } = useGetInfraDetails({
-    infraprovider_identifier: infraprovider_identifier ?? 'undefined',
+    infraprovider_identifier: infraprovider_identifier ?? '',
     accountIdentifier: accountInfo?.identifier,
     queryParams: {
       acl_filter: 'false'
@@ -70,11 +70,11 @@ const AwsInfraDetails = () => {
 
   useEffect(() => {
     if (data) {
-      const { identifier, metadata }: OpenapiCreateInfraProviderConfigRequest = data
+      const { identifier, name, metadata }: OpenapiCreateInfraProviderConfigRequest = data
       const delegate = metadata?.delegate_selectors?.map((del: { selector: string }) => del.selector)
       const payload: InfraDetailsFormikProps = {
         identifier: identifier,
-        name: metadata?.name,
+        name: name,
         domain: metadata?.domain,
         instance_type: metadata?.gateway?.instance_type,
         instances: metadata?.gateway?.instances,
@@ -164,7 +164,7 @@ const AwsInfraDetails = () => {
           metadata: {
             domain,
             delegate_selectors: delegates,
-            name,
+            name: identifier,
             region_configs,
             runner: {
               region: runner?.region,
diff --git a/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/BasicDetails.tsx b/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/BasicDetails.tsx
index dfd7fda0c..cb794e484 100644
--- a/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/BasicDetails.tsx
+++ b/web/src/cde-gitness/pages/InfraConfigure/AWS/InfraDetails/BasicDetails.tsx
@@ -44,7 +44,7 @@ const BasicDetails = ({ formikProps }: BasicDetailProps) => {
         <FormInput.InputWithIdentifier
           inputLabel={getString('cde.configureInfra.infraName')}
           inputName="name"
-          isIdentifierEditable={true}
+          isIdentifierEditable={!editMode}
         />
         <FormInput.Text
           name="vpc_cidr_block"
diff --git a/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/BasicDetails.tsx b/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/BasicDetails.tsx
index 6a667c5fb..722d64b94 100644
--- a/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/BasicDetails.tsx
+++ b/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/BasicDetails.tsx
@@ -44,7 +44,7 @@ const BasicDetails = ({ formikProps }: BasicDetailProps) => {
         <FormInput.InputWithIdentifier
           inputLabel={getString('cde.configureInfra.infraName')}
           inputName="name"
-          isIdentifierEditable={true}
+          isIdentifierEditable={!editMode}
         />
         <FormInput.Text
           name="project"
diff --git a/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/GcpInfraDetails.tsx b/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/GcpInfraDetails.tsx
index 0775c498e..f39647563 100644
--- a/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/GcpInfraDetails.tsx
+++ b/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/GcpInfraDetails.tsx
@@ -46,7 +46,7 @@ const GcpInfraDetails = () => {
   const { infraprovider_identifier } = useParams<RouteParamsProps>()
   const [infraDetails, setInfraDetails] = useState<InfraDetailsFormikProps>({})
   const { data } = useGetInfraDetails({
-    infraprovider_identifier: infraprovider_identifier ?? 'undefined',
+    infraprovider_identifier: infraprovider_identifier ?? '',
     accountIdentifier: accountInfo?.identifier,
     queryParams: {
       acl_filter: 'false'
@@ -63,11 +63,11 @@ const GcpInfraDetails = () => {
 
   useEffect(() => {
     if (data) {
-      const { identifier, metadata }: OpenapiCreateInfraProviderConfigRequest = data
+      const { identifier, name, metadata }: OpenapiCreateInfraProviderConfigRequest = data
       const delegate = metadata?.delegate_selectors?.map((del: { selector: string }) => del.selector)
       const payload: InfraDetailsFormikProps = {
         identifier: identifier,
-        name: metadata?.name,
+        name: name,
         domain: metadata?.domain,
         machine_type: metadata?.gateway?.machine_type,
         instances: metadata?.gateway?.instances,
@@ -147,7 +147,7 @@ const GcpInfraDetails = () => {
                     domain,
                     runner,
                     delegate_selectors: delegates,
-                    name,
+                    name: identifier,
                     region_configs,
                     project: {
                       id: project
diff --git a/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/NewRegionModal.module.scss b/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/NewRegionModal.module.scss
index 19eccc850..ab29bb465 100644
--- a/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/NewRegionModal.module.scss
+++ b/web/src/cde-gitness/pages/InfraConfigure/InfraDetails/NewRegionModal.module.scss
@@ -35,7 +35,7 @@
 
 .buttonContainer {
   display: flex;
-  margin-top: var(--spacing-medium) !important;
+  margin-top: var(--spacing-xxlarge) !important;
   gap: var(--spacing-small);
 }
 
diff --git a/web/src/cde-gitness/strings/strings.en.yaml b/web/src/cde-gitness/strings/strings.en.yaml
index 6eda17d77..b15cb0f5b 100644
--- a/web/src/cde-gitness/strings/strings.en.yaml
+++ b/web/src/cde-gitness/strings/strings.en.yaml
@@ -124,7 +124,7 @@ settings:
   other: Other
   regions:
     availableCloudRegions: Available Cloud Regions
-    availableCloudRegionsDesc: Customize which IDEs will be available while creating Gitspaces
+    availableCloudRegionsDesc: Customize which cloud regions will be available while creating Gitspaces
     regionsAvailable: regions available
     selectRegionsDesc: Select which regions and machines will be available to create a Gitspace
     region: Region
diff --git a/web/src/components/ProtectionRules/ProtectionRulesForm/ProtectionRulesForm.tsx b/web/src/components/ProtectionRules/ProtectionRulesForm/ProtectionRulesForm.tsx
index 19e32a748..ae9453cc5 100644
--- a/web/src/components/ProtectionRules/ProtectionRulesForm/ProtectionRulesForm.tsx
+++ b/web/src/components/ProtectionRules/ProtectionRulesForm/ProtectionRulesForm.tsx
@@ -644,8 +644,7 @@ const ProtectionRulesForm = (props: {
                     setSearchStatusTerm={setSearchStatusTerm}
                     defaultReviewerProps={{
                       setSearchTerm,
-                      userPrincipalOptions,
-                      settingSectionMode
+                      userPrincipalOptions
                     }}
                   />
                 ) : (
diff --git a/web/src/components/ProtectionRules/ProtectionRulesForm/components/BranchRulesForm.tsx b/web/src/components/ProtectionRules/ProtectionRulesForm/components/BranchRulesForm.tsx
index 5be0dc5eb..8665c80ec 100644
--- a/web/src/components/ProtectionRules/ProtectionRulesForm/components/BranchRulesForm.tsx
+++ b/web/src/components/ProtectionRules/ProtectionRulesForm/components/BranchRulesForm.tsx
@@ -22,7 +22,7 @@ import { Color, FontVariation } from '@harnessio/design-system'
 import type { FormikProps } from 'formik'
 import { Classes, Popover, PopoverInteractionKind, PopoverPosition } from '@blueprintjs/core'
 import { useStrings } from 'framework/strings'
-import { ProtectionRulesType, type SettingTypeMode } from 'utils/GitUtils'
+import { ProtectionRulesType } from 'utils/GitUtils'
 import type { RulesFormPayload } from 'components/ProtectionRules/ProtectionRulesUtils'
 import DefaultReviewersSection from './DefaultReviewersSection'
 import css from '../ProtectionRulesForm.module.scss'
@@ -34,7 +34,6 @@ const BranchRulesForm = (props: {
   defaultReviewerProps: {
     setSearchTerm: React.Dispatch<React.SetStateAction<string>>
     userPrincipalOptions: SelectOption[]
-    settingSectionMode: SettingTypeMode
   }
 }) => {
   const { formik, defaultReviewerProps, setSearchStatusTerm, statusOptions } = props
@@ -163,6 +162,7 @@ const BranchRulesForm = (props: {
       {requireMinReviewers && (
         <Container padding={{ left: 'xlarge', top: 'medium' }}>
           <FormInput.Text
+            inputGroup={{ type: 'number' }}
             className={cx(css.widthContainer, css.minText)}
             name={'minReviewers'}
             placeholder={getString('protectionRules.minNumberPlaceholder')}
diff --git a/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersList.tsx b/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersList.tsx
index 369cfaf1e..5e31d5f1b 100644
--- a/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersList.tsx
+++ b/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersList.tsx
@@ -23,8 +23,8 @@ import { Color, FontVariation } from '@harnessio/design-system'
 import css from '../ProtectionRulesForm.module.scss'
 
 const DefaultReviewersList = (props: {
-  defaultReviewersList?: string[] // eslint-disable-next-line @typescript-eslint/no-explicit-any
   setFieldValue: (field: string, value: any, shouldValidate?: boolean) => void
+  defaultReviewersList?: string[]
 }) => {
   const { defaultReviewersList, setFieldValue } = props
 
diff --git a/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersSection.tsx b/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersSection.tsx
index 3481aa306..4ab9b82b8 100644
--- a/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersSection.tsx
+++ b/web/src/components/ProtectionRules/ProtectionRulesForm/components/DefaultReviewersSection.tsx
@@ -21,7 +21,6 @@ import { Color } from '@harnessio/design-system'
 import type { FormikProps } from 'formik'
 import { Render } from 'react-jsx-match'
 import { useStrings } from 'framework/strings'
-import { SettingTypeMode } from 'utils/GitUtils'
 import type { RulesFormPayload } from 'components/ProtectionRules/ProtectionRulesUtils'
 import DefaultReviewersList from './DefaultReviewersList'
 import css from '../ProtectionRulesForm.module.scss'
@@ -31,34 +30,27 @@ const DefaultReviewersSection = (props: {
   defaultReviewerProps: {
     setSearchTerm: React.Dispatch<React.SetStateAction<string>>
     userPrincipalOptions: SelectOption[]
-    settingSectionMode: SettingTypeMode
   }
 }) => {
   const { formik, defaultReviewerProps } = props
-  const { settingSectionMode, userPrincipalOptions, setSearchTerm } = defaultReviewerProps
+  const { userPrincipalOptions, setSearchTerm } = defaultReviewerProps
   const { getString } = useStrings()
   const setFieldValue = formik.setFieldValue
-  const {
-    defaultReviewersEnabled,
-    defaultReviewersList: formikDefaultReviewersList,
-    defaultReviewersSet,
-    minDefaultReviewers,
-    requireMinDefaultReviewers
-  } = formik.values
+  const { defaultReviewersEnabled, defaultReviewersList, minDefaultReviewers, requireMinDefaultReviewers } =
+    formik.values
   const { defaultReviewersList: formikDefaultReviewersListError } = formik.errors
 
-  const defaultReviewersList = useMemo(
-    () => (settingSectionMode === SettingTypeMode.EDIT || defaultReviewersSet ? formikDefaultReviewersList : []),
-    [settingSectionMode, defaultReviewersSet, formikDefaultReviewersList]
+  const defaultReviewerIds = useMemo(
+    () => new Set((defaultReviewersList || []).map((user: string) => user.split(' ')[0])),
+    [defaultReviewersList]
   )
 
   const filteredPrincipalOptions = useMemo(() => {
-    const defaultReviewerIds = new Set((defaultReviewersList || []).map((user: string) => user.split(' ')[0]))
     return userPrincipalOptions.filter((user: SelectOption) => {
       const id = user.value.toString().split(' ')[0]
       return !defaultReviewerIds.has(id)
     })
-  }, [userPrincipalOptions, defaultReviewersList])
+  }, [userPrincipalOptions, defaultReviewerIds])
 
   const defReviewerWarning = useMemo(() => {
     const minReviewers = Number(minDefaultReviewers)
@@ -111,9 +103,8 @@ const DefaultReviewersSection = (props: {
               const id = item.value?.toString().split(' ')[0]
               const displayName = item.label
               const defaultReviewerEntry = `${id} ${displayName}`
-              defaultReviewersList?.push(defaultReviewerEntry)
-              const uniqueArr = Array.from(new Set(defaultReviewersList))
-              setFieldValue('defaultReviewersList', uniqueArr)
+              const newList = [...(defaultReviewersList || []), defaultReviewerEntry]
+              setFieldValue('defaultReviewersList', newList)
               setFieldValue('defaultReviewersSet', true)
             }}
             name={'defaultReviewerSelect'}
@@ -148,6 +139,7 @@ const DefaultReviewersSection = (props: {
           {requireMinDefaultReviewers && (
             <Container padding={{ left: 'xlarge', top: 'medium' }}>
               <FormInput.Text
+                inputGroup={{ type: 'number' }}
                 className={cx(css.widthContainer, css.minText)}
                 name={'minDefaultReviewers'}
                 placeholder={getString('protectionRules.minNumberPlaceholder')}
diff --git a/web/src/services/cde/index.tsx b/web/src/services/cde/index.tsx
index b5c4ca401..eda87b5a3 100644
--- a/web/src/services/cde/index.tsx
+++ b/web/src/services/cde/index.tsx
@@ -153,16 +153,11 @@ export interface OpenapiLookupRepoGitspaceRequest {
 }
 
 export interface OpenapiUpdateGitspaceRequest {
-  branch?: string
-  devcontainer_path?: string
-  id?: string
   ide?: EnumIDEType
-  infra_provider_config_identifier?: string
-  infra_provider_resource_id?: string
-  metadata?: {
-    [key: string]: string
-  } | null
   name?: string
+  resource_identifier?: string
+  resource_space_ref?: string
+  ssh_token_identifier?: string
 }
 
 export interface OpenapiUpdateInfraProviderConfigRequest {
@@ -599,7 +594,7 @@ export const useGetUsageForAccount = ({ accountIdentifier, ...props }: UseGetUsa
 
 export interface ListInfraProvidersQueryParams {
   /**
-   * ACL filter should be applied to the request
+   * acl filter should be applied to the request
    */
   acl_filter?: string
 }
@@ -764,7 +759,7 @@ export const useDeleteInfraProvider = ({
 
 export interface GetInfraProviderQueryParams {
   /**
-   * ACL filter should be applied to the request
+   * acl filter should be applied to the request
    */
   acl_filter?: string
 }
@@ -948,9 +943,13 @@ export const useListGateways = ({ accountIdentifier, infraprovider_identifier, .
 
 export interface ListInfraProviderResourcesQueryParams {
   /**
-   * ACL filter should be applied to the request
+   * acl filter should be applied to the request
    */
   acl_filter?: string
+  /**
+   * current resource identifier, used to filter resources which are compatible with the current resource
+   */
+  current_resource_identifier?: string
 }
 
 export interface ListInfraProviderResourcesPathParams {
diff --git a/web/yarn.lock b/web/yarn.lock
index 0ea24ad13..7f419af77 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -1921,10 +1921,10 @@
   resolved "https://registry.npmjs.org/@harnessio/design-system/-/design-system-2.1.1.tgz#2da3036602ed9b9446d8139c72009e6dc1e25642"
   integrity sha512-ZwAGM1srOZ49/6YkwyjkczUv4v91CN0rCecRYnV3/g+xdSV5ycrUvkJjl9nHub6jw2eCGC0GdyNgAtAJnLmGfQ==
 
-"@harnessio/icons@^2.1.12":
-  version "2.1.12"
-  resolved "https://registry.yarnpkg.com/@harnessio/icons/-/icons-2.1.12.tgz#3fa50c49b8c81013ca867681bccd343fdb973c1b"
-  integrity sha512-FVwaIOBrc5xj2j+84j8Up1jaGuu6UsUzXcG30Td0ZEBZVqR0Lgz6KoVwIheT0uVjC3cqjvBN6+Z+Im3HrWnH0w==
+"@harnessio/icons@^2.1.13":
+  version "2.1.13"
+  resolved "https://registry.yarnpkg.com/@harnessio/icons/-/icons-2.1.13.tgz#3a35ecca2f42a11a4edbf2ab04985d1a813394c2"
+  integrity sha512-sfASvL4YylC/6FsryW0ysdxHsNdBh2Pi0XJQbbsBoOTuwvZlht1VtJU7rEcf/B0X0mXa3JpUWFnvVoYuZvQ4WQ==
 
 "@harnessio/oats-cli@^3.0.0":
   version "3.0.0"
@@ -1945,10 +1945,10 @@
     yargs "^17.6.2"
     zod "^3.19.1"
 
-"@harnessio/react-har-service-client@^0.22.0":
-  version "0.22.0"
-  resolved "https://registry.yarnpkg.com/@harnessio/react-har-service-client/-/react-har-service-client-0.22.0.tgz#7fbe353889c30b62bf616231ef1005b09c2a9085"
-  integrity sha512-xiqHk+oXdAOPGOuss+OQsu2S9bXt/ncGPUIYQ+EC5FYws5sCAXoLSbDvWu2zZarzWxeut3N2KoRP44LeZrezGw==
+"@harnessio/react-har-service-client@^0.25.0":
+  version "0.25.0"
+  resolved "https://registry.yarnpkg.com/@harnessio/react-har-service-client/-/react-har-service-client-0.25.0.tgz#728a4243baebc57a822093036fd39a7a30498be7"
+  integrity sha512-H+9MHojFqkjoH9DKNs8REOe8p+Vh333A7MLznA2TYlVPZSJymMdx+O54nMgrMmxPUA2Fy00NHY/cuUsGZecjSQ==
   dependencies:
     "@harnessio/oats-cli" "^3.0.0"
 



Test patch:
diff --git a/registry/app/api/controller/metadata/create_registry_test.go b/registry/app/api/controller/metadata/create_registry_test.go
index e6d16e9f9..1af6ea383 100644
--- a/registry/app/api/controller/metadata/create_registry_test.go
+++ b/registry/app/api/controller/metadata/create_registry_test.go
@@ -271,6 +271,7 @@ func TestCreateRegistry(t *testing.T) {
 					nil,
 					nil,
 					nil,
+					nil,
 				)
 			},
 		},
@@ -346,6 +347,7 @@ func TestCreateRegistry(t *testing.T) {
 					nil,
 					nil,
 					nil,
+					nil,
 				)
 			},
 		},
diff --git a/registry/app/driver/testsuites/testsuites.go b/registry/app/driver/testsuites/testsuites.go
index 8568675cd..ebe04d69e 100644
--- a/registry/app/driver/testsuites/testsuites.go
+++ b/registry/app/driver/testsuites/testsuites.go
@@ -778,13 +778,13 @@ func (suite *DriverSuite) TestRedirectURL() {
 	err := suite.StorageDriver.PutContent(suite.ctx, filename, contents)
 	suite.Require().NoError(err)
 
-	url, err := suite.StorageDriver.RedirectURL(context.TODO(), "", filename, "")
+	url, err := suite.StorageDriver.RedirectURL(suite.ctx, "", filename, "")
 	if url == "" && err == nil {
 		return
 	}
 	client := &http.Client{}
 	suite.Require().NoError(err)
-	req, _ := http.NewRequestWithContext(context.TODO(), http.MethodGet, url, nil)
+	req, _ := http.NewRequestWithContext(suite.ctx, http.MethodGet, url, nil)
 
 	response, err := client.Do(req)
 	suite.Require().NoError(err)
@@ -794,12 +794,12 @@ func (suite *DriverSuite) TestRedirectURL() {
 	suite.Require().NoError(err)
 	suite.Require().Equal(contents, read)
 
-	url, err = suite.StorageDriver.RedirectURL(context.TODO(), "", filename, "")
+	url, err = suite.StorageDriver.RedirectURL(suite.ctx, "", filename, "")
 	if url == "" && err == nil {
 		return
 	}
 	suite.Require().NoError(err)
-	req, _ = http.NewRequestWithContext(context.TODO(), http.MethodHead, url, nil)
+	req, _ = http.NewRequestWithContext(suite.ctx, http.MethodHead, url, nil)
 
 	response, err = client.Do(req)
 	suite.Require().NoError(err)