diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index ec9b5f13d4f8fcf78aad41dda5c26f4a00affee3..f177d904cb25228548dbc3ee5e0bef46919d6698 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -175,20 +175,20 @@
         },
         "boto3": {
             "hashes": [
-                "sha256:76cfc9a705be46e8d22607efacc8d688c064f923d785a01c00b28e9a96425d1a",
-                "sha256:fde1c29996b77274a60b7bc9f741525afa6267bb1716eb644a764fb7c124a0d2"
+                "sha256:53a5307f6a3526ee2f8590e3c45efa504a3ea4532c1bfe4926c0c19bf188d141",
+                "sha256:f9843a5d06f501d66ada06f5a5417f671823af2cf319e36ceefa1bafaaaaa953"
             ],
             "index": "pypi",
             "markers": "python_version >= '3.8'",
-            "version": "==1.36.2"
+            "version": "==1.36.3"
         },
         "botocore": {
             "hashes": [
-                "sha256:a1fe6610983f0214b0c7655fe6990b6a731746baf305b182976fc7b568fc3cb0",
-                "sha256:bc3b7e3b573a48af2bd7116b80fe24f9a335b0b67314dcb2697a327d009abf29"
+                "sha256:536ab828e6f90dbb000e3702ac45fd76642113ae2db1b7b1373ad24104e89255",
+                "sha256:775b835e979da5c96548ed1a0b798101a145aec3cd46541d62e27dda5a94d7f8"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==1.36.2"
+            "version": "==1.36.3"
         },
         "certifi": {
             "hashes": [
@@ -412,7 +412,7 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:19c6bbcf9461e20681f0fb342087c618a91123d2d04d4df2f4fd1da80aa77b76"
+                "sha256:a41ca60353510cbecf8fb647cf2483acb100258743794a16bc8ad6f8e9ea4481"
             ],
             "path": "./lib/dbrepo-1.6.2.tar.gz"
         },
@@ -1601,11 +1601,11 @@
         },
         "tzdata": {
             "hashes": [
-                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
-                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
+                "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694",
+                "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"
             ],
             "markers": "python_version >= '2'",
-            "version": "==2024.2"
+            "version": "==2025.1"
         },
         "urllib3": {
             "hashes": [
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.2-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.6.2-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..24256263e2fb3156ac0eea01079116e4b40e36fd
Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.6.2-py3-none-any.whl differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.2.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.6.2.tar.gz
index 02ed2aec31c2b1881165a12d45060ed4a311192d..2ae1ea50b1610050f5bd5746f7e9596b1c483c9d 100644
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.6.2.tar.gz and b/dbrepo-analyse-service/lib/dbrepo-1.6.2.tar.gz differ
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java
index 57d6ffab7ccf87336066e0a8c5b9ec700434099f..4dcfaf13a288c0d6c2415227552257396e450612 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/MetadataServiceGatewayImpl.java
@@ -100,7 +100,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find database with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find database: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Username", "X-Password", "X-Host", "X-Port");
+        final List<String> expectedHeaders = List.of("X-Username", "X-Password", "X-Host", "X-Port", "X-Type");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all  database headers");
             log.debug("expected headers: {}", expectedHeaders);
@@ -112,10 +112,11 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             throw new MetadataServiceException("Failed to find database with id " + id + ": body is empty");
         }
         final DatabaseDto database = response.getBody();
-        database.getContainer().setUsername(response.getHeaders().get("X-Username").get(0));
-        database.getContainer().setPassword(response.getHeaders().get("X-Password").get(0));
-        database.getContainer().setHost(response.getHeaders().get("X-Host").get(0));
-        database.getContainer().setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0)));
+        database.setJdbcMethod(response.getHeaders().get("X-Type").get(0));
+        database.setUsername(response.getHeaders().get("X-Username").get(0));
+        database.setPassword(response.getHeaders().get("X-Password").get(0));
+        database.setHost(response.getHeaders().get("X-Host").get(0));
+        database.setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0)));
         database.setLastRetrieved(Instant.now());
         return database;
     }
@@ -139,7 +140,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find table with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find table: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-Table");
+        final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-Table", "X-Type");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all  table headers");
             log.debug("expected headers: {}", expectedHeaders);
