diff --git a/pkg/extension/action.go b/pkg/extension/action.go
index 7d6b3082a003f59b846d7373e40ecf46a98d62a1..be99916a35aa54e3f68d3f78b584e77cd02b4158 100644
--- a/pkg/extension/action.go
+++ b/pkg/extension/action.go
@@ -90,24 +90,24 @@ var (
 )
 
 type Action struct {
-	Extension        string                  `mapstructure:"extension,omitempty"`   // Расширение
-	Action           string                  `mapstructure:"action,omitempty"`      // Идентификатор действия
-	Target           ActionTarget            `mapstructure:"target,omitempty"`      // Отображение результата действия
-	Parent           string                  `mapstructure:"parent,omitempty"`      // Идентификатор родительского действия (для отображения в меню)
-	Name             string                  `mapstructure:"name,omitempty"`        // Название действия для отображения в интерфейсе (пункт меню, кнопка).
-	Description      string                  `mapstructure:"description,omitempty"` // Описание действия для отображения в интерфейсе
-	Icon             string                  `mapstructure:"icon,omitempty"`        // Название иконки для отображения действия в интерфейсе
-	Image            *references.Reference   `mapstructure:"image,omitempty"`       // Изображение для отображения в действия в интерфейсе
-	Groups           []string                `mapstructure:"groups,omitempty"`      // Группы отображения действия в интерфейсе
-	Kind             ActionKind              `mapstructure:"kind,omitempty"`        // Указывает на что направлено действие
-	Classes          []string                `mapstructure:"classes,omitempty"`     // Классы данных к которым применимо действие (название коллекций или специальных групп в рамках которых данное действие применимо)
-	Refs             []*references.Reference `mapstructure:"refs,omitempty"`        // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
-	ParamsCollection string                  `mapstructure:"params_collection,omitempty"`
-	Request          *ActionRequest          `mapstructure:"request,omitempty"`           // Параметры запроса (используется в случае `ActionResponse.next`)
-	NavigationAction bool                    `mapstructure:"navigation_action,omitempty"` // Флаг указывающий, что действие должно переносить пользователя в другую часть интерфейса, а не отправлять запрос на сервер
-	NavigationRoute  string                  `mapstructure:"navigation_route,omitempty"`
-	Autorun          bool                    `mapstructure:"autorun,omitempty"` // Параметр указывающий, что действие выполняется автоматически
-	Confirm          bool                    `mapstructure:"confirm,omitempty"` // Параметр указывающий, что действие требует подтверждения пользователя
+	Extension        string                  `mapstructure:"extension,omitempty" json:"extension,omitempty"`     // Расширение
+	Action           string                  `mapstructure:"action,omitempty" json:"action"`                     // Идентификатор действия
+	Target           ActionTarget            `mapstructure:"target,omitempty" json:"target"`                     // Отображение результата действия
+	Parent           string                  `mapstructure:"parent,omitempty" json:"parent,omitempty"`           // Идентификатор родительского действия (для отображения в меню)
+	Name             string                  `mapstructure:"name,omitempty" json:"name,omitempty"`               // Название действия для отображения в интерфейсе (пункт меню, кнопка).
+	Description      string                  `mapstructure:"description,omitempty" json:"description,omitempty"` // Описание действия для отображения в интерфейсе
+	Icon             string                  `mapstructure:"icon,omitempty" json:"icon,omitempty"`               // Название иконки для отображения действия в интерфейсе
+	Image            *references.Reference   `mapstructure:"image,omitempty" json:"image,omitempty"`             // Изображение для отображения в действия в интерфейсе
+	Groups           []string                `mapstructure:"groups,omitempty" json:"groups,omitempty"`           // Группы отображения действия в интерфейсе
+	Kind             ActionKind              `mapstructure:"kind,omitempty" json:"kind"`                         // Указывает на что направлено действие
+	Classes          []string                `mapstructure:"classes,omitempty" json:"classes,omitempty"`         // Классы данных к которым применимо действие (название коллекций или специальных групп в рамках которых данное действие применимо)
+	Refs             []*references.Reference `mapstructure:"refs,omitempty" json:"refs,omitempty"`               // Ссылки на записи используемые для выполнения действия (назначение ссылок зависит от действия и расширения)
+	ParamsCollection string                  `mapstructure:"params_collection,omitempty" json:"paramsCollection,omitempty"`
+	Request          *ActionRequest          `mapstructure:"request,omitempty" json:"request,omitempty"`                    // Параметры запроса (используется в случае `ActionResponse.next`)
+	NavigationAction bool                    `mapstructure:"navigation_action,omitempty" json:"navigationAction,omitempty"` // Флаг указывающий, что действие должно переносить пользователя в другую часть интерфейса, а не отправлять запрос на сервер
+	NavigationRoute  string                  `mapstructure:"navigation_route,omitempty" json:"navigationRoute,omitempty"`
+	Autorun          bool                    `mapstructure:"autorun,omitempty" json:"autorun,omitempty"` // Параметр указывающий, что действие выполняется автоматически
+	Confirm          bool                    `mapstructure:"confirm,omitempty" json:"confirm,omitempty"` // Параметр указывающий, что действие требует подтверждения пользователя
 }
 
 func ActionToMap(action *Action) map[string]interface{} {
diff --git a/pkg/setup/collection.go b/pkg/setup/collection.go
index 0a7fc65c9da358240980638e82915089b13e5829..9f5f6a46c7818d54db7e5123cdbef595b0cc0ab9 100644
--- a/pkg/setup/collection.go
+++ b/pkg/setup/collection.go
@@ -61,9 +61,9 @@ func OverwriteCollection() CollectionsOption {
 	return func(c *CollectionConfig) {
 		c.UpdateFn = func(s *Setup, old, new *collections.Collection) (*collections.Collection, bool, bool, error) {
 			update := new.Name != old.Name || new.IsSingle() != old.IsSingle() || new.IsSystem() != old.IsSystem() ||
-				new.IsNoData() != old.IsNoData() || new.Hidden != old.Hidden || new.IsView() != old.IsView() || !data.ElementsMatch(old.Tags, new.Tags)
+				new.IsNoData() != old.IsNoData() || new.Hidden != old.Hidden || !new.View.Equal(old.View) || !data.ElementsMatch(old.Tags, new.Tags)
 
-			return new, update, old.Schema.Equal(new.Schema), nil
+			return new, update, !old.Schema.Equal(new.Schema), nil
 		}
 	}
 }
diff --git a/pkg/setup/collection_test.go b/pkg/setup/collection_test.go
index a06c117a3a5586b4a3afc9513bb6ac1333c556cf..43b450119a0892865486517df1d43a7e92d3dc2d 100644
--- a/pkg/setup/collection_test.go
+++ b/pkg/setup/collection_test.go
@@ -14,6 +14,7 @@ import (
 	"git.perx.ru/perxis/perxis-go/pkg/schema/field"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
+	"github.com/stretchr/testify/require"
 )
 
 func TestSetup_InstallCollections(t *testing.T) {
@@ -156,3 +157,52 @@ func TestSetup_InstallCollections(t *testing.T) {
 		})
 	}
 }
