diff --git a/backend/src/baserow/contrib/database/views/view_types.py b/backend/src/baserow/contrib/database/views/view_types.py
index 11e830765..8c27e6649 100644
--- a/backend/src/baserow/contrib/database/views/view_types.py
+++ b/backend/src/baserow/contrib/database/views/view_types.py
@@ -290,6 +290,7 @@ class GalleryViewType(ViewType):
     api_exceptions_map = {
         FieldNotInTable: ERROR_FIELD_NOT_IN_TABLE,
     }
+    can_decorate = True
 
     def get_api_urls(self):
         from baserow.contrib.database.api.views.gallery import urls as api_urls
diff --git a/changelog.md b/changelog.md
index ea3ea801a..42506cecd 100644
--- a/changelog.md
+++ b/changelog.md
@@ -2,6 +2,8 @@
 
 ## Unreleased
 
+* Added row coloring for Kanban and Gallery views
+
 ## Released (2022-10-05 1.10.0)
 
 * Added batch create/update/delete rows endpoints. These endpoints make it possible to
diff --git a/premium/backend/src/baserow_premium/views/view_types.py b/premium/backend/src/baserow_premium/views/view_types.py
index e247a5a37..197034dcf 100644
--- a/premium/backend/src/baserow_premium/views/view_types.py
+++ b/premium/backend/src/baserow_premium/views/view_types.py
@@ -52,6 +52,7 @@ class KanbanViewType(ViewType):
         ),
         FieldNotInTable: ERROR_FIELD_NOT_IN_TABLE,
     }
+    can_decorate = True
 
     def get_api_urls(self):
         from baserow_premium.api.views.kanban import urls as api_urls
diff --git a/premium/web-frontend/modules/baserow_premium/assets/scss/components/views/decorators.scss b/premium/web-frontend/modules/baserow_premium/assets/scss/components/views/decorators.scss
index 14de77036..965551fd4 100644
--- a/premium/web-frontend/modules/baserow_premium/assets/scss/components/views/decorators.scss
+++ b/premium/web-frontend/modules/baserow_premium/assets/scss/components/views/decorators.scss
@@ -1,8 +1,10 @@
 .left-border-decorator {
   width: 6px;
-  height: 24px;
-  margin: 0 4px;
+  align-self: stretch;
+  flex-shrink: 0;
+  flex-grow: 0;
   border-radius: 6px;
+  margin: 4px;
 
   @include add-shadow-on-same-background();
 }
diff --git a/premium/web-frontend/modules/baserow_premium/components/views/kanban/KanbanViewStack.vue b/premium/web-frontend/modules/baserow_premium/components/views/kanban/KanbanViewStack.vue
index 883d677be..bbfd23dde 100644
--- a/premium/web-frontend/modules/baserow_premium/components/views/kanban/KanbanViewStack.vue
+++ b/premium/web-frontend/modules/baserow_premium/components/views/kanban/KanbanViewStack.vue
@@ -76,6 +76,7 @@
               v-show="slot.position != -1"
               :key="'card-' + slot.id"
               :fields="cardFields"
+              :decorations-by-place="decorationsByPlace"
               :row="slot.row"
               :cover-image-field="coverImageField"
               :style="{
@@ -138,11 +139,12 @@ import InfiniteScroll from '@baserow/modules/core/components/helpers/InfiniteScr
 import { populateRow } from '@baserow_premium/store/view/kanban'
 import KanbanViewStackContext from '@baserow_premium/components/views/kanban/KanbanViewStackContext'
 import { getCardHeight } from '@baserow/modules/database/utils/card'