@@ -181,7 +182,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find view with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find view: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-View");
+        final List<String> expectedHeaders = List.of("X-Type", "X-Host", "X-Port", "X-Username", "X-Password", "X-Database", "X-View", "X-Type");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all  view headers");
             log.debug("expected headers: {}", expectedHeaders);
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java
index 9fbee30fa6b91df13075d2895ab3921e36893dc8..1044869ad873b2eae3b1dd1ea8f92b19857dbd49 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DataConnector.java
@@ -12,7 +12,7 @@ public abstract class DataConnector<T extends CacheableDto> {
     public ComboPooledDataSource getDataSource(T entity) {
         final long start = System.currentTimeMillis();
         final ComboPooledDataSource dataSource = new ComboPooledDataSource();
-        dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPassword(),
+        dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(),
                 entity.getDatabase()));
         dataSource.setUser(entity.getUsername());
         dataSource.setPassword(entity.getPassword());
@@ -27,7 +27,7 @@ public abstract class DataConnector<T extends CacheableDto> {
     public ComboPooledDataSource getDataSource(T entity, String databaseName) {
         final long start = System.currentTimeMillis();
         final ComboPooledDataSource dataSource = new ComboPooledDataSource();
-        dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPassword(), databaseName));
+        dataSource.setJdbcUrl(getJdbcUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), databaseName));
         dataSource.setUser(entity.getUsername());
         dataSource.setPassword(entity.getPassword());
         dataSource.setInitialPoolSize(5);
@@ -38,24 +38,24 @@ public abstract class DataConnector<T extends CacheableDto> {
         return dataSource;
     }
 
-    public String getSparkUrl(String jdbcMethod, String host, String password, String databaseName) {
-        final StringBuilder sb = new StringBuilder(getJdbcUrl(jdbcMethod, host, password, databaseName))
+    public String getSparkUrl(String jdbcMethod, String host, Integer port, String databaseName) {
+        final StringBuilder sb = new StringBuilder(getJdbcUrl(jdbcMethod, host, port, databaseName))
                 .append("?sessionVariables=sql_mode='ANSI_QUOTES'");
         log.trace("mapped container to spark url: {}", sb.toString());
         return sb.toString();
     }
 
     public String getSparkUrl(T entity) {
-        return getSparkUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPassword(), entity.getDatabase());
+        return getSparkUrl(entity.getJdbcMethod(), entity.getHost(), entity.getPort(), entity.getDatabase());
     }
 