+
+func TestOverwriteCollection(t *testing.T) {
+	tests := []struct {
+		name          string
+		old, new      *collections.Collection
+		wantUpdate    bool
+		wantSetSchema bool
+		wantErr       bool
+	}{
+		{
+			name:          "Equal collections should not be updated",
+			old:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", Schema: schema.New("a", field.String())},
+			new:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", Schema: schema.New("a", field.String())},
+			wantUpdate:    false,
+			wantSetSchema: false,
+		},
+		{
+			name:          "For collections with different schemas and equal other params schemas should be set",
+			old:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", Name: "Coll", Schema: schema.New("a", field.String())},
+			new:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", Name: "Coll", Schema: schema.New("b", field.String())},
+			wantUpdate:    false,
+			wantSetSchema: true,
+		},
+		{
+			name:          "Collections with different names should be updated",
+			old:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", Name: "Coll1", Schema: schema.New("a", field.String())},
+			new:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", Name: "Coll2", Schema: schema.New("a", field.String())},
+			wantUpdate:    true,
+			wantSetSchema: false,
+		},
+		{
+			name:          "Collections with different view params should be updated",
+			old:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp1", EnvID: "env1", CollectionID: "coll1"}},
+			new:           &collections.Collection{ID: "coll", SpaceID: "sp", EnvID: "env", View: &collections.View{SpaceID: "sp2", EnvID: "env2", CollectionID: "coll2"}},
+			wantUpdate:    true,
+			wantSetSchema: false,
+		},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			c := new(CollectionConfig)
+			OverwriteCollection()(c)
+			_, update, setSchema, err := c.UpdateFn(new(Setup), tt.old, tt.new)
+			require.NoError(t, err)
+			assert.Equal(t, tt.wantUpdate, update)
+			assert.Equal(t, tt.wantSetSchema, setSchema)
+		})
+	}
+}