diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index a34914b5d78f9686bbef821284161e39acc59567..a47ad241be71bb73dd72e470f0d84c8ecf528c97 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "81259bb4fb1f303f1bfc9f643c6210d3b5f8de902725e4134cdab680d3fdfbb3"
+            "sha256": "a445bc066f06e174431552d155daabfdb4271e7f6ba781b61611e816ad8bf48c"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -167,27 +167,28 @@
         },
         "boto3": {
             "hashes": [
-                "sha256:0314e6598f59ee0f34eb4e6d1a0f69fa65c146d2b88a6e837a527a9956ec2731",
-                "sha256:d41037e2c680ab8d6c61a0a4ee6bf1fdd9e857f43996672830a95d62d6f6fa79"
+                "sha256:11edeeacdd517bda3b7615b754d8440820cdc9ddd66794cc995a9693ddeaa3be",
+                "sha256:f4e6489ba9dc7fb37d53e0e82dbc97f2cb0a4969ef3970e2c88b8f94023ae81a"
             ],
             "index": "pypi",
-            "version": "==1.34.136"
+            "markers": "python_version >= '3.8'",
+            "version": "==1.34.149"
         },
         "botocore": {
             "hashes": [
-                "sha256:7f7135178692b39143c8f152a618d2a3b71065a317569a7102d2306d4946f42f",
-                "sha256:c63fe9032091fb9e9477706a3ebfa4d0c109b807907051d892ed574f9b573e61"
+                "sha256:2e1eb5ef40102a3d796bb3dd05f2ac5e8fb43fe1ff114b4f6d33153437f5a372",
+                "sha256:ae6c4be52eeee96f68c116b27d252bab069cd046d61a17cfe8e9da411cf22906"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==1.34.136"
+            "version": "==1.34.149"
         },
         "certifi": {
             "hashes": [
-                "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516",
-                "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"
+                "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b",
+                "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"
             ],
             "markers": "python_version >= '3.6'",
-            "version": "==2024.6.2"
+            "version": "==2024.7.4"
         },
         "cffi": {
             "hashes": [
@@ -247,6 +248,15 @@
             "markers": "platform_python_implementation != 'PyPy'",
             "version": "==1.16.0"
         },
+        "chardet": {
+            "hashes": [
+                "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7",
+                "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.7'",
+            "version": "==5.2.0"
+        },
         "charset-normalizer": {
             "hashes": [
                 "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
@@ -353,50 +363,44 @@
         },
         "cryptography": {
             "hashes": [
-                "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad",
-                "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583",
-                "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b",
-                "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c",
-                "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1",
-                "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648",
-                "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949",
-                "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba",
-                "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c",
-                "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9",
-                "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d",
-                "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c",
-                "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e",
-                "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2",
-                "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d",
-                "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7",
-                "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70",
-                "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2",
-                "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7",
-                "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14",
-                "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe",
-                "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e",
-                "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71",
-                "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961",
-                "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7",
-                "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c",
-                "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28",
-                "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842",
-                "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902",
-                "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801",
-                "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a",
-                "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e"
+                "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709",
+                "sha256:08a24a7070b2b6804c1940ff0f910ff728932a9d0e80e7814234269f9d46d069",
+                "sha256:232ce02943a579095a339ac4b390fbbe97f5b5d5d107f8a08260ea2768be8cc2",
+                "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b",
+                "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e",
+                "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70",
+                "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778",
+                "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22",
+                "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895",
+                "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf",
+                "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431",
+                "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f",
+                "sha256:5bcb8a5620008a8034d39bce21dc3e23735dfdb6a33a06974739bfa04f853947",
+                "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74",
+                "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc",
+                "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66",
+                "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66",
+                "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf",
+                "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f",
+                "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5",
+                "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e",
+                "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f",
+                "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55",
+                "sha256:e9c5266c432a1e23738d178e51c2c7a5e2ddf790f248be939448c0ba2021f9d1",
+                "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47",
+                "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5",
+                "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0"
             ],
             "markers": "python_version >= '3.7'",
-            "version": "==42.0.8"
+            "version": "==43.0.0"
         },
         "dbrepo": {
             "hashes": [
-                "sha256:2506475fc8fb3f4fdd722e3e92f8e6ad28d0707023c3d8ea5d6d076cef71f395",
-                "sha256:2bdb48c70b4c99b5044fbfc12aa653c1e9281ca8913a433cc08a1e14cb4bd2ef",
-                "sha256:dccfaec20a3972a578313206678a119db3d6f898604aab4b694aa2ac37a20629"
+                "sha256:0a04b67204de6dc969ec68fb21aaead898156077e8a5b6f1e03bb5ab0e124a61",
+                "sha256:454a182b772cb777d27a22bb334bf059ce68d4e6b5fecae802678fabfdf3f934"
             ],
-            "path": "./lib/dbrepo-1.4.5.tar.gz",
-            "version": "==1.4.5"
+            "markers": "python_version >= '3.11'",
+            "path": "./lib/dbrepo-1.4.5.tar.gz"
         },
         "events": {
             "hashes": [
@@ -406,11 +410,12 @@
         },
         "exceptiongroup": {
             "hashes": [
-                "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad",
-                "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"
+                "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b",
+                "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"
             ],
             "index": "pypi",
-            "version": "==1.2.1"
+            "markers": "python_version >= '3.7'",
+            "version": "==1.2.2"
         },
         "flasgger": {
             "hashes": [
@@ -425,6 +430,7 @@
                 "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==3.0.3"
         },
         "flask-cors": {
@@ -449,6 +455,7 @@
                 "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7' and python_version < '4'",
             "version": "==4.6.0"
         },
         "frozenlist": {
@@ -579,6 +586,7 @@
                 "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==24.2.1"
         },
         "greenlet": {
@@ -643,6 +651,7 @@
                 "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==3.0.3"
         },
         "gunicorn": {
@@ -651,6 +660,7 @@
                 "sha256:4a0b436239ff76fb33f11c07a16482c521a7e09c1ce3cc293c2330afe01bec63"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==22.0.0"
         },
         "idna": {
@@ -687,11 +697,11 @@
         },
         "jsonschema": {
             "hashes": [
-                "sha256:5b22d434a45935119af990552c862e5d6d564e8f6601206b305a61fdf661a2b7",
-                "sha256:ff4cfd6b1367a40e7bc6411caec72effadd3db0bbe5017de188f2d6108335802"
+                "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4",
+                "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==4.22.0"
+            "version": "==4.23.0"
         },
         "jsonschema-specifications": {
             "hashes": [
@@ -706,6 +716,7 @@
                 "sha256:61c9170f92e736b530655e75374681d4fcca9cfa8763ab42be57353b2b203494"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.6'",
             "version": "==1.3.1"
         },
         "markupsafe": {
@@ -888,54 +899,55 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f",
-                "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238",
-                "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f",
-                "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95",
-                "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a",
-                "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a",
-                "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2",
-                "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2",
-                "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f",
-                "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609",
-                "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f",
-                "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad",
-                "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86",
-                "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65",
-                "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb",
-                "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995",
-                "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a",
-                "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85",
-                "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4",
-                "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275",
-                "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1",
-                "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196",
-                "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d",
-                "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e",
-                "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514",
-                "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f",
-                "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6",
-                "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4",
-                "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44",
-                "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df",
-                "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581",
-                "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787",
-                "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5",
-                "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc",
-                "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871",
-                "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54",
-                "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2",
-                "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98",
-                "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9",
-                "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864",
-                "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de",
-                "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289",
-                "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b",
-                "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c",
-                "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9"
+                "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8",
+                "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134",
+                "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d",
+                "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67",
+                "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf",
+                "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02",
+                "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59",
+                "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55",
+                "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c",
+                "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f",
+                "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4",
+                "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018",
+                "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015",
+                "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9",
+                "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3",
+                "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8",
+                "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe",
+                "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1",
+                "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f",
+                "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a",
+                "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42",
+                "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac",
+                "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e",
+                "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06",
+                "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268",
+                "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1",
+                "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4",
+                "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868",
+                "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26",
+                "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef",
+                "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b",
+                "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82",
+                "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343",
+                "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b",
+                "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7",
+                "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171",
+                "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414",
+                "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7",
+                "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87",
+                "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368",
+                "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587",
+                "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990",
+                "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c",
+                "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101",
+                "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"
             ],
             "index": "pypi",
-            "version": "==2.0.0"
+            "markers": "python_version >= '3.9'",
+            "version": "==2.0.1"
         },
         "opensearch-py": {
             "hashes": [
@@ -943,6 +955,7 @@
                 "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.6.0"
         },
         "packaging": {
@@ -986,6 +999,7 @@
                 "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.9'",
             "version": "==2.2.2"
         },
         "pika": {
@@ -1006,11 +1020,11 @@
         },
         "prometheus-flask-exporter": {
             "hashes": [
-                "sha256:7a026b4fdd54ebeddb77589333efe3a1ec43c7c717468825b0b3e9b6c33f7e9e",
-                "sha256:e4e6beb1b8e1e164da6d70fe1edefc95ef184f113b5047f66f4b7262233da9c0"
+                "sha256:587c770a1061e93d72c5cbcdefbd7b633fb764e39dffd7dd16932c9124559244",
+                "sha256:ab49b2c40b57cd35cd51e91e59b3c306b3754477095c4f3cf679034c5122398c"
             ],
             "index": "pypi",
-            "version": "==0.23.0"
+            "version": "==0.23.1"
         },
         "pycparser": {
             "hashes": [
@@ -1060,96 +1074,107 @@
         },
         "pydantic": {
             "hashes": [
-                "sha256:0c84efd9548d545f63ac0060c1e4d39bb9b14db8b3c0652338aecc07b5adec52",
-                "sha256:ee8538d41ccb9c0a9ad3e0e5f07bf15ed8015b481ced539a1759d8cc89ae90d0"
+                "sha256:6f62c13d067b0755ad1c21a34bdd06c0c12625a22b0fc09c6b149816604f7c2a",
+                "sha256:73ee9fddd406dc318b885c7a2eab8a6472b68b8fb5ba8150949fc3db939f23c8"
             ],
             "index": "pypi",
-            "version": "==2.7.4"
+            "markers": "python_version >= '3.8'",
+            "version": "==2.8.2"
         },
         "pydantic-core": {
             "hashes": [
-                "sha256:01dd777215e2aa86dfd664daed5957704b769e726626393438f9c87690ce78c3",
-                "sha256:0eb2a4f660fcd8e2b1c90ad566db2b98d7f3f4717c64fe0a83e0adb39766d5b8",
-                "sha256:0fbbdc827fe5e42e4d196c746b890b3d72876bdbf160b0eafe9f0334525119c8",
-                "sha256:123c3cec203e3f5ac7b000bd82235f1a3eced8665b63d18be751f115588fea30",
-                "sha256:14601cdb733d741b8958224030e2bfe21a4a881fb3dd6fbb21f071cabd48fa0a",
-                "sha256:18f469a3d2a2fdafe99296a87e8a4c37748b5080a26b806a707f25a902c040a8",
-                "sha256:19894b95aacfa98e7cb093cd7881a0c76f55731efad31073db4521e2b6ff5b7d",
-                "sha256:1b4de2e51bbcb61fdebd0ab86ef28062704f62c82bbf4addc4e37fa4b00b7cbc",
-                "sha256:1d886dc848e60cb7666f771e406acae54ab279b9f1e4143babc9c2258213daa2",
-                "sha256:1f4d26ceb5eb9eed4af91bebeae4b06c3fb28966ca3a8fb765208cf6b51102ab",
-                "sha256:21a5e440dbe315ab9825fcd459b8814bb92b27c974cbc23c3e8baa2b76890077",
-                "sha256:293afe532740370aba8c060882f7d26cfd00c94cae32fd2e212a3a6e3b7bc15e",
-                "sha256:2f5966897e5461f818e136b8451d0551a2e77259eb0f73a837027b47dc95dab9",
-                "sha256:2fd41f6eff4c20778d717af1cc50eca52f5afe7805ee530a4fbd0bae284f16e9",
-                "sha256:2fdf2156aa3d017fddf8aea5adfba9f777db1d6022d392b682d2a8329e087cef",
-                "sha256:3c40d4eaad41f78e3bbda31b89edc46a3f3dc6e171bf0ecf097ff7a0ffff7cb1",
-                "sha256:43d447dd2ae072a0065389092a231283f62d960030ecd27565672bd40746c507",
-                "sha256:44a688331d4a4e2129140a8118479443bd6f1905231138971372fcde37e43528",
-                "sha256:44c7486a4228413c317952e9d89598bcdfb06399735e49e0f8df643e1ccd0558",
-                "sha256:44cd83ab6a51da80fb5adbd9560e26018e2ac7826f9626bc06ca3dc074cd198b",
-                "sha256:46387e38bd641b3ee5ce247563b60c5ca098da9c56c75c157a05eaa0933ed154",
-                "sha256:4701b19f7e3a06ea655513f7938de6f108123bf7c86bbebb1196eb9bd35cf724",
-                "sha256:4748321b5078216070b151d5271ef3e7cc905ab170bbfd27d5c83ee3ec436695",
-                "sha256:4b06beb3b3f1479d32befd1f3079cc47b34fa2da62457cdf6c963393340b56e9",
-                "sha256:4d0dcc59664fcb8974b356fe0a18a672d6d7cf9f54746c05f43275fc48636851",
-                "sha256:4e99bc050fe65c450344421017f98298a97cefc18c53bb2f7b3531eb39bc7805",
-                "sha256:509daade3b8649f80d4e5ff21aa5673e4ebe58590b25fe42fac5f0f52c6f034a",
-                "sha256:51991a89639a912c17bef4b45c87bd83593aee0437d8102556af4885811d59f5",
-                "sha256:53db086f9f6ab2b4061958d9c276d1dbe3690e8dd727d6abf2321d6cce37fa94",
-                "sha256:564d7922e4b13a16b98772441879fcdcbe82ff50daa622d681dd682175ea918c",
-                "sha256:574d92eac874f7f4db0ca653514d823a0d22e2354359d0759e3f6a406db5d55d",
-                "sha256:578e24f761f3b425834f297b9935e1ce2e30f51400964ce4801002435a1b41ef",
-                "sha256:59ff3e89f4eaf14050c8022011862df275b552caef8082e37b542b066ce1ff26",
-                "sha256:5f09baa656c904807e832cf9cce799c6460c450c4ad80803517032da0cd062e2",
-                "sha256:6891a2ae0e8692679c07728819b6e2b822fb30ca7445f67bbf6509b25a96332c",
-                "sha256:6a750aec7bf431517a9fd78cb93c97b9b0c496090fee84a47a0d23668976b4b0",
-                "sha256:6f5c4d41b2771c730ea1c34e458e781b18cc668d194958e0112455fff4e402b2",
-                "sha256:77450e6d20016ec41f43ca4a6c63e9fdde03f0ae3fe90e7c27bdbeaece8b1ed4",
-                "sha256:81b5efb2f126454586d0f40c4d834010979cb80785173d1586df845a632e4e6d",
-                "sha256:823be1deb01793da05ecb0484d6c9e20baebb39bd42b5d72636ae9cf8350dbd2",
-                "sha256:834b5230b5dfc0c1ec37b2fda433b271cbbc0e507560b5d1588e2cc1148cf1ce",
-                "sha256:847a35c4d58721c5dc3dba599878ebbdfd96784f3fb8bb2c356e123bdcd73f34",
-                "sha256:86110d7e1907ab36691f80b33eb2da87d780f4739ae773e5fc83fb272f88825f",
-                "sha256:8951eee36c57cd128f779e641e21eb40bc5073eb28b2d23f33eb0ef14ffb3f5d",
-                "sha256:8a7164fe2005d03c64fd3b85649891cd4953a8de53107940bf272500ba8a788b",
-                "sha256:8b8bab4c97248095ae0c4455b5a1cd1cdd96e4e4769306ab19dda135ea4cdb07",
-                "sha256:90afc12421df2b1b4dcc975f814e21bc1754640d502a2fbcc6d41e77af5ec312",
-                "sha256:938cb21650855054dc54dfd9120a851c974f95450f00683399006aa6e8abb057",
-                "sha256:942ba11e7dfb66dc70f9ae66b33452f51ac7bb90676da39a7345e99ffb55402d",
-                "sha256:972658f4a72d02b8abfa2581d92d59f59897d2e9f7e708fdabe922f9087773af",
-                "sha256:97736815b9cc893b2b7f663628e63f436018b75f44854c8027040e05230eeddb",
-                "sha256:98906207f29bc2c459ff64fa007afd10a8c8ac080f7e4d5beff4c97086a3dabd",
-                "sha256:99457f184ad90235cfe8461c4d70ab7dd2680e28821c29eca00252ba90308c78",
-                "sha256:a0d829524aaefdebccb869eed855e2d04c21d2d7479b6cada7ace5448416597b",
-                "sha256:a2fdd81edd64342c85ac7cf2753ccae0b79bf2dfa063785503cb85a7d3593223",
-                "sha256:a55b5b16c839df1070bc113c1f7f94a0af4433fcfa1b41799ce7606e5c79ce0a",
-                "sha256:a642295cd0c8df1b86fc3dced1d067874c353a188dc8e0f744626d49e9aa51c4",
-                "sha256:ab86ce7c8f9bea87b9d12c7f0af71102acbf5ecbc66c17796cff45dae54ef9a5",
-                "sha256:abc267fa9837245cc28ea6929f19fa335f3dc330a35d2e45509b6566dc18be23",
-                "sha256:ae1d6df168efb88d7d522664693607b80b4080be6750c913eefb77e34c12c71a",
-                "sha256:b2ebef0e0b4454320274f5e83a41844c63438fdc874ea40a8b5b4ecb7693f1c4",
-                "sha256:b48ece5bde2e768197a2d0f6e925f9d7e3e826f0ad2271120f8144a9db18d5c8",
-                "sha256:b7cdf28938ac6b8b49ae5e92f2735056a7ba99c9b110a474473fd71185c1af5d",
-                "sha256:bb4462bd43c2460774914b8525f79b00f8f407c945d50881568f294c1d9b4443",
-                "sha256:bc4ff9805858bd54d1a20efff925ccd89c9d2e7cf4986144b30802bf78091c3e",
-                "sha256:c1322d7dd74713dcc157a2b7898a564ab091ca6c58302d5c7b4c07296e3fd00f",
-                "sha256:c67598100338d5d985db1b3d21f3619ef392e185e71b8d52bceacc4a7771ea7e",
-                "sha256:ca26a1e73c48cfc54c4a76ff78df3727b9d9f4ccc8dbee4ae3f73306a591676d",
-                "sha256:d323a01da91851a4f17bf592faf46149c9169d68430b3146dcba2bb5e5719abc",
-                "sha256:dc1803ac5c32ec324c5261c7209e8f8ce88e83254c4e1aebdc8b0a39f9ddb443",
-                "sha256:e00a3f196329e08e43d99b79b286d60ce46bed10f2280d25a1718399457e06be",
-                "sha256:e85637bc8fe81ddb73fda9e56bab24560bdddfa98aa64f87aaa4e4b6730c23d2",
-                "sha256:e858ac0a25074ba4bce653f9b5d0a85b7456eaddadc0ce82d3878c22489fa4ee",
-                "sha256:eae237477a873ab46e8dd748e515c72c0c804fb380fbe6c85533c7de51f23a8f",
-                "sha256:ebef0dd9bf9b812bf75bda96743f2a6c5734a02092ae7f721c048d156d5fabae",
-                "sha256:ec3beeada09ff865c344ff3bc2f427f5e6c26401cc6113d77e372c3fdac73864",
-                "sha256:f76d0ad001edd426b92233d45c746fd08f467d56100fd8f30e9ace4b005266e4",
-                "sha256:f85d05aa0918283cf29a30b547b4df2fbb56b45b135f9e35b6807cb28bc47951",
-                "sha256:f9899c94762343f2cc2fc64c13e7cae4c3cc65cdfc87dd810a31654c9b7358cc"
+                "sha256:035ede2e16da7281041f0e626459bcae33ed998cca6a0a007a5ebb73414ac72d",
+                "sha256:04024d270cf63f586ad41fff13fde4311c4fc13ea74676962c876d9577bcc78f",
+                "sha256:0827505a5c87e8aa285dc31e9ec7f4a17c81a813d45f70b1d9164e03a813a686",
+                "sha256:084659fac3c83fd674596612aeff6041a18402f1e1bc19ca39e417d554468482",
+                "sha256:10d4204d8ca33146e761c79f83cc861df20e7ae9f6487ca290a97702daf56006",
+                "sha256:11b71d67b4725e7e2a9f6e9c0ac1239bbc0c48cce3dc59f98635efc57d6dac83",
+                "sha256:150906b40ff188a3260cbee25380e7494ee85048584998c1e66df0c7a11c17a6",
+                "sha256:175873691124f3d0da55aeea1d90660a6ea7a3cfea137c38afa0a5ffabe37b88",
+                "sha256:177f55a886d74f1808763976ac4efd29b7ed15c69f4d838bbd74d9d09cf6fa86",
+                "sha256:19c0fa39fa154e7e0b7f82f88ef85faa2a4c23cc65aae2f5aea625e3c13c735a",
+                "sha256:1eedfeb6089ed3fad42e81a67755846ad4dcc14d73698c120a82e4ccf0f1f9f6",
+                "sha256:225b67a1f6d602de0ce7f6c1c3ae89a4aa25d3de9be857999e9124f15dab486a",
+                "sha256:242b8feb3c493ab78be289c034a1f659e8826e2233786e36f2893a950a719bb6",
+                "sha256:254ec27fdb5b1ee60684f91683be95e5133c994cc54e86a0b0963afa25c8f8a6",
+                "sha256:25e9185e2d06c16ee438ed39bf62935ec436474a6ac4f9358524220f1b236e43",
+                "sha256:26ab812fa0c845df815e506be30337e2df27e88399b985d0bb4e3ecfe72df31c",
+                "sha256:26ca695eeee5f9f1aeeb211ffc12f10bcb6f71e2989988fda61dabd65db878d4",
+                "sha256:26dc97754b57d2fd00ac2b24dfa341abffc380b823211994c4efac7f13b9e90e",
+                "sha256:270755f15174fb983890c49881e93f8f1b80f0b5e3a3cc1394a255706cabd203",
+                "sha256:2aafc5a503855ea5885559eae883978c9b6d8c8993d67766ee73d82e841300dd",
+                "sha256:2d036c7187b9422ae5b262badb87a20a49eb6c5238b2004e96d4da1231badef1",
+                "sha256:33499e85e739a4b60c9dac710c20a08dc73cb3240c9a0e22325e671b27b70d24",
+                "sha256:37eee5b638f0e0dcd18d21f59b679686bbd18917b87db0193ae36f9c23c355fc",
+                "sha256:38cf1c40a921d05c5edc61a785c0ddb4bed67827069f535d794ce6bcded919fc",
+                "sha256:3acae97ffd19bf091c72df4d726d552c473f3576409b2a7ca36b2f535ffff4a3",
+                "sha256:3c5ebac750d9d5f2706654c638c041635c385596caf68f81342011ddfa1e5598",
+                "sha256:3d482efec8b7dc6bfaedc0f166b2ce349df0011f5d2f1f25537ced4cfc34fd98",
+                "sha256:407653af5617f0757261ae249d3fba09504d7a71ab36ac057c938572d1bc9331",
+                "sha256:40a783fb7ee353c50bd3853e626f15677ea527ae556429453685ae32280c19c2",
+                "sha256:41e81317dd6a0127cabce83c0c9c3fbecceae981c8391e6f1dec88a77c8a569a",
+                "sha256:41f4c96227a67a013e7de5ff8f20fb496ce573893b7f4f2707d065907bffdbd6",
+                "sha256:469f29f9093c9d834432034d33f5fe45699e664f12a13bf38c04967ce233d688",
+                "sha256:4745f4ac52cc6686390c40eaa01d48b18997cb130833154801a442323cc78f91",
+                "sha256:4868f6bd7c9d98904b748a2653031fc9c2f85b6237009d475b1008bfaeb0a5aa",
+                "sha256:4aa223cd1e36b642092c326d694d8bf59b71ddddc94cdb752bbbb1c5c91d833b",
+                "sha256:4dd484681c15e6b9a977c785a345d3e378d72678fd5f1f3c0509608da24f2ac0",
+                "sha256:4f2790949cf385d985a31984907fecb3896999329103df4e4983a4a41e13e840",
+                "sha256:512ecfbefef6dac7bc5eaaf46177b2de58cdf7acac8793fe033b24ece0b9566c",
+                "sha256:516d9227919612425c8ef1c9b869bbbee249bc91912c8aaffb66116c0b447ebd",
+                "sha256:53e431da3fc53360db73eedf6f7124d1076e1b4ee4276b36fb25514544ceb4a3",
+                "sha256:595ba5be69b35777474fa07f80fc260ea71255656191adb22a8c53aba4479231",
+                "sha256:5b5ff4911aea936a47d9376fd3ab17e970cc543d1b68921886e7f64bd28308d1",
+                "sha256:5d41e6daee2813ecceea8eda38062d69e280b39df793f5a942fa515b8ed67953",
+                "sha256:5e999ba8dd90e93d57410c5e67ebb67ffcaadcea0ad973240fdfd3a135506250",
+                "sha256:5f239eb799a2081495ea659d8d4a43a8f42cd1fe9ff2e7e436295c38a10c286a",
+                "sha256:635fee4e041ab9c479e31edda27fcf966ea9614fff1317e280d99eb3e5ab6fe2",
+                "sha256:65db0f2eefcaad1a3950f498aabb4875c8890438bc80b19362cf633b87a8ab20",
+                "sha256:6b507132dcfc0dea440cce23ee2182c0ce7aba7054576efc65634f080dbe9434",
+                "sha256:6b9d9bb600328a1ce523ab4f454859e9d439150abb0906c5a1983c146580ebab",
+                "sha256:70c8daf4faca8da5a6d655f9af86faf6ec2e1768f4b8b9d0226c02f3d6209703",
+                "sha256:77bf3ac639c1ff567ae3b47f8d4cc3dc20f9966a2a6dd2311dcc055d3d04fb8a",
+                "sha256:784c1214cb6dd1e3b15dd8b91b9a53852aed16671cc3fbe4786f4f1db07089e2",
+                "sha256:7eb6a0587eded33aeefea9f916899d42b1799b7b14b8f8ff2753c0ac1741edac",
+                "sha256:7ed1b0132f24beeec5a78b67d9388656d03e6a7c837394f99257e2d55b461611",
+                "sha256:8ad4aeb3e9a97286573c03df758fc7627aecdd02f1da04516a86dc159bf70121",
+                "sha256:964faa8a861d2664f0c7ab0c181af0bea66098b1919439815ca8803ef136fc4e",
+                "sha256:9dc1b507c12eb0481d071f3c1808f0529ad41dc415d0ca11f7ebfc666e66a18b",
+                "sha256:9ebfef07dbe1d93efb94b4700f2d278494e9162565a54f124c404a5656d7ff09",
+                "sha256:a45f84b09ac9c3d35dfcf6a27fd0634d30d183205230a0ebe8373a0e8cfa0906",
+                "sha256:a4f55095ad087474999ee28d3398bae183a66be4823f753cd7d67dd0153427c9",
+                "sha256:a6d511cc297ff0883bc3708b465ff82d7560193169a8b93260f74ecb0a5e08a7",
+                "sha256:a8ad4c766d3f33ba8fd692f9aa297c9058970530a32c728a2c4bfd2616d3358b",
+                "sha256:aa2f457b4af386254372dfa78a2eda2563680d982422641a85f271c859df1987",
+                "sha256:b03f7941783b4c4a26051846dea594628b38f6940a2fdc0df00b221aed39314c",
+                "sha256:b0dae11d8f5ded51699c74d9548dcc5938e0804cc8298ec0aa0da95c21fff57b",
+                "sha256:b91ced227c41aa29c672814f50dbb05ec93536abf8f43cd14ec9521ea09afe4e",
+                "sha256:bc633a9fe1eb87e250b5c57d389cf28998e4292336926b0b6cdaee353f89a237",
+                "sha256:bebb4d6715c814597f85297c332297c6ce81e29436125ca59d1159b07f423eb1",
+                "sha256:c336a6d235522a62fef872c6295a42ecb0c4e1d0f1a3e500fe949415761b8a19",
+                "sha256:c6514f963b023aeee506678a1cf821fe31159b925c4b76fe2afa94cc70b3222b",
+                "sha256:c693e916709c2465b02ca0ad7b387c4f8423d1db7b4649c551f27a529181c5ad",
+                "sha256:c81131869240e3e568916ef4c307f8b99583efaa60a8112ef27a366eefba8ef0",
+                "sha256:d02a72df14dfdbaf228424573a07af10637bd490f0901cee872c4f434a735b94",
+                "sha256:d2a8fa9d6d6f891f3deec72f5cc668e6f66b188ab14bb1ab52422fe8e644f312",
+                "sha256:d2b27e6af28f07e2f195552b37d7d66b150adbaa39a6d327766ffd695799780f",
+                "sha256:d2fe69c5434391727efa54b47a1e7986bb0186e72a41b203df8f5b0a19a4f669",
+                "sha256:d3f3ed29cd9f978c604708511a1f9c2fdcb6c38b9aae36a51905b8811ee5cbf1",
+                "sha256:d573faf8eb7e6b1cbbcb4f5b247c60ca8be39fe2c674495df0eb4318303137fe",
+                "sha256:e0bbdd76ce9aa5d4209d65f2b27fc6e5ef1312ae6c5333c26db3f5ade53a1e99",
+                "sha256:e7c4ea22b6739b162c9ecaaa41d718dfad48a244909fe7ef4b54c0b530effc5a",
+                "sha256:e93e1a4b4b33daed65d781a57a522ff153dcf748dee70b40c7258c5861e1768a",
+                "sha256:e97fdf088d4b31ff4ba35db26d9cc472ac7ef4a2ff2badeabf8d727b3377fc52",
+                "sha256:e9fa4c9bf273ca41f940bceb86922a7667cd5bf90e95dbb157cbb8441008482c",
+                "sha256:eaad4ff2de1c3823fddf82f41121bdf453d922e9a238642b1dedb33c4e4f98ad",
+                "sha256:f1f62b2413c3a0e846c3b838b2ecd6c7a19ec6793b2a522745b0869e37ab5bc1",
+                "sha256:f6d6cff3538391e8486a431569b77921adfcdef14eb18fbf19b7c0a5294d4e6a",
+                "sha256:f9aa05d09ecf4c75157197f27cdc9cfaeb7c5f15021c6373932bf3e124af029f",
+                "sha256:fa2fddcb7107e0d1808086ca306dcade7df60a13a6c347a7acf1ec139aa6789a",
+                "sha256:faa6b09ee09433b87992fb5a2859efd1c264ddc37280d2dd5db502126d0e7f27"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==2.18.4"
+            "version": "==2.20.1"
         },
         "pyjwt": {
             "hashes": [
@@ -1245,112 +1270,117 @@
                 "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
         "rpds-py": {
             "hashes": [
-                "sha256:05f3d615099bd9b13ecf2fc9cf2d839ad3f20239c678f461c753e93755d629ee",
-                "sha256:06d218939e1bf2ca50e6b0ec700ffe755e5216a8230ab3e87c059ebb4ea06afc",
-                "sha256:07f2139741e5deb2c5154a7b9629bc5aa48c766b643c1a6750d16f865a82c5fc",
-                "sha256:08d74b184f9ab6289b87b19fe6a6d1a97fbfea84b8a3e745e87a5de3029bf944",
-                "sha256:0abeee75434e2ee2d142d650d1e54ac1f8b01e6e6abdde8ffd6eeac6e9c38e20",
-                "sha256:154bf5c93d79558b44e5b50cc354aa0459e518e83677791e6adb0b039b7aa6a7",
-                "sha256:17c6d2155e2423f7e79e3bb18151c686d40db42d8645e7977442170c360194d4",
-                "sha256:1805d5901779662d599d0e2e4159d8a82c0b05faa86ef9222bf974572286b2b6",
-                "sha256:19ba472b9606c36716062c023afa2484d1e4220548751bda14f725a7de17b4f6",
-                "sha256:19e515b78c3fc1039dd7da0a33c28c3154458f947f4dc198d3c72db2b6b5dc93",
-                "sha256:1d54f74f40b1f7aaa595a02ff42ef38ca654b1469bef7d52867da474243cc633",
-                "sha256:207c82978115baa1fd8d706d720b4a4d2b0913df1c78c85ba73fe6c5804505f0",
-                "sha256:2625f03b105328729f9450c8badda34d5243231eef6535f80064d57035738360",
-                "sha256:27bba383e8c5231cd559affe169ca0b96ec78d39909ffd817f28b166d7ddd4d8",
-                "sha256:2c3caec4ec5cd1d18e5dd6ae5194d24ed12785212a90b37f5f7f06b8bedd7139",
-                "sha256:2cc7c1a47f3a63282ab0f422d90ddac4aa3034e39fc66a559ab93041e6505da7",
-                "sha256:2fc24a329a717f9e2448f8cd1f960f9dac4e45b6224d60734edeb67499bab03a",
-                "sha256:312fe69b4fe1ffbe76520a7676b1e5ac06ddf7826d764cc10265c3b53f96dbe9",
-                "sha256:32b7daaa3e9389db3695964ce8e566e3413b0c43e3394c05e4b243a4cd7bef26",
-                "sha256:338dee44b0cef8b70fd2ef54b4e09bb1b97fc6c3a58fea5db6cc083fd9fc2724",
-                "sha256:352a88dc7892f1da66b6027af06a2e7e5d53fe05924cc2cfc56495b586a10b72",
-                "sha256:35b2b771b13eee8729a5049c976197ff58a27a3829c018a04341bcf1ae409b2b",
-                "sha256:38e14fb4e370885c4ecd734f093a2225ee52dc384b86fa55fe3f74638b2cfb09",
-                "sha256:3c20f05e8e3d4fc76875fc9cb8cf24b90a63f5a1b4c5b9273f0e8225e169b100",
-                "sha256:3dd3cd86e1db5aadd334e011eba4e29d37a104b403e8ca24dcd6703c68ca55b3",
-                "sha256:489bdfe1abd0406eba6b3bb4fdc87c7fa40f1031de073d0cfb744634cc8fa261",
-                "sha256:48c2faaa8adfacefcbfdb5f2e2e7bdad081e5ace8d182e5f4ade971f128e6bb3",
-                "sha256:4a98a1f0552b5f227a3d6422dbd61bc6f30db170939bd87ed14f3c339aa6c7c9",
-                "sha256:4adec039b8e2928983f885c53b7cc4cda8965b62b6596501a0308d2703f8af1b",
-                "sha256:4e0ee01ad8260184db21468a6e1c37afa0529acc12c3a697ee498d3c2c4dcaf3",
-                "sha256:51584acc5916212e1bf45edd17f3a6b05fe0cbb40482d25e619f824dccb679de",
-                "sha256:531796fb842b53f2695e94dc338929e9f9dbf473b64710c28af5a160b2a8927d",
-                "sha256:5463c47c08630007dc0fe99fb480ea4f34a89712410592380425a9b4e1611d8e",
-                "sha256:5c45a639e93a0c5d4b788b2613bd637468edd62f8f95ebc6fcc303d58ab3f0a8",
-                "sha256:6031b25fb1b06327b43d841f33842b383beba399884f8228a6bb3df3088485ff",
-                "sha256:607345bd5912aacc0c5a63d45a1f73fef29e697884f7e861094e443187c02be5",
-                "sha256:618916f5535784960f3ecf8111581f4ad31d347c3de66d02e728de460a46303c",
-                "sha256:636a15acc588f70fda1661234761f9ed9ad79ebed3f2125d44be0862708b666e",
-                "sha256:673fdbbf668dd958eff750e500495ef3f611e2ecc209464f661bc82e9838991e",
-                "sha256:6afd80f6c79893cfc0574956f78a0add8c76e3696f2d6a15bca2c66c415cf2d4",
-                "sha256:6b5ff7e1d63a8281654b5e2896d7f08799378e594f09cf3674e832ecaf396ce8",
-                "sha256:6c4c4c3f878df21faf5fac86eda32671c27889e13570645a9eea0a1abdd50922",
-                "sha256:6cd8098517c64a85e790657e7b1e509b9fe07487fd358e19431cb120f7d96338",
-                "sha256:6d1e42d2735d437e7e80bab4d78eb2e459af48c0a46e686ea35f690b93db792d",
-                "sha256:6e30ac5e329098903262dc5bdd7e2086e0256aa762cc8b744f9e7bf2a427d3f8",
-                "sha256:70a838f7754483bcdc830444952fd89645569e7452e3226de4a613a4c1793fb2",
-                "sha256:720edcb916df872d80f80a1cc5ea9058300b97721efda8651efcd938a9c70a72",
-                "sha256:732672fbc449bab754e0b15356c077cc31566df874964d4801ab14f71951ea80",
-                "sha256:740884bc62a5e2bbb31e584f5d23b32320fd75d79f916f15a788d527a5e83644",
-                "sha256:7700936ef9d006b7ef605dc53aa364da2de5a3aa65516a1f3ce73bf82ecfc7ae",
-                "sha256:7732770412bab81c5a9f6d20aeb60ae943a9b36dcd990d876a773526468e7163",
-                "sha256:7750569d9526199c5b97e5a9f8d96a13300950d910cf04a861d96f4273d5b104",
-                "sha256:7f1944ce16401aad1e3f7d312247b3d5de7981f634dc9dfe90da72b87d37887d",
-                "sha256:81c5196a790032e0fc2464c0b4ab95f8610f96f1f2fa3d4deacce6a79852da60",
-                "sha256:8352f48d511de5f973e4f2f9412736d7dea76c69faa6d36bcf885b50c758ab9a",
-                "sha256:8927638a4d4137a289e41d0fd631551e89fa346d6dbcfc31ad627557d03ceb6d",
-                "sha256:8c7672e9fba7425f79019db9945b16e308ed8bc89348c23d955c8c0540da0a07",
-                "sha256:8d2e182c9ee01135e11e9676e9a62dfad791a7a467738f06726872374a83db49",
-                "sha256:910e71711d1055b2768181efa0a17537b2622afeb0424116619817007f8a2b10",
-                "sha256:942695a206a58d2575033ff1e42b12b2aece98d6003c6bc739fbf33d1773b12f",
-                "sha256:9437ca26784120a279f3137ee080b0e717012c42921eb07861b412340f85bae2",
-                "sha256:967342e045564cef76dfcf1edb700b1e20838d83b1aa02ab313e6a497cf923b8",
-                "sha256:998125738de0158f088aef3cb264a34251908dd2e5d9966774fdab7402edfab7",
-                "sha256:9e6934d70dc50f9f8ea47081ceafdec09245fd9f6032669c3b45705dea096b88",
-                "sha256:a3d456ff2a6a4d2adcdf3c1c960a36f4fd2fec6e3b4902a42a384d17cf4e7a65",
-                "sha256:a7b28c5b066bca9a4eb4e2f2663012debe680f097979d880657f00e1c30875a0",
-                "sha256:a888e8bdb45916234b99da2d859566f1e8a1d2275a801bb8e4a9644e3c7e7909",
-                "sha256:aa3679e751408d75a0b4d8d26d6647b6d9326f5e35c00a7ccd82b78ef64f65f8",
-                "sha256:aaa71ee43a703c321906813bb252f69524f02aa05bf4eec85f0c41d5d62d0f4c",
-                "sha256:b646bf655b135ccf4522ed43d6902af37d3f5dbcf0da66c769a2b3938b9d8184",
-                "sha256:b906b5f58892813e5ba5c6056d6a5ad08f358ba49f046d910ad992196ea61397",
-                "sha256:b9bb1f182a97880f6078283b3505a707057c42bf55d8fca604f70dedfdc0772a",
-                "sha256:bd1105b50ede37461c1d51b9698c4f4be6e13e69a908ab7751e3807985fc0346",
-                "sha256:bf18932d0003c8c4d51a39f244231986ab23ee057d235a12b2684ea26a353590",
-                "sha256:c273e795e7a0f1fddd46e1e3cb8be15634c29ae8ff31c196debb620e1edb9333",
-                "sha256:c69882964516dc143083d3795cb508e806b09fc3800fd0d4cddc1df6c36e76bb",
-                "sha256:c827576e2fa017a081346dce87d532a5310241648eb3700af9a571a6e9fc7e74",
-                "sha256:cbfbea39ba64f5e53ae2915de36f130588bba71245b418060ec3330ebf85678e",
-                "sha256:ce0bb20e3a11bd04461324a6a798af34d503f8d6f1aa3d2aa8901ceaf039176d",
-                "sha256:d0cee71bc618cd93716f3c1bf56653740d2d13ddbd47673efa8bf41435a60daa",
-                "sha256:d21be4770ff4e08698e1e8e0bce06edb6ea0626e7c8f560bc08222880aca6a6f",
-                "sha256:d31dea506d718693b6b2cffc0648a8929bdc51c70a311b2770f09611caa10d53",
-                "sha256:d44607f98caa2961bab4fa3c4309724b185b464cdc3ba6f3d7340bac3ec97cc1",
-                "sha256:d58ad6317d188c43750cb76e9deacf6051d0f884d87dc6518e0280438648a9ac",
-                "sha256:d70129cef4a8d979caa37e7fe957202e7eee8ea02c5e16455bc9808a59c6b2f0",
-                "sha256:d85164315bd68c0806768dc6bb0429c6f95c354f87485ee3593c4f6b14def2bd",
-                "sha256:d960de62227635d2e61068f42a6cb6aae91a7fe00fca0e3aeed17667c8a34611",
-                "sha256:dc48b479d540770c811fbd1eb9ba2bb66951863e448efec2e2c102625328e92f",
-                "sha256:e1735502458621921cee039c47318cb90b51d532c2766593be6207eec53e5c4c",
-                "sha256:e2be6e9dd4111d5b31ba3b74d17da54a8319d8168890fbaea4b9e5c3de630ae5",
-                "sha256:e4c39ad2f512b4041343ea3c7894339e4ca7839ac38ca83d68a832fc8b3748ab",
-                "sha256:ed402d6153c5d519a0faf1bb69898e97fb31613b49da27a84a13935ea9164dfc",
-                "sha256:ee17cd26b97d537af8f33635ef38be873073d516fd425e80559f4585a7b90c43",
-                "sha256:f3027be483868c99b4985fda802a57a67fdf30c5d9a50338d9db646d590198da",
-                "sha256:f5bab211605d91db0e2995a17b5c6ee5edec1270e46223e513eaa20da20076ac",
-                "sha256:f6f8e3fecca256fefc91bb6765a693d96692459d7d4c644660a9fff32e517843",
-                "sha256:f7afbfee1157e0f9376c00bb232e80a60e59ed716e3211a80cb8506550671e6e",
-                "sha256:fa242ac1ff583e4ec7771141606aafc92b361cd90a05c30d93e343a0c2d82a89",
-                "sha256:fab6ce90574645a0d6c58890e9bcaac8d94dff54fb51c69e5522a7358b80ab64"
+                "sha256:01227f8b3e6c8961490d869aa65c99653df80d2f0a7fde8c64ebddab2b9b02fd",
+                "sha256:08ce9c95a0b093b7aec75676b356a27879901488abc27e9d029273d280438505",
+                "sha256:0b02dd77a2de6e49078c8937aadabe933ceac04b41c5dde5eca13a69f3cf144e",
+                "sha256:0d4b52811dcbc1aba08fd88d475f75b4f6db0984ba12275d9bed1a04b2cae9b5",
+                "sha256:13e6d4840897d4e4e6b2aa1443e3a8eca92b0402182aafc5f4ca1f5e24f9270a",
+                "sha256:1a129c02b42d46758c87faeea21a9f574e1c858b9f358b6dd0bbd71d17713175",
+                "sha256:1a8dfa125b60ec00c7c9baef945bb04abf8ac772d8ebefd79dae2a5f316d7850",
+                "sha256:1c32e41de995f39b6b315d66c27dea3ef7f7c937c06caab4c6a79a5e09e2c415",
+                "sha256:1d494887d40dc4dd0d5a71e9d07324e5c09c4383d93942d391727e7a40ff810b",
+                "sha256:1d4af2eb520d759f48f1073ad3caef997d1bfd910dc34e41261a595d3f038a94",
+                "sha256:1fb93d3486f793d54a094e2bfd9cd97031f63fcb5bc18faeb3dd4b49a1c06523",
+                "sha256:24f8ae92c7fae7c28d0fae9b52829235df83f34847aa8160a47eb229d9666c7b",
+                "sha256:24fc5a84777cb61692d17988989690d6f34f7f95968ac81398d67c0d0994a897",
+                "sha256:26ab43b6d65d25b1a333c8d1b1c2f8399385ff683a35ab5e274ba7b8bb7dc61c",
+                "sha256:271accf41b02687cef26367c775ab220372ee0f4925591c6796e7c148c50cab5",
+                "sha256:2ddd50f18ebc05ec29a0d9271e9dbe93997536da3546677f8ca00b76d477680c",
+                "sha256:31dd5794837f00b46f4096aa8ccaa5972f73a938982e32ed817bb520c465e520",
+                "sha256:31e450840f2f27699d014cfc8865cc747184286b26d945bcea6042bb6aa4d26e",
+                "sha256:32e0db3d6e4f45601b58e4ac75c6f24afbf99818c647cc2066f3e4b192dabb1f",
+                "sha256:346557f5b1d8fd9966059b7a748fd79ac59f5752cd0e9498d6a40e3ac1c1875f",
+                "sha256:34bca66e2e3eabc8a19e9afe0d3e77789733c702c7c43cd008e953d5d1463fde",
+                "sha256:3511f6baf8438326e351097cecd137eb45c5f019944fe0fd0ae2fea2fd26be39",
+                "sha256:35af5e4d5448fa179fd7fff0bba0fba51f876cd55212f96c8bbcecc5c684ae5c",
+                "sha256:3837c63dd6918a24de6c526277910e3766d8c2b1627c500b155f3eecad8fad65",
+                "sha256:39d67896f7235b2c886fb1ee77b1491b77049dcef6fbf0f401e7b4cbed86bbd4",
+                "sha256:3b823be829407393d84ee56dc849dbe3b31b6a326f388e171555b262e8456cc1",
+                "sha256:3c73254c256081704dba0a333457e2fb815364018788f9b501efe7c5e0ada401",
+                "sha256:3ddab996807c6b4227967fe1587febade4e48ac47bb0e2d3e7858bc621b1cace",
+                "sha256:3e1dc59a5e7bc7f44bd0c048681f5e05356e479c50be4f2c1a7089103f1621d5",
+                "sha256:4383beb4a29935b8fa28aca8fa84c956bf545cb0c46307b091b8d312a9150e6a",
+                "sha256:4cc4bc73e53af8e7a42c8fd7923bbe35babacfa7394ae9240b3430b5dcf16b2a",
+                "sha256:4dd02e29c8cbed21a1875330b07246b71121a1c08e29f0ee3db5b4cfe16980c4",
+                "sha256:4f580ae79d0b861dfd912494ab9d477bea535bfb4756a2269130b6607a21802e",
+                "sha256:53dbc35808c6faa2ce3e48571f8f74ef70802218554884787b86a30947842a14",
+                "sha256:56313be667a837ff1ea3508cebb1ef6681d418fa2913a0635386cf29cff35165",
+                "sha256:57863d16187995c10fe9cf911b897ed443ac68189179541734502353af33e693",
+                "sha256:5953391af1405f968eb5701ebbb577ebc5ced8d0041406f9052638bafe52209d",
+                "sha256:5beffdbe766cfe4fb04f30644d822a1080b5359df7db3a63d30fa928375b2720",
+                "sha256:5e360188b72f8080fefa3adfdcf3618604cc8173651c9754f189fece068d2a45",
+                "sha256:5e58b61dcbb483a442c6239c3836696b79f2cd8e7eec11e12155d3f6f2d886d1",
+                "sha256:69084fd29bfeff14816666c93a466e85414fe6b7d236cfc108a9c11afa6f7301",
+                "sha256:6d1d7539043b2b31307f2c6c72957a97c839a88b2629a348ebabe5aa8b626d6b",
+                "sha256:6d8b735c4d162dc7d86a9cf3d717f14b6c73637a1f9cd57fe7e61002d9cb1972",
+                "sha256:6ea961a674172ed2235d990d7edf85d15d8dfa23ab8575e48306371c070cda67",
+                "sha256:71157f9db7f6bc6599a852852f3389343bea34315b4e6f109e5cbc97c1fb2963",
+                "sha256:720f3108fb1bfa32e51db58b832898372eb5891e8472a8093008010911e324c5",
+                "sha256:74129d5ffc4cde992d89d345f7f7d6758320e5d44a369d74d83493429dad2de5",
+                "sha256:747251e428406b05fc86fee3904ee19550c4d2d19258cef274e2151f31ae9d38",
+                "sha256:75130df05aae7a7ac171b3b5b24714cffeabd054ad2ebc18870b3aa4526eba23",
+                "sha256:7b3661e6d4ba63a094138032c1356d557de5b3ea6fd3cca62a195f623e381c76",
+                "sha256:7d5c7e32f3ee42f77d8ff1a10384b5cdcc2d37035e2e3320ded909aa192d32c3",
+                "sha256:8124101e92c56827bebef084ff106e8ea11c743256149a95b9fd860d3a4f331f",
+                "sha256:81db2e7282cc0487f500d4db203edc57da81acde9e35f061d69ed983228ffe3b",
+                "sha256:840e18c38098221ea6201f091fc5d4de6128961d2930fbbc96806fb43f69aec1",
+                "sha256:89cc8921a4a5028d6dd388c399fcd2eef232e7040345af3d5b16c04b91cf3c7e",
+                "sha256:8b32cd4ab6db50c875001ba4f5a6b30c0f42151aa1fbf9c2e7e3674893fb1dc4",
+                "sha256:8df1c283e57c9cb4d271fdc1875f4a58a143a2d1698eb0d6b7c0d7d5f49c53a1",
+                "sha256:902cf4739458852fe917104365ec0efbea7d29a15e4276c96a8d33e6ed8ec137",
+                "sha256:97fbb77eaeb97591efdc654b8b5f3ccc066406ccfb3175b41382f221ecc216e8",
+                "sha256:9c7042488165f7251dc7894cd533a875d2875af6d3b0e09eda9c4b334627ad1c",
+                "sha256:9e318e6786b1e750a62f90c6f7fa8b542102bdcf97c7c4de2a48b50b61bd36ec",
+                "sha256:a9421b23c85f361a133aa7c5e8ec757668f70343f4ed8fdb5a4a14abd5437244",
+                "sha256:aaf71f95b21f9dc708123335df22e5a2fef6307e3e6f9ed773b2e0938cc4d491",
+                "sha256:afedc35fe4b9e30ab240b208bb9dc8938cb4afe9187589e8d8d085e1aacb8309",
+                "sha256:b5e28e56143750808c1c79c70a16519e9bc0a68b623197b96292b21b62d6055c",
+                "sha256:b82c9514c6d74b89a370c4060bdb80d2299bc6857e462e4a215b4ef7aa7b090e",
+                "sha256:b8f78398e67a7227aefa95f876481485403eb974b29e9dc38b307bb6eb2315ea",
+                "sha256:bbda75f245caecff8faa7e32ee94dfaa8312a3367397975527f29654cd17a6ed",
+                "sha256:bca34e913d27401bda2a6f390d0614049f5a95b3b11cd8eff80fe4ec340a1208",
+                "sha256:bd04d8cab16cab5b0a9ffc7d10f0779cf1120ab16c3925404428f74a0a43205a",
+                "sha256:c149a652aeac4902ecff2dd93c3b2681c608bd5208c793c4a99404b3e1afc87c",
+                "sha256:c2087dbb76a87ec2c619253e021e4fb20d1a72580feeaa6892b0b3d955175a71",
+                "sha256:c34f751bf67cab69638564eee34023909380ba3e0d8ee7f6fe473079bf93f09b",
+                "sha256:c6d20c8896c00775e6f62d8373aba32956aa0b850d02b5ec493f486c88e12859",
+                "sha256:c7af6f7b80f687b33a4cdb0a785a5d4de1fb027a44c9a049d8eb67d5bfe8a687",
+                "sha256:c7b07959866a6afb019abb9564d8a55046feb7a84506c74a6f197cbcdf8a208e",
+                "sha256:ca0dda0c5715efe2ab35bb83f813f681ebcd2840d8b1b92bfc6fe3ab382fae4a",
+                "sha256:cdb7eb3cf3deb3dd9e7b8749323b5d970052711f9e1e9f36364163627f96da58",
+                "sha256:ce757c7c90d35719b38fa3d4ca55654a76a40716ee299b0865f2de21c146801c",
+                "sha256:d1fa67ef839bad3815124f5f57e48cd50ff392f4911a9f3cf449d66fa3df62a5",
+                "sha256:d2dbd8f4990d4788cb122f63bf000357533f34860d269c1a8e90ae362090ff3a",
+                "sha256:d4ec0046facab83012d821b33cead742a35b54575c4edfb7ed7445f63441835f",
+                "sha256:dbceedcf4a9329cc665452db1aaf0845b85c666e4885b92ee0cddb1dbf7e052a",
+                "sha256:dc733d35f861f8d78abfaf54035461e10423422999b360966bf1c443cbc42705",
+                "sha256:dd635c2c4043222d80d80ca1ac4530a633102a9f2ad12252183bcf338c1b9474",
+                "sha256:de1f7cd5b6b351e1afd7568bdab94934d656abe273d66cda0ceea43bbc02a0c2",
+                "sha256:df7c841813f6265e636fe548a49664c77af31ddfa0085515326342a751a6ba51",
+                "sha256:e0f9d268b19e8f61bf42a1da48276bcd05f7ab5560311f541d22557f8227b866",
+                "sha256:e2d66eb41ffca6cc3c91d8387509d27ba73ad28371ef90255c50cb51f8953301",
+                "sha256:e429fc517a1c5e2a70d576077231538a98d59a45dfc552d1ac45a132844e6dfb",
+                "sha256:e4d2b88efe65544a7d5121b0c3b003ebba92bfede2ea3577ce548b69c5235185",
+                "sha256:e76c902d229a3aa9d5ceb813e1cbcc69bf5bda44c80d574ff1ac1fa3136dea71",
+                "sha256:ef07a0a1d254eeb16455d839cef6e8c2ed127f47f014bbda64a58b5482b6c836",
+                "sha256:f09529d2332264a902688031a83c19de8fda5eb5881e44233286b9c9ec91856d",
+                "sha256:f0a6d4a93d2a05daec7cb885157c97bbb0be4da739d6f9dfb02e101eb40921cd",
+                "sha256:f0cf2a0dbb5987da4bd92a7ca727eadb225581dd9681365beba9accbe5308f7d",
+                "sha256:f2671cb47e50a97f419a02cd1e0c339b31de017b033186358db92f4d8e2e17d8",
+                "sha256:f35b34a5184d5e0cc360b61664c1c06e866aab077b5a7c538a3e20c8fcdbf90b",
+                "sha256:f3d73022990ab0c8b172cce57c69fd9a89c24fd473a5e79cbce92df87e3d9c48",
+                "sha256:f5b8353ea1a4d7dfb59a7f45c04df66ecfd363bb5b35f33b11ea579111d4655f",
+                "sha256:f809a17cc78bd331e137caa25262b507225854073fd319e987bd216bed911b7c",
+                "sha256:f9bc4161bd3b970cd6a6fcda70583ad4afd10f2750609fb1f3ca9505050d4ef3",
+                "sha256:fdf4890cda3b59170009d012fca3294c00140e7f2abe1910e6a730809d0f3f9b"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==0.18.1"
+            "version": "==0.19.1"
         },
         "s3transfer": {
             "hashes": [
@@ -1362,11 +1392,11 @@
         },
         "setuptools": {
             "hashes": [
-                "sha256:937a48c7cdb7a21eb53cd7f9b59e525503aa8abaf3584c730dc5f7a5bec3a650",
-                "sha256:a58a8fde0541dab0419750bcc521fbdf8585f6e5cb41909df3a472ef7b81ca95"
+                "sha256:5a0d9c6a2f332881a0153f629d8000118efd33255cfa802757924c53312c76da",
+                "sha256:98b4d786a12fadd34eabf69e8d014b84e5fc655981e4ff419994700434ace132"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==70.1.1"
+            "version": "==72.0.0"
         },
         "six": {
             "hashes": [
@@ -1609,11 +1639,11 @@
         },
         "certifi": {
             "hashes": [
-                "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516",
-                "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"
+                "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b",
+                "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"
             ],
             "markers": "python_version >= '3.6'",
-            "version": "==2024.6.2"
+            "version": "==2024.7.4"
         },
         "cffi": {
             "hashes": [
@@ -1771,61 +1801,62 @@
         },
         "coverage": {
             "hashes": [
-                "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f",
-                "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d",
-                "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747",
-                "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f",
-                "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d",
-                "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f",
-                "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47",
-                "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e",
-                "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba",
-                "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c",
-                "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b",
-                "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4",
-                "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7",
-                "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555",
-                "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233",
-                "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace",
-                "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805",
-                "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136",
-                "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4",
-                "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d",
-                "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806",
-                "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99",
-                "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8",
-                "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b",
-                "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5",
-                "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da",
-                "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0",
-                "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078",
-                "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f",
-                "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029",
-                "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353",
-                "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638",
-                "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9",
-                "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f",
-                "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7",
-                "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3",
-                "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e",
-                "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016",
-                "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088",
-                "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4",
-                "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882",
-                "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7",
-                "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53",
-                "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d",
-                "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080",
-                "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5",
-                "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d",
-                "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c",
-                "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8",
-                "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633",
-                "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9",
-                "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"
+                "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382",
+                "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1",
+                "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac",
+                "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee",
+                "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166",
+                "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57",
+                "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c",
+                "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b",
+                "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51",
+                "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da",
+                "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450",
+                "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2",
+                "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd",
+                "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d",
+                "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d",
+                "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6",
+                "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca",
+                "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169",
+                "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1",
+                "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713",
+                "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b",
+                "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6",
+                "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c",
+                "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605",
+                "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463",
+                "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b",
+                "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6",
+                "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5",
+                "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63",
+                "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c",
+                "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783",
+                "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44",
+                "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca",
+                "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8",
+                "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d",
+                "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390",
+                "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933",
+                "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67",
+                "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b",
+                "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03",
+                "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b",
+                "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791",
+                "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb",
+                "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807",
+                "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6",
+                "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2",
+                "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428",
+                "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd",
+                "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c",
+                "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94",
+                "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8",
+                "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"
             ],
             "index": "pypi",
-            "version": "==7.5.4"
+            "markers": "python_version >= '3.8'",
+            "version": "==7.6.0"
         },
         "docker": {
             "hashes": [
@@ -1871,6 +1902,7 @@
                 "sha256:b6e78b685dd4e9c016d7a4299cf1de69e299c88322e3f81c716e6e23fe5683c1"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8' and python_version < '4'",
             "version": "==2.6.0"
         },
         "packaging": {
@@ -1937,11 +1969,12 @@
         },
         "pytest": {
             "hashes": [
-                "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343",
-                "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"
+                "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5",
+                "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"
             ],
             "index": "pypi",
-            "version": "==8.2.2"
+            "markers": "python_version >= '3.8'",
+            "version": "==8.3.2"
         },
         "python-dateutil": {
             "hashes": [
@@ -1957,6 +1990,7 @@
                 "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.8'",
             "version": "==2.32.3"
         },
         "requests-mock": {
@@ -1965,6 +1999,7 @@
                 "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.5'",
             "version": "==1.12.1"
         },
         "six": {
@@ -1987,6 +2022,7 @@
                 "sha256:54d330d085c0a11fc5da0b001af87aec4dd3e814104376bf7513e8646c77442a"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "testcontainers-opensearch": {
@@ -1994,6 +2030,7 @@
                 "sha256:0bdf270b5b7f53915832f7c31dd2bd3ffdc20b534ea6b32231cc7003049bd0e1"
             ],
             "index": "pypi",
+            "markers": "python_version >= '3.7'",
             "version": "==0.0.1rc1"
         },
         "typing-extensions": {
diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py
index d19b721a33a211b44a56a8a727c7ff0badbce7f6..bbce751508c62e8a5f375447b97a7486668b9673 100644
--- a/dbrepo-analyse-service/app.py
+++ b/dbrepo-analyse-service/app.py
@@ -254,10 +254,10 @@ def analyse_datatypes():
         return Response(res, mimetype="application/json"), 202
     except OSError as e:
         logging.error(f"Failed to determine data types: {e}")
-        return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.csv.invalid'), 400
+        return ApiError(status='BAD_REQUEST', message=str(e), code='error.analyse.invalid').model_dump_json(), 400
     except ClientError as e:
         logging.error(f"Failed to determine separator: {e}")
-        return ApiError(status='NOT_FOUND', message='Failed to find csv', code='analyse.csv.missing'), 404
+        return ApiError(status='NOT_FOUND', message='Failed to find csv', code='error.analyse.missing').model_dump_json(), 404
 
 
 @app.route("/api/analyse/keys", methods=["GET"], endpoint="analyse_analyse_keys")
@@ -269,7 +269,7 @@ def analyse_keys():
     logging.debug(f"Analyse keys from filename '{filename}' with separator {separator}")
     if filename is None or separator is None:
         return ApiError(status='BAD_REQUEST', message="Missing required query parameters 'filename' and 'separator'",
-                        code='analyse.csv.invalid'), 400
+                        code='analyse.csv.invalid').model_dump_json(), 400
     try:
         res = {
             'keys': determine_pk(filename, separator)
@@ -278,4 +278,4 @@ def analyse_keys():
         return Response(dumps(res), mimetype="application/json"), 202
     except OSError as e:
         logging.error(f"Failed to determine primary key: {e}")
-        return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid'), 400
+        return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid').model_dump_json(), 400
diff --git a/dbrepo-analyse-service/determine_dt.py b/dbrepo-analyse-service/determine_dt.py
index 3fcfc73e9454fc5f6c98488a6096a8cdb3859628..6a224018665e9d2583da023f558837a9f24ab4e2 100644
--- a/dbrepo-analyse-service/determine_dt.py
+++ b/dbrepo-analyse-service/determine_dt.py
@@ -9,11 +9,12 @@ import pandas
 
 from numpy import dtype, max, min
 from flask import current_app
+from pandas.errors import EmptyDataError
 
 from clients.s3_client import S3Client
 
 
-def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=None) -> {}:
+def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=',') -> {}:
     # Use option enum=True for searching Postgres ENUM Types in CSV file. Remark
     # Enum is not SQL standard, hence, it might not be supported by all db-engines.
     # However, it can be used in Postgres and MySQL.
@@ -35,10 +36,22 @@ def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=None) -
             line_terminator = "\r"
         elif b"\r\n" in line:
             line_terminator = "\r\n"
-        logging.info("Analysing corpus with separator: %s", separator)
+        logging.info(f"Analysing corpus with separator: {separator}")
 
         # index_col=False -> prevent shared index & count length correct
-        df = pandas.read_csv(fh, delimiter=separator, nrows=100, lineterminator=line_terminator, index_col=False)
+        df = None
+        for encoding in ['utf-8', 'cp1252', 'latin1', 'iso-8859-1']:
+            try:
+                logging.debug(f"attempt parsing .csv using encoding {encoding}")
+                df = pandas.read_csv(fh, delimiter=separator, nrows=100, lineterminator=line_terminator,
+                                     index_col=False, encoding=encoding)
+                logging.debug(f"parsing .csv using encoding {encoding} was successful")
+                break
+            except (UnicodeDecodeError, EmptyDataError) as error:
+                logging.warning(f"Failed to parse .csv using encoding {encoding}: {error}")
+        if df is None:
+            raise IOError(
+                f"Failed to parse .csv: no supported encoding found (one of: utf-8, cp1252, latin1, iso-8859-1)")
 
         if b"," in line:
             separator = ","
@@ -51,31 +64,44 @@ def determine_datatypes(filename, enum=False, enum_tol=0.0001, separator=None) -
 
         for name, dataType in df.dtypes.items():
             if dataType == dtype('float64'):
-                r[name] = 'decimal'
+                if pandas.to_numeric(df[name], errors='coerce').notnull().all():
+                    logging.debug(f"mapped column {name} from float64 to decimal")
+                    r[name] = 'decimal'
+                else:
+                    logging.debug(f"mapped column {name} from float64 to text")
+                    r[name] = 'text'
             elif dataType == dtype('int64'):
                 min_val = min(df[name])
                 max_val = max(df[name])
                 if 0 <= min_val <= 1 and 0 <= max_val <= 1:
+                    logging.debug(f"mapped column {name} from int64 to bool")
                     r[name] = 'bool'
                     continue
+                logging.debug(f"mapped column {name} from int64 to bigint")
                 r[name] = 'bigint'
             elif dataType == dtype('O'):
                 try:
                     pandas.to_datetime(df[name], format='mixed')
+                    logging.debug(f"mapped column {name} from O to timestamp")
                     r[name] = 'timestamp'
                     continue
                 except ValueError:
                     pass
                 max_size = max(df[name].astype(str).map(len))
                 if max_size <= 1:
+                    logging.debug(f"mapped column {name} from O to char")
                     r[name] = 'char'
                 if 0 <= max_size <= 255:
+                    logging.debug(f"mapped column {name} from O to varchar")
                     r[name] = 'varchar'
                 else:
+                    logging.debug(f"mapped column {name} from O to text")
                     r[name] = 'text'
             elif dataType == dtype('bool'):
+                logging.debug(f"mapped column {name} from bool to bool")
                 r[name] = 'bool'
             elif dataType == dtype('datetime64'):
+                logging.debug(f"mapped column {name} from datetime64 to datetime")
                 r[name] = 'datetime'
             else:
                 logging.warning(f'default to \'text\' for column {name} and type {dtype}')
diff --git a/dbrepo-analyse-service/determine_pk.py b/dbrepo-analyse-service/determine_pk.py
index 0e3a66ad19d47c66fa6c6fba5081a25e7e150aaf..141d90b78e43b05cce8b2f6c10700a18d14c6073 100644
--- a/dbrepo-analyse-service/determine_pk.py
+++ b/dbrepo-analyse-service/determine_pk.py
@@ -8,7 +8,7 @@ from determine_dt import determine_datatypes
 from clients.s3_client import S3Client
 
 
-def determine_pk(filename, separator=","):
+def determine_pk(filename: str, separator: str = ','):
     dt = json.loads(determine_datatypes(filename=filename, separator=separator))
     dt = {k.lower(): v for k, v in dt["columns"].items()}
     # {k.lower(): v for k, v in dt['columns'].items() if v != 'Numeric'}
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl
deleted file mode 100644
index 617969c3eb15926d932b7c0180bed51b9ef7052d..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.4.4-py3-none-any.whl and /dev/null differ
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz
deleted file mode 100644
index 9d1d5ae238baba6bc51db4d219a0d09b5aca1c51..0000000000000000000000000000000000000000
Binary files a/dbrepo-analyse-service/lib/dbrepo-1.4.4.tar.gz and /dev/null differ
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java
index f4626deb93f9f1581be1ee5eab2fe748734ee4e6..8f5f4a821484d23a51dd5c60a6bba658278fdb14 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/SubsetEndpoint.java
@@ -261,12 +261,12 @@ public class SubsetEndpoint {
             QueryNotFoundException, StorageUnavailableException, QueryMalformedException, SidecarExportException,
             StorageNotFoundException, QueryStoreInsertException, TableMalformedException, PaginationException,
             QueryNotSupportedException, NotAllowedException, UserNotFoundException, MetadataServiceException {
-        log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, page={}, " +
-                "size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size, timestamp);
+        log.debug("endpoint create subset in database, databaseId={}, data.statement={}, principal.name={}, " +
+                "page={}, size={}, timestamp={}", databaseId, data.getStatement(), principal.getName(), page, size,
+                timestamp);
         /* check */
         endpointValidator.validateDataParams(page, size);
         endpointValidator.validateForbiddenStatements(data.getStatement());
-        metadataServiceGateway.getAccess(databaseId, UserUtil.getId(principal));
         /* parameters */
         if (page == null) {
             page = 0L;
diff --git a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index 7e95c7cfa94ae356a1e3d908c903bf7294f3621a..f4d31bbc216b333656d1ac70d0e3f28ddd49be0f 100644
--- a/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-data-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -646,7 +646,7 @@ public class TableEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
-                    description = "Failed to find table in metadata database",
+                    description = "Failed to find table or database in metadata database",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -659,9 +659,10 @@ public class TableEndpoint {
     public ResponseEntity<TableStatisticDto> statistic(@NotBlank @PathVariable("databaseId") Long databaseId,
                                                        @NotBlank @PathVariable("tableId") Long tableId)
             throws DatabaseUnavailableException, RemoteUnavailableException, TableNotFoundException,
-            MetadataServiceException, TableMalformedException, QueryMalformedException {
+            MetadataServiceException, TableMalformedException, DatabaseNotFoundException {
         log.debug("endpoint generate table statistic, databaseId={}, tableId={}", databaseId, tableId);
         final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId);
+        table.setDatabase(metadataServiceGateway.getDatabaseById(databaseId));
         try {
             final TableStatisticDto dto = tableService.getStatistics(table);
             return ResponseEntity.ok(dto);
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java
index c45454b8f3c3ac8238726755e0eda19c063ed1f8..d554667467009b396caee8f2800b522f21f8ace6 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/SubsetEndpointUnitTest.java
@@ -167,7 +167,7 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"})
-    public void create_succeeds() throws UserNotFoundException, QueryStoreInsertException, TableMalformedException,
+    public void create_noAccess_succeeds() throws UserNotFoundException, QueryStoreInsertException, TableMalformedException,
             NotAllowedException, SidecarExportException, QueryNotSupportedException, PaginationException,
             StorageNotFoundException, DatabaseUnavailableException, StorageUnavailableException,
             QueryMalformedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException,
@@ -177,8 +177,6 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* mock */
-        when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID))
-                .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO);
         when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID))
                 .thenReturn(DATABASE_3_PRIVILEGED_DTO);
         when(queryService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null)))
@@ -213,8 +211,6 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
                 .build();
 
         /* mock */
-        when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID))
-                .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO);
         when(metadataServiceGateway.getDatabaseById(DATABASE_3_ID))
                 .thenReturn(DATABASE_3_PRIVILEGED_DTO);
         when(queryService.execute(eq(DATABASE_3_PRIVILEGED_DTO), anyString(), any(Instant.class), eq(USER_1_ID), eq(0L), eq(10L), eq(null), eq(null)))
@@ -226,15 +222,13 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"execute-query"})
-    public void create_databaseNotFound_fails() throws NotAllowedException, RemoteUnavailableException,
+    public void create_databaseNotFound_fails() throws RemoteUnavailableException,
             DatabaseNotFoundException, MetadataServiceException {
         final ExecuteStatementDto request = ExecuteStatementDto.builder()
                 .statement(QUERY_5_STATEMENT)
                 .build();
 
         /* mock */
-        when(metadataServiceGateway.getAccess(DATABASE_3_ID, USER_1_ID))
-                .thenReturn(DATABASE_3_USER_1_READ_ACCESS_DTO);
         doThrow(DatabaseNotFoundException.class)
                 .when(metadataServiceGateway)
                 .getDatabaseById(DATABASE_3_ID);
@@ -258,24 +252,6 @@ public class SubsetEndpointUnitTest extends AbstractUnitTest {
         });
     }
 
-    @Test
-    @WithMockUser(username = USER_4_USERNAME, authorities = {"execute-query"})
-    public void create_noAccess_fails() throws NotAllowedException, RemoteUnavailableException, MetadataServiceException {
-        final ExecuteStatementDto request = ExecuteStatementDto.builder()
-                .statement(QUERY_5_STATEMENT)
-                .build();
-
-        /* mock */
-        doThrow(NotAllowedException.class)
-                .when(metadataServiceGateway)
-                .getAccess(DATABASE_3_ID, USER_4_ID);
-
-        /* test */
-        assertThrows(NotAllowedException.class, () -> {
-            subsetEndpoint.create(DATABASE_3_ID, request, USER_4_PRINCIPAL, null, null, null);
-        });
-    }
-
     @Test
     public void getData_succeeds() throws DatabaseNotFoundException, RemoteUnavailableException, UserNotFoundException,
             NotAllowedException, SQLException, QueryNotFoundException, TableMalformedException, QueryMalformedException,
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
index 65ec32c0d501524028e7caef05cb58e997d19446..41fa4963fb26158f11060db383c4cb973e66e1c0 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java
@@ -451,7 +451,7 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
     }
 
     @Test
-    public void getStatistics_succeeds() throws TableMalformedException, SQLException, QueryMalformedException {
+    public void getStatistics_succeeds() throws TableMalformedException, SQLException, TableNotFoundException {
 
         /* test */
         final TableStatisticDto response = tableService.getStatistics(TABLE_1_PRIVILEGED_DTO);
@@ -493,13 +493,8 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
     @Test
     public void create_malformed_fails() {
         final at.tuwien.api.database.table.internal.TableCreateDto request = TableCreateDto.builder()
-                .needSequence(false)
                 .name("missing_foreign_key")
-                .columns(List.of(ColumnCreateDto.builder()
-                        .name("id")
-                        .type(ColumnTypeDto.BIGINT)
-                        .nullAllowed(false)
-                        .build()))
+                .columns(List.of())
                 .constraints(ConstraintsCreateDto.builder()
                         .foreignKeys(List.of(ForeignKeyCreateDto.builder()
                                 .columns(List.of("i_do_not_exist"))
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java
index f95bb3fe76a1e95786fae0b109ee7c1619954209..6e233395d92ae03785ba820055cb7d421cfc7b38 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/KeycloakGatewayImpl.java
@@ -41,9 +41,17 @@ public class KeycloakGatewayImpl implements KeycloakGateway {
         final String url = keycloakConfig.getKeycloakEndpoint() + "/realms/dbrepo/protocol/openid-connect/token";
         log.trace("request user token from url: {}", url);
         log.trace("request username: {}", username);
-        log.trace("request password: {}", password != null ? "(set)" : "(not set)");
+        if (password.isEmpty() || password.isBlank()) {
+            log.warn("request password: (empty)");
+        } else {
+            log.trace("request password: (set)");
+        }
         log.trace("request client_id: {}", keycloakConfig.getKeycloakClient());
-        log.trace("request client_secret: {}", keycloakConfig.getKeycloakClientSecret());
+        if (keycloakConfig.getKeycloakClientSecret().isEmpty() || keycloakConfig.getKeycloakClientSecret().isBlank()) {
+            log.warn("request client_secret: (empty)");
+        } else {
+            log.trace("request client_secret: (set)");
+        }
         final ResponseEntity<TokenDto> response;
         try {
             response = new RestTemplate()
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 a3fda6482c2d18cb75bab577644f8ce630314e6e..06641b738b91c4798e9a57b26eb011fbc6c3c4cd 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
@@ -313,6 +313,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             RemoteUnavailableException {
         final ResponseEntity<Void> response;
         final String url = "/api/database/" + databaseId + "/table/" + tableId;
+        log.trace("mapped url: {}", url);
         try {
             response = restTemplate.exchange(url, HttpMethod.PUT, HttpEntity.EMPTY, Void.class);
         } catch (ResourceAccessException | HttpServerErrorException e) {
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java
index b6b782a04c6c2c9c353f837caee4c8f1f2b213ec..b2ed933049687a9ea35aa4cfa673999b81db31af 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MariaDbMapper.java
@@ -234,9 +234,7 @@ public interface MariaDbMapper {
                     /* data type */
                     .append(columnTypeDtoToDataType(column))
                     /* null expressions */
-                    .append(column.getNullAllowed() != null && column.getNullAllowed() ? " NULL" : " NOT NULL")
-                    /* default expressions */
-                    .append(data.getNeedSequence() && column.getName().equals("id") ? " DEFAULT NEXTVAL(`" + tableCreateDtoToSequenceName(data) + "`)" : "");
+                    .append(column.getNullAllowed() != null && column.getNullAllowed() ? " NULL" : " NOT NULL");
             if (column.getDescription() != null && !column.getDescription().isEmpty()) {
                 /* comments */
                 stringBuilder.append(" COMMENT \"")
@@ -565,10 +563,10 @@ public interface MariaDbMapper {
         final int[] jdx = new int[]{0};
         data.getKeys()
                 .forEach((key, value) -> {
-                    statement.append(jdx[0] == 0 ? "" : ", ")
+                    statement.append(jdx[0] == 0 ? "" : " AND ")
                             .append("`")
                             .append(key)
-                            .append("` ");
+                            .append("`");
                     if (value == null) {
                         statement.append(" IS NULL");
                     } else {
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java
index 50894eb77a46b3b2fc0f77d7ebe0f99b73e895af..765a3b7e2e630b70b4e52d99aaddecd8559754a3 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/TableService.java
@@ -32,10 +32,10 @@ public interface TableService {
      * @return The table statistic, if successful.
      * @throws SQLException Failed to parse SQL query, contains invalid syntax.
      * @throws TableMalformedException The table statistic generation was unsuccessful, likely due to a bug in the mapping.
-     * @throws QueryMalformedException The inspection query is malformed.
+     * @throws TableNotFoundException The table could not be inspected in the data database.
      */
     TableStatisticDto getStatistics(PrivilegedTableDto table) throws SQLException, TableMalformedException,
-            QueryMalformedException;
+            TableNotFoundException;
 
     /**
      * Finds a table with given data database and table name.
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 e913c0cb82f22cd12654c7cd23d160bf68b5ef87..4dacc1e094f0c0f11e6d9949ee4cbf2fbc9e8621 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
@@ -86,7 +86,7 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table
 
     @Override
     public TableStatisticDto getStatistics(PrivilegedTableDto table) throws SQLException, TableMalformedException,
-            QueryMalformedException {
+            TableNotFoundException {
         final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase());
         final Connection connection = dataSource.getConnection();
         final TableStatisticDto statistic;
@@ -95,7 +95,11 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table
             final ResultSet resultSet = connection.prepareStatement(mariaDbMapper.tableColumnStatisticsSelectRawQuery(table.getColumns(), table.getInternalName()))
                     .executeQuery();
             statistic = dataMapper.resultSetToTableStatistic(resultSet);
-            statistic.setRows(getCount(table, null));
+            final TableDto tmpTable = schemaService.inspectTable(table.getDatabase(), table.getInternalName());
+            statistic.setAvgRowLength(tmpTable.getAvgRowLength());
+            statistic.setDataLength(tmpTable.getDataLength());
+            statistic.setMaxDataLength(tmpTable.getMaxDataLength());
+            statistic.setRows(tmpTable.getNumRows());
         } catch (SQLException e) {
             connection.rollback();
             log.error("Failed to obtain column statistics: {}", e.getMessage());
@@ -107,7 +111,8 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table
                 .stream()
                 .filter(column -> !MariaDbUtil.numericDataTypes.contains(column.getColumnType()))
                 .forEach(column -> statistic.getColumns().put(column.getInternalName(), new ColumnStatisticDto()));
-        log.info("Obtained column statistics for table: {}", table.getInternalName());
+        log.info("Obtained statistics for the table and {} column(s)", statistic.getColumns().size());
+        log.trace("obtained statistics: {}", statistic);
         return statistic;
     }
 
@@ -123,12 +128,6 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table
         final ComboPooledDataSource dataSource = getPrivilegedDataSource(database);
         final Connection connection = dataSource.getConnection();
         try {
-            if (data.getNeedSequence()) {
-                /* create table sequence if not exists */
-                connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateSequenceRawQuery(data))
-                        .execute();
-                log.info("Created sequence as primary key");
-            }
             /* create table if not exists */
             connection.prepareStatement(mariaDbMapper.tableCreateDtoToCreateTableRawQuery(data))
                     .execute();
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java
index 312ecaf2ac45058a5c52677815e05194a647bfd4..e2ef252708c4457165e126ea228b17aa00177c57 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableCreateDto.java
@@ -27,9 +27,6 @@ public class TableCreateDto {
     @Schema(example = "Air Quality")
     private String name;
 
-    @JsonProperty("need_sequence")
-    private transient boolean needSequence;
-
     @Size(max = 180)
     @Schema(example = "Air Quality in Austria")
     private String description;
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java
index 8d41bcc7ff79ba6a51ea1caabad2fd52686cd4a5..8862723b9ca573a9b7356f207d145850d1c233af 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableStatisticDto.java
@@ -2,6 +2,7 @@ package at.tuwien.api.database.table;
 
 import at.tuwien.api.database.table.columns.ColumnStatisticDto;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
@@ -17,10 +18,23 @@ import java.util.Map;
 @ToString
 public class TableStatisticDto {
 
-    @NotNull
     @JsonProperty("rows")
+    @Schema(example = "5")
     private Long rows;
 
+    @JsonProperty("data_length")
+    @Schema(example = "16384", description = "in bytes")
+    private Long dataLength;
+
+    @JsonProperty("max_data_length")
+    @Schema(example = "0", description = "in bytes")
+    private Long maxDataLength;
+
+    @JsonProperty("avg_row_length")
+    @Schema(example = "3276", description = "in bytes")
+    private Long avgRowLength;
+
     @NotNull
+    @ToString.Exclude
     private Map<String, ColumnStatisticDto> columns;
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java
index 9e92a46c484eadf1fd486995c39260294241d6c5..0db45a9f1b5690c4cb1d4e3a988b4c76824713e1 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/TableCreateDto.java
@@ -2,7 +2,6 @@ package at.tuwien.api.database.table.internal;
 
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
 import at.tuwien.api.database.table.constraints.ConstraintsCreateDto;
-import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
@@ -26,10 +25,6 @@ public class TableCreateDto {
     @Schema(example = "Air Quality")
     private String name;
 
-    @NotNull
-    @JsonProperty("need_sequence")
-    private Boolean needSequence;
-
     @Size(max = 180)
     @Schema(example = "Air Quality in Austria")
     private String description;
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
index f463370e4d252f87cdaf11266e3497a4af4c2c36..2e154b86973601af8560c6055fe388fd614858a6 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/Database.java
@@ -117,6 +117,7 @@ public class Database implements Serializable {
     private List<Identifier> subsets;
 
     @ToString.Exclude
+    @OrderBy("id DESC")
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true)
     private List<Table> tables;
 
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
index 57d9dbab1b9b95b143fde6752384457d99653857..9a402201eaf38191213abb609544709d28b516c4 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/table/Table.java
@@ -88,6 +88,7 @@ public class Table {
     })
     private Database database;
 
+    @ToString.Exclude
     @OnDelete(action = OnDeleteAction.CASCADE)
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE, CascadeType.PERSIST}, mappedBy = "table")
     @OrderBy("ordinalPosition")
@@ -104,6 +105,7 @@ public class Table {
     @OrderBy("id DESC")
     private List<Identifier> identifiers;
 
+    @ToString.Exclude
     @Embedded
     private Constraints constraints;
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
index 33b4594424956b584ff2910898f18d336c1aec7b..59419f9bad37d26687342c51da6155463d674e87 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/TableServiceUnitTest.java
@@ -172,29 +172,21 @@ public class TableServiceUnitTest extends AbstractUnitTest {
         final Table response = tableService.createTable(DATABASE_1, request, USER_1_PRINCIPAL);
         assertEquals("New Table", response.getName());
         assertEquals("new_table", response.getInternalName());
-        assertEquals(2, response.getColumns().size());
+        assertEquals(1, response.getColumns().size());
         /* columns */
         final TableColumn column0 = response.getColumns().get(0);
-        assertEquals("id", column0.getName());
-        assertEquals("id", column0.getInternalName());
-        assertEquals(TableColumnType.BIGINT, column0.getColumnType());
-        assertFalse(column0.getIsNullAllowed());
-        assertTrue(column0.getAutoGenerated());
-        final TableColumn column1 = response.getColumns().get(1);
-        assertEquals("I Am Späshül", column1.getName());
-        assertEquals("i_am_spa_shu_l", column1.getInternalName());
-        assertEquals(TableColumnType.TEXT, column1.getColumnType());
-        assertTrue(column1.getIsNullAllowed());
-        assertFalse(column1.getAutoGenerated());
+        assertEquals("I Am Späshül", column0.getName());
+        assertEquals("i_am_spa_shu_l", column0.getInternalName());
+        assertEquals(TableColumnType.TEXT, column0.getColumnType());
+        assertTrue(column0.getIsNullAllowed());
+        assertFalse(column0.getAutoGenerated());
         /* constraints */
         final Constraints constraints = response.getConstraints();
-        assertEquals(1, constraints.getPrimaryKey().size());
-        assertEquals(column0.getName(), constraints.getPrimaryKey().get(0).getColumn().getName());
-        assertEquals(column0.getInternalName(), constraints.getPrimaryKey().get(0).getColumn().getInternalName());
+        assertEquals(0, constraints.getPrimaryKey().size());
         assertEquals(1, constraints.getUniques().get(0).getColumns().size());
         assertNotNull(constraints.getUniques().get(0).getName());
-        assertEquals(column1.getName(), constraints.getUniques().get(0).getColumns().get(0).getName());
-        assertEquals(column1.getInternalName(), constraints.getUniques().get(0).getColumns().get(0).getInternalName());
+        assertEquals(column0.getName(), constraints.getUniques().get(0).getColumns().get(0).getName());
+        assertEquals(column0.getInternalName(), constraints.getUniques().get(0).getColumns().get(0).getInternalName());
         assertEquals(0, constraints.getChecks().size());
         assertEquals(0, constraints.getForeignKeys().size());
     }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java
index 5a7288cf55ead160c3b57436742f93693723592f..835b7245d1ef2ca017375990dd77c20693f3ef6f 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/auth/InternalRequestInterceptor.java
@@ -38,7 +38,6 @@ public class InternalRequestInterceptor implements ClientHttpRequestInterceptor
                     gatewayConfig.getSystemPassword());
             headers.setBearerAuth(token.getAccessToken());
             log.trace("set bearer token for internal user: {}", gatewayConfig.getSystemUsername());
-            log.trace("set access token: {}", token.getAccessToken());
             return execution.execute(request, body);
         } catch (AuthServiceConnectionException | CredentialsInvalidException | AccountNotSetupException e) {
             log.error("Failed to obtain token for internal user: {}", gatewayConfig.getSystemUsername());
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
index 46a0602c74dd4c93cf5ef05c4ad0c51116be0cf6..7ca855974e86b23a5a2ec8abcbc124f97a0e8ab7 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/TableServiceImpl.java
@@ -100,24 +100,6 @@ public class TableServiceImpl implements TableService {
             TableExistsException, SearchServiceException, SearchServiceConnectionException, MalformedException,
             OntologyNotFoundException, SemanticEntityNotFoundException {
         final User owner = userService.findByUsername(principal.getName());
-        /* check */
-        if (data.getConstraints().getPrimaryKey().isEmpty()) {
-            final List<ColumnCreateDto> columns = new LinkedList<>();
-            columns.add(ColumnCreateDto.builder()
-                    .name("id")
-                    .type(ColumnTypeDto.BIGINT)
-                    .nullAllowed(false)
-                    .build());
-            columns.addAll(data.getColumns());
-            data.setNeedSequence(true);
-            data.setColumns(columns);
-            data.getConstraints()
-                    .setPrimaryKey(Set.of("id"));
-            log.debug("no primary key provided: generate primary key column with sequence");
-        } else {
-            log.trace("primary key provided: no column with sequence needed");
-            data.setNeedSequence(false);
-        }
         /* map table */
         final Table table = Table.builder()
                 .isVersioned(true)
@@ -144,9 +126,6 @@ public class TableServiceImpl implements TableService {
                 final TableColumn column = metadataMapper.columnCreateDtoToTableColumn(c, database.getContainer().getImage());
                 column.setOrdinalPosition(idx[0]++);
                 column.setTable(table);
-                if (data.isNeedSequence() && column.getName().equals("id")) {
-                    column.setAutoGenerated(true);
-                }
                 if (c.getUnitUri() != null) {
                     log.trace("column {} has assigned unit uri: {}", column.getInternalName(), c.getUnitUri());
                     TableColumnUnit unit;
@@ -292,6 +271,9 @@ public class TableServiceImpl implements TableService {
             DataServiceException, DataServiceConnectionException {
         final TableStatisticDto statistic = dataServiceGateway.getTableStatistics(table.getTdbid(), table.getId());
         table.setNumRows(statistic.getRows());
+        table.setDataLength(statistic.getDataLength());
+        table.setAvgRowLength(statistic.getAvgRowLength());
+        table.setMaxDataLength(statistic.getMaxDataLength());
         for (Map.Entry<String, ColumnStatisticDto> entry : statistic.getColumns().entrySet()) {
             final Optional<TableColumn> optional = table.getColumns().stream().filter(c -> c.getInternalName().equals(entry.getKey())).findFirst();
             if (optional.isEmpty()) {
@@ -313,7 +295,8 @@ public class TableServiceImpl implements TableService {
         databaseRepository.save(database);
         /* update in open search service */
         searchServiceGateway.update(database);
-        log.info("Updated statistics of table with id: {}", table.getId());
+        log.info("Updated statistics for the table and {} column(s)", table.getColumns().size());
+        log.trace("updated statistics: {}", table);
     }
 
 }
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
index 173a3ba9f41ce3d617b99f996d0c4bc0c482a5e3..0341a7a5dfad8f3a218dd195631ff956289b6b15 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/BaseTest.java
@@ -1842,11 +1842,11 @@ public abstract class BaseTest {
             .checks(new LinkedHashSet<>())
             .primaryKey(new LinkedHashSet<>())
             .foreignKeys(new LinkedList<>())
-            .uniques(List.of(List.of("id")))
+            .uniques(new LinkedList<>())
             .build();
 
     public final static ConstraintsCreateDto TABLE_3_CONSTRAINTS_INVALID_CREATE_DTO = ConstraintsCreateDto.builder()
-            .uniques(List.of(List.of("id")))
+            .uniques(new LinkedList<>())
             .foreignKeys(List.of(ForeignKeyCreateDto.builder()
                     .referencedTable("weather_location")
                     .columns(List.of("fahrzeug"))
@@ -2186,7 +2186,6 @@ public abstract class BaseTest {
             .description(TABLE_4_DESCRIPTION)
             .columns(TABLE_4_COLUMNS_CREATE_DTO)
             .constraints(TABLE_4_CONSTRAINTS_CREATE_DTO)
-            .needSequence(false)
             .build();
 
     public final static List<ColumnDto> TABLE_4_COLUMNS_DTO = List.of(ColumnDto.builder()
@@ -2889,7 +2888,6 @@ public abstract class BaseTest {
             .description(TABLE_1_DESCRIPTION)
             .columns(TABLE_1_COLUMNS_CREATE_DTO)
             .constraints(TABLE_1_CONSTRAINTS_CREATE_DTO)
-            .needSequence(true)
             .build();
 
     public final static List<TableColumn> TABLE_2_COLUMNS = List.of(TableColumn.builder()
diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue
index 3597876609f79e42cd40a1951f729a61fab5663b..5a86bbaa01410fb068533930af6636fc9f20d1d7 100644
--- a/dbrepo-ui/components/database/DatabaseToolbar.vue
+++ b/dbrepo-ui/components/database/DatabaseToolbar.vue
@@ -15,7 +15,7 @@
           bottom>
           <template v-slot:activator="{ props }">
             <v-icon
-              class="ml-2"
+              class="mr-2"
               size="small"
               right
               :color="database.is_public ? 'success' : 'chip'"
@@ -33,20 +33,13 @@
         color="tertiary"
         :variant="buttonVariant"
         :text="$t('toolbars.database.dashboard.permanent') + ($vuetify.display.lgAndUp ? ' ' + $t('toolbars.database.dashboard.xl') : '')" />
-      <v-btn
-        v-if="canImportCsv"
-        :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-cloud-upload' : null"
-        color="tertiary"
-        :variant="buttonVariant"
-        :text="$t('toolbars.database.import-csv.permanent') + ($vuetify.display.lgAndUp ? ' ' + $t('toolbars.database.import-csv.xl') : '')"
-        :to="`/database/${$route.params.database_id}/table/import`" />
       <v-btn
         v-if="canCreateSubset"
         :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-wrench' : null"
         color="secondary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-subset.xl') + ' ' : '') + $t('toolbars.database.create-subset.permanent')"
-        class="ml-2 white--text"
+        class="mr-2 white--text"
         :to="`/database/${$route.params.database_id}/subset/create`" />
       <v-btn
         v-if="canCreateView"
@@ -54,7 +47,7 @@
         color="secondary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-view.xl') + ' ' : '') + $t('toolbars.database.create-view.permanent')"
-        class="ml-2 white--text"
+        class="mr-2 white--text"
         :to="`/database/${$route.params.database_id}/view/create`" />
       <v-btn
         v-if="canCreateTable"
@@ -62,15 +55,15 @@
         color="secondary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-table.xl') + ' ' : '') + $t('toolbars.database.create-table.permanent')"
-        class="ml-2"
-        :to="`/database/${$route.params.database_id}/table/create`" />
+        class="mr-2"
+        :to="`/database/${$route.params.database_id}/table/create/dataset`" />
       <v-btn
         v-if="canCreateIdentifier"
         :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-identifier' : null"
         color="primary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-pid.xl') + ' ' : '') + $t('toolbars.database.create-pid.permanent')"
-        class="ml-2"
+        class="mr-2"
         :to="`/database/${$route.params.database_id}/persist`" />
       <template v-slot:extension>
         <v-tabs
diff --git a/dbrepo-ui/components/dialogs/EditTuple.vue b/dbrepo-ui/components/dialogs/EditTuple.vue
index 3f40a93175b6f3515f9e8b15500ac183cfe95769..589c82b9b7aee5d2678e9ceab8249618878ced3f 100644
--- a/dbrepo-ui/components/dialogs/EditTuple.vue
+++ b/dbrepo-ui/components/dialogs/EditTuple.vue
@@ -169,6 +169,7 @@ export default {
     return {
       valid: false,
       loading: false,
+      oldTuple: null,
       error: false,
       menu: false,
       bools: [
@@ -177,6 +178,9 @@ export default {
       ]
     }
   },
+  mounted() {
+    this.oldTuple = Object.assign({}, this.tuple)
+  },
   computed: {
     title () {
       return (this.edit ? this.$t('toolbars.table.data.edit') : this.$t('toolbars.table.data.add')) + ' ' + this.$t('toolbars.table.data.tuple')
@@ -272,10 +276,19 @@ export default {
     },
     updateTuple () {
       const constraints = {}
-      this.table.constraints.primary_key
-        .forEach((pk) => {
-          constraints[pk] = this.tuple[pk]
-        })
+      if (this.table.constraints.primary_key.length > 0) {
+        this.table.constraints.primary_key
+          .forEach((pk) => {
+            constraints[pk.column.internal_name] = this.oldTuple[pk.column.internal_name]
+          })
+        console.debug('table has primary key: set update tuple constraints', constraints)
+      } else {
+        this.table.columns
+          .forEach((column) => {
+            constraints[column.internal_name] = this.oldTuple[column.internal_name]
+          })
+        console.debug('table does not have a primary key: set update tuple constraints', constraints)
+      }
       const tupleService = useTupleService()
       this.loading = true
       tupleService.update(this.$route.params.database_id, this.$route.params.table_id, { data: this.tuple, keys: constraints })
diff --git a/dbrepo-ui/components/subset/Builder.vue b/dbrepo-ui/components/subset/Builder.vue
index a70c32f6505fb3f5fddbb67eba046fed033e4ab6..7c30fd8f5a488cee4173f710e50e50e0154e9210 100644
--- a/dbrepo-ui/components/subset/Builder.vue
+++ b/dbrepo-ui/components/subset/Builder.vue
@@ -10,10 +10,10 @@
         :text="title" />
       <v-spacer />
       <v-btn
-        v-if="user"
         :disabled="!canExecute"
         color="secondary"
         variant="flat"
+        class="mr-2"
         :loading="loadingQuery"
         :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-run' : null"
         :text="$t('navigation.create')"
@@ -52,11 +52,13 @@
                 clearable
                 persistent-hint
                 :variant="inputVariant"
+                required
+                :rules="[
+                  v => !!v || $t('validation.required'),
+                  v => !validViewName(v) || $t('validation.view.exists')
+                ]"
                 :label="$t('pages.view.subpages.create.name.label')"
-                :hint="$t('pages.view.subpages.create.name.hint')"
-                :rules="[v => !!v || $t('validation.required'),
-                     v => !validViewName(v) || $t('validation.view.exists')]"
-                required />
+                :hint="$t('pages.view.subpages.create.name.hint')" />
             </v-col>
           </v-row>
           <v-row
@@ -80,9 +82,11 @@
                 :variant="inputVariant"
                 required
                 clearable
+                :rules="[
+                  v => !!v || $t('validation.required')
+                ]"
                 :label="$t('pages.view.subpages.create.visibility.label')"
-                :hint="$t('pages.view.subpages.create.visibility.hint')"
-                :rules="[v => !!v || $t('validation.required')]" />
+                :hint="$t('pages.view.subpages.create.visibility.hint')" />
             </v-col>
           </v-row>
           <v-window
@@ -219,21 +223,6 @@
                   </div>
                 </div>
               </div>
-              <v-row
-                dense>
-                <v-col
-                  v-text="$t('pages.subset.subpages.create.generated')" />
-              </v-row>
-              <v-row
-                id="query-raw"
-                dense>
-                <v-col>
-                  <Raw
-                    :value="query.formatted"
-                    disabled
-                    class="mt-2" />
-                </v-col>
-              </v-row>
             </v-window-item>
             <v-window-item
               value="1">
diff --git a/dbrepo-ui/components/table/TableImport.vue b/dbrepo-ui/components/table/TableImport.vue
index 8528b3b04edf43c5b0b9058390cf777c73c4d285..22f708175134d40bc50b3c630a3431181c40018a 100644
--- a/dbrepo-ui/components/table/TableImport.vue
+++ b/dbrepo-ui/components/table/TableImport.vue
@@ -2,15 +2,16 @@
   <div>
     <v-stepper-header>
       <v-stepper-item
-        :title="$t('pages.table.subpages.import.dataset.title')"
+        :title="$t('pages.table.subpages.import.schema.title')"
         :complete="validStep1"
-        :value="stepStart"/>
+        :value="1"/>
     </v-stepper-header>
     <v-stepper-window
       direction="vertical">
       <v-form
         ref="form"
         v-model="validStep1"
+        :disabled="disabled"
         @submit.prevent="submit">
         <v-container>
           <v-row dense>
@@ -122,102 +123,149 @@
       <v-stepper-item
         :title="$t('pages.table.subpages.import.file.title')"
         :complete="validStep2"
-        :value="stepStart+1"/>
+        :value="2" />
     </v-stepper-header>
     <v-stepper-window
       direction="vertical">
-      <v-form
-        ref="form"
-        v-model="validStep2"
-        @submit.prevent="submit">
-        <v-container>
-          <v-row
-            v-if="step > 1 && suggestedAnalyseSeparator && providedSeparator !== analysedSeparator"
-            dense>
-            <v-col>
-              <v-alert
-                border="start"
-                color="warning">
-                {{ $t('pages.table.subpages.import.separator.warn.prefix') }}
-                <strong v-text="tableImport.separator"/>
-                {{ $t('pages.table.subpages.import.separator.warn.middle') }}
-                <strong v-text="suggestedAnalyseSeparator"/>
-                {{ $t('pages.table.subpages.import.separator.warn.suffix') }}
-              </v-alert>
-            </v-col>
-          </v-row>
-          <v-row
-            v-if="step > 1 && suggestedAnalyseLineTerminator && providedTerminator !== analysedTerminator"
-            dense>
-            <v-col>
-              <v-alert
-                border="start"
-                color="warning">
-                {{ $t('pages.table.subpages.import.terminator.warn.prefix') }}
-                <strong>{{ JSON.stringify(tableImport.line_termination).replaceAll('"', '') }}</strong>
-                {{ $t('pages.table.subpages.import.terminator.warn.middle') }}
-                <strong>{{ JSON.stringify(suggestedAnalyseLineTerminator).replaceAll('"', '') }}</strong>
-                {{ $t('pages.table.subpages.import.terminator.warn.suffix') }}
-              </v-alert>
-            </v-col>
-          </v-row>
-          <v-row
-            v-if="!hasCompatibleSchema"
-            dense>
-            <v-col>
-              <v-alert
-                border="start"
-                color="warning"
-                :text="$t('pages.table.subpages.import.dataset.warn')"/>
-            </v-col>
-          </v-row>
-          <v-row>
-            <v-col cols="8">
-              <v-file-input
-                v-model="file"
-                accept=".csv,.tsv"
-                :show-size="1000"
-                counter
-                required
-                :rules="[
-                          v => notFile(v) || $t('validation.required'),
-                        ]"
-                :prepend-icon="validStep1 ? 'mdi-database-check-outline' : 'mdi-database-arrow-up-outline'"
-                persistent-hint
-                :variant="inputVariant"
-                :hint="$t('pages.table.subpages.import.file.hint')"
-                :label="$t('pages.table.subpages.import.file.label')" />
-            </v-col>
-          </v-row>
-          <v-row>
-            <v-col cols="8">
-              <v-btn
-                :disabled="!isAnalyseAllowed || !validStep1 || !validStep2"
-                :loading="loading"
-                :variant="buttonVariant"
-                color="secondary"
-                size="small"
-                :text="$t('pages.table.subpages.import.analyse.text')"
-                @click="uploadAndAnalyse"/>
-            </v-col>
-          </v-row>
+      <v-container>
+        <v-row
+          v-if="$route.query.location"
+          dense>
+          <v-col>
+            <p
+              v-text="$t('pages.table.subpages.import.storage.text')" />
+            <v-chip
+              prepend-icon="mdi-cloud-upload"
+              label>
+              {{ $route.query.location }}
+            </v-chip>
+          </v-col>
+        </v-row>
+        <v-form
+          v-if="!$route.query.location"
+          ref="form"
+          v-model="validStep2"
+          :disabled="disabled"
+          @submit.prevent="submit">
+            <v-row
+              v-if="step > 1 && suggestedAnalyseSeparator && providedSeparator !== analysedSeparator"
+              dense>
+              <v-col>
+                <v-alert
+                  border="start"
+                  color="warning">
+                  {{ $t('pages.table.subpages.import.separator.warn.prefix') }}
+                  <strong v-text="tableImport.separator"/>
+                  {{ $t('pages.table.subpages.import.separator.warn.middle') }}
+                  <strong v-text="suggestedAnalyseSeparator"/>
+                  {{ $t('pages.table.subpages.import.separator.warn.suffix') }}
+                </v-alert>
+              </v-col>
+            </v-row>
+            <v-row
+              v-if="step > 1 && suggestedAnalyseLineTerminator && providedTerminator !== analysedTerminator"
+              dense>
+              <v-col>
+                <v-alert
+                  border="start"
+                  color="warning">
+                  {{ $t('pages.table.subpages.import.terminator.warn.prefix') }}
+                  <strong>{{ JSON.stringify(tableImport.line_termination).replaceAll('"', '') }}</strong>
+                  {{ $t('pages.table.subpages.import.terminator.warn.middle') }}
+                  <strong>{{ JSON.stringify(suggestedAnalyseLineTerminator).replaceAll('"', '') }}</strong>
+                  {{ $t('pages.table.subpages.import.terminator.warn.suffix') }}
+                </v-alert>
+              </v-col>
+            </v-row>
+            <v-row
+              v-if="!hasCompatibleSchema"
+              dense>
+              <v-col
+                md="8">
+                <v-alert
+                  border="start"
+                  color="warning"
+                  :text="$t('pages.table.subpages.import.dataset.warn')"/>
+              </v-col>
+            </v-row>
+            <v-row
+              v-if="!$route.query.location"
+              dense>
+              <v-col cols="8">
+                <v-file-input
+                  v-model="file"
+                  accept=".csv,.tsv"
+                  :show-size="1000"
+                  counter
+                  required
+                  :rules="[
+                    v => notFile(v) || $t('validation.required'),
+                  ]"
+                  :prepend-icon="validStep1 ? 'mdi-database-check-outline' : 'mdi-database-arrow-up-outline'"
+                  persistent-hint
+                  :variant="inputVariant"
+                  :hint="$t('pages.table.subpages.import.file.hint')"
+                  :label="$t('pages.table.subpages.import.file.label')" />
+              </v-col>
+            </v-row>
+            <v-row
+              dense>
+              <v-col
+                cols="8">
+                <v-btn
+                  :disabled="!isAnalyseAllowed || !validStep1 || !validStep2 || disabled"
+                  :loading="loading"
+                  :variant="buttonVariant"
+                  color="secondary"
+                  size="small"
+                  :text="$t('pages.table.subpages.import.analyse.text')"
+                  @click="uploadAndAnalyse"/>
+              </v-col>
+            </v-row>
+          </v-form>
         </v-container>
-      </v-form>
     </v-stepper-window>
     <v-stepper-header
       v-if="!create">
       <v-stepper-item
-        :title="$t('pages.table.subpages.import.summary.title')"
-        :value="stepStart+2"/>
+        :title="$t('pages.table.subpages.import.dataset.title')"
+        :complete="validStep3"
+        :value="3" />
     </v-stepper-header>
     <v-stepper-window
       v-if="!create"
       direction="vertical">
       <v-container>
         <v-row
-          v-if="rowCount"
           dense>
           <v-col>
+            <v-btn
+              color="secondary"
+              :disabled="step !== 3 || disabled"
+              size="small"
+              variant="flat"
+              :loading="loadingImport"
+              :text="$t('navigation.import')"
+              @click="importCsv"/>
+          </v-col>
+        </v-row>
+      </v-container>
+    </v-stepper-window>
+    <v-stepper-header
+      v-if="!create">
+      <v-stepper-item
+        :title="$t('pages.table.subpages.import.summary.title')"
+        :value="4"/>
+    </v-stepper-header>
+    <v-stepper-window
+      v-if="!create && step === 4"
+      direction="vertical">
+      <v-container>
+        <v-row
+          v-if="rowCount"
+          dense>
+          <v-col
+            md="8">
             <v-alert
               border="start"
               color="success">
@@ -232,19 +280,11 @@
             <v-btn
               v-if="rowCount !== null"
               color="secondary"
-              :disabled="step !== stepStart + 2"
+              :disabled="step !== 4 || disabled"
               size="small"
               variant="flat"
               :text="$t('navigation.data')"
               :to="`/database/${$route.params.database_id}/table/${tableId}/data`" />
-            <v-btn
-              v-else
-              color="secondary"
-              :disabled="step !== stepStart + 2"
-              size="small"
-              variant="flat"
-              :text="$t('navigation.import')"
-              @click="importCsv"/>
           </v-col>
         </v-row>
       </v-container>
@@ -253,7 +293,7 @@
 </template>
 
 <script>
-import {isNonNegativeInteger} from '@/utils'
+import { isNonNegativeInteger } from '@/utils'
 import { useCacheStore } from '@/stores/cache'
 
 export default {
@@ -263,12 +303,12 @@ export default {
         return null
       }
     },
-    stepStart: {
+    create: {
       default: () => {
-        return 1
+        return false
       }
     },
-    create: {
+    disabled: {
       default: () => {
         return false
       }
@@ -276,11 +316,13 @@ export default {
   },
   data() {
     return {
-      step: 1,
+      step: 2,
       validStep1: false,
       validStep2: false,
+      validStep3: false,
       file: null,
       loading: false,
+      loadingImport: false,
       rowCount: null,
       suggestedAnalyseSeparator: null,
       suggestedAnalyseLineTerminator: null,
@@ -312,15 +354,19 @@ export default {
       cacheStore: useCacheStore()
     }
   },
-  watch: {
-    stepStart: {
-      handler() {
-        this.step = this.stepStart
-      }
-    }
-  },
   mounted() {
-    this.step = this.stepStart
+    this.setQueryParamSafely('location')
+    this.setQueryParamSafely('quote')
+    this.setQueryParamSafely('false_element')
+    this.setQueryParamSafely('true_element')
+    this.setQueryParamSafely('null_element')
+    this.setQueryParamSafely('separator')
+    this.setQueryParamSafely('line_termination')
+    this.setQueryParamSafely('skip_lines')
+    if (this.$route.query.location) {
+      this.step = 3
+      this.validStep2 = true
+    }
   },
   computed: {
     table() {
@@ -339,11 +385,11 @@ export default {
       if (!this.columns || !this.table) {
         return false
       }
-      const schema = this.table.columns.map(c => c.internal_name)
+      const schema = this.table.columns.map(c => c.name)
       let pass = true
       this.columns.forEach(c => {
         if (!schema.includes(c.name)) {
-          console.error('Failed to find column with id', c.name, 'in schema')
+          console.error('Failed to find column', c.name, 'in schema')
           pass = false
         }
       })
@@ -395,8 +441,13 @@ export default {
     submit() {
       this.$refs.form.validate()
     },
+    setQueryParamSafely(name) {
+      if (this.$route.query[name]) {
+        this.tableImport[name] = this.$route.query[name]
+      }
+    },
     importCsv() {
-      this.loading = true
+      this.loadingImport = true
       const tableService = useTableService()
       tableService.importCsv(this.$route.params.database_id, this.tableId, this.tableImport)
         .then(() => {
@@ -407,16 +458,18 @@ export default {
             .then((rowCount) => {
               this.rowCount = rowCount
             })
-          this.step = this.stepStart + 2
-          this.loading = false
+          this.step = 4
+          this.validStep3 = true
+          this.loadingImport = false
         })
-        .catch(() => {
+        .catch(({code, message}) => {
           const toast = useToastInstance()
-          toast.error(this.$t('error.import.dataset'))
-          this.loading = false
+          console.error(code, message)
+          toast.error(`${this.$t(code)}: ${message}`)
+          this.loadingImport = false
         })
         .finally(() => {
-          this.loading = false
+          this.loadingImport = false
         })
     },
     uploadAndAnalyse() {
@@ -464,19 +517,21 @@ export default {
           this.suggestedAnalyseSeparator = separator
           this.suggestedAnalyseLineTerminator = line_termination
           this.tableImport.location = filename
-          this.step = this.stepStart + 2
+          this.step = 3
           const toast = useToastInstance()
           toast.success(this.$t('success.analyse.dataset'))
           this.$emit('analyse', {columns: this.columns, filename, line_termination})
           this.loading = false
         })
-        .catch(({code}) => {
+        .catch(({code, message}) => {
           this.loading = false
           const toast = useToastInstance()
           if (typeof code !== 'string') {
+            /* fallback default error message */
+            toast.error(this.$t('error.analyse.invalid'))
             return
           }
-          toast.error(this.$t(code))
+          toast.error(`${this.$t(code)}: ${message}`)
         })
     }
   }
diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue
index 1cc172858c9302b43dd1bbad5ea311fc5898dbd2..51f186dd4a861850c36c4c9443ae73193c172b9d 100644
--- a/dbrepo-ui/components/table/TableSchema.vue
+++ b/dbrepo-ui/components/table/TableSchema.vue
@@ -4,33 +4,24 @@
       ref="form"
       v-model="valid"
       :disabled="disabled">
-      <v-row>
-        <v-col md="8">
-          <v-alert
-            v-if="needsSequence"
-            class="mb-6"
-            border="start"
-            :text="$t('validation.schema.primary-key')"
-            color="info" />
-        </v-col>
-      </v-row>
       <v-row
         v-for="(c, idx) in columns"
         :key="`r-${idx}`"
         class="column pa-2 ml-1 mr-1 mb-2"
         dense>
-        <v-col cols="2">
+        <v-col
+          cols="2">
           <v-text-field
             v-model="c.name"
             required
             :rules="[v => !!v || $t('validation.required')]"
-            :error-messages="needsSequence && c.name.toLowerCase() === 'id' ? [$t('validation.schema.id')] : []"
             persistent-hint
             :variant="inputVariant"
             :label="$t('pages.table.subpages.schema.name.label')"
             :hint="$t('pages.table.subpages.schema.name.hint')" />
         </v-col>
-        <v-col cols="2">
+        <v-col
+          cols="1">
           <v-select
             v-model="c.type"
             :items="columnTypes"
@@ -44,7 +35,9 @@
             :hint="$t('pages.table.subpages.schema.type.hint')"
             @update:modelValue="setDefaultSizeAndD(c)" />
         </v-col>
-        <v-col cols="2" :hidden="c.type !== 'set'">
+        <v-col
+          v-if="c.type === 'set'"
+          cols="2">
           <v-text-field
             v-model="c.sets_values"
             required
@@ -57,7 +50,9 @@
             :label="$t('pages.table.subpages.schema.set.label')"
             @focusout="formatValues(c)" />
         </v-col>
-        <v-col cols="2" :hidden="c.type !== 'enum'">
+        <v-col
+          v-if="c.type === 'enum'"
+          cols="2">
           <v-text-field
             v-model="c.enums_values"
             required
@@ -66,11 +61,15 @@
             :variant="inputVariant"
             :counter-value="() => c.enums.length"
             :hint="$t('pages.table.subpages.schema.enum.hint')"
-            :rules="[v => !!v || $t('validation.required')]"
+            :rules="[
+              v => !!v || $t('validation.required')
+            ]"
             :label="$t('pages.table.subpages.schema.enum.label')"
             @focusout="formatValues(c)" />
         </v-col>
-        <v-col cols="1" :hidden="defaultSize(c) === false">
+        <v-col
+          v-if="defaultSize(c) !== false"
+          cols="1">
           <v-text-field
             v-model.number="c.size"
             type="number"
@@ -80,7 +79,9 @@
             :error-messages="sizeErrorMessages(c)"
             :label="$t('pages.table.subpages.schema.size.label')" />
         </v-col>
-        <v-col cols="1" :hidden="defaultD(c) === false">
+        <v-col
+          v-if="defaultD(c) !== false"
+          cols="1">
           <v-text-field
             v-model.number="c.d"
             type="number"
@@ -90,50 +91,49 @@
             :error-messages="dErrorMessages(c)"
             :label="$t('pages.table.subpages.schema.d.label')" />
         </v-col>
-        <v-col v-if="hasDate(c)" cols="2">
+        <v-col
+          cols="2"
+          v-if="hasDate(c)">
           <v-select
             v-model="c.dfid"
             required
             :variant="inputVariant"
+            :disabled="disabled"
             :rules="[v => !!v || $t('validation.required')]"
             :items="filterDateFormats(c)"
             item-title="unix_format"
             item-value="id"
             :label="$t('pages.table.subpages.schema.fsp.label')" />
         </v-col>
-        <v-col v-if="shift(c)" :cols="shift(c)" />
-        <v-col cols="auto" class="pl-2">
+        <v-col
+          v-if="shift(c)"
+          :cols="shift(c)" />
+        <v-col
+          cols="auto"
+          class="pl-2">
           <v-checkbox
             v-model="c.primary_key"
+            :disabled="disabled"
             :label="$t('pages.table.subpages.schema.primary-key.label')"
             @click="setOthers(c)" />
         </v-col>
-        <v-col cols="auto" class="pl-10">
+        <v-col
+          cols="auto"
+          class="pl-10">
           <v-checkbox
             v-model="c.null_allowed"
-            :disabled="c.primary_key"
+            :disabled="c.primary_key || disabled"
             :label="$t('pages.table.subpages.schema.null.label')" />
         </v-col>
-        <v-col cols="auto" class="pl-10">
+        <v-col
+          cols="auto"
+          class="pl-10">
           <v-checkbox
             v-model="c.unique"
+            :disabled="disabled"
             :hidden="c.primary_key"
             :label="$t('pages.table.subpages.schema.unique.label')" />
         </v-col>
-        <v-col v-if="false" cols="auto" class="pl-10">
-          <v-text-field
-            v-model="c.foreign_key"
-            :variant="inputVariant"
-            required
-            :label="$t('pages.table.subpages.schema.foreign-key.label')" />
-        </v-col>
-        <v-col v-if="false" cols="auto" class="pl-10">
-          <v-text-field
-            v-model="c.references"
-            :variant="inputVariant"
-            required
-            :label="$t('pages.table.subpages.schema.references.label')" />
-        </v-col>
         <v-col
           v-if="canRemove(idx)"
           cols="auto"
@@ -160,21 +160,12 @@
       </v-row>
       <v-row>
         <v-col>
-          <v-btn
-            v-if="back"
-            :color="disabled ? '' : 'tertiary'"
-            :variant="buttonVariant"
-            size="small"
-            class="mr-2"
-            :disabled="disabled"
-            :text="$t('navigation.back')"
-            @click="goBack" />
           <v-btn
             color="secondary"
             variant="flat"
             size="small"
             :loading="loading"
-            :disabled="disabled"
+            :disabled="disabled || !valid || this.columns.length === 0"
             :text="submitText"
             @click="submit" />
         </v-col>
@@ -194,12 +185,6 @@ export default {
         return []
       }
     },
-    back: {
-      type: Boolean,
-      default () {
-        return false
-      }
-    },
     disabled: {
       type: Boolean,
       default () {
@@ -262,7 +247,10 @@ export default {
         return false
       }
       let shift = 0
-      if (this.hasDate(column) === false && this.columns.filter(c => this.hasDate(c) !== false).length > 0 && this.defaultSize(column) === false && this.columns.filter(c => this.defaultSize(c) !== false).length > 0) {
+      if (this.hasDate(column) === false && this.columns.filter(c => this.hasDate(c) !== false).length > 0) {
+        shift++
+      }
+      if (this.defaultSize(column) === false && this.columns.filter(c => this.defaultSize(c) !== false).length > 0) {
         shift++
       }
       if (this.defaultD(column) === false && this.columns.filter(c => this.defaultD(c) !== false).length > 0) {
@@ -281,9 +269,6 @@ export default {
       column.null_allowed = false
       column.unique = true
     },
-    goBack () {
-      this.$emit('back', { success: false })
-    },
     canRemove (idx) {
       if (idx > 0) {
         return true
diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue
index d7b3d1596a8e71d02c49b0dc44fc5680d6fa96d5..ef95ad1bd2eee6406925a956a3dda14950070a7d 100644
--- a/dbrepo-ui/components/table/TableToolbar.vue
+++ b/dbrepo-ui/components/table/TableToolbar.vue
@@ -22,7 +22,7 @@
         color="tertiary"
         :variant="buttonVariant"
         :text="$t('toolbars.database.import-csv.permanent') + ($vuetify.display.lgAndUp ? ' ' + $t('toolbars.database.import-csv.xl') : '')"
-        class="ml-2"
+        class="mr-2"
         :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/import`" />
       <v-btn
         v-if="canExecuteQuery"
@@ -30,7 +30,7 @@
         color="secondary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-subset.xl') + ' ' : '') + $t('toolbars.database.create-subset.permanent')"
-        class="ml-2"
+        class="mr-2"
         :to="`/database/${$route.params.database_id}/subset/create?tid=${$route.params.table_id}`" />
       <v-btn
         v-if="canCreateView"
@@ -38,7 +38,7 @@
         color="secondary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-view.xl') + ' ' : '') + $t('toolbars.database.create-view.permanent')"
-        class="ml-2"
+        class="mr-2"
         :to="`/database/${$route.params.database_id}/view/create?tid=${$route.params.table_id}`" />
       <v-btn
         v-if="canDropTable"
@@ -46,7 +46,7 @@
         color="error"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? 'Drop ' : '') + 'Table'"
-        class="ml-2"
+        class="mr-2"
         @click="dropTableDialog = true" />
       <v-btn
         v-if="canGetPid"
@@ -54,7 +54,7 @@
         color="primary"
         variant="flat"
         :text="($vuetify.display.lgAndUp ? 'Get ' : '') + 'PID'"
-        class="ml-2"
+        class="mr-2"
         :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/persist`" />
       <template v-slot:extension>
         <v-tabs v-model="tab" color="primary">
diff --git a/dbrepo-ui/locales/de-AT.json b/dbrepo-ui/locales/de-AT.json
index e32fe38ee0f835e7bd9c000b1669e2de22d289be..4d9e25b36e9a38a3e87c8176ec04751811c63528 100644
--- a/dbrepo-ui/locales/de-AT.json
+++ b/dbrepo-ui/locales/de-AT.json
@@ -30,11 +30,15 @@
     "yes": "Ja",
     "no": "Nein",
     "mine": "(Meine)",
-    "loading": "Lade"
+    "loading": "Lade",
+    "view": "Ansicht"
   },
   "pages": {
     "identifier": {
       "title": "Kennung",
+      "export": {
+        "text": "Metadatenexport"
+      },
       "pid": {
         "title": "Persistenter Bezeichner"
       },
@@ -273,6 +277,19 @@
       "broker": {
         "title": "Broker"
       },
+      "connection": {
+        "title": "Verbindungsdetails",
+        "secure": "sicher",
+        "insecure": "unsicher",
+        "permissions": {
+          "write": "Sie können in diese Tabelle schreiben",
+          "read": "Sie können den gesamten Inhalt dieser Tabelle lesen"
+        }
+      },
+      "description": {
+        "title": "Beschreibung",
+        "empty": "(Keine Beschreibung)"
+      },
       "exchange": {
         "title": "Exchange"
       },
@@ -282,14 +299,8 @@
       "routing-key": {
         "title": "Routing-Schlüssel"
       },
-      "connection": {
-        "title": "Verbindungsdetails",
-        "secure": "sicher",
-        "insecure": "unsicher",
-        "permissions": {
-          "write": "Sie können in diese Tabelle schreiben",
-          "read": "Sie können den gesamten Inhalt dieser Tabelle lesen"
-        }
+      "name": {
+        "title": "Interner Name"
       },
       "protocol": {
         "title": "Protokoll",
@@ -301,10 +312,6 @@
       "result-rows": {
         "title": "Reihen"
       },
-      "description": {
-        "title": "Beschreibung",
-        "empty": "(Keine Beschreibung)"
-      },
       "owner": {
         "title": "Eigentümer"
       },
@@ -320,9 +327,14 @@
           "metadata": {
             "title": "Tabellenmetadaten"
           },
-          "dataset": {
+          "schema": {
             "title": "Datensatzstruktur",
-            "warn": "Das Datensatzschema stimmt nicht mit dem Zieltabellenschema überein. "
+            "text": "das Tabellenschema manuell."
+          },
+          "dataset": {
+            "title": "Datensatz importieren",
+            "text": "Erstellt ein Tabellenschema aus einem bestimmten CSV-Datensatz. ",
+            "warn": "Das Datensatzschema stimmt (wahrscheinlich) nicht mit dem Schema der Zieltabelle überein. "
           },
           "name": {
             "label": "Name",
@@ -349,12 +361,15 @@
             "label": "Zeilen überspringen",
             "hint": "Optional. "
           },
+          "storage": {
+            "text": "Datensatz vom Speicherdienst"
+          },
           "quote": {
             "label": "Angebotskodierung",
             "hint": "Optional. "
           },
           "terminator": {
-            "label": "Kodierung des Leitungsabschlusses",
+            "label": "Codierung des Leitungsabschlusses",
             "hint": "Optional. ",
             "warn": {
               "prefix": "Wir haben Ihren .csv/.tsv-Datensatz analysiert und festgestellt, dass die von Ihnen angegebene Leitungsabschlusscodierung vorliegt",
@@ -375,7 +390,7 @@
             "hint": "Optional. "
           },
           "file": {
-            "title": "Datensatz-Upload",
+            "title": "Datensatzanalyse",
             "label": "Datensatzdatei",
             "hint": "Erforderlich. "
           },
@@ -396,6 +411,12 @@
           "information": {
             "title": "Information"
           },
+          "simple": {
+            "text": "Aus Schema"
+          },
+          "from-csv": {
+            "text": "Von CSV"
+          },
           "name": {
             "label": "Tabellenname",
             "hint": "Erforderlich"
@@ -405,8 +426,7 @@
             "hint": ""
           },
           "summary": {
-            "prefix": "Tabelle mit Namen erstellt",
-            "suffix": "und importierter Datensatz erfolgreich"
+            "text": "Erstellte Tabelle mit internem Namen:"
           }
         },
         "drop": {
@@ -421,7 +441,7 @@
           }
         },
         "schema": {
-          "title": "System Versioniert",
+          "title": "Systemversioniert",
           "subtitle": "Tabellenbeschränkungen",
           "bullet": "●",
           "assign": "Zuordnen",
@@ -447,7 +467,7 @@
             "title": "Nullbar"
           },
           "sequence": {
-            "title": "Sequenz"
+            "title": "Reihenfolge"
           },
           "description": {
             "title": "Beschreibung"
@@ -501,7 +521,7 @@
           }
         },
         "semantics": {
-          "title": "Semantische Instanz für Tabellenspalte zuweisen",
+          "title": "Weisen Sie der Tabellenspalte eine semantische Instanz zu",
           "subtitle": "Semantische Instanzen helfen Maschinen dabei, den richtigen Kontext Ihres Datensatzes zu ermitteln",
           "recommended": "Empfohlene semantische Instanzen",
           "bullet": "●",
@@ -534,7 +554,7 @@
             "hint": "Der Wert ist ein Primärschlüssel"
           },
           "format": {
-            "hint": "Der Wert muss folgendes Format haben"
+            "hint": "Der Wert muss im Format vorliegen"
           },
           "required": {
             "hint": "Erforderlich. "
@@ -561,7 +581,7 @@
         "title": "Interner Name"
       },
       "visibility": {
-        "title": "Sichtbarkeit"
+        "title": "Sichtweite"
       },
       "size": {
         "title": "Größe"
@@ -618,7 +638,7 @@
           }
         },
         "tables": {
-          "empty": "(keine Tabellen)"
+          "empty": "(keine Tische)"
         },
         "tuple": {
           "create": {
@@ -650,9 +670,9 @@
           },
           "scheme": {
             "title": "Schema",
-            "subtitle": "Aktualisiert die Metadaten im Datenbankschema, um systemversionierte Tabellen und Ansichten in der Benutzeroberfläche anzuzeigen",
+            "subtitle": "Aktualisieren Sie die Metadaten im Datenbankschema, um systemversionierte Tabellen und Ansichten in der Benutzeroberfläche anzuzeigen",
             "submit": {
-              "text": "Aktualisieren"
+              "text": "Aktualisierung"
             }
           },
           "ownership": {
@@ -665,7 +685,7 @@
             }
           },
           "visibility": {
-            "title": "Sichtbarkeit",
+            "title": "Sichtweite",
             "subtitle": "Private Datenbanken verbergen die Daten, während Metadaten weiterhin sichtbar sind. ",
             "visibility": {
               "label": "Datenbanksichtbarkeit",
@@ -723,7 +743,7 @@
           "title": "Information",
           "subtitle": "Allgemeine Benutzermetadaten",
           "id": {
-            "label": "ID"
+            "label": "AUSWEIS"
           },
           "username": {
             "label": "Nutzername"
@@ -754,13 +774,13 @@
           "de": "Deutsch (DE)"
         },
         "theme": {
-          "title": "Theme",
+          "title": "Thema",
           "subtitle": "Aktualisieren Sie das Benutzerdesign, wenn Sie angemeldet sind",
           "label": "Thema",
           "dark": "Dunkel",
           "dark-contrast": "Dunkel – hoher Kontrast",
           "light": "Licht",
-          "light-contrast": "Hell – hoher Kontrast",
+          "light-contrast": "Licht – hoher Kontrast",
           "submit": {
             "text": "Aktualisieren"
           }
@@ -836,25 +856,25 @@
       }
     },
     "view": {
-      "title": "Ansicht",
+      "title": "Sicht",
       "tabs": {
-        "info": "Info",
+        "info": "Die Info",
         "data": "Daten"
       },
       "name": {
         "title": "Name"
       },
       "query": {
-        "title": "Abfrage"
+        "title": "Stellungnahme"
       },
       "creator": {
-        "title": "Ersteller"
+        "title": "Schöpfer"
       },
       "creation": {
-        "title": "Erstellt"
+        "title": "Schaffung"
       },
       "visibility": {
-        "title": "Sichtbarkeit"
+        "title": "Sichtweite"
       },
       "subpages": {
         "create": {
@@ -885,7 +905,7 @@
         "title": "Sichtweite"
       },
       "creator": {
-        "title": "Ersteller"
+        "title": "Schöpfer"
       },
       "query": {
         "title": "Abfrage"
@@ -904,13 +924,12 @@
         "title": "Ergebniszeilen"
       },
       "tabs": {
-        "info": "Info",
+        "info": "Die Info",
         "data": "Daten"
       },
       "subpages": {
         "create": {
           "title": "Teilmenge erstellen",
-          "generated": "Die folgende Abfrage wird ausgeführt (schreibgeschützt)",
           "subtitle": "Die folgende Abfrage wird ausgeführt",
           "simple": {
             "text": "Einfach"
@@ -952,20 +971,20 @@
     "search": {
       "types": {
         "database": "Datenbank",
-        "table": "Tabelle",
+        "table": "Tisch",
         "column": "Spalte",
         "user": "Benutzer",
         "identifier": "Kennung",
         "concept": "Konzept",
         "unit": "Einheit",
-        "view": "View"
+        "view": "Sicht"
       },
       "type": {
         "label": "Typ",
         "hint": ""
       },
       "id": {
-        "label": "ID",
+        "label": "AUSWEIS",
         "hint": ""
       },
       "name": {
@@ -977,7 +996,7 @@
         "hint": ""
       },
       "publication-range": {
-        "hint": "Geben Sie Ihren benutzerdefinierten Veröffentlichungsjahrbereich an"
+        "hint": "Geben Sie Ihren benutzerdefinierten Veröffentlichungsjahresbereich an"
       },
       "start-year": {
         "label": "Startjahr",
@@ -1031,14 +1050,18 @@
   },
   "error": {
     "auth": {
-      "connection": "Kontakt zum Authentifizierungsdienst fehlgeschlagen",
-      "invalid": "Authentifizierung im Authentifizierungsdienst fehlgeschlagen"
+      "connection": "Der Authentifizierungsdienst konnte nicht kontaktiert werden",
+      "invalid": "Die Authentifizierung im Authentifizierungsdienst ist fehlgeschlagen"
+    },
+    "analyse": {
+      "invalid": "Der Datensatz konnte nicht analysiert werden",
+      "missing": "Datensatz konnte nicht gefunden werden"
     },
     "access": {
       "missing": "Der Zugriff in der Metadatendatenbank konnte nicht gefunden werden"
     },
     "axios": {
-      "connection": "Es konnte keine Verbindung hergestellt werden",
+      "connection": "Kontakt zum Backend fehlgeschlagen",
       "timeout": "Zeitüberschreitung der Verbindung"
     },
     "concept": {
@@ -1049,17 +1072,17 @@
       "missing": "Der Container konnte in der Metadatendatenbank nicht gefunden werden"
     },
     "data": {
+      "connection": "Kontaktaufnahme zum Datendienst fehlgeschlagen",
       "invalid": "Die Kommunikation mit dem Datendienst ist fehlgeschlagen",
-      "connection": "Es konnte keine Verbindung zum Datendienst hergestellt werden",
       "value": "Spaltenwert konnte nicht festgelegt werden",
-      "drift": "Die Uhr Ihres Browsers ist nicht mit UTC synchronisiert und scheint um Folgendes eingestellt zu sein"
+      "drift": "Die Uhr Ihres Browsers ist nicht mit UTC synchronisiert und scheint um 16:00 Uhr verschoben zu sein"
     },
     "database": {
-      "connection": "Es konnte keine Verbindung zur Datenbank hergestellt werden",
+      "connection": "Kontakt zur Datenbank konnte nicht hergestellt werden",
+      "create": "Datenbank konnte im Datendienst nicht erstellt werden",
       "invalid": "Aktion in der Datenbank konnte nicht ausgeführt werden",
       "querystore": "Die Abfrage konnte nicht in den Abfragespeicher eingefügt werden",
-      "missing": "Die Datenbank konnte nicht in der Metadatendatenbank gefunden werden",
-      "create":  "Es konnte keine Verbindung zum Metadatendienst hergestellt werden"
+      "missing": "Die Datenbank konnte nicht in der Metadatendatenbank gefunden werden"
     },
     "doi": {
       "missing": "DOI konnte in der Metadatendatenbank nicht gefunden werden"
@@ -1107,7 +1130,7 @@
     "query": {
       "missing": "Die Abfrage konnte im Datendienst nicht gefunden werden",
       "invalid": "Die Abfrage ist ungültig",
-      "type.exists": "Abfrage konnte nicht erstellt werden: kein solcher Spaltentyp",
+      "type.exists": "Abfrage konnte nicht erstellt werden: Kein solcher Spaltentyp",
       "type.build": "Abfrage konnte nicht erstellt werden: Derzeit gibt es keine Abfrageerstellungsunterstützung für den Spaltentyp",
       "column.exists": "Abfrage konnte nicht erstellt werden: In den Datenspalten fehlt die Spalte mit dem Namen"
     },
@@ -1118,9 +1141,9 @@
       "persist": "Die Abfrage konnte nicht im Abfragespeicher der Datenbank gespeichert werden"
     },
     "metadata": {
-      "privileged": "Das Abrufen privilegierter Metadaten im Datendienst ist fehlgeschlagen",
-      "connection": "Es konnte keine Verbindung zum Metadatendienst hergestellt werden",
-      "invalid": "Es konnten keine Authentifizierungsmetadaten im Datendienst abgerufen werden"
+      "connection": "Es konnte kein Kontakt zum Metadatendienst hergestellt werden",
+      "invalid": "Es konnten keine Authentifizierungsmetadaten im Datendienst abgerufen werden",
+      "privileged": "Das Abrufen privilegierter Metadaten im Datendienst ist fehlgeschlagen"
     },
     "sidecar": {
       "export": "Der Datensatz konnte nicht in den Datenbank-Sidecar exportiert werden",
@@ -1165,12 +1188,12 @@
       "malformed": "Ungültige Paginierungsanforderung"
     },
     "table": {
+      "connection": "Kontakt zur Datenbank konnte nicht hergestellt werden",
+      "create": "Tabelle konnte nicht erstellt werden",
       "missing": "Die Tabelle konnte in der Metadatendatenbank nicht gefunden werden",
       "exists": "Die Tabelle mit diesem Namen existiert bereits",
       "invalid": "Die Spalten im Datendienst konnten nicht analysiert werden",
-      "malformed": "Eintrag konnte nicht eingefügt werden",
-      "create": "Tabelle konnte nicht erstellt werden",
-      "connection": "Das Laden der Tabellendaten ist fehlgeschlagen, da die Datenbank nicht erreichbar ist"
+      "malformed": "Eintrag konnte nicht eingefügt werden"
     },
     "unit": {
       "missing": "Die semantische Einheit konnte in der Metadatendatenbank nicht gefunden werden"
@@ -1181,11 +1204,11 @@
       "invalid": "Die Ansichtsabfrage konnte den Spalten im Datendienst nicht zugeordnet werden"
     },
     "broker": {
-      "connection": "Es konnte keine Verbindung zum Vermittlungsdienst hergestellt werden",
-      "invalid": "Es konnten keine Metadaten im Metadatendienst abgerufen werden"
+      "connection": "Kontakt zum Broker-Service fehlgeschlagen",
+      "invalid": "Es konnten keine Metadaten im Brokerdienst abgerufen werden"
     },
     "external": {
-      "invalid": "Metadaten konnten nicht aus dem Datacite-System abgerufen werden"
+      "invalid": "Es konnten keine Metadaten vom Datacite-System abgerufen werden"
     }
   },
   "success": {
@@ -1220,10 +1243,6 @@
       "created": "Tabelle erfolgreich erstellt",
       "semantics": "Semantische Instanz erfolgreich zugewiesen"
     },
-    "schema": {
-      "tables": "Die Metadaten der Datenbanktabellen wurden erfolgreich aktualisiert",
-      "views": "Metadaten der Datenbankansichten wurden erfolgreich aktualisiert"
-    },
     "schema": {
       "tables": "Die Metadaten der Datenbanktabellen wurden erfolgreich aktualisiert.",
       "views": "Metadaten der Datenbankansichten wurden erfolgreich aktualisiert."
@@ -1240,14 +1259,14 @@
     "pid": {
       "saved": "Kennung erfolgreich gespeichert",
       "created": "Kennung erfolgreich erstellt",
-      "published": "Identifikator erfolgreich veröffentlicht",
+      "published": "Erfolgreich veröffentlichte Kennung",
       "updated": "Kennung erfolgreich aktualisiert",
       "deleted": "Kennung erfolgreich gelöscht"
     },
     "user": {
       "info": "Benutzerinformationen erfolgreich aktualisiert",
       "theme": "Benutzerthema erfolgreich aktualisiert",
-      "password": "Benutzerkennwort erfolgreich aktualisiert",
+      "password": "Benutzerpasswort erfolgreich aktualisiert",
       "login": "Erfolgreich angemeldet"
     },
     "view": {
@@ -1260,7 +1279,7 @@
   },
   "toolbars": {
     "user": {
-      "info": "Info",
+      "info": "Die Info",
       "authentication": "Authentifizierung",
       "developer": "Entwickler"
     },
@@ -1294,30 +1313,30 @@
         "xl": "CSV"
       },
       "dashboard": {
-        "permanent": "Visualisiere",
+        "permanent": "Visualisieren",
         "xl": "Daten"
       },
       "create-subset": {
         "permanent": "Teilmenge",
-        "xl": "Erstelle"
+        "xl": "Erstellen"
       },
       "create-view": {
-        "permanent": "Ansicht",
-        "xl": "Erstelle"
+        "permanent": "Sicht",
+        "xl": "Erstellen"
       },
       "create-table": {
-        "permanent": "Tabelle",
-        "xl": "Erstelle"
+        "permanent": "Tisch",
+        "xl": "Erstellen"
       },
       "create-pid": {
         "permanent": "PID",
         "xl": "Erhalten"
       },
       "info": {
-        "tab": "Info"
+        "tab": "Die Info"
       },
       "tables": {
-        "tab": "Tabellen"
+        "tab": "Tische"
       },
       "subsets": {
         "tab": "Teilmengen"
@@ -1400,14 +1419,11 @@
     "integer": "Größer oder gleich Null",
     "max-length": "Die maximale Länge beträgt: ",
     "day": "Ungültiger Tag",
+    "matching": "Nicht passend!",
     "doi": {
       "invalid": "Ungültiger DOI. "
     },
     "month": "Ungültiger Monat",
-    "schema": {
-      "id": "Die Spalte muss als Primärschlüssel deklariert werden",
-      "primary-key": "Wir erstellen eine Spalte mit dem Namen „id“ mit einer automatisch ansteigenden Sequenz, die bei 1 beginnt. Bitte geben Sie eine Spalte mit Primärschlüssel an, wenn Sie dieses Verhalten nicht wünschen"
-    },
     "uri": {
       "pattern": "Ungültiger URI",
       "exists": "URI existiert"
@@ -1420,7 +1436,7 @@
       "exists": "Der Ansichtsname existiert bereits"
     },
     "table": {
-      "exists": "Tabellenname existiert bereits"
+      "exists": "Der Tabellenname existiert bereits"
     },
     "prefix": {
       "pattern": "Ungültiges Präfixmuster",
diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json
index edf6c66ca15a752e442ed3c807c4cb3d31a7c8ff..935023300e5c1fd86934d6187605ea1c1b3b2078 100644
--- a/dbrepo-ui/locales/en-US.json
+++ b/dbrepo-ui/locales/en-US.json
@@ -19,7 +19,7 @@
     "persist": "Persist",
     "cancel": "Cancel",
     "user": "User",
-    "import": "Import",
+    "import": "Import Data",
     "delete": "Delete",
     "recommend": "Recommend",
     "now": "Now",
@@ -30,7 +30,8 @@
     "yes": "Yes",
     "no": "No",
     "mine": "(mine)",
-    "loading": "Loading"
+    "loading": "Loading",
+    "view": "View"
   },
   "pages": {
     "identifier": {
@@ -276,6 +277,19 @@
       "broker": {
         "title": "Broker"
       },
+      "connection": {
+        "title": "Connection Details",
+        "secure": "secure",
+        "insecure": "insecure",
+        "permissions": {
+          "write": "You can write to this table",
+          "read": "You can read all contents of this table"
+        }
+      },
+      "description": {
+        "title": "Description",
+        "empty": "(no description)"
+      },
       "exchange": {
         "title": "Exchange"
       },
@@ -285,14 +299,8 @@
       "routing-key": {
         "title": "Routing Key"
       },
-      "connection": {
-        "title": "Connection Details",
-        "secure": "secure",
-        "insecure": "insecure",
-        "permissions": {
-          "write": "You can write to this table",
-          "read": "You can read all contents of this table"
-        }
+      "name": {
+        "title": "Internal Name"
       },
       "protocol": {
         "title": "Protocol",
@@ -304,10 +312,6 @@
       "result-rows": {
         "title": "Rows"
       },
-      "description": {
-        "title": "Description",
-        "empty": "(no description)"
-      },
       "owner": {
         "title": "Owner"
       },
@@ -323,9 +327,14 @@
           "metadata": {
             "title": "Table Metadata"
           },
-          "dataset": {
+          "schema": {
             "title": "Dataset Structure",
-            "warn": "The dataset schema does not match the target table schema. You can still force the import but it is not recommended"
+            "text": "the table schema manually."
+          },
+          "dataset": {
+            "title": "Import Dataset",
+            "text": "Creates a table schema from a given .csv dataset. Alternatively you can create",
+            "warn": "The dataset schema (likely) does not match the target table schema. You can still force the import but it is not recommended"
           },
           "name": {
             "label": "Name",
@@ -352,6 +361,9 @@
             "label": "Skip Rows",
             "hint": "Optional. Number of rows to skip, e.g. when the first one contains header and no data"
           },
+          "storage": {
+            "text": "Dataset from Storage Service"
+          },
           "quote": {
             "label": "Quote Encoding",
             "hint": "Optional. Character that quotes data, e.g. double-quotes \"value\""
@@ -378,7 +390,7 @@
             "hint": "Optional. Character sequence that represents boolean false, e.g. 0, false, no"
           },
           "file": {
-            "title": "Dataset Upload",
+            "title": "Dataset Analysis",
             "label": "Dataset File",
             "hint": "Required. Needs to be in .csv/.tsv file format"
           },
@@ -399,6 +411,12 @@
           "information": {
             "title": "Information"
           },
+          "simple": {
+            "text": "From Schema"
+          },
+          "from-csv": {
+            "text": "From CSV"
+          },
           "name": {
             "label": "Table Name",
             "hint": "Required"
@@ -408,8 +426,7 @@
             "hint": ""
           },
           "summary": {
-            "prefix": "Created table with name",
-            "suffix": "and imported dataset successfully"
+            "text": "Created table with internal name:"
           }
         },
         "drop": {
@@ -913,7 +930,6 @@
       "subpages": {
         "create": {
           "title": "Create Subset",
-          "generated": "The following query will be executed (readonly)",
           "subtitle": "The following query will be executed",
           "simple": {
             "text": "Simple"
@@ -1037,6 +1053,10 @@
       "connection": "Failed to contact auth service",
       "invalid": "Failed to authenticate in auth service"
     },
+    "analyse": {
+      "invalid": "Failed to analyse dataset",
+      "missing": "Failed to find dataset"
+    },
     "access": {
       "missing": "Failed to find access in metadata database"
     },
@@ -1399,14 +1419,11 @@
     "integer": "Greater or equal to zero",
     "max-length": "Maximum length is: ",
     "day": "Invalid day",
+    "matching": "Not matching!",
     "doi": {
       "invalid": "Invalid DOI. Must start with 10.xyz"
     },
     "month": "Invalid month",
-    "schema": {
-      "id": "Column needs to be declared as primary key",
-      "primary-key": "We create a column named id with a auto-increasing sequence starting at 1. Please specify a column with primary key if you don't want this behavior"
-    },
     "uri": {
       "pattern": "Invalid URI",
       "exists": "URI exists"
diff --git a/dbrepo-ui/nuxt.config.ts b/dbrepo-ui/nuxt.config.ts
index 7103e352a30f87450788b3e4cb7e50c820370f23..14a6c3034dbb36e756d0fe58c58a88e6d7edd8dc 100644
--- a/dbrepo-ui/nuxt.config.ts
+++ b/dbrepo-ui/nuxt.config.ts
@@ -22,137 +22,149 @@ const routeRules = {
 }
 
 export default defineNuxtConfig({
-  app: {
-    head: {
-      charset: 'utf-8',
-      viewport: 'width=device-width, initial-scale=1',
-      meta: [
-        { 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' }
-      ],
-      htmlAttrs: {
-        lang: 'en-US'
-      }
-    }
-  },
-  build: {
-    transpile: ['vuetify'],
-  },
-  css: [
-    'vuetify/lib/styles/main.sass',
-    '@mdi/font/css/materialdesignicons.min.css',
-    '@/assets/globals.css',
-    '@/assets/overrides.css',
-  ],
-  runtimeConfig: {
-    public: {
-      commit: '',
-      title: 'Database Repository',
-      logo: '/logo.svg',
-      icon: '/favicon.ico',
-      touch: '/apple-touch-icon.png',
-      version: 'bun-dev',
-      broker: {
-        host: 'localhost',
-        port: {
-          '5672': false
-        },
-        extra: ''
-      },
-      variant: {
-        input: {
-          normal: 'underlined',
-          contrast: 'outlined',
-        },
-        button: {
-          normal: 'flat',
-          contrast: 'outlined',
-        },
-        list: {
-          normal: '',
-          contrast: 'flat',
-        }
-      },
-      api: {
-        client: 'http://localhost',
-        server: 'http://gateway-service',
-      },
-      upload: {
-        client: 'http://localhost/api/upload/files'
-      },
-      database: {
-        unsupported: '*,AVG,BIT_AND,BIT_OR,BIT_XOR,COUNT,COUNTDISTINCT,GROUP_CONCAT,JSON_ARRAYAGG,JSON_OBJECTAGG,MAX,MIN,STD,STDDEV,STDDEV_POP,STDDEV_SAMP,SUM,VARIANCE,VAR_POP,VAR_SAMP,--',
-        image: {
-          width: 400,
-          height: 400
-        },
-        extra: ''
-      },
-      pid: {
-        default: {
-          publisher: 'Example University'
-        }
-      },
-      doi: {
-        enabled: false,
-        endpoint: 'https://doi.org'
-      },
-      links: {
-        rabbitmq: {
-          text: 'RabbitMQ Admin',
-          href: '/admin/broker/'
-        },
-        keycloak: {
-          text: 'Keycloak Admin',
-          href: '/api/auth/'
-        }
-      }
-    }
-  },
-  routeRules,
-  devServer: {
-    port: 3001
-  },
-  modules: [
-    '@pinia/nuxt',
-    '@pinia-plugin-persistedstate/nuxt',
-    '@nuxtjs/i18n'
-  ],
-  pinia: {
-    storesDirs: ['./stores/**'],
-  },
-  piniaPersistedstate: {
-    storage: 'localStorage'
-  },
-  i18n: {
-    lazy: false,
-    langDir: 'locales',
-    strategy: 'no_prefix',
-    defaultLocale: 'de',
-    locales: [
-      {
-        'code': 'en',
-        'file': 'en-US.json',
-        'name': 'English (US)',
-        'iso': 'en-US'
-      },
-      {
-        'code': 'de',
-        'file': 'de-AT.json',
-        'name': 'German (AT)',
-        'iso': 'de-AT'
-      }
-    ]
-
-  },
-  vite: {
-    server: {
-      proxy
-    },
-    vue: {
-      template: {
-        transformAssetUrls,
-      },
-    },
-  },
-  devtools: { enabled: true }
-})
+ app: {
+   head: {
+     charset: 'utf-8',
+     viewport: 'width=device-width, initial-scale=1',
+     meta: [
+       { 'http-equiv': 'Content-Security-Policy', content: 'upgrade-insecure-requests' }
+     ],
+     htmlAttrs: {
+       lang: 'en-US'
+     }
+   }
+ },
+
+ build: {
+   transpile: ['vuetify'],
+ },
+
+ css: [
+   'vuetify/lib/styles/main.sass',
+   '@mdi/font/css/materialdesignicons.min.css',
+   '@/assets/globals.css',
+   '@/assets/overrides.css',
+ ],
+
+ runtimeConfig: {
+   public: {
+     commit: '',
+     title: 'Database Repository',
+     logo: '/logo.svg',
+     icon: '/favicon.ico',
+     touch: '/apple-touch-icon.png',
+     version: 'bun-dev',
+     broker: {
+       host: 'localhost',
+       port: {
+         '5672': false
+       },
+       extra: ''
+     },
+     variant: {
+       input: {
+         normal: 'underlined',
+         contrast: 'outlined',
+       },
+       button: {
+         normal: 'flat',
+         contrast: 'outlined',
+       },
+       list: {
+         normal: '',
+         contrast: 'flat',
+       }
+     },
+     api: {
+       client: 'http://localhost',
+       server: 'http://gateway-service',
+     },
+     upload: {
+       client: 'http://localhost/api/upload/files'
+     },
+     database: {
+       unsupported: '*,AVG,BIT_AND,BIT_OR,BIT_XOR,COUNT,COUNTDISTINCT,GROUP_CONCAT,JSON_ARRAYAGG,JSON_OBJECTAGG,MAX,MIN,STD,STDDEV,STDDEV_POP,STDDEV_SAMP,SUM,VARIANCE,VAR_POP,VAR_SAMP,--',
+       image: {
+         width: 400,
+         height: 400
+       },
+       extra: ''
+     },
+     pid: {
+       default: {
+         publisher: 'Example University'
+       }
+     },
+     doi: {
+       enabled: false,
+       endpoint: 'https://doi.org'
+     },
+     links: {
+       rabbitmq: {
+         text: 'RabbitMQ Admin',
+         href: '/admin/broker/'
+       },
+       keycloak: {
+         text: 'Keycloak Admin',
+         href: '/api/auth/'
+       }
+     }
+   }
+ },
+
+ routeRules,
+
+ devServer: {
+   port: 3001
+ },
+
+ modules: [
+   '@pinia/nuxt',
+   '@pinia-plugin-persistedstate/nuxt',
+   '@nuxtjs/i18n'
+ ],
+
+ pinia: {
+   storesDirs: ['./stores/**'],
+ },
+
+ piniaPersistedstate: {
+   storage: 'localStorage'
+ },
+
+ i18n: {
+   lazy: false,
+   langDir: 'locales',
+   strategy: 'no_prefix',
+   defaultLocale: 'de',
+   locales: [
+     {
+       'code': 'en',
+       'file': 'en-US.json',
+       'name': 'English (US)',
+       'iso': 'en-US'
+     },
+     {
+       'code': 'de',
+       'file': 'de-AT.json',
+       'name': 'German (AT)',
+       'iso': 'de-AT'
+     }
+   ]
+
+ },
+
+ vite: {
+   server: {
+     proxy
+   },
+   vue: {
+     template: {
+       transformAssetUrls,
+     },
+   },
+ },
+
+ devtools: { enabled: true },
+ compatibilityDate: '2024-07-24'
+})
\ No newline at end of file
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue
index 7b29c6ba8e9f22c1568db41b5ab8898a63b0bda6..38c9be5567046b7b7d97b4941aa4f8bb5170daff 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/import.vue
@@ -1,5 +1,6 @@
 <template>
-  <div v-if="canInsertTableData">
+  <div
+    v-if="canInsertTableData">
     <v-toolbar flat>
       <v-btn
         class="mr-2"
@@ -18,8 +19,7 @@
           vertical
           variant="flat">
           <TableImport
-            :table-id="$route.params.table_id"
-            @analyse="onAnalyse" />
+            :table-id="$route.params.table_id" />
         </v-stepper>
       </v-card-text>
     </v-card>
@@ -94,11 +94,6 @@ export default {
       }
       return this.roles.includes('insert-table-data')
     }
-  },
-  methods: {
-    onAnalyse (event) {
-      const { columns } = event
-    }
   }
 }
 </script>
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue
index 47ba1af4337a011f2f160baa574bdeb7087e8615..08b42c0d936c7e034b67e09edbd07203edde12d7 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/info.vue
@@ -32,6 +32,10 @@
             :title="$t('pages.table.id.title')">
             {{ table.id }}
           </v-list-item>
+          <v-list-item
+            :title="$t('pages.table.name.title')">
+            {{ table.internal_name }}
+          </v-list-item>
           <v-list-item
             :title="$t('pages.table.size.title')">
             {{ sizeToHumanLabel(table.data_length) }}
@@ -71,7 +75,8 @@
         </v-list>
       </v-card-text>
     </v-card>
-    <v-divider />
+    <v-divider
+      v-if="canWrite && canWriteQueues" />
     <v-card
       v-if="canWrite && canWriteQueues"
       variant="flat"
@@ -86,25 +91,11 @@
           </v-list-item>
           <v-list-item
             :title="$t('pages.table.exchange.title')">
-            <span>
-              <v-badge
-                inline
-                color="code"
-                :content="database.exchange_type">
-                <span v-text="database.exchange_name" />
-              </v-badge>
-            </span>
+            {{ database.exchange_name }}
           </v-list-item>
           <v-list-item
             :title="$t('pages.table.queue.title')">
-            <span>
-              <v-badge
-                inline
-                color="code"
-                :content="table.queue_type" >
-                <span v-text="table.queue_name" />
-              </v-badge>
-            </span>
+            {{ table.queue_name }}
           </v-list-item>
           <v-list-item
             :title="$t('pages.table.routing-key.title')">
@@ -261,7 +252,7 @@ export default {
       return this.userStore.getAccess
     },
     hasDescription () {
-      return this.table && this.table.description !== null
+      return this.table && this.table.description
     },
     canWriteQueues () {
       if (!this.roles) {
@@ -306,7 +297,7 @@ export default {
       if (!this.$config.public.broker.port) {
         return []
       }
-      Object.keys(this.$config.public.broker.port).map(key => {
+      return Object.keys(this.$config.public.broker.port).map(key => {
         return {
           port: key,
           secure: this.$config.public.broker.port[key]
@@ -325,7 +316,6 @@ export default {
     }
   },
   methods: {
-    sizeToHumanLabel,
     amqpString (port) {
       if (!this.user) {
         return null
diff --git a/dbrepo-ui/pages/database/[database_id]/table/import.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue
similarity index 85%
rename from dbrepo-ui/pages/database/[database_id]/table/import.vue
rename to dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue
index ed86afe09eed451a853ac72e2224d45a7154303e..9a68b5786f286b5a8123c71669aac75307c2782f 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/import.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue
@@ -13,6 +13,21 @@
     <v-card
       variant="flat"
       rounded="0">
+      <v-card-text>
+        <v-row>
+          <v-col
+            md="8">
+            <v-alert
+              border="start"
+              color="info">
+              {{ $t('pages.table.subpages.import.dataset.text') }}
+              <NuxtLink
+                :href="`/database/${$route.params.database_id}/table/create/schema`"
+                v-text="$t('pages.table.subpages.import.schema.text')" />
+            </v-alert>
+          </v-col>
+        </v-row>
+      </v-card-text>
       <v-card-text>
         <v-stepper
           vertical
@@ -28,10 +43,11 @@
             <v-form
               ref="form"
               v-model="validStep1"
+              :disabled="step > 4"
               @submit.prevent="submit">
               <v-container>
                 <v-row dense>
-                  <v-col md="8">
+                  <v-col md="4">
                     <v-text-field
                       v-model="tableCreate.name"
                       :rules="[
@@ -46,9 +62,7 @@
                       :hint="$t('pages.table.subpages.import.name.hint')"
                       :label="$t('pages.table.subpages.import.name.label')"/>
                   </v-col>
-                </v-row>
-                <v-row dense>
-                  <v-col md="8">
+                  <v-col md="4">
                     <v-text-field
                       v-model="generatedTableName"
                       :rules="[
@@ -86,8 +100,8 @@
             </v-form>
           </v-stepper-window>
           <TableImport
-            :step-start="2"
             :create="true"
+            :disabled="!validStep1 || step > 4"
             :table="table"
             @analyse="onAnalyse"/>
           <v-stepper-header>
@@ -103,6 +117,7 @@
               <TableSchema
                 ref="schema"
                 :back="false"
+                :disabled="step > 4"
                 :loading="loading"
                 :submit-text="$t('navigation.continue')"
                 :columns="tableCreate.columns"
@@ -119,25 +134,33 @@
             direction="vertical">
             <v-container>
               <v-row dense>
-                <v-col>
+                <v-col
+                  md="8">
                   <v-alert
                     border="start"
                     color="success">
-                    {{ $t('pages.table.subpages.create.summary.prefix') }}
+                    {{ $t('pages.table.subpages.create.summary.text') }}
                     <strong v-text="table.internal_name"/>
-                    {{ $t('pages.table.subpages.create.summary.suffix') }}
                   </v-alert>
                 </v-col>
               </v-row>
               <v-row>
                 <v-col>
+                  <v-btn
+                    class="mb-1 mr-2"
+                    color="tertiary"
+                    size="small"
+                    variant="flat"
+                    :loading="loadingImport"
+                    :text="$t('navigation.import')"
+                    @click="onImport"/>
                   <v-btn
                     class="mb-1"
                     color="secondary"
                     size="small"
                     variant="flat"
                     :loading="loadingContinue"
-                    :text="$t('navigation.data')"
+                    :text="$t('navigation.view')"
                     @click="onContinue"/>
                 </v-col>
               </v-row>
@@ -169,6 +192,7 @@ export default {
       validStep4: false,
       error: false,
       loadingContinue: false,
+      loadingImport: false,
       fileModel: null,
       rowCount: null,
       file: {
@@ -306,53 +330,24 @@ export default {
       if (!success) {
         return
       }
-      const payload = Object.assign({}, this.tableCreate)
-      payload.columns = columns
-      payload.constraints = constraints
-      this.createTable(payload)
-        .then(table => this.import(table))
-    },
-    createTable(payload) {
+      const schema = Object.assign({}, this.tableCreate)
+      schema.columns = columns
+      schema.constraints = constraints
       this.loading = true
       const tableService = useTableService()
-      return new Promise((resolve, reject) => {
-        if (this.table) {
-          resolve(this.table)
-          return
-        }
-        tableService.create(this.$route.params.database_id, payload)
+      tableService.create(this.$route.params.database_id, schema)
         .then((table) => {
           this.table = table
-          resolve(table)
-        })
-        .catch((error) => {
-          this.loading = false
           const toast = useToastInstance()
-          if (typeof error.code !== 'string' || typeof error.message !== 'string') {
-            reject(error)
-          }
-          toast.error(`${this.$t(error.code)}: ${error.message}`)
-          reject(error)
-        })
-        .finally(() => {
-          this.loading = false
-        })
-      })
-    },
-    import(table) {
-      this.loading = true
-      const tableService = useTableService()
-      tableService.importCsv(this.$route.params.database_id, table.id, this.tableImport)
-        .then(() => {
+          toast.success(this.$t('success.table.created'))
           this.step = 5
-          const toast = useToastInstance()
-          toast.success(this.$t('success.import.dataset'))
-          this.cacheStore.reloadDatabase()
         })
         .catch(({code, message}) => {
           this.loading = false
           const toast = useToastInstance()
           if (typeof code !== 'string' || typeof message !== 'string') {
+            /* fallback */
+            toast.error(`${this.$t('error.table.create')}: ${message}`)
             return
           }
           toast.error(`${this.$t(code)}: ${message}`)
@@ -361,10 +356,6 @@ export default {
           this.loading = false
         })
     },
-    schemaValidity(event) {
-      const {valid} = event
-      this.validStep4 = valid
-    },
     onAnalyse({columns, filename, line_termination}) {
       console.debug('analysed', columns)
       this.tableCreate.columns = columns
@@ -374,6 +365,10 @@ export default {
         this.step = 4
       }
     },
+    async onImport () {
+      this.loadingImport = true
+      await this.$router.push({ path: `/database/${this.$route.params.database_id}/table/${this.table.id}/import`, query: this.tableImport })
+    },
     async onContinue () {
       this.loadingContinue = true
       await this.$router.push(`/database/${this.$route.params.database_id}/table/${this.table.id}/data`)
diff --git a/dbrepo-ui/pages/database/[database_id]/table/create.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue
similarity index 93%
rename from dbrepo-ui/pages/database/[database_id]/table/create.vue
rename to dbrepo-ui/pages/database/[database_id]/table/create/schema.vue
index 55c9599f8d0bcac9922c0fff77dce370bc8d8b89..b60de5df3045d3f51bcbb2c203afdff18be87699 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/create.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue
@@ -31,7 +31,7 @@
               @submit.prevent="submit">
               <v-container>
                 <v-row dense>
-                  <v-col md="8">
+                  <v-col md="4">
                     <v-text-field
                       v-model="tableCreate.name"
                       :rules="[
@@ -46,9 +46,7 @@
                       :hint="$t('pages.table.subpages.import.name.hint')"
                       :label="$t('pages.table.subpages.import.name.label')" />
                   </v-col>
-                </v-row>
-                <v-row dense>
-                  <v-col md="8">
+                  <v-col md="4">
                     <v-text-field
                       v-model="generatedTableName"
                       :rules="[
@@ -96,7 +94,7 @@
             <v-container>
               <TableSchema
                 submit-text="Create"
-                :disabled="!tableCreate.name || table"
+                :disabled="!valid || table"
                 :columns="tableCreate.columns"
                 :loading="loading"
                 @close="schemaClose" />
@@ -109,8 +107,9 @@
               :value="3" />
           </v-stepper-header>
           <v-stepper-window
+            v-if="table"
             direction="vertical">
-            <v-container v-if="table">
+            <v-container>
               <v-row
                 dense>
                 <v-col md="8">
@@ -122,6 +121,14 @@
               </v-row>
               <v-row>
                 <v-col>
+                  <v-btn
+                    color="tertiary"
+                    class="mr-2"
+                    variant="flat"
+                    size="small"
+                    :loading="loadingImport"
+                    :text="$t('navigation.import')"
+                    @click="onImport" />
                   <v-btn
                     color="secondary"
                     variant="flat"
@@ -157,6 +164,7 @@ export default {
       valid: false,
       description: null,
       loading: false,
+      loadingImport: false,
       loadingContinue: false,
       step: 1,
       table: null,
@@ -279,6 +287,10 @@ export default {
       }
       this.createTable(columns, constraints)
     },
+    async onImport () {
+      this.loadingImport = true
+      await this.$router.push(`/database/${this.$route.params.database_id}/table/${this.table.id}/import`)
+    },
     async onContinue () {
       this.loadingContinue = true
       await this.$router.push(`/database/${this.$route.params.database_id}/table/${this.table.id}/info`)
diff --git a/dbrepo-ui/pages/signup.vue b/dbrepo-ui/pages/signup.vue
index 5c95e0c0f06a3f7877eb87f113e5991875fe80d9..54c00602256c7815d8aff0b255214e66836bc727 100644
--- a/dbrepo-ui/pages/signup.vue
+++ b/dbrepo-ui/pages/signup.vue
@@ -47,7 +47,9 @@
                 autocomplete="off"
                 required
                 name="password"
-                :rules="[v => !!v || $t('validation.required')]"
+                :rules="[
+                  v => !!v || $t('validation.required')
+                ]"
                 type="password"
                 persistent-hint
                 :label="$t('pages.signup.password.label')"
@@ -61,7 +63,10 @@
                 autocomplete="off"
                 required
                 name="password-confirm"
-                :rules="[v => !!v || $t('validation.required'), v => (!!v && v) === createAccount.password || $t('Not matching!')]"
+                :rules="[
+                  v => !!v || $t('validation.required')
+                ]"
+                :error-messages="password2 && password2 !== this.createAccount.password ? [this.$t('validation.matching')] : []"
                 type="password"
                 persistent-hint
                 :label="$t('pages.signup.confirm.label')"
diff --git a/dbrepo-ui/utils/index.ts b/dbrepo-ui/utils/index.ts
index 66dbe9448329faab2b2c18b4801bb59d878d06bb..d940d076ae2b2d4fafac31c6dca8ad833342f64a 100644
--- a/dbrepo-ui/utils/index.ts
+++ b/dbrepo-ui/utils/index.ts
@@ -1,7 +1,6 @@
-import {format} from 'date-fns'
+import { format } from 'date-fns'
 import moment from 'moment'
 import type {AxiosError} from 'axios'
-import type {Api} from "@vitejs/plugin-vue";
 
 
 export function notEmpty(str: string) {
@@ -1086,7 +1085,7 @@ export function timestampsToHumanDifference(date1: string, date2: string) {
 export function sizeToHumanLabel(num: number) {
   let number = Number(num)
   if (!number) {
-    return '0'
+    return '0 B'
   }
   if (number < 1000) {
     return `${Math.floor(number)} B`