+import viewDecoration from '@baserow/modules/database/mixins/viewDecoration'
 
 export default {
   name: 'KanbanViewStack',
   components: { InfiniteScroll, RowCard, KanbanViewStackContext },
-  mixins: [kanbanViewHelper],
+  mixins: [kanbanViewHelper, viewDecoration],
   props: {
     option: {
       validator: (prop) => typeof prop === 'object' || prop === null,
diff --git a/premium/web-frontend/modules/baserow_premium/decoratorValueProviders.js b/premium/web-frontend/modules/baserow_premium/decoratorValueProviders.js
index 684d9cd19..e08531c09 100644
--- a/premium/web-frontend/modules/baserow_premium/decoratorValueProviders.js
+++ b/premium/web-frontend/modules/baserow_premium/decoratorValueProviders.js
@@ -107,7 +107,11 @@ export class ConditionalColorValueProviderType extends DecoratorValueProviderTyp
   getValue({ options, fields, row }) {
     const { $registry } = this.app
     for (const { color, filters, operator } of options.colors) {
-      if (matchSearchFilters($registry, operator, filters, fields, row)) {
+      if (
+        row.id !== -1 &&
+        row.id !== undefined &&
+        matchSearchFilters($registry, operator, filters, fields, row)
+      ) {
         return color
       }
     }
diff --git a/premium/web-frontend/modules/baserow_premium/viewDecorators.js b/premium/web-frontend/modules/baserow_premium/viewDecorators.js
index 69e4ddcbf..43b5fb5f8 100644
--- a/premium/web-frontend/modules/baserow_premium/viewDecorators.js
+++ b/premium/web-frontend/modules/baserow_premium/viewDecorators.js
@@ -1,6 +1,13 @@
 import { ViewDecoratorType } from '@baserow/modules/database/viewDecorators'
 import { PremiumPlugin } from '@baserow_premium/plugins'
 
+import {
+  GridViewType,
+  GalleryViewType,
+} from '@baserow/modules/database/viewTypes'
+
+import { KanbanViewType } from './viewTypes'
+
 import leftBorderDecoratorImage from '@baserow_premium/assets/images/leftBorderDecorator.svg'
 import backgroundDecoratorImage from '@baserow_premium/assets/images/backgroundDecorator.svg'
 
@@ -71,7 +78,13 @@ export class LeftBorderColorViewDecoratorType extends ViewDecoratorType {
   isCompatible(view) {
     const { store } = this.app
 
-    return ['grid'].includes(view.type) && !store.getters['view/grid/isPublic']
+    return (
+      [
+        GridViewType.getType(),
+        GalleryViewType.getType(),
+        KanbanViewType.getType(),
+      ].includes(view.type) && !store.getters['view/grid/isPublic']
+    )
   }
 }
 
@@ -114,7 +127,13 @@ export class BackgroundColorViewDecoratorType extends ViewDecoratorType {
   isCompatible(view) {
     const { store } = this.app
 
-    return ['grid'].includes(view.type) && !store.getters['view/grid/isPublic']
+    return (
+      [
+        GridViewType.getType(),
+        GalleryViewType.getType(),
+        KanbanViewType.getType(),
+      ].includes(view.type) && !store.getters['view/grid/isPublic']
+    )
   }
 
   getDeactivatedText() {
diff --git a/web-frontend/modules/core/assets/scss/components/card.scss b/web-frontend/modules/core/assets/scss/components/card.scss
index 83546265d..56fb44261 100644
--- a/web-frontend/modules/core/assets/scss/components/card.scss
+++ b/web-frontend/modules/core/assets/scss/components/card.scss
@@ -68,8 +68,13 @@
   background-position: center center;
 }
 
+.card__content {
+  display: flex;
+}
+
 .card__fields {
   padding: 16px 0;
+  overflow: auto;
 }
 
 .card__field {
diff --git a/web-frontend/modules/core/assets/scss/components/card/single_select.scss b/web-frontend/modules/core/assets/scss/components/card/single_select.scss
index f57763fc8..e9b57d025 100644
--- a/web-frontend/modules/core/assets/scss/components/card/single_select.scss
+++ b/web-frontend/modules/core/assets/scss/components/card/single_select.scss
@@ -6,4 +6,5 @@
   @extend %ellipsis;
 
   @include select-option-style(inline-block);
+  @include add-shadow-on-same-background();
 }
diff --git a/web-frontend/modules/database/components/card/RowCard.vue b/web-frontend/modules/database/components/card/RowCard.vue
index 26b2ff71b..53fe5e1cf 100644
--- a/web-frontend/modules/database/components/card/RowCard.vue
+++ b/web-frontend/modules/database/components/card/RowCard.vue
@@ -6,41 +6,65 @@
     @mousemove="$emit('mousemove', $event)"
     @mouseenter="$emit('mouseenter', $event)"
   >
-    <div v-if="coverImageField !== null" class="card__cover">
-      <div
-        v-if="coverImageUrl !== null"
-        class="card__cover-image"
-        :style="{
-          'background-image': 'url(' + coverImageUrl + ')',
-        }"
-      ></div>
-    </div>
-    <div class="card__fields">
-      <div v-for="field in fields" :key="field.id" class="card__field">
-        <div class="card__field-name">{{ field.name }}</div>
-        <div class="card__field-value">
-          <component
-            :is="getCardComponent(field)"
-            v-if="!loading"
-            :field="field"
-            :value="row['field_' + field.id]"
-          />
+    <RecursiveWrapper
+      :components="
+        wrapperDecorations.map((comp) => ({
+          ...comp,
+          props: comp.propsFn(row),
+        }))
+      "
+    >
+      <div v-if="coverImageField !== null" class="card__cover">
+        <div
+          v-if="coverImageUrl !== null"
+          class="card__cover-image"
+          :style="{
+            'background-image': 'url(' + coverImageUrl + ')',
+          }"
+        ></div>
+      </div>
+      <div class="card__content">
+        <component
+          :is="dec.component"
+          v-for="dec in firstCellDecorations"
+          :key="dec.decoration.id"
+          v-bind="dec.propsFn(row)"
+        />
+        <div class="card__fields">
+          <div v-for="field in fields" :key="field.id" class="card__field">
+            <div class="card__field-name">{{ field.name }}</div>
+            <div class="card__field-value">
+              <component
+                :is="getCardComponent(field)"
+                v-if="!loading"
+                :field="field"
+                :value="row['field_' + field.id]"
+              />
+            </div>
+          </div>
         </div>
       </div>
-    </div>
+    </RecursiveWrapper>
   </div>
 </template>
 
 <script>
 import { FileFieldType } from '@baserow/modules/database/fieldTypes'
+import RecursiveWrapper from '@baserow/modules/database/components/RecursiveWrapper'
 
 export default {
   name: 'RowCard',
+  components: { RecursiveWrapper },
   props: {
     fields: {
       type: Array,
       required: true,
     },
+    decorationsByPlace: {
+      type: Object,
+      required: false,
+      default: () => {},
+    },
     row: {
       type: Object,
       required: false,
@@ -80,6 +104,12 @@ export default {
 
       return image.thumbnails.card_cover.url
     },
+    firstCellDecorations() {
+      return this.decorationsByPlace?.first_cell || []
+    },
+    wrapperDecorations() {
+      return this.decorationsByPlace?.wrapper || []
+    },
   },
   methods: {
     getCardComponent(field) {
diff --git a/web-frontend/modules/database/components/view/ViewDecoratorContext.vue b/web-frontend/modules/database/components/view/ViewDecoratorContext.vue
index 864a56da1..afd23858c 100644
--- a/web-frontend/modules/database/components/view/ViewDecoratorContext.vue
+++ b/web-frontend/modules/database/components/view/ViewDecoratorContext.vue
@@ -17,11 +17,11 @@
               <ViewDecoratorItem :decorator-type="dec.decoratorType" />
             </div>
             <div
-              v-show="dec.decoration.value_provider_type"
+              v-show="dec.valueProviderType"
               class="decorator-context__decorator-header-select"
             >
               <Picker
-                v-if="dec.decoration.value_provider_type"
+                v-if="dec.valueProviderType"
                 :icon="dec.valueProviderType.getIconClass()"
                 :name="dec.valueProviderType.getName()"
                 @select="selectValueProvider(dec.decoration, $event)"
@@ -104,6 +104,7 @@
 
 <script>
 import context from '@baserow/modules/core/mixins/context'
+import viewDecoration from '@baserow/modules/database/mixins/viewDecoration'
 import ViewDecoratorList from '@baserow/modules/database/components/view/ViewDecoratorList'
 import ViewDecoratorItem from '@baserow/modules/database/components/view/ViewDecoratorItem'
 import SelectViewDecoratorContext from '@baserow/modules/database/components/view/SelectViewDecoratorContext'
@@ -120,7 +121,7 @@ export default {
     SelectViewDecoratorContext,
     DecoratorValueProviderList,
   },
-  mixins: [context],
+  mixins: [context, viewDecoration],
   props: {
     primary: {
       type: Object,
@@ -143,42 +144,6 @@ export default {
       required: true,
     },
   },
-  computed: {
-    allFields() {
-      return [this.primary, ...this.fields]
-    },
-    augmentedDecorations() {
-      return this.view.decorations.map((decoration) => {
-        const deco = { decoration }
-        deco.decoratorType = this.$registry.get(
-          'viewDecorator',
-          decoration.type
-        )
-
-        if (decoration.value_provider_type) {
-          deco.valueProviderType = this.$registry.get(
-            'decoratorValueProvider',
-            decoration.value_provider_type
-          )
-        }
-
-        deco.availableValueProviderTypes = this.$registry
-          .getOrderedList('decoratorValueProvider')
-          .filter((valueProviderType) =>
-            valueProviderType.isCompatible(deco.decoratorType)
-          )
-
-        deco.isDeactivated = deco.decoratorType.isDeactivated({
-          view: this.view,
-        })
-
-        return deco
-      })
-    },
-    activeDecorations() {
-      return this.augmentedDecorations.filter((deco) => !deco.isDeactivated)
-    },
-  },
   methods: {
     async removeDecoration(decoration) {
       try {
@@ -202,7 +167,7 @@ export default {
             value_provider_type: valueProviderType.getType(),
             value_provider_conf: valueProviderType.getDefaultConfiguration({
               view: this.view,
-              fields: this.allFields,
+              fields: this.allTableFields,
             }),
           },
           decoration,
diff --git a/web-frontend/modules/database/components/view/gallery/GalleryView.vue b/web-frontend/modules/database/components/view/gallery/GalleryView.vue
index c57bea7f9..9c411b727 100644
--- a/web-frontend/modules/database/components/view/gallery/GalleryView.vue
+++ b/web-frontend/modules/database/components/view/gallery/GalleryView.vue
@@ -33,6 +33,7 @@
           :row="slot.item || {}"
           :loading="slot.item === null"
           :cover-image-field="coverImageField"
+          :decorations-by-place="decorationsByPlace"
           class="gallery-view__card"
           :style="{
             width: cardWidth + 'px',
@@ -93,11 +94,12 @@ import RowCreateModal from '@baserow/modules/database/components/row/RowCreateMo
 import RowEditModal from '@baserow/modules/database/components/row/RowEditModal'
 import bufferedRowsDragAndDrop from '@baserow/modules/database/mixins/bufferedRowsDragAndDrop'
 import viewHelpers from '@baserow/modules/database/mixins/viewHelpers'
+import viewDecoration from '@baserow/modules/database/mixins/viewDecoration'
 
 export default {
   name: 'GalleryView',
   components: { RowCard, RowCreateModal, RowEditModal },
-  mixins: [viewHelpers, bufferedRowsDragAndDrop],
+  mixins: [viewHelpers, bufferedRowsDragAndDrop, viewDecoration],
   props: {
     primary: {
       type: Object,
diff --git a/web-frontend/modules/database/components/view/grid/GridView.vue b/web-frontend/modules/database/components/view/grid/GridView.vue
index f09590b36..85a6fe42a 100644
--- a/web-frontend/modules/database/components/view/grid/GridView.vue
+++ b/web-frontend/modules/database/components/view/grid/GridView.vue
@@ -16,7 +16,7 @@
       ref="left"
       class="grid-view__left"
       :fields="leftFields"
-      :all-table-fields="allTableFields"
+      :decorations-by-place="decorationsByPlace"
       :table="table"
       :view="view"
       :include-field-width-handles="false"
@@ -66,7 +66,7 @@
       ref="right"
       class="grid-view__right"
       :fields="visibleFields"
-      :all-table-fields="allTableFields"
+      :decorations-by-place="decorationsByPlace"
       :table="table"
       :view="view"
       :include-add-field="true"
@@ -188,6 +188,7 @@ import gridViewHelpers from '@baserow/modules/database/mixins/gridViewHelpers'
 import { maxPossibleOrderValue } from '@baserow/modules/database/viewTypes'
 import viewHelpers from '@baserow/modules/database/mixins/viewHelpers'
 import { isElement } from '@baserow/modules/core/utils/dom'
+import viewDecoration from '@baserow/modules/database/mixins/viewDecoration'
 
 export default {
   name: 'GridView',
@@ -197,7 +198,7 @@ export default {
     GridViewRowDragging,
     RowEditModal,
   },
-  mixins: [viewHelpers, gridViewHelpers],
+  mixins: [viewHelpers, gridViewHelpers, viewDecoration],
   props: {
     primary: {
       type: Object,
@@ -280,9 +281,6 @@ export default {
     leftWidth() {
       return this.leftFieldsWidth + this.gridViewRowDetailsWidth
     },
-    allTableFields() {
-      return [this.primary, ...this.fields]
-    },
   },
   watch: {
     fieldOptions: {
diff --git a/web-frontend/modules/database/components/view/grid/GridViewRow.vue b/web-frontend/modules/database/components/view/grid/GridViewRow.vue
index 747eebc17..96c0445d6 100644
--- a/web-frontend/modules/database/components/view/grid/GridViewRow.vue
+++ b/web-frontend/modules/database/components/view/grid/GridViewRow.vue
@@ -128,10 +128,9 @@ export default {
       type: Array,
       required: true,
     },
-    decorations: {
-      type: Array,
-      required: false,
-      default: () => [],
+    decorationsByPlace: {
+      type: Object,
+      required: true,
     },
     allFields: {
       type: Array,
@@ -212,10 +211,10 @@ export default {
       return fields
     },
     firstCellDecorations() {
-      return this.decorations.filter(({ place }) => place === 'first_cell')
+      return this.decorationsByPlace?.first_cell || []
     },
     wrapperDecorations() {
-      return this.decorations.filter(({ place }) => place === 'wrapper')
+      return this.decorationsByPlace?.wrapper || []
     },
   },
   methods: {
diff --git a/web-frontend/modules/database/components/view/grid/GridViewRows.vue b/web-frontend/modules/database/components/view/grid/GridViewRows.vue
index 4aba9869e..13550a7ff 100644
--- a/web-frontend/modules/database/components/view/grid/GridViewRows.vue
+++ b/web-frontend/modules/database/components/view/grid/GridViewRows.vue
@@ -13,7 +13,7 @@
       :all-fields="allFields"
       :field-widths="fieldWidths"
       :include-row-details="includeRowDetails"
-      :decorations="augmentedDecorations"
+      :decorations-by-place="decorationsByPlace"
       :read-only="readOnly"
       :can-drag="view.sortings.length === 0"
       :store-prefix="storePrefix"
@@ -41,8 +41,8 @@ export default {
       type: Array,
       required: true,
     },
-    allTableFields: {
-      type: Array,
+    decorationsByPlace: {
+      type: Object,
       required: true,
     },
     leftOffset: {
@@ -72,42 +72,6 @@ export default {
       })
       return fieldWidths
     },
-    augmentedDecorations() {
-      return this.view.decorations
-        .filter(({ value_provider_type: valPro }) => valPro)
-        .map((decoration) => {
-          const deco = { decoration }
-
-          deco.decorationType = this.$registry.get(
-            'viewDecorator',
-            decoration.type
-          )
-
-          deco.component = deco.decorationType.getComponent()
-          deco.place = deco.decorationType.getPlace()
-
-          deco.valueProviderType = this.$registry.get(
-            'decoratorValueProvider',
-            decoration.value_provider_type
-          )
-
-          deco.propsFn = (row) => {
-            return {
-              value: deco.valueProviderType.getValue({
-                row,
-                fields: this.allTableFields,
-                options: decoration.value_provider_conf,
-              }),
-            }
-          }
-
-          return deco
-        })
-        .filter(
-          ({ decorationType }) =>
-            !decorationType.isDeactivated({ view: this.view })
-        )
-    },
   },
   beforeCreate() {
     this.$options.computed = {
diff --git a/web-frontend/modules/database/components/view/grid/GridViewSection.vue b/web-frontend/modules/database/components/view/grid/GridViewSection.vue
index 34ea7ade8..d5dafeaab 100644
--- a/web-frontend/modules/database/components/view/grid/GridViewSection.vue
+++ b/web-frontend/modules/database/components/view/grid/GridViewSection.vue
@@ -52,7 +52,7 @@
             :view="view"
             :fields="fieldsToRender"
             :all-fields="fields"
-            :all-table-fields="allTableFields"
+            :decorations-by-place="decorationsByPlace"
             :left-offset="fieldsLeftOffset"
             :include-row-details="includeRowDetails"
             :read-only="readOnly"
@@ -127,8 +127,8 @@ export default {
       type: Array,
       required: true,
     },
-    allTableFields: {
-      type: Array,
+    decorationsByPlace: {
+      type: Object,
       required: true,
     },
     table: {
diff --git a/web-frontend/modules/database/mixins/viewDecoration.js b/web-frontend/modules/database/mixins/viewDecoration.js
new file mode 100644
index 000000000..b2e64cff2
--- /dev/null
+++ b/web-frontend/modules/database/mixins/viewDecoration.js
@@ -0,0 +1,75 @@
+/**
+ * A mixin that can be used in combination with the view filter input components. If
+ * contains the expected props and it has a computed property that finds the field
+ * object related to filter field id.
+ */
+export default {
+  props: {
+    view: {
+      type: Object,
+      required: false,
+      default: undefined,
+    },
+    fields: {
+      type: Array,
+      required: true,
+    },
+    primary: {
+      type: Object,
+      required: true,
+    },
+  },
+  computed: {
+    allTableFields() {
+      return [this.primary, ...this.fields]
+    },
+    activeDecorations() {
+      return this.view.decorations
+        .map((decoration) => {
+          const deco = { decoration }
+
+          deco.decoratorType = this.$registry.get(
+            'viewDecorator',
+            decoration.type
+          )
+
+          deco.component = deco.decoratorType.getComponent()
+          deco.place = deco.decoratorType.getPlace()
+
+          if (decoration.value_provider_type) {
+            deco.valueProviderType = this.$registry.get(
+              'decoratorValueProvider',
+              decoration.value_provider_type
+            )
+
+            deco.propsFn = (row) => {
+              return {
+                value: deco.valueProviderType.getValue({
+                  row,
+                  fields: this.allTableFields,
+                  options: decoration.value_provider_conf,
+                }),
+              }
+            }
+          }
+
+          return deco
+        })
+        .filter(
+          ({ decoratorType }) =>
+            !decoratorType.isDeactivated({ view: this.view })
+        )
+    },
+    decorationsByPlace() {
+      return this.activeDecorations
+        .filter(({ valueProviderType }) => valueProviderType)
+        .reduce((prev, deco) => {
+          if (deco.valueProviderType) {
+            const decType = deco.decoratorType.getPlace()
+            prev[decType] = [...(prev[decType] || []), deco]
+          }
+          return prev
+        }, {})
+    },
+  },
+}
diff --git a/web-frontend/test/fixtures/gallery.js b/web-frontend/test/fixtures/gallery.js
new file mode 100644
index 000000000..2375beb7e
--- /dev/null
+++ b/web-frontend/test/fixtures/gallery.js
@@ -0,0 +1,49 @@
+export function createGalleryView(
+  mock,
+  application,
+  table,
+  {
+    viewType = 'gallery',
+    viewId = 1,
+    filters = [],
+    sortings = [],
+    decorations = [],
+  }
+) {
+  const tableId = table.id
+  const galleryView = {
+    id: viewId,
+    table_id: tableId,
+    name: `mock_view_${viewId}`,
+    order: 0,
+    type: viewType,
+    table: {
+      id: tableId,
+      name: table.name,
+      order: 0,
+      database_id: application.id,
+    },
+    filter_type: 'AND',
+    filters_disabled: false,
+    filters,
+    sortings,
+    decorations,
+  }
+  mock.onGet(`/database/views/table/${tableId}/`).reply(200, [galleryView])
+  return galleryView
+}
+
+export function createGalleryRows(mock, view, fields, rows = []) {
+  const fieldOptions = {}
+  for (let i = 1; i < fields.length; i++) {
+    fieldOptions[i] = {
+      hidden: false,
+      order: i,
+    }
+  }
+  mock.onGet(`/database/views/gallery/${view.id}/`).reply(200, {
+    count: rows.length,
+    results: rows,
+    field_options: fieldOptions,
+  })
+}
diff --git a/web-frontend/test/fixtures/grid.js b/web-frontend/test/fixtures/grid.js
index 82dd66f4d..a42bc989a 100644
--- a/web-frontend/test/fixtures/grid.js
+++ b/web-frontend/test/fixtures/grid.js
@@ -1,4 +1,4 @@
-export function createRows(mock, gridView, fields, rows = []) {
+export function createGridRows(mock, gridView, fields, rows = []) {
   const fieldOptions = {}
   for (let i = 1; i < fields.length; i++) {
     fieldOptions[i] = {
diff --git a/web-frontend/test/fixtures/mockServer.js b/web-frontend/test/fixtures/mockServer.js
index 11d5b743b..a2ea2b0ec 100644
--- a/web-frontend/test/fixtures/mockServer.js
+++ b/web-frontend/test/fixtures/mockServer.js
@@ -7,8 +7,12 @@ import {
 import { createFields } from '@baserow/test/fixtures/fields'
 import {
   createPublicGridViewRows,
-  createRows,
+  createGridRows,
 } from '@baserow/test/fixtures/grid'
+import {
+  createGalleryRows,
+  createGalleryView,
+} from '@baserow/test/fixtures/gallery'
 
 /**
  * MockServer is responsible for being the single place where we mock out calls to the
@@ -39,12 +43,13 @@ export class MockServer {
   createGridView(
     application,
     table,
-    { filters = [], sortings = [], decorations = [] }
+    { filters = [], sortings = [], decorations = [], ...rest }
   ) {
     return createGridView(this.mock, application, table, {
       filters,
       sortings,
       decorations,
+      ...rest,
     })
   }
 
@@ -56,12 +61,29 @@ export class MockServer {
     return createPublicGridViewRows(this.mock, viewSlug, fields, rows)
   }
 
+  createGalleryView(
+    application,
+    table,
+    { filters = [], sortings = [], decorations = [], ...rest }
+  ) {
+    return createGalleryView(this.mock, application, table, {
+      filters,
+      sortings,
+      decorations,
+      ...rest,
+    })
+  }
+
   createFields(application, table, fields) {
     return createFields(this.mock, application, table, fields)
   }
 
-  createRows(gridView, fields, rows) {
-    return createRows(this.mock, gridView, fields, rows)
+  createGridRows(gridView, fields, rows) {
+    return createGridRows(this.mock, gridView, fields, rows)
+  }
+
+  createGalleryRows(gridView, fields, rows) {
+    return createGalleryRows(this.mock, gridView, fields, rows)
   }
 
   nextSearchForTermWillReturn(searchTerm, gridView, results) {
diff --git a/web-frontend/test/unit/database/components/view/__snapshots__/viewDecoratorContext.spec.js.snap b/web-frontend/test/unit/database/components/view/__snapshots__/viewDecoratorContext.spec.js.snap
index c98d5fe88..b595fe470 100644
--- a/web-frontend/test/unit/database/components/view/__snapshots__/viewDecoratorContext.spec.js.snap
+++ b/web-frontend/test/unit/database/components/view/__snapshots__/viewDecoratorContext.spec.js.snap
@@ -43,7 +43,7 @@ exports[`GridViewRows component with decoration Default component 1`] = `
 </div>
 `;
 
-exports[`GridViewRows component with decoration Should show can add decorator tooltip 1`] = `
+exports[`GridViewRows component with decoration Should show cant add decorator tooltip 1`] = `
 <body>
   <div
     class="tooltip tooltip--body tooltip--center"
@@ -95,303 +95,6 @@ exports[`GridViewRows component with decoration Should show can add decorator to
       </div>
     </div>
   </div>
-  <div
-    class="tooltip tooltip--body tooltip--center"
-    style="top: 4px; left: 0px;"
-  >
-    <div
-      class="tooltip__content"
-    >
-      unavailability reason
-    </div>
-  </div>
-  <div
-    class="context"
-  >
-    <div
-      class="decorator-list"
-    >
-      <div
-        class="decorator-list__item decorator-list__item--disabled"
-      >
-        <div
-          class="decorator-item"
-        >
-          <img
-            class="decorator-item__image"
-            src="fake/url.png"
-          />
-           
-          <div
-            class="decorator-item__content"
-          >
-            <div
-              class="decorator-item__title"
-            >
-              
-      Fake decorator
-    
-            </div>
-             
-            <div
-              class="decorator-item__description"
-            >
-              
-      Fake decorator description
-    
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
-  <div
-    class="context"
-  >
-    <div
-      class="decorator-context"
-    >
-      <div
-        class="decorator-context__list"
-      >
-        <div
-          class="decorator-context__decorator"
-        >
-          <div
-            class="decorator-context__decorator-header"
-          >
-            <div
-              class="decorator-context__decorator-header-info"
-            >
-              <div
-                class="decorator-item"
-              >
-                <img
-                  class="decorator-item__image"
-                  src="fake/url.png"
-                />
-                 
-                <div
-                  class="decorator-item__content"
-                >
-                  <div
-                    class="decorator-item__title"
-                  >
-                    
-      Fake decorator
-    
-                  </div>
-                   
-                  <div
-                    class="decorator-item__description"
-                  >
-                    
-      Fake decorator description
-    
-                  </div>
-                </div>
-              </div>
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-select"
-            >
-              <div
-                class="dropdown"
-              >
-                <a
-                  class="dropdown__selected"
-                >
-                  <i
-                    class="dropdown__selected-icon fas fa-filter"
-                  />
-                  
-    Fake value provider
-    
-                  <i
-                    class="dropdown__toggle-icon fas fa-caret-down"
-                  />
-                </a>
-                 
-              </div>
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-trash"
-            >
-              <a
-                class="decorator-context__decorator-header-trash-link"
-              >
-                <i
-                  class="fa fa-trash"
-                />
-              </a>
-            </div>
-          </div>
-           
-          <div>
-            fake_value_provider_form
-          </div>
-        </div>
-        <div
-          class="decorator-context__decorator"
-        >
-          <div
-            class="decorator-context__decorator-header"
-          >
-            <div
-              class="decorator-context__decorator-header-info"
-            >
-              <div
-                class="decorator-item"
-              >
-                <img
-                  class="decorator-item__image"
-                  src="fake/url.png"
-                />
-                 
-                <div
-                  class="decorator-item__content"
-                >
-                  <div
-                    class="decorator-item__title"
-                  >
-                    
-      Fake decorator
-    
-                  </div>
-                   
-                  <div
-                    class="decorator-item__description"
-                  >
-                    
-      Fake decorator description
-    
-                  </div>
-                </div>
-              </div>
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-select"
-              style="display: none;"
-            >
-              <!---->
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-trash"
-            >
-              <a
-                class="decorator-context__decorator-header-trash-link"
-              >
-                <i
-                  class="fa fa-trash"
-                />
-              </a>
-            </div>
-          </div>
-           
-          <div
-            class="value-provider-list value-provider-list--row"
-          >
-            <div
-              class="value-provider-list__item"
-            >
-              <div
-                class="value-provider-item"
-              >
-                <div
-                  class="value-provider-item__title"
-                >
-                  <i
-                    class="fa fa-fw fa-filter value-provider-item__icon"
-                  />
-                  
-    Fake value provider
-  
-                </div>
-                 
-                <div
-                  class="value-provider-item__description"
-                >
-                  
-    Fake value provider description.
-  
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-       
-      <div
-        class="decorator-context__footer"
-      >
-        <a
-          class="decorator-context__add"
-        >
-          <i
-            class="fas fa-plus"
-          />
-          
-        viewDecoratorContext.addDecorator
-      
-        </a>
-         
-      </div>
-    </div>
-  </div>
-  <div
-    class="context visibility-hidden"
-  >
-    <!---->
-  </div>
-  <div
-    class="context picker__context visibility-hidden"
-  >
-    <!---->
-  </div>
-  <div
-    class="context"
-  >
-    <div
-      class="decorator-list"
-    >
-      <div
-        class="decorator-list__item"
-      >
-        <div
-          class="decorator-item"
-        >
-          <img
-            class="decorator-item__image"
-            src="fake/url.png"
-          />
-           
-          <div
-            class="decorator-item__content"
-          >
-            <div
-              class="decorator-item__title"
-            >
-              
-      Fake decorator
-    
-            </div>
-             
-            <div
-              class="decorator-item__description"
-            >
-              
-      Fake decorator description
-    
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
 </body>
 `;
 
@@ -447,253 +150,6 @@ exports[`GridViewRows component with decoration Should show unavailable decorato
       </div>
     </div>
   </div>
-  <div
-    class="context"
-  >
-    <div
-      class="decorator-context"
-    >
-      <div
-        class="decorator-context__list"
-      >
-        <div
-          class="decorator-context__decorator"
-        >
-          <div
-            class="decorator-context__decorator-header"
-          >
-            <div
-              class="decorator-context__decorator-header-info"
-            >
-              <div
-                class="decorator-item"
-              >
-                <img
-                  class="decorator-item__image"
-                  src="fake/url.png"
-                />
-                 
-                <div
-                  class="decorator-item__content"
-                >
-                  <div
-                    class="decorator-item__title"
-                  >
-                    
-      Fake decorator
-    
-                  </div>
-                   
-                  <div
-                    class="decorator-item__description"
-                  >
-                    
-      Fake decorator description
-    
-                  </div>
-                </div>
-              </div>
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-select"
-            >
-              <div
-                class="dropdown"
-              >
-                <a
-                  class="dropdown__selected"
-                >
-                  <i
-                    class="dropdown__selected-icon fas fa-filter"
-                  />
-                  
-    Fake value provider
-    
-                  <i
-                    class="dropdown__toggle-icon fas fa-caret-down"
-                  />
-                </a>
-                 
-              </div>
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-trash"
-            >
-              <a
-                class="decorator-context__decorator-header-trash-link"
-              >
-                <i
-                  class="fa fa-trash"
-                />
-              </a>
-            </div>
-          </div>
-           
-          <div>
-            fake_value_provider_form
-          </div>
-        </div>
-        <div
-          class="decorator-context__decorator"
-        >
-          <div
-            class="decorator-context__decorator-header"
-          >
-            <div
-              class="decorator-context__decorator-header-info"
-            >
-              <div
-                class="decorator-item"
-              >
-                <img
-                  class="decorator-item__image"
-                  src="fake/url.png"
-                />
-                 
-                <div
-                  class="decorator-item__content"
-                >
-                  <div
-                    class="decorator-item__title"
-                  >
-                    
-      Fake decorator
-    
-                  </div>
-                   
-                  <div
-                    class="decorator-item__description"
-                  >
-                    
-      Fake decorator description
-    
-                  </div>
-                </div>
-              </div>
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-select"
-              style="display: none;"
-            >
-              <!---->
-            </div>
-             
-            <div
-              class="decorator-context__decorator-header-trash"
-            >
-              <a
-                class="decorator-context__decorator-header-trash-link"
-              >
-                <i
-                  class="fa fa-trash"
-                />
-              </a>
-            </div>
-          </div>
-           
-          <div
-            class="value-provider-list value-provider-list--row"
-          >
-            <div
-              class="value-provider-list__item"
-            >
-              <div
-                class="value-provider-item"
-              >
-                <div
-                  class="value-provider-item__title"
-                >
-                  <i
-                    class="fa fa-fw fa-filter value-provider-item__icon"
-                  />
-                  
-    Fake value provider
-  
-                </div>
-                 
-                <div
-                  class="value-provider-item__description"
-                >
-                  
-    Fake value provider description.
-  
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-      </div>
-       
-      <div
-        class="decorator-context__footer"
-      >
-        <a
-          class="decorator-context__add"
-        >
-          <i
-            class="fas fa-plus"
-          />
-          
-        viewDecoratorContext.addDecorator
-      
-        </a>
-         
-      </div>
-    </div>
-  </div>
-  <div
-    class="context visibility-hidden"
-  >
-    <!---->
-  </div>
-  <div
-    class="context picker__context visibility-hidden"
-  >
-    <!---->
-  </div>
-  <div
-    class="context"
-  >
-    <div
-      class="decorator-list"
-    >
-      <div
-        class="decorator-list__item"
-      >
-        <div
-          class="decorator-item"
-        >
-          <img
-            class="decorator-item__image"
-            src="fake/url.png"
-          />
-           
-          <div
-            class="decorator-item__content"
-          >
-            <div
-              class="decorator-item__title"
-            >
-              
-      Fake decorator
-    
-            </div>
-             
-            <div
-              class="decorator-item__description"
-            >
-              
-      Fake decorator description
-    
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-  </div>
 </body>
 `;
 
diff --git a/web-frontend/test/unit/database/components/view/gallery/__snapshots__/galleryViewDecoration.spec.js.snap b/web-frontend/test/unit/database/components/view/gallery/__snapshots__/galleryViewDecoration.spec.js.snap
new file mode 100644
index 000000000..a5795185e
--- /dev/null
+++ b/web-frontend/test/unit/database/components/view/gallery/__snapshots__/galleryViewDecoration.spec.js.snap
@@ -0,0 +1,251 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`GalleryView component with decoration Default component with first_cell decoration 1`] = `
+<div
+  class="gallery-view"
+>
+  <a
+    class="gallery-view__add"
+  >
+    <i
+      class="fas fa-plus"
+    />
+  </a>
+   
+  <div
+    class="gallery-view__scroll"
+  >
+    <div
+      class="gallery-view__cards"
+      style="height: 410px;"
+    >
+      <div
+        class="card gallery-view__card"
+        style="width: -60px; transform: translateX(30px) translateY(30px);"
+      >
+        <!---->
+         
+        <div
+          class="card__content"
+        >
+          <div>
+            fake_decoration: fake_value
+          </div>
+          <div>
+            fake_decoration: fake_value
+          </div>
+           
+          <div
+            class="card__fields"
+          >
+            <div
+              class="card__field"
+            >
+              <div
+                class="card__field-name"
+              >
+                Name
+              </div>
+               
+              <div
+                class="card__field-value"
+              >
+                <div
+                  class="card-text"
+                >
+                  
+  first
+
+                </div>
+              </div>
+            </div>
+            <div
+              class="card__field"
+            >
+              <div
+                class="card__field-name"
+              >
+                Surname
+              </div>
+               
+              <div
+                class="card__field-value"
+              >
+                <div
+                  class="card-text"
+                >
+                  
+  Bram
+
+                </div>
+              </div>
+            </div>
+            <div
+              class="card__field"
+            >
+              <div
+                class="card__field-name"
+              >
+                Address
+              </div>
+               
+              <div
+                class="card__field-value"
+              >
+                <div
+                  class="card-text"
+                >
+                  
+  
+
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+   
+   
+</div>
+`;
+
+exports[`GalleryView component with decoration Default component with row wrapper decoration 1`] = `
+<div
+  class="gallery-view"
+>
+  <a
+    class="gallery-view__add"
+  >
+    <i
+      class="fas fa-plus"
+    />
+  </a>
+   
+  <div
+    class="gallery-view__scroll"
+  >
+    <div
+      class="gallery-view__cards"
+      style="height: 410px;"
+    >
+      <div
+        class="card gallery-view__card"
+        style="width: -60px; transform: translateX(30px) translateY(30px);"
+      >
+        <div
+          class="test-wrapper"
+        />
+      </div>
+    </div>
+  </div>
+   
+   
+</div>
+`;
+
+exports[`GalleryView component with decoration Default component with unavailable decoration 1`] = `
+<div
+  class="gallery-view"
+>
+  <a
+    class="gallery-view__add"
+  >
+    <i
+      class="fas fa-plus"
+    />
+  </a>
+   
+  <div
+    class="gallery-view__scroll"
+  >
+    <div
+      class="gallery-view__cards"
+      style="height: 410px;"
+    >
+      <div
+        class="card gallery-view__card"
+        style="width: -60px; transform: translateX(30px) translateY(30px);"
+      >
+        <!---->
+         
+        <div
+          class="card__content"
+        >
+           
+          <div
+            class="card__fields"
+          >
+            <div
+              class="card__field"
+            >
+              <div
+                class="card__field-name"
+              >
+                Name
+              </div>
+               
+              <div
+                class="card__field-value"
+              >
+                <div
+                  class="card-text"
+                >
+                  
+  first
+
+                </div>
+              </div>
+            </div>
+            <div
+              class="card__field"
+            >
+              <div
+                class="card__field-name"
+              >
+                Surname
+              </div>
+               
+              <div
+                class="card__field-value"
+              >
+                <div
+                  class="card-text"
+                >
+                  
+  Bram
+
+                </div>
+              </div>
+            </div>
+            <div
+              class="card__field"
+            >
+              <div
+                class="card__field-name"
+              >
+                Address
+              </div>
+               
+              <div
+                class="card__field-value"
+              >
+                <div
+                  class="card-text"
+                >
+                  
+  
+
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+   
+   
+</div>
+`;
diff --git a/web-frontend/test/unit/database/components/view/gallery/galleryViewDecoration.spec.js b/web-frontend/test/unit/database/components/view/gallery/galleryViewDecoration.spec.js
new file mode 100644
index 000000000..f1a1ee00b
--- /dev/null
+++ b/web-frontend/test/unit/database/components/view/gallery/galleryViewDecoration.spec.js
@@ -0,0 +1,252 @@
+import { TestApp } from '@baserow/test/helpers/testApp'
+import GalleryView from '@baserow/modules/database/components/view/gallery/GalleryView'
+import { DecoratorValueProviderType } from '@baserow/modules/database/decoratorValueProviders'
+import { ViewDecoratorType } from '@baserow/modules/database/viewDecorators'
+
+export class FakeDecoratorType extends ViewDecoratorType {
+  static getType() {
+    return 'fake_decorator'
+  }
+
+  getPlace() {
+    return 'first_cell'
+  }
+
+  isDeactivated({ view }) {
+    return false
+  }
+
+  getComponent() {
+    const component = {
+      functional: true,
+
+      render(h, ctx) {
+        return h('div', `fake_decoration: ${ctx.props.value}`)
+      },
+    }
+    return component
+  }
+}
+
+export class FakeValueProviderType extends DecoratorValueProviderType {
+  static getType() {
+    return 'fake_value_provider_type'
+  }
+
+  getValue({ options, fields, row }) {
+    return 'fake_value'
+  }
+
+  getFormComponent() {
+    const component = {
+      functional: true,
+
+      render(h) {
+        return h('div', 'fake_value_provider_form')
+      },
+    }
+    return component
+  }
+}
+
+const fieldData = [
+  {
+    id: 1,
+    name: 'Name',
+    order: 0,
+    type: 'text',
+    primary: true,
+    text_default: '',
+  },
+  {
+    id: 2,
+    name: 'Surname',
+    type: 'text',
+    text_default: '',
+    primary: false,
+  },
+  {
+    id: 3,
+    name: 'Address',
+    type: 'text',
+    text_default: '',
+    primary: false,
+  },
+]
+
+const rows = [
+  {
+    id: 2,
+    order: '2.00000000000000000000',
+    field_1: 'first',
+    field_2: 'Bram',
+  },
+  {
+    id: 4,
+    order: '2.50000000000000000000',
+    field_1: 'second',
+    field_2: 'foo',
+    field_3: 'bar',
+  },
+]
+
+describe('GalleryView component with decoration', () => {
+  let testApp = null
+  let mockServer = null
+  let store = null
+
+  beforeAll(() => {
+    testApp = new TestApp()
+    store = testApp.store
+    mockServer = testApp.mockServer
+  })
+
+  afterEach((done) => {
+    testApp.afterEach().then(done)
+    // Clean up potentially registered stuff
+    try {
+      store.$registry.unregister('viewDecorator', 'fake_decorator')
+    } catch {}
+    try {
+      store.$registry.unregister(
+        'decoratorValueProvider',
+        'fake_value_provider_type'
+      )
+    } catch {}
+  })
+
+  const mountComponent = (props, slots = {}) => {
+    return testApp.mount(GalleryView, { propsData: props, slots })
+  }
+
+  const populateStore = async (decorations) => {
+    const table = mockServer.createTable()
+    const { application } = await mockServer.createAppAndGroup(table)
+    const view = mockServer.createGalleryView(application, table, {
+      decorations,
+    })
+    mockServer.createFields(application, table, fieldData)
+    await store.dispatch('field/fetchAll', table)
+    const primary = store.getters['field/getPrimary']
+    const fields = store.getters['field/getAll']
+
+    mockServer.createGalleryRows(view, fields, rows)
+    await store.dispatch('page/view/gallery/fetchInitial', {
+      viewId: 1,
+      fields,
+      primary,
+    })
+    await store.dispatch('view/fetchAll', { id: 1 })
+
+    return { table, primary, fields, view }
+  }
+
+  test('Default component with first_cell decoration', async () => {
+    const { table, primary, fields, view } = await populateStore([
+      {
+        type: 'fake_decorator',
+        value_provider_type: 'fake_value_provider_type',
+        value_provider_conf: {},
+      },
+      {
+        type: 'fake_decorator',
+        value_provider_type: 'fake_value_provider_type',
+        value_provider_conf: {},
+      },
+    ])
+
+    const fakeDecorator = new FakeDecoratorType({ app: testApp })
+    const fakeValueProvider = new FakeValueProviderType({ app: testApp })
+
+    store.$registry.register('viewDecorator', fakeDecorator)
+    store.$registry.register('decoratorValueProvider', fakeValueProvider)
+
+    const wrapper1 = await mountComponent({
+      table,
+      view,
+      primary,
+      fields,
+      readOnly: false,
+      storePrefix: 'page/',
+    })
+
+    expect(wrapper1.element).toMatchSnapshot()
+  })
+
+  test('Default component with row wrapper decoration', async () => {
+    const { table, primary, fields, view } = await populateStore([
+      {
+        type: 'fake_decorator',
+        value_provider_type: 'fake_value_provider_type',
+        value_provider_conf: {},
+      },
+      {
+        type: 'fake_decorator',
+        value_provider_type: 'fake_value_provider_type',
+        value_provider_conf: {},
+      },
+    ])
+
+    const fakeDecorator = new FakeDecoratorType({ app: testApp })
+    const fakeValueProvider = new FakeValueProviderType({ app: testApp })
+
+    fakeDecorator.getPlace = () => 'wrapper'
+    fakeDecorator.getComponent = () => {
+      const component = {
+        functional: true,
+
+        render(h, ctx) {
+          return h(
+            'div',
+            { class: { 'test-wrapper': true } },
+            ctx.slots().default
+          )
+        },
+      }
+      return component
+    }
+
+    store.$registry.register('viewDecorator', fakeDecorator)
+    store.$registry.register('decoratorValueProvider', fakeValueProvider)
+
+    const wrapper1 = await mountComponent({
+      table,
+      view,
+      primary,
+      fields,
+      readOnly: false,
+      storePrefix: 'page/',
+    })
+
+    expect(wrapper1.element).toMatchSnapshot()
+  })
+
+  test('Default component with unavailable decoration', async () => {
+    const { table, primary, fields, view } = await populateStore([
+      {
+        type: 'fake_decorator',
+        value_provider_type: 'fake_value_provider_type',
+        value_provider_conf: {},
+      },
+    ])
+
+    const fakeDecorator = new FakeDecoratorType({ app: testApp })
+    const fakeValueProvider = new FakeValueProviderType({ app: testApp })
+
+    fakeDecorator.isDeactivated = () => true
+
+    store.$registry.register('viewDecorator', fakeDecorator)
+    store.$registry.register('decoratorValueProvider', fakeValueProvider)
+
+    const wrapper1 = await mountComponent({
+      table,
+      view,
+      primary,
+      fields,
+      readOnly: false,
+      storePrefix: 'page/',
+    })
+
+    expect(wrapper1.element).toMatchSnapshot()
+  })
+})
diff --git a/web-frontend/test/unit/database/components/view/grid/__snapshots__/gridViewDecoration.spec.js.snap b/web-frontend/test/unit/database/components/view/grid/__snapshots__/gridViewDecoration.spec.js.snap
new file mode 100644
index 000000000..84e28bae6
--- /dev/null
+++ b/web-frontend/test/unit/database/components/view/grid/__snapshots__/gridViewDecoration.spec.js.snap
@@ -0,0 +1,1311 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`GridView component with decoration Default component with first_cell decoration 1`] = `
+<div
+  class="grid-view"
+>
+  <div
+    class="scrollbars"
+    style="left: 270px;"
+  >
+    <!---->
+     
+    <!---->
+  </div>
+   
+  <div
+    class="grid-view__left"
+    style="width: 270px;"
+  >
+    <div
+      class="grid-view__inner"
+      style="min-width: 270px;"
+    >
+      <div
+        class="grid-view__head"
+      >
+        <div
+          class="grid-view__column"
+          style="width: 70px;"
+        />
+         
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Name
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <!---->
+          </div>
+        </div>
+         
+        <!---->
+      </div>
+       
+      <div
+        class="grid-view__body"
+      >
+        <div
+          class="grid-view__body-inner"
+        >
+          <div
+            class="grid-view__placeholder"
+            style="height: 66px; width: 270px;"
+          >
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 199px;"
+            />
+          </div>
+           
+          <div
+            class="grid-view__rows"
+            style="transform: translateY(0px) translateX(0px);"
+          >
+            <div
+              class="grid-view__row"
+            >
+              <!---->
+               
+              <div
+                class="grid-view__column"
+                style="width: 70px;"
+              >
+                <div
+                  class="grid-view__row-info"
+                >
+                  <div
+                    class="grid-view__row-count"
+                    title="2"
+                  >
+                    
+            2
+          
+                  </div>
+                   
+                  <div
+                    class="grid-view__row-drag"
+                  />
+                   
+                  <a
+                    class="grid-view__row-more"
+                  >
+                    <i
+                      class="fas fa-expand"
+                    />
+                  </a>
+                   
+                  <div>
+                    fake_decoration: fake_value
+                  </div>
+                  <div>
+                    fake_decoration: fake_value
+                  </div>
+                </div>
+              </div>
+               
+              <div
+                class="grid-view__column"
+                style="width: 200px;"
+              >
+                <div
+                  class="grid-view__cell"
+                >
+                  <div
+                    class="grid-field-text"
+                  >
+                    first
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+           
+          <div
+            class="grid-view__row"
+            style="width: 270px;"
+          >
+            <div
+              class="grid-view__column"
+              style="width: 270px;"
+            >
+              <a
+                class="grid-view__add-row"
+              >
+                <i
+                  class="fas fa-plus"
+                />
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__foot"
+      >
+        <div
+          class="grid-view__foot-info"
+        >
+          
+        gridView.rowCount - 2
+      
+        </div>
+         
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+      </div>
+    </div>
+     
+    <div
+      style="display: none;"
+    >
+      <div
+        class="grid-view__field-dragging"
+        style="width: 0px; left: 0px;"
+      />
+       
+      <div
+        class="grid-view__field-target"
+        style="left: 0px;"
+      />
+    </div>
+  </div>
+   
+  <div
+    class="grid-view__divider"
+    style="left: 270px;"
+  />
+   
+  <div
+    class="grid-view__divider-width"
+    style="left: 270px;"
+  />
+   
+  <div
+    class="grid-view__right"
+    style="left: 270px;"
+  >
+    <div
+      class="grid-view__inner"
+      style="min-width: 600px;"
+    >
+      <div
+        class="grid-view__head"
+      >
+        <!---->
+         
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Surname
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <div
+              class="grid-view__description-width"
+            />
+          </div>
+        </div>
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Address
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <div
+              class="grid-view__description-width"
+            />
+          </div>
+        </div>
+         
+        <div
+          class="grid-view__column"
+          style="width: 100px;"
+        >
+          <a
+            class="grid-view__add-column"
+          >
+            <i
+              class="fas fa-plus"
+            />
+          </a>
+           
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__body"
+      >
+        <div
+          class="grid-view__body-inner"
+        >
+          <div
+            class="grid-view__placeholder"
+            style="height: 66px; width: 400px;"
+          >
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 199px;"
+            />
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 399px;"
+            />
+          </div>
+           
+          <div
+            class="grid-view__rows"
+            style="transform: translateY(0px) translateX(0px);"
+          >
+            <div
+              class="grid-view__row"
+            >
+              <!---->
+               
+              <div
+                class="grid-view__column"
+                style="width: 200px;"
+              >
+                <div
+                  class="grid-view__cell"
+                >
+                  <div
+                    class="grid-field-text"
+                  >
+                    Bram
+                  </div>
+                </div>
+              </div>
+              <div
+                class="grid-view__column"
+                style="width: 200px;"
+              >
+                <div
+                  class="grid-view__cell"
+                >
+                  <div
+                    class="grid-field-text"
+                  >
+                    
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+           
+          <div
+            class="grid-view__row"
+            style="width: 400px;"
+          >
+            <div
+              class="grid-view__column"
+              style="width: 400px;"
+            >
+              <a
+                class="grid-view__add-row"
+              >
+                <!---->
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__foot"
+      >
+         
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+      </div>
+    </div>
+     
+    <div
+      style="display: none;"
+    >
+      <div
+        class="grid-view__field-dragging"
+        style="width: 0px; left: 0px;"
+      />
+       
+      <div
+        class="grid-view__field-target"
+        style="left: 0px;"
+      />
+    </div>
+  </div>
+   
+  <div
+    class="grid-view__row-dragging-container"
+    style="display: none;"
+  >
+    <div
+      class="grid-view__row-dragging"
+      style="width: 670px; top: 0px;"
+    />
+     
+    <div
+      class="grid-view__row-target"
+      style="width: 670px; top: 0px;"
+    />
+  </div>
+   
+   
+</div>
+`;
+
+exports[`GridView component with decoration Default component with row wrapper decoration 1`] = `
+<div
+  class="grid-view"
+>
+  <div
+    class="scrollbars"
+    style="left: 270px;"
+  >
+    <!---->
+     
+    <!---->
+  </div>
+   
+  <div
+    class="grid-view__left"
+    style="width: 270px;"
+  >
+    <div
+      class="grid-view__inner"
+      style="min-width: 270px;"
+    >
+      <div
+        class="grid-view__head"
+      >
+        <div
+          class="grid-view__column"
+          style="width: 70px;"
+        />
+         
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Name
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <!---->
+          </div>
+        </div>
+         
+        <!---->
+      </div>
+       
+      <div
+        class="grid-view__body"
+      >
+        <div
+          class="grid-view__body-inner"
+        >
+          <div
+            class="grid-view__placeholder"
+            style="height: 66px; width: 270px;"
+          >
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 199px;"
+            />
+          </div>
+           
+          <div
+            class="grid-view__rows"
+            style="transform: translateY(0px) translateX(0px);"
+          >
+            <div
+              class="test-wrapper"
+            />
+          </div>
+           
+          <div
+            class="grid-view__row"
+            style="width: 270px;"
+          >
+            <div
+              class="grid-view__column"
+              style="width: 270px;"
+            >
+              <a
+                class="grid-view__add-row"
+              >
+                <i
+                  class="fas fa-plus"
+                />
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__foot"
+      >
+        <div
+          class="grid-view__foot-info"
+        >
+          
+        gridView.rowCount - 2
+      
+        </div>
+         
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+      </div>
+    </div>
+     
+    <div
+      style="display: none;"
+    >
+      <div
+        class="grid-view__field-dragging"
+        style="width: 0px; left: 0px;"
+      />
+       
+      <div
+        class="grid-view__field-target"
+        style="left: 0px;"
+      />
+    </div>
+  </div>
+   
+  <div
+    class="grid-view__divider"
+    style="left: 270px;"
+  />
+   
+  <div
+    class="grid-view__divider-width"
+    style="left: 270px;"
+  />
+   
+  <div
+    class="grid-view__right"
+    style="left: 270px;"
+  >
+    <div
+      class="grid-view__inner"
+      style="min-width: 600px;"
+    >
+      <div
+        class="grid-view__head"
+      >
+        <!---->
+         
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Surname
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <div
+              class="grid-view__description-width"
+            />
+          </div>
+        </div>
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Address
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <div
+              class="grid-view__description-width"
+            />
+          </div>
+        </div>
+         
+        <div
+          class="grid-view__column"
+          style="width: 100px;"
+        >
+          <a
+            class="grid-view__add-column"
+          >
+            <i
+              class="fas fa-plus"
+            />
+          </a>
+           
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__body"
+      >
+        <div
+          class="grid-view__body-inner"
+        >
+          <div
+            class="grid-view__placeholder"
+            style="height: 66px; width: 400px;"
+          >
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 199px;"
+            />
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 399px;"
+            />
+          </div>
+           
+          <div
+            class="grid-view__rows"
+            style="transform: translateY(0px) translateX(0px);"
+          >
+            <div
+              class="test-wrapper"
+            />
+          </div>
+           
+          <div
+            class="grid-view__row"
+            style="width: 400px;"
+          >
+            <div
+              class="grid-view__column"
+              style="width: 400px;"
+            >
+              <a
+                class="grid-view__add-row"
+              >
+                <!---->
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__foot"
+      >
+         
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+      </div>
+    </div>
+     
+    <div
+      style="display: none;"
+    >
+      <div
+        class="grid-view__field-dragging"
+        style="width: 0px; left: 0px;"
+      />
+       
+      <div
+        class="grid-view__field-target"
+        style="left: 0px;"
+      />
+    </div>
+  </div>
+   
+  <div
+    class="grid-view__row-dragging-container"
+    style="display: none;"
+  >
+    <div
+      class="grid-view__row-dragging"
+      style="width: 670px; top: 0px;"
+    />
+     
+    <div
+      class="grid-view__row-target"
+      style="width: 670px; top: 0px;"
+    />
+  </div>
+   
+   
+</div>
+`;
+
+exports[`GridView component with decoration Default component with unavailable decoration 1`] = `
+<div
+  class="grid-view"
+>
+  <div
+    class="scrollbars"
+    style="left: 270px;"
+  >
+    <!---->
+     
+    <!---->
+  </div>
+   
+  <div
+    class="grid-view__left"
+    style="width: 270px;"
+  >
+    <div
+      class="grid-view__inner"
+      style="min-width: 270px;"
+    >
+      <div
+        class="grid-view__head"
+      >
+        <div
+          class="grid-view__column"
+          style="width: 70px;"
+        />
+         
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Name
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <!---->
+          </div>
+        </div>
+         
+        <!---->
+      </div>
+       
+      <div
+        class="grid-view__body"
+      >
+        <div
+          class="grid-view__body-inner"
+        >
+          <div
+            class="grid-view__placeholder"
+            style="height: 66px; width: 270px;"
+          >
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 199px;"
+            />
+          </div>
+           
+          <div
+            class="grid-view__rows"
+            style="transform: translateY(0px) translateX(0px);"
+          >
+            <div
+              class="grid-view__row"
+            >
+              <!---->
+               
+              <div
+                class="grid-view__column"
+                style="width: 70px;"
+              >
+                <div
+                  class="grid-view__row-info"
+                >
+                  <div
+                    class="grid-view__row-count"
+                    title="2"
+                  >
+                    
+            2
+          
+                  </div>
+                   
+                  <div
+                    class="grid-view__row-drag"
+                  />
+                   
+                  <a
+                    class="grid-view__row-more"
+                  >
+                    <i
+                      class="fas fa-expand"
+                    />
+                  </a>
+                   
+                </div>
+              </div>
+               
+              <div
+                class="grid-view__column"
+                style="width: 200px;"
+              >
+                <div
+                  class="grid-view__cell"
+                >
+                  <div
+                    class="grid-field-text"
+                  >
+                    first
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+           
+          <div
+            class="grid-view__row"
+            style="width: 270px;"
+          >
+            <div
+              class="grid-view__column"
+              style="width: 270px;"
+            >
+              <a
+                class="grid-view__add-row"
+              >
+                <i
+                  class="fas fa-plus"
+                />
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__foot"
+      >
+        <div
+          class="grid-view__foot-info"
+        >
+          
+        gridView.rowCount - 2
+      
+        </div>
+         
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+      </div>
+    </div>
+     
+    <div
+      style="display: none;"
+    >
+      <div
+        class="grid-view__field-dragging"
+        style="width: 0px; left: 0px;"
+      />
+       
+      <div
+        class="grid-view__field-target"
+        style="left: 0px;"
+      />
+    </div>
+  </div>
+   
+  <div
+    class="grid-view__divider"
+    style="left: 270px;"
+  />
+   
+  <div
+    class="grid-view__divider-width"
+    style="left: 270px;"
+  />
+   
+  <div
+    class="grid-view__right"
+    style="left: 270px;"
+  >
+    <div
+      class="grid-view__inner"
+      style="min-width: 600px;"
+    >
+      <div
+        class="grid-view__head"
+      >
+        <!---->
+         
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Surname
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <div
+              class="grid-view__description-width"
+            />
+          </div>
+        </div>
+        <div
+          class="grid-view__column"
+          filters=""
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view__description"
+          >
+            <div
+              class="grid-view__description-icon"
+            >
+              <i
+                class="fas fa-font"
+              />
+            </div>
+             
+            <div
+              class="grid-view__description-name"
+            >
+              
+      Address
+    
+            </div>
+             
+            <!---->
+             
+            <a
+              class="grid-view__description-options"
+            >
+              <i
+                class="fas fa-caret-down"
+              />
+            </a>
+             
+             
+            <div
+              class="grid-view__description-width"
+            />
+          </div>
+        </div>
+         
+        <div
+          class="grid-view__column"
+          style="width: 100px;"
+        >
+          <a
+            class="grid-view__add-column"
+          >
+            <i
+              class="fas fa-plus"
+            />
+          </a>
+           
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__body"
+      >
+        <div
+          class="grid-view__body-inner"
+        >
+          <div
+            class="grid-view__placeholder"
+            style="height: 66px; width: 400px;"
+          >
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 199px;"
+            />
+            <div
+              class="grid-view__placeholder-column"
+              style="left: 399px;"
+            />
+          </div>
+           
+          <div
+            class="grid-view__rows"
+            style="transform: translateY(0px) translateX(0px);"
+          >
+            <div
+              class="grid-view__row"
+            >
+              <!---->
+               
+              <div
+                class="grid-view__column"
+                style="width: 200px;"
+              >
+                <div
+                  class="grid-view__cell"
+                >
+                  <div
+                    class="grid-field-text"
+                  >
+                    Bram
+                  </div>
+                </div>
+              </div>
+              <div
+                class="grid-view__column"
+                style="width: 200px;"
+              >
+                <div
+                  class="grid-view__cell"
+                >
+                  <div
+                    class="grid-field-text"
+                  >
+                    
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+           
+          <div
+            class="grid-view__row"
+            style="width: 400px;"
+          >
+            <div
+              class="grid-view__column"
+              style="width: 400px;"
+            >
+              <a
+                class="grid-view__add-row"
+              >
+                <!---->
+              </a>
+            </div>
+          </div>
+        </div>
+      </div>
+       
+      <div
+        class="grid-view__foot"
+      >
+         
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+        <div
+          style="width: 200px;"
+        >
+          <div
+            class="grid-view-aggregation"
+          >
+            <!---->
+             
+          </div>
+        </div>
+      </div>
+    </div>
+     
+    <div
+      style="display: none;"
+    >
+      <div
+        class="grid-view__field-dragging"
+        style="width: 0px; left: 0px;"
+      />
+       
+      <div
+        class="grid-view__field-target"
+        style="left: 0px;"
+      />
+    </div>
+  </div>
+   
+  <div
+    class="grid-view__row-dragging-container"
+    style="display: none;"
+  >
+    <div
+      class="grid-view__row-dragging"
+      style="width: 670px; top: 0px;"
+    />
+     
+    <div
+      class="grid-view__row-target"
+      style="width: 670px; top: 0px;"
+    />
+  </div>
+   
+   
+</div>
+`;
diff --git a/web-frontend/test/unit/database/components/view/grid/__snapshots__/gridViewRowsDecoration.spec.js.snap b/web-frontend/test/unit/database/components/view/grid/__snapshots__/gridViewRowsDecoration.spec.js.snap
deleted file mode 100644
index b54d1dd38..000000000
--- a/web-frontend/test/unit/database/components/view/grid/__snapshots__/gridViewRowsDecoration.spec.js.snap
+++ /dev/null
@@ -1,303 +0,0 @@
-// Jest Snapshot v1, https://goo.gl/fbAQLP
-
-exports[`GridViewRows component with decoration Default component with firs_cell decoration 1`] = `
-<div
-  class="grid-view__rows"
-  style="transform: translateY(0px) translateX(0px);"
->
-  <div
-    class="grid-view__row"
-  >
-    <!---->
-     
-    <div
-      class="grid-view__column"
-      style="width: 70px;"
-    >
-      <div
-        class="grid-view__row-info"
-      >
-        <div
-          class="grid-view__row-count"
-          title="2"
-        >
-          
-            2
-          
-        </div>
-         
-        <div
-          class="grid-view__row-drag"
-        />
-         
-        <a
-          class="grid-view__row-more"
-        >
-          <i
-            class="fas fa-expand"
-          />
-        </a>
-         
-        <div>
-          fake_decoration: fake_value
-        </div>
-        <div>
-          fake_decoration: fake_value
-        </div>
-      </div>
-    </div>
-     
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          Bram
-        </div>
-      </div>
-    </div>
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          
-        </div>
-      </div>
-    </div>
-  </div>
-  <div
-    class="grid-view__row"
-  >
-    <!---->
-     
-    <div
-      class="grid-view__column"
-      style="width: 70px;"
-    >
-      <div
-        class="grid-view__row-info"
-      >
-        <div
-          class="grid-view__row-count"
-          title="4"
-        >
-          
-            4
-          
-        </div>
-         
-        <div
-          class="grid-view__row-drag"
-        />
-         
-        <a
-          class="grid-view__row-more"
-        >
-          <i
-            class="fas fa-expand"
-          />
-        </a>
-         
-        <div>
-          fake_decoration: fake_value
-        </div>
-        <div>
-          fake_decoration: fake_value
-        </div>
-      </div>
-    </div>
-     
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          foo
-        </div>
-      </div>
-    </div>
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          bar
-        </div>
-      </div>
-    </div>
-  </div>
-</div>
-`;
-
-exports[`GridViewRows component with decoration Default component with row wrapper decoration 1`] = `
-<div
-  class="grid-view__rows"
-  style="transform: translateY(0px) translateX(0px);"
->
-  <div
-    class="testWrapper"
-  />
-  <div
-    class="testWrapper"
-  />
-</div>
-`;
-
-exports[`GridViewRows component with decoration Default component with unavailable decoration 1`] = `
-<div
-  class="grid-view__rows"
-  style="transform: translateY(0px) translateX(0px);"
->
-  <div
-    class="grid-view__row"
-  >
-    <!---->
-     
-    <div
-      class="grid-view__column"
-      style="width: 70px;"
-    >
-      <div
-        class="grid-view__row-info"
-      >
-        <div
-          class="grid-view__row-count"
-          title="2"
-        >
-          
-            2
-          
-        </div>
-         
-        <div
-          class="grid-view__row-drag"
-        />
-         
-        <a
-          class="grid-view__row-more"
-        >
-          <i
-            class="fas fa-expand"
-          />
-        </a>
-         
-      </div>
-    </div>
-     
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          Bram
-        </div>
-      </div>
-    </div>
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          
-        </div>
-      </div>
-    </div>
-  </div>
-  <div
-    class="grid-view__row"
-  >
-    <!---->
-     
-    <div
-      class="grid-view__column"
-      style="width: 70px;"
-    >
-      <div
-        class="grid-view__row-info"
-      >
-        <div
-          class="grid-view__row-count"
-          title="4"
-        >
-          
-            4
-          
-        </div>
-         
-        <div
-          class="grid-view__row-drag"
-        />
-         
-        <a
-          class="grid-view__row-more"
-        >
-          <i
-            class="fas fa-expand"
-          />
-        </a>
-         
-      </div>
-    </div>
-     
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          foo
-        </div>
-      </div>
-    </div>
-    <div
-      class="grid-view__column"
-      style="width: 200px;"
-    >
-      <div
-        class="grid-view__cell"
-      >
-        <div
-          class="grid-field-text"
-        >
-          bar
-        </div>
-      </div>
-    </div>
-  </div>
-</div>
-`;
diff --git a/web-frontend/test/unit/database/components/view/grid/gridViewRowsDecoration.spec.js b/web-frontend/test/unit/database/components/view/grid/gridViewDecoration.spec.js
similarity index 75%
rename from web-frontend/test/unit/database/components/view/grid/gridViewRowsDecoration.spec.js
rename to web-frontend/test/unit/database/components/view/grid/gridViewDecoration.spec.js
index 5dc960ede..2bb9edcf4 100644
--- a/web-frontend/test/unit/database/components/view/grid/gridViewRowsDecoration.spec.js
+++ b/web-frontend/test/unit/database/components/view/grid/gridViewDecoration.spec.js
@@ -1,5 +1,5 @@
 import { TestApp } from '@baserow/test/helpers/testApp'
-import GridViewRows from '@baserow/modules/database/components/view/grid/GridViewRows'
+import GridView from '@baserow/modules/database/components/view/grid/GridView'
 import { DecoratorValueProviderType } from '@baserow/modules/database/decoratorValueProviders'
 import { ViewDecoratorType } from '@baserow/modules/database/viewDecorators'
 
@@ -49,7 +49,48 @@ export class FakeValueProviderType extends DecoratorValueProviderType {
   }
 }
 
-describe('GridViewRows component with decoration', () => {
+const fieldData = [
+  {
+    id: 1,
+    name: 'Name',
+    order: 0,
+    type: 'text',
+    primary: true,
+    text_default: '',
+  },
+  {
+    id: 2,
+    name: 'Surname',
+    type: 'text',
+    text_default: '',
+    primary: false,
+  },
+  {
+    id: 3,
+    name: 'Address',
+    type: 'text',
+    text_default: '',
+    primary: false,
+  },
+]
+
+const rows = [
+  {
+    id: 2,
+    order: '2.00000000000000000000',
+    field_1: 'first',
+    field_2: 'Bram',
+  },
+  {
+    id: 4,
+    order: '2.50000000000000000000',
+    field_1: 'second',
+    field_2: 'foo',
+    field_3: 'bar',
+  },
+]
+
+describe('GridView component with decoration', () => {
   let testApp = null
   let mockServer = null
   let store = null
@@ -75,69 +116,32 @@ describe('GridViewRows component with decoration', () => {
   })
 
   const mountComponent = (props, slots = {}) => {
-    return testApp.mount(GridViewRows, { propsData: props, slots })
+    return testApp.mount(GridView, { propsData: props, slots })
   }
 
-  const primary = {
-    id: 1,
-    name: 'Name',
-    order: 0,
-    type: 'text',
-    primary: true,
-    text_default: '',
-    _: {
-      loading: false,
-    },
-  }
-
-  const fieldData = [
-    {
-      id: 2,
-      name: 'Surname',
-      type: 'text',
-      text_default: '',
-      primary: false,
-      _: {
-        loading: false,
-      },
-    },
-    {
-      id: 3,
-      name: 'Address',
-      type: 'text',
-      text_default: '',
-      primary: false,
-      _: {
-        loading: false,
-      },
-    },
-  ]
-
-  const rows = [
-    { id: 2, order: '2.00000000000000000000', field_2: 'Bram' },
-    { id: 4, order: '2.50000000000000000000', field_2: 'foo', field_3: 'bar' },
-  ]
-
   const populateStore = async (decorations) => {
     const table = mockServer.createTable()
     const { application } = await mockServer.createAppAndGroup(table)
     const view = mockServer.createGridView(application, table, {
       decorations,
     })
-    const fields = mockServer.createFields(application, table, fieldData)
+    mockServer.createFields(application, table, fieldData)
+    await store.dispatch('field/fetchAll', table)
+    const primary = store.getters['field/getPrimary']
+    const fields = store.getters['field/getAll']
 
-    mockServer.createRows(view, fields, rows)
+    mockServer.createGridRows(view, fields, rows)
     await store.dispatch('page/view/grid/fetchInitial', {
       gridId: 1,
       fields,
       primary,
     })
     await store.dispatch('view/fetchAll', { id: 1 })
-    return { table, fields, view }
+    return { table, primary, fields, view }
   }
 
-  test('Default component with firs_cell decoration', async () => {
-    const { fields, view } = await populateStore([
+  test('Default component with first_cell decoration', async () => {
+    const { table, primary, fields, view } = await populateStore([
       {
         type: 'fake_decorator',
         value_provider_type: 'fake_value_provider_type',
@@ -157,12 +161,11 @@ describe('GridViewRows component with decoration', () => {
     store.$registry.register('decoratorValueProvider', fakeValueProvider)
 
     const wrapper1 = await mountComponent({
+      table,
       view,
+      primary,
       fields,
-      allFields: fields,
-      leftOffset: 0,
       readOnly: false,
-      includeRowDetails: true,
       storePrefix: 'page/',
     })
 
@@ -170,7 +173,7 @@ describe('GridViewRows component with decoration', () => {
   })
 
   test('Default component with row wrapper decoration', async () => {
-    const { fields, view } = await populateStore([
+    const { table, primary, fields, view } = await populateStore([
       {
         type: 'fake_decorator',
         value_provider_type: 'fake_value_provider_type',
@@ -192,7 +195,11 @@ describe('GridViewRows component with decoration', () => {
         functional: true,
 
         render(h, ctx) {
-          return h('div', { class: { testWrapper: true } }, ctx.slots().default)
+          return h(
+            'div',
+            { class: { 'test-wrapper': true } },
+            ctx.slots().default
+          )
         },
       }
       return component
@@ -202,12 +209,11 @@ describe('GridViewRows component with decoration', () => {
     store.$registry.register('decoratorValueProvider', fakeValueProvider)
 
     const wrapper1 = await mountComponent({
+      table,
       view,
+      primary,
       fields,
-      allFields: fields,
-      leftOffset: 0,
       readOnly: false,
-      includeRowDetails: false,
       storePrefix: 'page/',
     })
 
@@ -215,7 +221,7 @@ describe('GridViewRows component with decoration', () => {
   })
 
   test('Default component with unavailable decoration', async () => {
-    const { fields, view } = await populateStore([
+    const { table, primary, fields, view } = await populateStore([
       {
         type: 'fake_decorator',
         value_provider_type: 'fake_value_provider_type',
@@ -232,12 +238,11 @@ describe('GridViewRows component with decoration', () => {
     store.$registry.register('decoratorValueProvider', fakeValueProvider)
 
     const wrapper1 = await mountComponent({
+      table,
       view,
+      primary,
       fields,
-      allFields: fields,
-      leftOffset: 0,
       readOnly: false,
-      includeRowDetails: true,
       storePrefix: 'page/',
     })
 
diff --git a/web-frontend/test/unit/database/components/view/grid/gridViewRows.spec.js b/web-frontend/test/unit/database/components/view/grid/gridViewRows.spec.js
index 37651e30b..07ff35e98 100644
--- a/web-frontend/test/unit/database/components/view/grid/gridViewRows.spec.js
+++ b/web-frontend/test/unit/database/components/view/grid/gridViewRows.spec.js
@@ -67,7 +67,7 @@ describe('GridViewRows component', () => {
     const view = mockServer.createGridView(application, table, {})
     const fields = mockServer.createFields(application, table, fieldData)
 
-    mockServer.createRows(view, fields, rows)
+    mockServer.createGridRows(view, fields, rows)
     await store.dispatch('page/view/grid/fetchInitial', {
       gridId: 1,
       fields,
diff --git a/web-frontend/test/unit/database/components/view/viewDecoratorContext.spec.js b/web-frontend/test/unit/database/components/view/viewDecoratorContext.spec.js
index 215bd6da7..893d6de95 100644
--- a/web-frontend/test/unit/database/components/view/viewDecoratorContext.spec.js
+++ b/web-frontend/test/unit/database/components/view/viewDecoratorContext.spec.js
@@ -32,6 +32,17 @@ export class FakeDecoratorType extends ViewDecoratorType {
     return 'unavailability reason'
   }
 
+  getComponent() {
+    const component = {
+      functional: true,
+
+      render(h, ctx) {
+        return h('div', `fake_decoration: ${ctx.props.value}`)
+      },
+    }
+    return component
+  }
+
   canAdd({ view }) {
     return [true]
   }
@@ -70,19 +81,51 @@ export class FakeValueProviderType extends DecoratorValueProviderType {
   }
 }
 
+const fieldData = [
+  {
+    id: 1,
+    name: 'Name',
+    order: 0,
+    type: 'text',
+    primary: true,
+    text_default: '',
+  },
+  {
+    id: 2,
+    name: 'Surname',
+    type: 'text',
+    text_default: '',
+    primary: false,
+  },
+  {
+    id: 3,
+    name: 'Status',
+    type: 'single_select',
+    text_default: '',
+    primary: false,
+  },
+]
+
+const rows = [
+  { id: 2, order: '2.00000000000000000000', field_2: 'Bram' },
+  { id: 4, order: '2.50000000000000000000', field_2: 'foo', field_3: 'bar' },
+]
+
 describe('GridViewRows component with decoration', () => {
   let testApp = null
   let mockServer = null
   let store = null
+  let wrapperToDestroy = null
 
   beforeAll(() => {
     testApp = new TestApp()
     store = testApp.store
     mockServer = testApp.mockServer
+    store.$registry.registerNamespace('viewDecorator')
+    store.$registry.registerNamespace('decoratorValueProvider')
   })
 
   afterEach((done) => {
-    testApp.afterEach().then(done)
     // Clean up potentially registered stuff
     try {
       store.$registry.unregister('viewDecorator', 'fake_decorator')
@@ -93,64 +136,34 @@ describe('GridViewRows component with decoration', () => {
         'fake_value_provider_type'
       )
     } catch {}
+    if (wrapperToDestroy) {
+      wrapperToDestroy.destroy()
+      wrapperToDestroy = null
+    }
+    testApp.afterEach().then(done)
   })
 
-  const primary = {
-    id: 1,
-    name: 'Name',
-    order: 0,
-    type: 'text',
-    primary: true,
-    text_default: '',
-    _: {
-      loading: false,
-    },
-  }
-
-  const fieldData = [
-    {
-      id: 2,
-      name: 'Surname',
-      type: 'text',
-      text_default: '',
-      primary: false,
-      _: {
-        loading: false,
-      },
-    },
-    {
-      id: 3,
-      name: 'Status',
-      type: 'select',
-      text_default: '',
-      primary: false,
-      _: {
-        loading: false,
-      },
-    },
-  ]
-
-  const rows = [
-    { id: 2, order: '2.00000000000000000000', field_2: 'Bram' },
-    { id: 4, order: '2.50000000000000000000', field_2: 'foo', field_3: 'bar' },
-  ]
-
-  const populateStore = async (decorations) => {
+  const populateStore = async ({ viewId = 1, decorations } = {}) => {
     const table = mockServer.createTable()
     const { application } = await mockServer.createAppAndGroup(table)
     const view = mockServer.createGridView(application, table, {
       decorations,
+      viewId,
     })
-    const fields = mockServer.createFields(application, table, fieldData)
 
-    mockServer.createRows(view, fields, rows)
+    mockServer.createFields(application, table, fieldData)
+    await store.dispatch('field/fetchAll', table)
+    const primary = store.getters['field/getPrimary']
+    const fields = store.getters['field/getAll']
+
+    mockServer.createGridRows(view, fields, rows)
     await store.dispatch('page/view/grid/fetchInitial', {
-      gridId: 1,
+      gridId: view.id,
       fields,
       primary,
     })
-    await store.dispatch('view/fetchAll', { id: 1 })
-    return { table, fields, view }
+    await store.dispatch('view/fetchAll', { id: table.id })
+    return { table, primary, fields, view }
   }
 
   const mountComponent = async (props) => {
@@ -160,11 +173,15 @@ describe('GridViewRows component with decoration', () => {
 
     await wrapper.vm.show(document.body)
     await wrapper.vm.$nextTick()
+
+    // Allow to clean the DOM after the test
+    wrapperToDestroy = wrapper
+
     return wrapper
   }
 
   test('Default component', async () => {
-    const { table, fields, view } = await populateStore()
+    const { table, primary, fields, view } = await populateStore()
 
     const fakeDecorator = new FakeDecoratorType({ app: testApp })
     const fakeValueProvider = new FakeValueProviderType({ app: testApp })
@@ -184,20 +201,22 @@ describe('GridViewRows component with decoration', () => {
   })
 
   test('View with decoration configured', async () => {
-    const { table, fields, view } = await populateStore([
-      {
-        type: 'fake_decorator',
-        value_provider_type: 'fake_value_provider_type',
-        value_provider_conf: {},
-        _: { loading: false },
-      },
-      {
-        type: 'fake_decorator',
-        value_provider_type: '',
-        value_provider_conf: {},
-        _: { loading: false },
-      },
-    ])
+    const { table, primary, fields, view } = await populateStore({
+      decorations: [
+        {
+          type: 'fake_decorator',
+          value_provider_type: 'fake_value_provider_type',
+          value_provider_conf: {},
+          _: { loading: false },
+        },
+        {
+          type: 'fake_decorator',
+          value_provider_type: '',
+          value_provider_conf: {},
+          _: { loading: false },
+        },
+      ],
+    })
 
     const fakeDecorator = new FakeDecoratorType({ app: testApp })
     const fakeValueProvider = new FakeValueProviderType({ app: testApp })
@@ -217,7 +236,7 @@ describe('GridViewRows component with decoration', () => {
   })
 
   test('Should show unavailable decorator tooltip', async () => {
-    const { table, fields, view } = await populateStore()
+    const { table, primary, fields, view } = await populateStore()
 
     const fakeDecorator = new FakeDecoratorType({ app: testApp })
     const fakeValueProvider = new FakeValueProviderType({ app: testApp })
@@ -242,8 +261,8 @@ describe('GridViewRows component with decoration', () => {
     expect(document.body).toMatchSnapshot()
   })
 
-  test('Should show can add decorator tooltip', async () => {
-    const { table, fields, view } = await populateStore()
+  test('Should show cant add decorator tooltip', async () => {
+    const { table, primary, fields, view } = await populateStore()
 
     const fakeDecorator = new FakeDecoratorType({ app: testApp })
     const fakeValueProvider = new FakeValueProviderType({ app: testApp })
diff --git a/web-frontend/test/unit/database/table.spec.js b/web-frontend/test/unit/database/table.spec.js
index 05127622d..defca15f3 100644
--- a/web-frontend/test/unit/database/table.spec.js
+++ b/web-frontend/test/unit/database/table.spec.js
@@ -144,7 +144,7 @@ describe('Table Component Tests', () => {
       },
     ])
 
-    mockServer.createRows(gridView, fields, [
+    mockServer.createGridRows(gridView, fields, [
       {
         id: 1,
         order: 0,
diff --git a/web-frontend/test/unit/database/viewFilters.spec.js b/web-frontend/test/unit/database/viewFilters.spec.js
index 0f1855fc4..624ae221f 100644
--- a/web-frontend/test/unit/database/viewFilters.spec.js
+++ b/web-frontend/test/unit/database/viewFilters.spec.js
@@ -54,7 +54,7 @@ describe('View Filter Tests', () => {
     })
     const fields = mockServer.createFields(application, table, [field])
 
-    mockServer.createRows(gridView, fields, [row])
+    mockServer.createGridRows(gridView, fields, [row])
     await store.dispatch('page/view/grid/fetchInitial', {
       gridId: 1,
       fields: [field],