diff --git a/VERSION b/VERSION
index dbe590065479b394ecabbd44460125ae5fe544bf..c8e38b614057b7e417c63fde44726a4143de9da0 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.8.1
+2.9.0
diff --git a/frontend/src/views/regional_success/RegionalSuccess.vue b/frontend/src/views/regional_success/RegionalSuccess.vue
index e842482290028ca42fa449528be6183e9f4f2f65..36f47ac31cf64c4a6da194884900f59bca7065e7 100644
--- a/frontend/src/views/regional_success/RegionalSuccess.vue
+++ b/frontend/src/views/regional_success/RegionalSuccess.vue
@@ -83,7 +83,7 @@ export default {
       fourthRow: null,
       fourthEmoji: null,
 
-      //contractedBy: DEFAULT_CONTRACTOR,
+      contractedBy: DEFAULT_CONTRACTOR,
 
       logoImage: null,
       logoPosition: LOGO_POSITIONS.top_right,
@@ -126,6 +126,7 @@ export default {
         logoImage: this.logoImage,
         nameText: this.nameText,
         nameTextDesc: this.nameTextDesc,
+        contractedBy: this.contractedBy,
         colors: this.colors,
       };
 
@@ -158,6 +159,7 @@ export default {
         vm.logoImage,
         vm.nameText,
         vm.nameTextDesc,
+        vm.contractedBy,
         vm.colors,
       ],
       async (value) => {
@@ -300,6 +302,14 @@ export default {
           v-model="logoPosition"
           zIndex="6"
         />
+
+        <ShortTextInput
+          name="Zadavatel a zpracovatel"
+          v-model="contractedBy"
+          :defaultValue="DEFAULT_CONTRACTOR"
+          :important="false"
+          zIndex="5"
+        />
       </template>
     </MainContainer>
   </main>
diff --git a/frontend/src/views/regional_success/canvas.js b/frontend/src/views/regional_success/canvas.js
index 3d0432c4ed53c45e5ca63f3494153b2fade8843c..47131c63197124854cb0dc44a9f05eddd8efdc04 100644
--- a/frontend/src/views/regional_success/canvas.js
+++ b/frontend/src/views/regional_success/canvas.js
@@ -12,6 +12,7 @@ import backgroundArrowsImageURL from "../../assets/template/regional_success/arr
 //import overlayURL from '../../assets/template/poster/overlay.png'
 
 let mainTextBox = null;
+let contractedByTextbox = null;
 
 let logoImage = null;
 let mainImage = null;
@@ -58,6 +59,7 @@ const redraw = async (canvas, options) => {
       fourthEmoji,
       nameText,
       nameTextDesc,
+      contractedByTextbox,
       gradientRect,
     ],
     canvas,
@@ -79,6 +81,11 @@ const redraw = async (canvas, options) => {
     headerHeight + (rowHeightBg - emojiHeight) / 2,
   );
 
+  const contractedByTextSize = Math.ceil(canvas.height * 0.013);
+  const contractedByTextMaxWidth = Math.ceil(canvas.width * 0.9);
+  const contractedByTextSideMargin = Math.ceil(canvas.width * 0.068);
+  const contractedByTextBottomMargin = Math.ceil(canvas.height * 0.023)
+
   const rowsMaxWidth = 425;
   const rowsTextSize = 38;
   const rowsLineHeight = 0.9;
@@ -463,6 +470,29 @@ const redraw = async (canvas, options) => {
   }
   /* END Name text description render */
 
+  /* BEGIN Contracted by render */
+
+  if (options.contractedBy !== null) {
+    contractedByTextbox = new fabric.Textbox(options.contractedBy, {
+      left:
+        canvas.width - contractedByTextMaxWidth - contractedByTextSideMargin,
+      top: canvas.height - contractedByTextBottomMargin - contractedByTextSize,
+      width: contractedByTextMaxWidth,
+      fontFamily: "Roboto Condensed",
+      fontSize: contractedByTextSize,
+      textAlign: "right",
+      fill: "#505050",
+      selectable: false,
+      zIndex: 40,
+    });
+
+    checkTextBoxHeight(contractedByTextbox, 1);
+
+    canvas.add(contractedByTextbox);
+  }
+
+  /* END Contracted by render */
+
   sortObjects(canvas);
 
   if (!pointerDownEventAssigned) {