diff --git a/modules/scripts.py b/modules/scripts.py
index 722f8685060f0e85d2ccc51df8cdd036fe6d9a32..0c44f191823799fa0507dc1ffde69145fd9b0ed6 100644
--- a/modules/scripts.py
+++ b/modules/scripts.py
@@ -1,4 +1,5 @@
 import os
+import re
 import sys
 import traceback
 from collections import namedtuple
@@ -128,6 +129,15 @@ class Script:
         """unused"""
         return ""
 
+    def elem_id(self, item_id):
+        """helper function to generate id for a HTML element, constructs final id out of script name, tab and user-supplied item_id"""
+
+        need_tabname = self.show(True) == self.show(False)
+        tabname = ('img2img' if self.is_img2img else 'txt2txt') + "_" if need_tabname else ""
+        title = re.sub(r'[^a-z_0-9]', '', re.sub(r'\s', '_', self.title().lower()))
+
+        return f'script_{tabname}{title}_{item_id}'
+
 
 current_basedir = paths.script_path
 
diff --git a/scripts/custom_code.py b/scripts/custom_code.py
index 9ce1f650e76416715ed9a07e2a0a1f60adc11906..d29113e671070d10bdb7d7a23059255681fa0ef2 100644
--- a/scripts/custom_code.py
+++ b/scripts/custom_code.py
@@ -3,18 +3,12 @@ import gradio as gr
 
 from modules.processing import Processed
 from modules.shared import opts, cmd_opts, state
-import re
 
 class Script(scripts.Script):
 
     def title(self):
         return "Custom code"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def show(self, is_img2img):
         return cmd_opts.allow_code
 
diff --git a/scripts/img2imgalt.py b/scripts/img2imgalt.py
index 7555e874e48fa0bd2dabba8c5bd9bb1dd9dbf247..cbdfc6b3c961c8256ee1f68660679ee59113a502 100644
--- a/scripts/img2imgalt.py
+++ b/scripts/img2imgalt.py
@@ -16,7 +16,6 @@ import k_diffusion as K
 from PIL import Image
 from torch import autocast
 from einops import rearrange, repeat
-import re
 
 
 def find_noise_for_image(p, cond, uncond, cfg_scale, steps):
@@ -123,11 +122,6 @@ class Script(scripts.Script):
     def title(self):
         return "img2img alternative test"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def show(self, is_img2img):
         return is_img2img
 
diff --git a/scripts/loopback.py b/scripts/loopback.py
index 4df7b73fe9738e48b71383b37b597cb83c9b3eeb..1dab9476cf0ad24ebcf588d6875e5cb4cb6ea86b 100644
--- a/scripts/loopback.py
+++ b/scripts/loopback.py
@@ -8,18 +8,12 @@ from modules import processing, shared, sd_samplers, images
 from modules.processing import Processed
 from modules.sd_samplers import samplers
 from modules.shared import opts, cmd_opts, state
-import re
 
 
 class Script(scripts.Script):
     def title(self):
         return "Loopback"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def show(self, is_img2img):
         return is_img2img
 
diff --git a/scripts/outpainting_mk_2.py b/scripts/outpainting_mk_2.py
index b4a0dc735012160c59d56d0afb45325db1a00f46..0906da6ae7da2281e83a517f2278f6cf1315c518 100644
--- a/scripts/outpainting_mk_2.py
+++ b/scripts/outpainting_mk_2.py
@@ -10,7 +10,6 @@ from PIL import Image, ImageDraw
 from modules import images, processing, devices
 from modules.processing import Processed, process_images
 from modules.shared import opts, cmd_opts, state
-import re
 
 
 # this function is taken from https://github.com/parlance-zz/g-diffuser-bot
@@ -123,11 +122,6 @@ class Script(scripts.Script):
     def title(self):
         return "Outpainting mk2"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def show(self, is_img2img):
         return is_img2img
 
