diff --git a/pkg/collections/collection.go b/pkg/collections/collection.go
index dfe5d66ed4a5b96f4f99118a6842488a2bc94735..ddb73ecad0151b3f185f069ed503f0b4ba4d9165 100644
--- a/pkg/collections/collection.go
+++ b/pkg/collections/collection.go
@@ -176,6 +176,10 @@ func (c Collection) IsNoData() bool {
 	return c.NoData != nil && *c.NoData
 }
 
+func (c Collection) IsSystem() bool {
+	return c.System != nil && *c.System
+}
+
 func (c Collection) IsView() bool {
 	return c.View != nil
 }
diff --git a/pkg/setup/collection.go b/pkg/setup/collection.go
index d1c354d330ad10f866852286d9e4354e775673ac..b52c32d18c95acbba856d8280473f02f8824c4be 100644
--- a/pkg/setup/collection.go
+++ b/pkg/setup/collection.go
@@ -6,6 +6,7 @@ import (
 	"strings"
 
 	"git.perx.ru/perxis/perxis-go/pkg/collections"
+	"git.perx.ru/perxis/perxis-go/pkg/data"
 	"git.perx.ru/perxis/perxis-go/pkg/environments"
 	"git.perx.ru/perxis/perxis-go/pkg/errors"
 	"git.perx.ru/perxis/perxis-go/pkg/extension"
@@ -31,7 +32,7 @@ type CollectionConfig struct {
 func NewCollectionConfig(collection *collections.Collection, opt ...CollectionsOption) CollectionConfig {
 	c := CollectionConfig{collection: collection}
 
-	DefaultUpdateCollStrategy()(&c)
+	DefaultUpdateCollectionStrategy()(&c)
 	DeleteCollectionIfRemove()(&c)
 
 	for _, o := range opt {
@@ -69,20 +70,29 @@ func DeleteCollectionIfRemove() CollectionsOption {
 	}
 }
 
-func DefaultUpdateCollStrategy() CollectionsOption {
+func DefaultUpdateCollectionStrategy() CollectionsOption {
 	return func(c *CollectionConfig) {
 		c.UpdateFn = func(s *Setup, exist, collection *collections.Collection) (*collections.Collection, bool, bool, error) {
-			if len(exist.Tags) > 0 {
-				collection.Tags = append(exist.Tags, collection.Tags...)
-			}
-
 			if !s.IsForce() && !collection.IsView() && !exist.IsView() && collection.Schema.Metadata != nil && collection.Schema.Metadata[extension.ExtensionMetadataKey] != "" {
 				if exist.Schema.Metadata == nil || exist.Schema.Metadata[extension.ExtensionMetadataKey] != collection.Schema.Metadata[extension.ExtensionMetadataKey] {
 					return nil, false, false, collections.ErrAlreadyExists
 				}
 			}
 
-			return collection, true, !collection.IsView() && !reflect.DeepEqual(exist.Schema, collection.Schema), nil
+			if len(exist.Tags) > 0 {
+				collection.Tags = data.SetFromSlice(append(exist.Tags, collection.Tags...))
+			}
+
+			var update, setSchema bool
+			update = collection.Name != exist.Name || collection.IsSingle() != exist.IsSingle() || collection.IsSystem() != exist.IsSystem() ||
+				collection.IsNoData() != exist.IsNoData() || collection.Hidden != exist.Hidden || collection.IsView() != exist.IsView() && data.ElementsMatch(exist.Tags, collection.Tags)
+
+			if exist.View != nil && collection.View != nil {
+				update = update && *exist.View == *collection.View
+			}
+			setSchema = !collection.IsView() && !reflect.DeepEqual(exist.Schema, collection.Schema)
+
+			return collection, update, setSchema, nil
 		}
 	}
 }
diff --git a/pkg/setup/setup_test.go b/pkg/setup/setup_test.go
index 162c5188bed62bcedc0be8afcfc462962ed43e86..99c11e7a122b1f45df501bbf405936ee00750f7f 100644
--- a/pkg/setup/setup_test.go
+++ b/pkg/setup/setup_test.go
@@ -181,15 +181,9 @@ func TestSetupInstall(t *testing.T) {
 		envMocks := &environmentMock.Environments{}
 
 		collsMock := &collectionMock.Collections{}
-		for _, collection := range getCollections() {
-			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
-				Return(collection, nil).
-				Once()
-
-			collsMock.On("Update", mock.Anything, collection).
-				Return(nil).
-				Once()
-		}
+		collsMock.On("Get", mock.Anything, spaceID, envID, "coll1").
+			Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция старая"}, nil).Once()
+		collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(nil).Once()
 
 		rMock := &rolesMock.Roles{}
 		for _, role := range getRoles() {
@@ -247,15 +241,9 @@ func TestSetupInstall(t *testing.T) {
 
 	t.Run("Success, with force", func(t *testing.T) {
 		collsMock := &collectionMock.Collections{}
-		for _, collection := range getCollections() {
-			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
-				Return(collection, nil).
-				Once()
-
-			collsMock.On("Update", mock.Anything, collection).
-				Return(nil).
-				Once()
-		}
+		collsMock.On("Get", mock.Anything, spaceID, envID, "coll1").
+			Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция старая"}, nil).Once()
+		collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(nil).Once()
 
 		rMock := &rolesMock.Roles{}
 		for _, role := range getRoles() {
@@ -453,15 +441,8 @@ func TestSetupInstall(t *testing.T) {
 
 	t.Run("Can't update collection, storage returns error", func(t *testing.T) {
 		collsMock := &collectionMock.Collections{}
-		for _, collection := range getCollections() {
-			collsMock.On("Get", mock.Anything, spaceID, envID, collection.ID).
-				Return(collection, nil).
-				Once()
-
-			collsMock.On("Update", mock.Anything, collection).
-				Return(errors.New("can't update collection")).
-				Once()
-		}
+		collsMock.On("Get", mock.Anything, spaceID, envID, "coll1").Return(&collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция 00"}, nil).Once()
+		collsMock.On("Update", mock.Anything, &collections.Collection{ID: "coll1", SpaceID: spaceID, EnvID: envID, Schema: schema.New(), Name: "Коллекция"}).Return(errors.New("can't update collection")).Once()
 
 		rMock := &rolesMock.Roles{}
 		for _, role := range getRoles() {