diff --git a/internal/qos/grpc.go b/internal/qos/grpc.go
index 534a1f74b..58cd9e52c 100644
--- a/internal/qos/grpc.go
+++ b/internal/qos/grpc.go
@@ -26,7 +26,7 @@ func NewAdjustOutgoingIOTagUnaryClientInterceptor() grpc.UnaryClientInterceptor
 		if err != nil {
 			tag = IOTagClient
 		}
-		if tag == IOTagBackground || tag == IOTagPolicer || tag == IOTagWritecache {
+		if tag.IsLocal() {
 			tag = IOTagInternal
 		}
 		ctx = tagging.ContextWithIOTag(ctx, tag.String())
@@ -44,7 +44,7 @@ func NewAdjustOutgoingIOTagStreamClientInterceptor() grpc.StreamClientIntercepto
 		if err != nil {
 			tag = IOTagClient
 		}
-		if tag == IOTagBackground || tag == IOTagPolicer || tag == IOTagWritecache {
+		if tag.IsLocal() {
 			tag = IOTagInternal
 		}
 		ctx = tagging.ContextWithIOTag(ctx, tag.String())
diff --git a/internal/qos/limiter.go b/internal/qos/limiter.go
index e92cef652..82f9917a5 100644
--- a/internal/qos/limiter.go
+++ b/internal/qos/limiter.go
@@ -74,7 +74,7 @@ func createScheduler(config limits.OpConfig) (scheduler, error) {
 
 func converToSchedulingTags(limits []limits.IOTagConfig) map[string]scheduling.TagInfo {
 	result := make(map[string]scheduling.TagInfo)
-	for _, tag := range []IOTag{IOTagClient, IOTagBackground, IOTagInternal, IOTagPolicer, IOTagWritecache} {
+	for _, tag := range []IOTag{IOTagClient, IOTagBackground, IOTagInternal, IOTagPolicer, IOTagWritecache, IOTagTreeSync} {
 		result[tag.String()] = scheduling.TagInfo{
 			Share: defaultShare,
 		}
diff --git a/internal/qos/stats.go b/internal/qos/stats.go
index f077f552b..aa4d4caf9 100644
--- a/internal/qos/stats.go
+++ b/internal/qos/stats.go
@@ -9,6 +9,7 @@ var statTags = map[string]struct{}{
 	IOTagPolicer.String():    {},
 	IOTagWritecache.String(): {},
 	IOTagCritical.String():   {},
+	IOTagTreeSync.String():   {},
 	unknownStatsTag:          {},
 }
 
diff --git a/internal/qos/tags.go b/internal/qos/tags.go
index 9db45f190..2781dec76 100644
--- a/internal/qos/tags.go
+++ b/internal/qos/tags.go
@@ -13,6 +13,7 @@ const (
 	IOTagClient     IOTag = "client"
 	IOTagInternal   IOTag = "internal"
 	IOTagBackground IOTag = "background"
+	IOTagTreeSync   IOTag = "treesync"
 	IOTagWritecache IOTag = "writecache"
 	IOTagPolicer    IOTag = "policer"
 	IOTagCritical   IOTag = "critical"
@@ -34,6 +35,8 @@ func FromRawString(s string) (IOTag, error) {
 		return IOTagWritecache, nil
 	case string(IOTagPolicer):
 		return IOTagPolicer, nil
+	case string(IOTagTreeSync):
+		return IOTagTreeSync, nil
 	default:
 		return ioTagUnknown, fmt.Errorf("unknown tag %s", s)
 	}
@@ -50,3 +53,7 @@ func IOTagFromContext(ctx context.Context) string {
 	}
 	return tag
 }
+
+func (t IOTag) IsLocal() bool {
+	return t == IOTagBackground || t == IOTagPolicer || t == IOTagWritecache || t == IOTagTreeSync
+}
diff --git a/internal/qos/validate.go b/internal/qos/validate.go
index 3fa4ebbd1..75bf4f4b9 100644
--- a/internal/qos/validate.go
+++ b/internal/qos/validate.go
@@ -47,6 +47,7 @@ func validateTags(configTags []limits.IOTagConfig) error {
 		IOTagBackground: {},
 		IOTagWritecache: {},
 		IOTagPolicer:    {},
+		IOTagTreeSync:   {},
 	}
 	for _, t := range configTags {
 		tag, err := FromRawString(t.Tag)
diff --git a/pkg/services/tree/service.go b/pkg/services/tree/service.go
index eeffec08b..b9bb96bab 100644
--- a/pkg/services/tree/service.go
+++ b/pkg/services/tree/service.go
@@ -85,7 +85,7 @@ func New(opts ...Option) *Service {
 
 // Start starts the service.
 func (s *Service) Start(ctx context.Context) {
-	ctx = tagging.ContextWithIOTag(ctx, qos.IOTagBackground.String())
+	ctx = tagging.ContextWithIOTag(ctx, qos.IOTagTreeSync.String())
 	go s.replicateLoop(ctx)
 	go s.syncLoop(ctx)