-    public String getJdbcUrl(String jdbcMethod, String host, String password, String databaseName) {
+    public String getJdbcUrl(String jdbcMethod, String host, Integer port, String databaseName) {
         final StringBuilder stringBuilder = new StringBuilder("jdbc:")
                 .append(jdbcMethod)
                 .append("://")
                 .append(host)
                 .append(":")
-                .append(password);
+                .append(port);
         if (databaseName != null) {
             stringBuilder.append("/")
                     .append(databaseName);
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
index 2b5af71d1c98d51d656fecb1f32430c7baae1c96..cfe43d8f8fdadbdc8e4eb3d1e316806681e47b74 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
@@ -13,13 +13,10 @@ import at.tuwien.mapper.DataMapper;
 import at.tuwien.mapper.MariaDbMapper;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.service.DatabaseService;
-import at.tuwien.service.TableService;
-import at.tuwien.service.ViewService;
 import com.google.common.hash.Hashing;
 import com.mchange.v2.c3p0.ComboPooledDataSource;
 import lombok.extern.log4j.Log4j2;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
 import java.nio.charset.StandardCharsets;
@@ -36,19 +33,14 @@ public class DatabaseServiceMariaDbImpl extends DataConnector<DatabaseDto> imple
 
     private final DataMapper dataMapper;
     private final QueryConfig queryConfig;
-    private final ViewService viewService;
-    private final TableService tableService;
     private final MariaDbMapper mariaDbMapper;
     private final MetadataMapper metadataMapper;
 
     @Autowired
-    public DatabaseServiceMariaDbImpl(DataMapper dataMapper, QueryConfig queryConfig, ViewService viewService,
-                                      TableService tableService, MariaDbMapper mariaDbMapper,
-                                      @Qualifier("metadataMapper") MetadataMapper metadataMapper) {
+    public DatabaseServiceMariaDbImpl(DataMapper dataMapper, QueryConfig queryConfig, MariaDbMapper mariaDbMapper,
+                                      MetadataMapper metadataMapper) {
         this.dataMapper = dataMapper;
         this.queryConfig = queryConfig;
-        this.viewService = viewService;
-        this.tableService = tableService;
         this.mariaDbMapper = mariaDbMapper;
         this.metadataMapper = metadataMapper;
     }
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java
index 6586c8ba42669dfc63d6b5c70aaaf84559a1b634..68fb59cb5e02969e94553d4109b7ca141f07d67d 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java
@@ -374,10 +374,10 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
             throws QueryMalformedException, TableNotFoundException {
         try {
             final Properties properties = new Properties();
-            properties.setProperty("user", database.getContainer().getUsername());
-            properties.setProperty("password", database.getContainer().getPassword());
+            properties.setProperty("user", database.getUsername());
+            properties.setProperty("password", database.getPassword());
             return sparkSession.read()
-                    .jdbc(getSparkUrl(database.getJdbcMethod(), database.getHost(), database.getPassword(),
+                    .jdbc(getSparkUrl(database.getJdbcMethod(), database.getHost(), database.getPort(),
                             database.getInternalName()), tableOrView, properties);
         } catch (Exception e) {
             if (e instanceof ExtendedAnalysisException exception) {
@@ -386,8 +386,8 @@ public class TableServiceMariaDbImpl extends DataConnector<TableDto> implements
                     throw new TableNotFoundException("Failed to find named reference: " + exception.getSimpleMessage()) /* remove throwable on purpose, clutters the output */;
                 }
             }
-            log.error("Failed to find get data from query statement: {}", e.getMessage());
-            throw new QueryMalformedException("Failed to find get data from query statement: " + e.getMessage(), e);
+            log.error("Malformed query: {}", e.getMessage());
+            throw new QueryMalformedException("Malformed query: " + e.getMessage(), e);
         }
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index 7e0320248049b800d26d2f81b98a736bde31c6ca..194f79d2554748750eac2ee90d01846f1ca64a8f 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -551,6 +551,7 @@ public class DatabaseEndpoint extends AbstractEndpoint {
             headers.set("X-Password", database.getContainer().getPrivilegedPassword());
             headers.set("X-Host", database.getContainer().getHost());
             headers.set("X-Port", "" + database.getContainer().getPort());
+            headers.set("X-Type", database.getContainer().getImage().getJdbcMethod());
             headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port");
         }
         return ResponseEntity.status(HttpStatus.OK)
diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock
index 8362cd2df3676640ad25e045008240c21b77ce05..d75a0069a1a39cd64ff953624e9bbb8adb61c78a 100644
--- a/dbrepo-search-service/Pipfile.lock
+++ b/dbrepo-search-service/Pipfile.lock
@@ -360,7 +360,7 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:19c6bbcf9461e20681f0fb342087c618a91123d2d04d4df2f4fd1da80aa77b76"
+                "sha256:a41ca60353510cbecf8fb647cf2483acb100258743794a16bc8ad6f8e9ea4481"
             ],
             "path": "./lib/dbrepo-1.6.2.tar.gz"
         },
@@ -1574,11 +1574,11 @@
         },
         "tzdata": {
             "hashes": [
-                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
-                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
+                "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694",
+                "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"
             ],
             "markers": "python_version >= '2'",
-            "version": "==2024.2"
+            "version": "==2025.1"
         },
         "urllib3": {
             "hashes": [
diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock
index e72262e85d16a2c3518981d7efedd2b7c791a368..e4a2e7d71877f6d44a929b2e344390bbf1117db0 100644
--- a/dbrepo-search-service/init/Pipfile.lock
+++ b/dbrepo-search-service/init/Pipfile.lock
@@ -254,7 +254,7 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:19c6bbcf9461e20681f0fb342087c618a91123d2d04d4df2f4fd1da80aa77b76"
+                "sha256:a41ca60353510cbecf8fb647cf2483acb100258743794a16bc8ad6f8e9ea4481"
             ],
             "path": "./lib/dbrepo-1.6.2.tar.gz"
         },
@@ -1027,11 +1027,11 @@
         },
         "tzdata": {
             "hashes": [
-                "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc",
-                "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd"
+                "sha256:24894909e88cdb28bd1636c6887801df64cb485bd593f2fd83ef29075a81d694",
+                "sha256:7e127113816800496f027041c570f50bcd464a020098a3b6b199517772303639"
             ],
             "markers": "python_version >= '2'",
-            "version": "==2024.2"
+            "version": "==2025.1"
         },
         "urllib3": {
             "hashes": [
diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.2-py3-none-any.whl b/dbrepo-search-service/init/lib/dbrepo-1.6.2-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..24256263e2fb3156ac0eea01079116e4b40e36fd
Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.6.2-py3-none-any.whl differ
diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.2.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.6.2.tar.gz
index 02ed2aec31c2b1881165a12d45060ed4a311192d..2ae1ea50b1610050f5bd5746f7e9596b1c483c9d 100644
Binary files a/dbrepo-search-service/init/lib/dbrepo-1.6.2.tar.gz and b/dbrepo-search-service/init/lib/dbrepo-1.6.2.tar.gz differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.6.2-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.6.2-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..24256263e2fb3156ac0eea01079116e4b40e36fd
Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.6.2-py3-none-any.whl differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.6.2.tar.gz b/dbrepo-search-service/lib/dbrepo-1.6.2.tar.gz
index 02ed2aec31c2b1881165a12d45060ed4a311192d..2ae1ea50b1610050f5bd5746f7e9596b1c483c9d 100644
Binary files a/dbrepo-search-service/lib/dbrepo-1.6.2.tar.gz and b/dbrepo-search-service/lib/dbrepo-1.6.2.tar.gz differ
diff --git a/dbrepo-ui/components/dialogs/EditTuple.vue b/dbrepo-ui/components/dialogs/EditTuple.vue
index 3290d230d1bf216bd2f212c4fbe9c683901e4b96..75e824ed4316bad96843a57694b245d4caf01682 100644
--- a/dbrepo-ui/components/dialogs/EditTuple.vue
+++ b/dbrepo-ui/components/dialogs/EditTuple.vue
@@ -3,7 +3,7 @@
     <v-form
       ref="form"
       v-model="valid"
-      @submit.prevent="submit">
+      @submit.prevent="validate">
       <v-card
         :title="title"
         :subtitle="this.$t('toolbars.table.data.subtitle')"
@@ -17,12 +17,10 @@
               <v-text-field
                 v-if="isNumber(column)"
                 v-model.number="tuple[column.internal_name]"
-                :disabled="!edit"
                 persistent-hint
                 :variant="inputVariant"
                 :label="column.internal_name"
                 :hint="hint(column)"
-                :rules="rules(column)"
                 :required="required(column)"
                 type="number">
                 <template
@@ -48,11 +46,9 @@
               <v-text-field
                 v-if="isTextField(column)"
                 v-model="tuple[column.internal_name]"
-                :disabled="disabled(column)"
                 :clearable="!required(column)"
                 :counter="maxLength(column) !== null"
                 :maxlength="maxLength(column)"
-                :rules="rules(column)"
                 :required="required(column)"
                 persistent-hint
                 :variant="inputVariant"
@@ -82,10 +78,8 @@
               <v-text-field
                 v-if="isFloatingPoint(column)"
                 v-model="tuple[column.internal_name]"
-                :disabled="disabled(column)"
                 step=".1"
                 :clearable="!required(column)"
-                :rules="rules(column)"
                 :required="required(column)"
                 persistent-hint
                 :variant="inputVariant"
@@ -115,10 +109,8 @@
               <v-textarea
                 v-if="isTextArea(column)"
                 v-model="tuple[column.internal_name]"
-                :disabled="disabled(column)"
                 rows="3"
                 :clearable="!required(column)"
-                :rules="rules(column)"
                 :required="required(column)"
                 persistent-hint
                 :variant="inputVariant"
@@ -155,7 +147,6 @@
                 :variant="inputVariant"
                 :label="column.internal_name"
                 :hint="hint(column)"
-                :rules="rules(column)"
                 :required="required(column)"
                 :clearable="!required(column)"
                 :items="isSet(column) ? column.sets : column.enums">
@@ -186,7 +177,6 @@
                 :variant="inputVariant"
                 :label="column.internal_name"
                 :hint="hint(column)"
-                :rules="rules(column)"
                 :required="required(column)"
                 :items="bools"
                 :clearable="!required(column)">
@@ -322,10 +312,10 @@ export default {
       cacheStore: useCacheStore()
     }
   },
-  mounted() {
+  mounted () {
     this.fetchContainer()
-    this.$refs.form.validate()
     this.oldTuple = Object.assign({}, this.tuple)
+    this.validate()
   },
   computed: {
     database () {
@@ -358,8 +348,17 @@ export default {
       return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
     }
   },
+  watch: {
+    tuple: {
+      handler () {
+        this.validate()
+      },
+      deep: true
+    }
+  },
   methods: {
-    submit () {
+    validate () {
+      console.debug('validate form')
       this.$refs.form.validate()
     },
     cancel () {
@@ -425,18 +424,6 @@ export default {
     isTimeField (column) {
       return ['date', 'datetime', 'timestamp', 'time', 'year'].includes(column.type)
     },
-    rules (column) {
-      if (column.is_null_allowed) {
-        return []
-      }
-      const rules = []
-      rules.push(v => v !== null || this.$t('validation.required'))
-      if (column.type === 'decimal' || column.type === 'double') {
-        rules.push(v => !(!v || v.split('.')[0].length > column.size) || `${this.$t('pages.table.subpages.data.float.max')} ${column.size} ${this.$t('pages.table.subpages.data.float.before')}`)
-        rules.push(v => !(!v || (column.d && v.split('.')[1].length > column.d)) || `${this.$t('pages.table.subpages.data.float.max')} ${column.d} ${this.$t('pages.table.subpages.data.float.after')}`)
-      }
-      return rules
-    },
     maxLength (column) {
       if (!this.isTextField(column) || column.size === null) {
         return null
@@ -446,9 +433,6 @@ export default {
     required (column) {
       return column.is_null_allowed === false
     },
-    disabled (column) {
-      return (this.edit && column.is_primary_key) || !this.edit
-    },
     updateTuple () {
       const constraints = {}
       this.primaryKeyColumns
diff --git a/make/build.mk b/make/build.mk
index 7311ed27167f72e4ffa4b8b7659127b90679d471..bc6dfc56a7421b53c6ad02f5bd4518f5f6b614ab 100644
--- a/make/build.mk
+++ b/make/build.mk
@@ -20,16 +20,16 @@ build-ui: ## Build the UI.
 
 .PHONY: build-lib
 build-lib: ## Build the Python Library.
-	rm -f ./dbrepo-analyse-service/lib/dbrepo-${APP_VERSION}.tar.gz
-	rm -f ./dbrepo-search-service/lib/dbrepo-${APP_VERSION}.tar.gz
-	rm -f ./dbrepo-search-service/init/lib/dbrepo-${APP_VERSION}.tar.gz
+	rm -f ./dbrepo-analyse-service/Pipfile.lock ./dbrepo-analyse-service/lib/dbrepo-${APP_VERSION}*
+	rm -f ./dbrepo-search-service/Pipfile.lock ./dbrepo-search-service/lib/dbrepo-${APP_VERSION}*
+	rm -f ./dbrepo-search-service/init/Pipfile.lock ./dbrepo-search-service/init/lib/dbrepo-${APP_VERSION}*
 	python3 -m build --sdist ./lib/python
 	python3 -m build --wheel ./lib/python
-	cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-analyse-service/lib/dbrepo-${APP_VERSION}.tar.gz
+	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-analyse-service/lib
 	(cd ./dbrepo-analyse-service && PIPENV_IGNORE_VIRTUALENVS=1 pipenv lock)
-	cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-search-service/lib/dbrepo-${APP_VERSION}.tar.gz
+	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-search-service/lib
 	(cd ./dbrepo-search-service && PIPENV_IGNORE_VIRTUALENVS=1 pipenv lock)
-	cp ./lib/python/dist/dbrepo-${APP_VERSION}.tar.gz ./dbrepo-search-service/init/lib/dbrepo-${APP_VERSION}.tar.gz
+	cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-search-service/init/lib
 	(cd ./dbrepo-search-service/init && PIPENV_IGNORE_VIRTUALENVS=1 pipenv lock)
 
 .PHONY: build-helm