diff --git a/scripts/poor_mans_outpainting.py b/scripts/poor_mans_outpainting.py
index 1c7dc46740086f2711368d6e131f75433305258d..d8feda00acde4e3ff644330cc62eb2dfdee060f6 100644
--- a/scripts/poor_mans_outpainting.py
+++ b/scripts/poor_mans_outpainting.py
@@ -7,18 +7,12 @@ from PIL import Image, ImageDraw
 from modules import images, processing, devices
 from modules.processing import Processed, process_images
 from modules.shared import opts, cmd_opts, state
-import re
 
 
 class Script(scripts.Script):
     def title(self):
         return "Poor man's outpainting"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def show(self, is_img2img):
         return is_img2img
 
diff --git a/scripts/prompt_matrix.py b/scripts/prompt_matrix.py
index 278d2e68b5216a5c9964bc29c28405b1850eff1c..dd95e5887ca29b39418e3b31a776d781c19e1546 100644
--- a/scripts/prompt_matrix.py
+++ b/scripts/prompt_matrix.py
@@ -10,7 +10,6 @@ from modules import images
 from modules.processing import process_images, Processed
 from modules.shared import opts, cmd_opts, state
 import modules.sd_samplers
-import re
 
 
 def draw_xy_grid(xs, ys, x_label, y_label, cell):
@@ -45,11 +44,6 @@ class Script(scripts.Script):
     def title(self):
         return "Prompt matrix"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def ui(self, is_img2img):        
         put_at_start = gr.Checkbox(label='Put variable parts at start of prompt', value=False, elem_id=self.elem_id("put_at_start"))
         different_seeds = gr.Checkbox(label='Use different seed for each picture', value=False, elem_id=self.elem_id("different_seeds"))
diff --git a/scripts/prompts_from_file.py b/scripts/prompts_from_file.py
index 5c84c3e95fa63fc2d9ec172513bb29e2464f825c..2751f98aa0ac55de527ec22973dc3f3929f5a500 100644
--- a/scripts/prompts_from_file.py
+++ b/scripts/prompts_from_file.py
@@ -13,7 +13,6 @@ from modules import sd_samplers
 from modules.processing import Processed, process_images
 from PIL import Image
 from modules.shared import opts, cmd_opts, state
-import re
 
 
 def process_string_tag(tag):
@@ -112,11 +111,6 @@ class Script(scripts.Script):
     def title(self):
         return "Prompts from file or textbox"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def ui(self, is_img2img):       
         checkbox_iterate = gr.Checkbox(label="Iterate seed every line", value=False, elem_id=self.elem_id("checkbox_iterate"))
         checkbox_iterate_batch = gr.Checkbox(label="Use same random seed for all lines", value=False, elem_id=self.elem_id("checkbox_iterate_batch"))
diff --git a/scripts/sd_upscale.py b/scripts/sd_upscale.py
index 247e755bde641ff9767c58b40849ed7ba32fbb50..9b8ffd8540c44fd739f08307fb2c78f8c20104c7 100644
--- a/scripts/sd_upscale.py
+++ b/scripts/sd_upscale.py
@@ -7,18 +7,12 @@ from PIL import Image
 from modules import processing, shared, sd_samplers, images, devices
 from modules.processing import Processed
 from modules.shared import opts, cmd_opts, state
-import re
 
 
 class Script(scripts.Script):
     def title(self):
         return "SD upscale"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def show(self, is_img2img):
         return is_img2img
 
diff --git a/scripts/xy_grid.py b/scripts/xy_grid.py
index b277a439ddf13bed1647b385f715c5fb4c26dcd3..f04d9b7e5aee833c953cbe4038a64ad7a1edc913 100644
--- a/scripts/xy_grid.py
+++ b/scripts/xy_grid.py
@@ -290,11 +290,6 @@ class Script(scripts.Script):
     def title(self):
         return "X/Y plot"
 
-    def elem_id(self, item_id):
-        gen_elem_id = ('img2img' if self.is_img2img else 'txt2txt') + '_script_' + re.sub(r'\s', '_', self.title().lower()) + '_' + item_id
-        gen_elem_id = re.sub(r'[^a-z_0-9]', '', gen_elem_id)
-        return gen_elem_id
-
     def ui(self, is_img2img):
         current_axis_options = [x for x in axis_options if type(x) == AxisOption or type(x) == AxisOptionImg2Img and is_img2img]