diff --git a/.docs/index.md b/.docs/index.md
index 8265da0102bbe966821c48cb4fb9473ac20eca99..e3307bd493e33dc0a03ce3fc2a770e726c30cd3f 100644
--- a/.docs/index.md
+++ b/.docs/index.md
@@ -14,7 +14,7 @@ author: Martin Weise
 ![Maintainability Rating](./images/maintainability.svg)
 ![Security Rating](./images/security.svg)
 
-Documentation for version: [v1.5.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases).
+Documentation for version: [v1.6.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases).
 
 DBRepo is a repository for data in databases that are used from the beginning until the end of a research 
 project supporting data evolution, -citation and -versioning. It implements the query store of the 
diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md
index fa40580f45a4a6b97222a804ae8c8699f39e2748..b6fd193fdf258b8d1fe0215f000bbf23c5cacc53 100644
--- a/.docs/kubernetes.md
+++ b/.docs/kubernetes.md
@@ -14,7 +14,7 @@ helm upgrade --install dbrepo \
   -n dbrepo \
   "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \
   --values ./values.yaml \
-  --version "1.5.2" \
+  --version "1.6.0" \
   --create-namespace \
   --cleanup-on-fail
 ```
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index ac86d248266d9429e499623a2dba28691420e4dd..9880536a743f257fd91de35b345562218f54db02 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,8 +4,8 @@ variables:
   TESTCONTAINERS_RYUK_DISABLED: "false"
   PYTHON_VERSION: "3.11"
   DOC_VERSION: "1.5"
-  APP_VERSION: "1.5.2"
-  CHART_VERSION: "1.5.2"
+  APP_VERSION: "1.6.0"
+  CHART_VERSION: "1.6.0"
   CACHE_FALLBACK_KEY: ${CI_DEFAULT_BRANCH}
   # This will supress any download for dependencies and plugins or upload messages which would clutter the console log.
   # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work.
diff --git a/Makefile b/Makefile
index 91994bda3b8a036503e05af28a152452e94fd087..11befeed00edf3090a7a0ac04296b95dd3ccbe7d 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
 .PHONY: all
 
-APP_VERSION ?= 1.5.2
-CHART_VERSION ?= 1.5.2
+APP_VERSION ?= 1.6.0
+CHART_VERSION ?= 1.6.0
 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo
 
 .PHONY: all
diff --git a/Pipfile b/Pipfile
index f0721bfdca857fc7072edafd32a0372e09e1168c..8a4fa7717247edfed259223c282c80998773bc20 100644
--- a/Pipfile
+++ b/Pipfile
@@ -19,6 +19,7 @@ pydantic = "==2.6.4"
 tuspy = "==1.0.3"
 mike = "==2.0.0"
 anybadge = "==1.14.0"
+gunicorn = "*"
 
 [dev-packages]
 
diff --git a/Pipfile.lock b/Pipfile.lock
index bf3eb9a4ce0a82df43ca1434743b85fd4a1fa88d..a3746e32d2a9dfe31dceb966b3b26a575476d159 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "c0f798e1103d6c20c3417ca7db612e28963f1b67de21172dd52ece1bb87f6816"
+            "sha256": "77395c7261196e0c46c146434bd370d1817840e4ebd695b0215311aa4a78e5ff"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -738,6 +738,15 @@
             ],
             "version": "==2.1.0"
         },
+        "gunicorn": {
+            "hashes": [
+                "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d",
+                "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"
+            ],
+            "index": "pypi",
+            "markers": "python_version >= '3.7'",
+            "version": "==23.0.0"
+        },
         "html5lib": {
             "hashes": [
                 "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d",
@@ -1110,11 +1119,11 @@
         },
         "packaging": {
             "hashes": [
-                "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002",
-                "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"
+                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==24.1"
+            "version": "==24.2"
         },
         "paginate": {
             "hashes": [
diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile
index 150d5811a6ce29bfc99588c65b5bafe6a2d87e2b..69b9ee840951c7c27bb036d94057477ae73ceb52 100644
--- a/dbrepo-analyse-service/Pipfile
+++ b/dbrepo-analyse-service/Pipfile
@@ -21,7 +21,7 @@ numpy = "*"
 pandas = "*"
 minio = "*"
 pydantic = "*"
-dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.6.0.tar.gz"}
 opensearch-py = "*"
 
 [dev-packages]
diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock
index 8e7bafd4267885b6d55789c1c8a07a85c167a58b..77b72d8cd6227a33fe0d17534b98019ad869eba3 100644
--- a/dbrepo-analyse-service/Pipfile.lock
+++ b/dbrepo-analyse-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "3df8e885e462132896bafc8d6c82c70226fc2352f2088eac67186d3e171b8308"
+            "sha256": "e3a8db6afce757927a19df8fe01aea426b0f15868df14c8f98a83f2c19a688da"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -26,85 +26,85 @@
         },
         "aiohttp": {
             "hashes": [
-                "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7",
-                "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361",
-                "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c",
-                "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6",
-                "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550",
-                "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c",
-                "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b",
-                "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5",
-                "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530",
-                "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180",
-                "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46",
-                "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066",
-                "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66",
-                "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0",
-                "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409",
-                "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3",
-                "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd",
-                "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60",
-                "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a",
-                "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b",
-                "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe",
-                "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502",
-                "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697",
-                "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c",
-                "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72",
-                "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771",
-                "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b",
-                "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a",
-                "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08",
-                "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae",
-                "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1",
-                "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe",
-                "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5",
-                "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d",
-                "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838",
-                "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f",
-                "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51",
-                "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2",
-                "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff",
-                "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130",
-                "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba",
-                "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e",
-                "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d",
-                "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87",
-                "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411",
-                "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2",
-                "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39",
-                "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c",
-                "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa",
-                "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3",
-                "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810",
-                "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9",
-                "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42",
-                "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9",
-                "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a",
-                "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0",
-                "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14",
-                "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269",
-                "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0",
-                "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44",
-                "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e",
-                "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938",
-                "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7",
-                "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82",
-                "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043",
-                "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7",
-                "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0",
-                "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313",
-                "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494",
-                "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e",
-                "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf",
-                "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868",
-                "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa",
-                "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941",
-                "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf",
-                "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b"
+                "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0",
+                "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769",
+                "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5",
+                "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59",
+                "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf",
+                "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985",
+                "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50",
+                "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299",
+                "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d",
+                "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab",
+                "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542",
+                "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b",
+                "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b",
+                "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838",
+                "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683",
+                "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df",
+                "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d",
+                "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91",
+                "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9",
+                "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be",
+                "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c",
+                "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219",
+                "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4",
+                "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf",
+                "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f",
+                "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199",
+                "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1",
+                "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60",
+                "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77",
+                "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf",
+                "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079",
+                "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4",
+                "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46",
+                "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8",
+                "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c",
+                "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d",
+                "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33",
+                "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34",
+                "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82",
+                "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b",
+                "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c",
+                "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836",
+                "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69",
+                "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39",
+                "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f",
+                "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32",
+                "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc",
+                "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52",
+                "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816",
+                "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1",
+                "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec",
+                "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487",
+                "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0",
+                "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767",
+                "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5",
+                "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6",
+                "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9",
+                "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f",
+                "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138",
+                "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e",
+                "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf",
+                "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109",
+                "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408",
+                "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6",
+                "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d",
+                "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99",
+                "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4",
+                "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74",
+                "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc",
+                "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d",
+                "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5",
+                "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a",
+                "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01",
+                "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f",
+                "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e",
+                "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"
             ],
             "markers": "python_version >= '3.9'",
-            "version": "==3.11.9"
+            "version": "==3.11.10"
         },
         "aiosignal": {
             "hashes": [
@@ -175,20 +175,20 @@
         },
         "boto3": {
             "hashes": [
-                "sha256:88370c6845ba71a4dae7f6b357099df29b3965da584be040c8e72c9902bc9492",
-                "sha256:dab5bddbbe57dc707b6f6a1f25dc2823b8e234b6fe99fafef7fc406ab73031b9"
+                "sha256:5ef7166fe5060637b92af8dc152cd7acecf96b3fc9c5456706a886cadb534391",
+                "sha256:fc8001519c8842e766ad3793bde3fbd0bb39e821a582fc12cf67876b8f3cf7f1"
             ],
             "index": "pypi",
             "markers": "python_version >= '3.8'",
-            "version": "==1.35.74"
+            "version": "==1.35.78"
         },
         "botocore": {
             "hashes": [
-                "sha256:9ac9d33d84dd9f05b35085de081552342a2c9ae22e3c4ee105723c9e92c07bd9",
-                "sha256:de5c4fa9a24cef3a758974857b5c5820a12fad345ebf33c052a5988e88f33634"
+                "sha256:41c37bd7c0326f25122f33ec84fb80fc0a14d7fcc9961431b0e57568e88c9cb5",
+                "sha256:6905036c25449ae8dba5e950e4b908e4b8a6fe6b516bf61e007ecb62fa21f323"
             ],
             "markers": "python_version >= '3.8'",
-            "version": "==1.35.74"
+            "version": "==1.35.78"
         },
         "certifi": {
             "hashes": [
@@ -427,9 +427,9 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:292c2631816ca3dbdbd243e4c006c4bd39d512f5ae7e4b10070102c85ec58a10"
+                "sha256:7164b09a9f578998b3adc1d51d16e4d77404c84ed9a6194ea4b6f07a6b69c27b"
             ],
-            "path": "./lib/dbrepo-1.5.2.tar.gz"
+            "path": "./lib/dbrepo-1.6.0.tar.gz"
         },
         "events": {
             "hashes": [
@@ -959,65 +959,65 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe",
-                "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0",
-                "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48",
-                "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a",
-                "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564",
-                "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958",
-                "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17",
-                "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0",
-                "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee",
-                "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b",
-                "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4",
-                "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4",
-                "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6",
-                "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4",
-                "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d",
-                "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f",
-                "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f",
-                "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f",
-                "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56",
-                "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9",
-                "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd",
-                "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23",
-                "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed",
-                "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a",
-                "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098",
-                "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1",
-                "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512",
-                "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f",
-                "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09",
-                "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f",
-                "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc",
-                "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8",
-                "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0",
-                "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761",
-                "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef",
-                "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5",
-                "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e",
-                "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b",
-                "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d",
-                "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43",
-                "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c",
-                "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41",
-                "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff",
-                "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408",
-                "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2",
-                "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9",
-                "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57",
-                "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb",
-                "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9",
-                "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3",
-                "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a",
-                "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0",
-                "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e",
-                "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598",
-                "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"
+                "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608",
+                "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef",
+                "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90",
+                "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae",
+                "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83",
+                "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0",
+                "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73",
+                "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671",
+                "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69",
+                "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa",
+                "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066",
+                "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da",
+                "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9",
+                "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e",
+                "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3",
+                "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a",
+                "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74",
+                "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3",
+                "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410",
+                "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72",
+                "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d",
+                "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4",
+                "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038",
+                "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e",
+                "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13",
+                "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d",
+                "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95",
+                "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31",
+                "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3",
+                "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03",
+                "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6",
+                "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2",
+                "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b",
+                "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7",
+                "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab",
+                "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219",
+                "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571",
+                "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d",
+                "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1",
+                "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca",
+                "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661",
+                "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e",
+                "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e",
+                "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e",
+                "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a",
+                "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3",
+                "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881",
+                "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221",
+                "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742",
+                "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773",
+                "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e",
+                "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529",
+                "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67",
+                "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c",
+                "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"
             ],
             "index": "pypi",
             "markers": "python_version >= '3.10'",
-            "version": "==2.1.3"
+            "version": "==2.2.0"
         },
         "opensearch-py": {
             "hashes": [
@@ -1459,112 +1459,112 @@
         },
         "rpds-py": {
             "hashes": [
-                "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0",
-                "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3",
-                "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9",
-                "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4",
-                "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571",
-                "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0",
-                "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669",
-                "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979",
-                "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141",
-                "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2",
-                "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5",
-                "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a",
-                "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2",
-                "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3",
-                "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b",
-                "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260",
-                "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2",
-                "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e",
-                "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42",
-                "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3",
-                "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795",
-                "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba",
-                "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d",
-                "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71",
-                "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70",
-                "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d",
-                "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0",
-                "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab",
-                "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5",
-                "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939",
-                "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd",
-                "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e",
-                "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3",
-                "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb",
-                "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4",
-                "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb",
-                "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16",
-                "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0",
-                "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50",
-                "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c",
-                "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9",
-                "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f",
-                "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a",
-                "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7",
-                "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1",
-                "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe",
-                "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d",
-                "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496",
-                "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef",
-                "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a",
-                "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d",
-                "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba",
-                "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31",
-                "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7",
-                "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef",
-                "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14",
-                "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3",
-                "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114",
-                "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9",
-                "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e",
-                "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24",
-                "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156",
-                "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a",
-                "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48",
-                "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b",
-                "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578",
-                "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f",
-                "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a",
-                "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49",
-                "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9",
-                "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411",
-                "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161",
-                "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05",
-                "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e",
-                "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f",
-                "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0",
-                "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501",
-                "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec",
-                "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357",
-                "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296",
-                "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f",
-                "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2",
-                "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8",
-                "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561",
-                "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b",
-                "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32",
-                "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312",
-                "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0",
-                "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2",
-                "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e",
-                "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639",
-                "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9",
-                "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695",
-                "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3",
-                "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa",
-                "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21",
-                "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28",
-                "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543",
-                "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac",
-                "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523",
-                "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934",
-                "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72",
-                "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167"
+                "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518",
+                "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059",
+                "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61",
+                "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5",
+                "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9",
+                "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543",
+                "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2",
+                "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a",
+                "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d",
+                "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56",
+                "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d",
+                "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd",
+                "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b",
+                "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4",
+                "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99",
+                "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d",
+                "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd",
+                "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe",
+                "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1",
+                "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e",
+                "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f",
+                "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3",
+                "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca",
+                "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d",
+                "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e",
+                "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc",
+                "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea",
+                "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38",
+                "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b",
+                "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c",
+                "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff",
+                "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723",
+                "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e",
+                "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493",
+                "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6",
+                "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83",
+                "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091",
+                "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1",
+                "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627",
+                "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1",
+                "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728",
+                "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16",
+                "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c",
+                "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45",
+                "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7",
+                "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a",
+                "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730",
+                "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967",
+                "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25",
+                "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24",
+                "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055",
+                "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d",
+                "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0",
+                "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e",
+                "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7",
+                "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c",
+                "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f",
+                "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd",
+                "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652",
+                "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8",
+                "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11",
+                "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333",
+                "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96",
+                "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64",
+                "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b",
+                "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e",
+                "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c",
+                "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9",
+                "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec",
+                "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb",
+                "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37",
+                "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad",
+                "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9",
+                "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c",
+                "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf",
+                "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4",
+                "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f",
+                "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d",
+                "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09",
+                "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d",
+                "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566",
+                "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74",
+                "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338",
+                "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15",
+                "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c",
+                "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648",
+                "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84",
+                "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3",
+                "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123",
+                "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520",
+                "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831",
+                "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e",
+                "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf",
+                "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b",
+                "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2",
+                "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3",
+                "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130",
+                "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b",
+                "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de",
+                "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5",
+                "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d",
+                "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00",
+                "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"
             ],
             "markers": "python_version >= '3.9'",
-            "version": "==0.22.1"
+            "version": "==0.22.3"
         },
         "s3transfer": {
             "hashes": [
@@ -1584,11 +1584,11 @@
         },
         "six": {
             "hashes": [
-                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
-                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+                "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
+                "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==1.16.0"
+            "version": "==1.17.0"
         },
         "tinydb": {
             "hashes": [
@@ -1627,7 +1627,7 @@
                 "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac",
                 "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"
             ],
-            "markers": "python_version >= '3.10'",
+            "markers": "python_version >= '3.8'",
             "version": "==2.2.3"
         },
         "werkzeug": {
@@ -2008,72 +2008,72 @@
         },
         "coverage": {
             "hashes": [
-                "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5",
-                "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf",
-                "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb",
-                "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638",
-                "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4",
-                "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc",
-                "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed",
-                "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a",
-                "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d",
-                "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649",
-                "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c",
-                "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b",
-                "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4",
-                "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443",
-                "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83",
-                "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee",
-                "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e",
-                "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e",
-                "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3",
-                "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0",
-                "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb",
-                "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076",
-                "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb",
-                "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787",
-                "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1",
-                "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e",
-                "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce",
-                "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801",
-                "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764",
-                "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365",
-                "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf",
-                "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6",
-                "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71",
-                "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002",
-                "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4",
-                "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c",
-                "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8",
-                "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4",
-                "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146",
-                "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc",
-                "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea",
-                "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4",
-                "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad",
-                "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28",
-                "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451",
-                "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50",
-                "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779",
-                "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63",
-                "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e",
-                "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc",
-                "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022",
-                "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d",
-                "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94",
-                "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b",
-                "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d",
-                "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331",
-                "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a",
-                "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0",
-                "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee",
-                "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92",
-                "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a",
-                "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"
+                "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4",
+                "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c",
+                "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f",
+                "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b",
+                "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6",
+                "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae",
+                "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692",
+                "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4",
+                "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4",
+                "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717",
+                "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d",
+                "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198",
+                "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1",
+                "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3",
+                "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb",
+                "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d",
+                "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08",
+                "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf",
+                "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b",
+                "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710",
+                "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c",
+                "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae",
+                "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077",
+                "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00",
+                "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb",
+                "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664",
+                "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014",
+                "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9",
+                "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6",
+                "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e",
+                "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9",
+                "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa",
+                "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611",
+                "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b",
+                "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a",
+                "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8",
+                "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030",
+                "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678",
+                "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015",
+                "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902",
+                "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97",
+                "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845",
+                "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419",
+                "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464",
+                "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be",
+                "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9",
+                "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7",
+                "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be",
+                "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1",
+                "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba",
+                "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5",
+                "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073",
+                "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4",
+                "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a",
+                "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a",
+                "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3",
+                "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599",
+                "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0",
+                "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b",
+                "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec",
+                "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1",
+                "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"
             ],
             "index": "pypi",
             "markers": "python_version >= '3.9'",
-            "version": "==7.6.8"
+            "version": "==7.6.9"
         },
         "docker": {
             "hashes": [
@@ -2222,11 +2222,11 @@
         },
         "six": {
             "hashes": [
-                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
-                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+                "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
+                "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==1.16.0"
+            "version": "==1.17.0"
         },
         "testcontainers-core": {
             "hashes": [
@@ -2264,7 +2264,7 @@
                 "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac",
                 "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"
             ],
-            "markers": "python_version >= '3.10'",
+            "markers": "python_version >= '3.8'",
             "version": "==2.2.3"
         },
         "wrapt": {
diff --git a/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..db73c1e06cf41cf64b5e409a536527ecebe1694f
Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.6.0.tar.gz differ
diff --git a/dbrepo-auth-service/dbrepo-realm.json b/dbrepo-auth-service/dbrepo-realm.json
index e057f778d4796aa1fd90c94c920a4abcec720de2..18dc0c89843de96a003326aae72745793fbf7e6a 100644
--- a/dbrepo-auth-service/dbrepo-realm.json
+++ b/dbrepo-auth-service/dbrepo-realm.json
@@ -73,7 +73,7 @@
       "description" : "${default-system-roles}",
       "composite" : true,
       "composites" : {
-        "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "check-foreign-database-access", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-database-view-data", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ]
+        "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "check-foreign-database-access", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ]
       },
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
@@ -146,19 +146,11 @@
       "description" : "${default-table-handling}",
       "composite" : true,
       "composites" : {
-        "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table" ]
+        "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table", "update-table" ]
       },
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
       "attributes" : { }
-    }, {
-      "id" : "b0d66d3d-59b4-4aae-aa66-e3d5a49f28e3",
-      "name" : "view-database-view-data",
-      "description" : "${view-database-view-data}",
-      "composite" : false,
-      "clientRole" : false,
-      "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
-      "attributes" : { }
     }, {
       "id" : "f5ea431a-9b2c-4195-bcb4-9511f38e4b44",
       "name" : "create-database-view",
@@ -219,7 +211,7 @@
       "description" : "${default-researcher-roles}",
       "composite" : true,
       "composites" : {
-        "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling" ]
+        "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling", "default-view-handling" ]
       },
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
@@ -264,6 +256,14 @@
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
       "attributes" : { }
+    }, {
+      "id" : "22449528-00c9-4e86-9400-4b8ae6fd8f4d",
+      "name" : "modify-view-visibility",
+      "description" : "${modify-view-visibility}",
+      "composite" : false,
+      "clientRole" : false,
+      "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
+      "attributes" : { }
     }, {
       "id" : "c12c1f4e-186f-4153-a795-26e79fb623d6",
       "name" : "create-ontology",
@@ -296,6 +296,17 @@
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
       "attributes" : { }
+    }, {
+      "id" : "d75e7938-9d5e-4cb3-8c57-18a446867d3a",
+      "name" : "default-view-handling",
+      "description" : "${default-view-handling}",
+      "composite" : true,
+      "composites" : {
+        "realm" : [ "delete-database-view", "update-database-view", "create-database-view", "modify-view-visibility", "find-database-view", "list-database-views" ]
+      },
+      "clientRole" : false,
+      "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
+      "attributes" : { }
     }, {
       "id" : "535f1484-4514-4d24-8d97-e3f6c11a426b",
       "name" : "create-container",
@@ -390,13 +401,21 @@
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
       "attributes" : { }
+    }, {
+      "id" : "6ae766b0-b8b4-4067-a95d-c8576bc4ac77",
+      "name" : "update-table",
+      "description" : "${update-table}",
+      "composite" : false,
+      "clientRole" : false,
+      "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
+      "attributes" : { }
     }, {
       "id" : "64c16bfb-2015-48ad-a23f-637ff24419cb",
       "name" : "default-query-handling",
       "description" : "${default-query-handling}",
       "composite" : true,
       "composites" : {
-        "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-database-view-data", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ]
+        "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ]
       },
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
@@ -417,6 +436,14 @@
       "clientRole" : false,
       "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
       "attributes" : { }
+    }, {
+      "id" : "df20b7d1-8d30-4a99-80eb-e8195fab0e76",
+      "name" : "update-database-view",
+      "description" : "${update-database-view}",
+      "composite" : false,
+      "clientRole" : false,
+      "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0",
+      "attributes" : { }
     }, {
       "id" : "88f82262-be80-4d18-9fb4-5529da031f33",
       "name" : "system",
@@ -1211,12 +1238,13 @@
     "frontchannelLogout" : false,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "false",
       "post.logout.redirect.uris" : "+"
     },
     "authenticationFlowBindingOverrides" : { },
     "fullScopeAllowed" : false,
     "nodeReRegistrationTimeout" : 0,
-    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ],
+    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ],
     "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
   }, {
     "id" : "d3c4a04e-39ce-4549-a34a-11e25774cd96",
@@ -1241,6 +1269,7 @@
     "frontchannelLogout" : false,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "false",
       "post.logout.redirect.uris" : "+",
       "pkce.code.challenge.method" : "S256"
     },
@@ -1255,7 +1284,7 @@
       "consentRequired" : false,
       "config" : { }
     } ],
-    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ],
+    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ],
     "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
   }, {
     "id" : "81ef0f59-a5ca-4be4-a1d1-0c32edf1cfd6",
@@ -1278,12 +1307,14 @@
     "frontchannelLogout" : false,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "false",
+      "client.use.lightweight.access.token.enabled" : "true",
       "post.logout.redirect.uris" : "+"
     },
     "authenticationFlowBindingOverrides" : { },
-    "fullScopeAllowed" : false,
+    "fullScopeAllowed" : true,
     "nodeReRegistrationTimeout" : 0,
-    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ],
+    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ],
     "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
   }, {
     "id" : "88694c91-753d-4c44-9740-ec9ac06bba45",
@@ -1306,6 +1337,7 @@
     "frontchannelLogout" : false,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "true",
       "post.logout.redirect.uris" : "+"
     },
     "authenticationFlowBindingOverrides" : { },
@@ -1339,6 +1371,7 @@
     "frontchannelLogout" : true,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "false",
       "oidc.ciba.grant.enabled" : "false",
       "client.secret.creation.time" : "1680085365",
       "backchannel.logout.session.required" : "true",
@@ -1369,11 +1402,11 @@
       "protocolMapper" : "oidc-hardcoded-claim-mapper",
       "consentRequired" : false,
       "config" : {
-        "claim.value" : "dbrepo",
-        "userinfo.token.claim" : "true",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "aud",
+        "claim.value" : "dbrepo",
+        "userinfo.token.claim" : "true",
         "access.tokenResponse.claim" : "false"
       }
     }, {
@@ -1392,7 +1425,7 @@
         "claim.name" : "uid"
       }
     } ],
-    "defaultClientScopes" : [ "roles", "attributes" ],
+    "defaultClientScopes" : [ "roles", "attributes", "basic" ],
     "optionalClientScopes" : [ "rabbitmq.read:*/*", "web-origins", "acr", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ]
   }, {
     "id" : "25741f6b-4867-4138-8238-6345c6ba8702",
@@ -1420,6 +1453,7 @@
     "frontchannelLogout" : true,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "false",
       "oidc.ciba.grant.enabled" : "false",
       "client.secret.creation.time" : "1680000860",
       "backchannel.logout.session.required" : "true",
@@ -1437,12 +1471,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "false",
         "user.attribute" : "username",
         "id.token.claim" : "false",
         "access.token.claim" : "true",
         "claim.name" : "client_id",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "false"
       }
     }, {
       "id" : "f1afc22d-f595-403b-ba2e-6ab19d98205e",
@@ -1451,15 +1485,15 @@
       "protocolMapper" : "oidc-hardcoded-claim-mapper",
       "consentRequired" : false,
       "config" : {
-        "claim.value" : "rabbitmq",
-        "userinfo.token.claim" : "false",
         "id.token.claim" : "false",
         "access.token.claim" : "true",
         "claim.name" : "aud",
+        "claim.value" : "rabbitmq",
+        "userinfo.token.claim" : "false",
         "access.tokenResponse.claim" : "false"
       }
     } ],
-    "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management" ],
+    "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management", "basic" ],
     "optionalClientScopes" : [ "rabbitmq.read:*/*", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "roles", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ]
   }, {
     "id" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930",
@@ -1482,6 +1516,7 @@
     "frontchannelLogout" : false,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "true",
       "post.logout.redirect.uris" : "+"
     },
     "authenticationFlowBindingOverrides" : { },
@@ -1512,11 +1547,13 @@
     "frontchannelLogout" : false,
     "protocol" : "openid-connect",
     "attributes" : {
+      "realm_client" : "false",
+      "client.use.lightweight.access.token.enabled" : "true",
       "post.logout.redirect.uris" : "+",
       "pkce.code.challenge.method" : "S256"
     },
     "authenticationFlowBindingOverrides" : { },
-    "fullScopeAllowed" : false,
+    "fullScopeAllowed" : true,
     "nodeReRegistrationTimeout" : 0,
     "protocolMappers" : [ {
       "id" : "c4d54410-3f22-4259-9571-94da2c43b752",
@@ -1525,15 +1562,15 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "locale",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "locale",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     } ],
-    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ],
+    "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "basic", "email" ],
     "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ]
   } ],
   "clientScopes" : [ {
@@ -1554,8 +1591,8 @@
     "protocol" : "openid-connect",
     "attributes" : {
       "include.in.token.scope" : "true",
-      "display.on.consent.screen" : "true",
-      "consent.screen.text" : "${emailScopeConsentText}"
+      "consent.screen.text" : "${emailScopeConsentText}",
+      "display.on.consent.screen" : "true"
     },
     "protocolMappers" : [ {
       "id" : "782819fe-ba5d-4ddb-9f95-cabb69d79c8d",
@@ -1564,12 +1601,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "emailVerified",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "email_verified",
-        "jsonType.label" : "boolean"
+        "jsonType.label" : "boolean",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "ca613fc8-bbf2-4240-8b33-a1874f1559f3",
@@ -1578,12 +1615,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "email",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "email",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     } ]
   }, {
@@ -1593,8 +1630,8 @@
     "protocol" : "openid-connect",
     "attributes" : {
       "include.in.token.scope" : "true",
-      "display.on.consent.screen" : "true",
-      "consent.screen.text" : "${profileScopeConsentText}"
+      "consent.screen.text" : "${profileScopeConsentText}",
+      "display.on.consent.screen" : "true"
     },
     "protocolMappers" : [ {
       "id" : "84f0487a-1d7d-470c-9b8e-5835294ae235",
@@ -1603,12 +1640,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "username",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "preferred_username",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "bbdcdb36-3ec0-443d-b1af-9993d40f0567",
@@ -1617,12 +1654,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "gender",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "gender",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "9faa870b-5491-4ce9-b27d-c9ce07d6a95e",
@@ -1631,12 +1668,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "birthdate",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "birthdate",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "f0e3c012-9523-4076-83ae-e466e2d08220",
@@ -1656,12 +1693,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "profile",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "profile",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "18cfbf4b-0a8e-45c7-a832-c0f72c92f3f3",
@@ -1670,12 +1707,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "updatedAt",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "updated_at",
-        "jsonType.label" : "long"
+        "jsonType.label" : "long",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "841ea785-26ab-429a-a420-09ce3948924d",
@@ -1684,12 +1721,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "lastName",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "family_name",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "bfba13ff-f952-4e89-bbb1-a693fdebfae8",
@@ -1698,12 +1735,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "website",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "website",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "475f071d-5149-4379-b928-76482f5f519c",
@@ -1712,12 +1749,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "zoneinfo",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "zoneinfo",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "b8bebfed-b5e9-4604-a0ee-9817f7d439ac",
@@ -1726,12 +1763,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "middleName",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "middle_name",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "445232c8-6830-476c-a6f1-8bbef167595a",
@@ -1740,12 +1777,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "picture",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "picture",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "65f2e474-6ede-4872-86e4-e49504dd0f2a",
@@ -1754,12 +1791,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "locale",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "locale",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "16cd5a27-ccf3-453c-ae1e-8621813ab73c",
@@ -1768,12 +1805,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "firstName",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "given_name",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "f9efedfc-3388-457c-b10a-1dff4525ff9b",
@@ -1782,12 +1819,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "nickname",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "nickname",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     } ]
   }, {
@@ -1821,12 +1858,12 @@
       "protocolMapper" : "oidc-usermodel-property-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "username",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "upn",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     } ]
   }, {
@@ -1868,8 +1905,8 @@
     "protocol" : "openid-connect",
     "attributes" : {
       "include.in.token.scope" : "true",
-      "display.on.consent.screen" : "true",
-      "consent.screen.text" : "${phoneScopeConsentText}"
+      "consent.screen.text" : "${phoneScopeConsentText}",
+      "display.on.consent.screen" : "true"
     },
     "protocolMappers" : [ {
       "id" : "dae802fb-9138-408a-b80e-a40eb0f56814",
@@ -1878,12 +1915,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "phoneNumber",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "phone_number",
-        "jsonType.label" : "String"
+        "jsonType.label" : "String",
+        "userinfo.token.claim" : "true"
       }
     }, {
       "id" : "feb06a8d-b0eb-4911-8464-368d93f566fa",
@@ -1892,12 +1929,12 @@
       "protocolMapper" : "oidc-usermodel-attribute-mapper",
       "consentRequired" : false,
       "config" : {
-        "userinfo.token.claim" : "true",
         "user.attribute" : "phoneNumberVerified",
         "id.token.claim" : "true",
         "access.token.claim" : "true",
         "claim.name" : "phone_number_verified",
-        "jsonType.label" : "boolean"
+        "jsonType.label" : "boolean",
+        "userinfo.token.claim" : "true"
       }
     } ]
   }, {
@@ -1907,8 +1944,8 @@
     "protocol" : "openid-connect",
     "attributes" : {
       "include.in.token.scope" : "false",
-      "display.on.consent.screen" : "false",
-      "consent.screen.text" : ""
+      "consent.screen.text" : "",
+      "display.on.consent.screen" : "false"
     },
     "protocolMappers" : [ {
       "id" : "c6411e3b-6478-453d-b530-5fe175a4d786",
@@ -2004,8 +2041,8 @@
     "protocol" : "openid-connect",
     "attributes" : {
       "include.in.token.scope" : "true",
-      "display.on.consent.screen" : "true",
-      "consent.screen.text" : "${addressScopeConsentText}"
+      "consent.screen.text" : "${addressScopeConsentText}",
+      "display.on.consent.screen" : "true"
     },
     "protocolMappers" : [ {
       "id" : "8d4ffe4d-1d01-4ca1-8ff4-44eacca61b30",
@@ -2036,6 +2073,41 @@
       "gui.order" : "",
       "consent.screen.text" : ""
     }
+  }, {
+    "id" : "ba11267a-478b-4b32-872f-4eb2d125d116",
+    "name" : "basic",
+    "description" : "OpenID Connect scope for add all basic claims to the token",
+    "protocol" : "openid-connect",
+    "attributes" : {
+      "include.in.token.scope" : "false",
+      "display.on.consent.screen" : "false"
+    },
+    "protocolMappers" : [ {
+      "id" : "1445e14f-49b0-4666-8ddc-691493c24ad9",
+      "name" : "sub",
+      "protocol" : "openid-connect",
+      "protocolMapper" : "oidc-sub-mapper",
+      "consentRequired" : false,
+      "config" : {
+        "introspection.token.claim" : "true",
+        "access.token.claim" : "true"
+      }
+    }, {
+      "id" : "846f1ef0-2b86-4e07-9d25-691d25af5fce",
+      "name" : "auth_time",
+      "protocol" : "openid-connect",
+      "protocolMapper" : "oidc-usersessionmodel-note-mapper",
+      "consentRequired" : false,
+      "config" : {
+        "user.session.note" : "AUTH_TIME",
+        "introspection.token.claim" : "true",
+        "userinfo.token.claim" : "true",
+        "id.token.claim" : "true",
+        "access.token.claim" : "true",
+        "claim.name" : "auth_time",
+        "jsonType.label" : "long"
+      }
+    } ]
   }, {
     "id" : "37f61543-dad7-4a82-8e10-77acdd1eefdc",
     "name" : "roles",
@@ -2043,8 +2115,8 @@
     "protocol" : "openid-connect",
     "attributes" : {
       "include.in.token.scope" : "false",
-      "display.on.consent.screen" : "true",
-      "consent.screen.text" : "${rolesScopeConsentText}"
+      "consent.screen.text" : "${rolesScopeConsentText}",
+      "display.on.consent.screen" : "true"
     },
     "protocolMappers" : [ {
       "id" : "3b6b6914-8ad1-4a71-88ec-444f754aaacb",
@@ -2081,7 +2153,7 @@
       }
     } ]
   } ],
-  "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management" ],
+  "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management", "basic" ],
   "defaultOptionalClientScopes" : [ "rabbitmq.write:*/*", "offline_access", "rabbitmq.configure:*/*", "roles", "role_list", "address", "phone", "acr", "microprofile-jwt", "email", "attributes", "profile", "rabbitmq.read:*/*", "web-origins" ],
   "browserSecurityHeaders" : {
     "contentSecurityPolicyReportOnly" : "",
@@ -2143,7 +2215,7 @@
       "subType" : "anonymous",
       "subComponents" : { },
       "config" : {
-        "allowed-protocol-mapper-types" : [ "saml-user-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "saml-user-property-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper" ]
+        "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-role-list-mapper", "saml-user-property-mapper", "oidc-address-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper" ]
       }
     }, {
       "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1",
@@ -2169,7 +2241,15 @@
       "subType" : "authenticated",
       "subComponents" : { },
       "config" : {
-        "allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper" ]
+        "allowed-protocol-mapper-types" : [ "saml-user-property-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-property-mapper", "oidc-address-mapper", "saml-role-list-mapper", "oidc-usermodel-attribute-mapper", "saml-user-attribute-mapper" ]
+      }
+    } ],
+    "org.keycloak.userprofile.UserProfileProvider" : [ {
+      "id" : "a407a1d6-a7f6-4a72-ba3a-149de03d5a43",
+      "providerId" : "declarative-user-profile",
+      "subComponents" : { },
+      "config" : {
+        "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ]
       }
     } ],
     "org.keycloak.storage.UserStorageProvider" : [ {
@@ -2231,19 +2311,19 @@
           "providerId" : "group-ldap-mapper",
           "subComponents" : { },
           "config" : {
+            "mode" : [ "LDAP_ONLY" ],
             "membership.attribute.type" : [ "DN" ],
+            "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ],
             "group.name.ldap.attribute" : [ "cn" ],
             "preserve.group.inheritance" : [ "false" ],
-            "membership.user.ldap.attribute" : [ "uid" ],
-            "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ],
-            "mode" : [ "LDAP_ONLY" ],
-            "user.roles.retrieve.strategy" : [ "LOAD_GROUPS_BY_MEMBER_ATTRIBUTE" ],
             "ignore.missing.groups" : [ "false" ],
             "membership.ldap.attribute" : [ "member" ],
+            "membership.user.ldap.attribute" : [ "uid" ],
             "memberof.ldap.attribute" : [ "memberOf" ],
+            "groups.dn" : [ "ou=users,dc=dbrepo,dc=at" ],
             "group.object.classes" : [ "groupOfNames" ],
-            "groups.path" : [ "/" ],
-            "drop.non.existing.groups.during.sync" : [ "false" ]
+            "drop.non.existing.groups.during.sync" : [ "false" ],
+            "groups.path" : [ "/" ]
           }
         }, {
           "id" : "b6ff3285-35af-4e86-8bb4-d94b8e0d70bb",
@@ -2253,8 +2333,8 @@
           "config" : {
             "ldap.attribute" : [ "modifyTimestamp" ],
             "is.mandatory.in.ldap" : [ "false" ],
-            "read.only" : [ "true" ],
             "always.read.value.from.ldap" : [ "true" ],
+            "read.only" : [ "true" ],
             "user.model.attribute" : [ "modifyTimestamp" ]
           }
         }, {
@@ -2267,15 +2347,15 @@
             "is.mandatory.in.ldap" : [ "true" ],
             "attribute.force.default" : [ "false" ],
             "is.binary.attribute" : [ "false" ],
-            "read.only" : [ "false" ],
             "always.read.value.from.ldap" : [ "false" ],
+            "read.only" : [ "false" ],
             "user.model.attribute" : [ "username" ]
           }
         } ]
       },
       "config" : {
-        "fullSyncPeriod" : [ "-1" ],
         "pagination" : [ "false" ],
+        "fullSyncPeriod" : [ "-1" ],
         "startTls" : [ "false" ],
         "usersDn" : [ "ou=users,dc=dbrepo,dc=at" ],
         "connectionPooling" : [ "true" ],
@@ -2303,14 +2383,6 @@
         "validatePasswordPolicy" : [ "false" ]
       }
     } ],
-    "org.keycloak.userprofile.UserProfileProvider" : [ {
-      "id" : "a407a1d6-a7f6-4a72-ba3a-149de03d5a43",
-      "providerId" : "declarative-user-profile",
-      "subComponents" : { },
-      "config" : {
-        "kc.user.profile.config" : [ "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}],\"unmanagedAttributePolicy\":\"ENABLED\"}" ]
-      }
-    } ],
     "org.keycloak.keys.KeyProvider" : [ {
       "id" : "2f53ccf3-37b0-4d34-83e7-ed497499ee51",
       "name" : "rsa-enc-generated",
@@ -2923,10 +2995,12 @@
     "actionTokenGeneratedByUserLifespan-idp-verify-account-via-email" : "",
     "parRequestUriLifespan" : "60",
     "clientSessionMaxLifespan" : "0",
+    "organizationsEnabled" : "false",
     "shortVerificationUri" : ""
   },
-  "keycloakVersion" : "24.0.5",
+  "keycloakVersion" : "26.0.0",
   "userManagedAccessAllowed" : false,
+  "organizationsEnabled" : false,
   "clientProfiles" : {
     "profiles" : [ ]
   },
diff --git a/dbrepo-auth-service/init/Dockerfile b/dbrepo-auth-service/init/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..6ae8e16d77c4aa3c6460ed93973b0d97a8e8720a
--- /dev/null
+++ b/dbrepo-auth-service/init/Dockerfile
@@ -0,0 +1,19 @@
+FROM python:3.11-alpine
+LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at"
+
+RUN apk add --no-cache alpine-sdk gcc python3-dev mariadb-connector-c-dev
+
+WORKDIR /home/alpine
+
+COPY Pipfile Pipfile.lock ./
+
+RUN pip install pipenv && \
+    pipenv install --system --deploy
+
+USER 1001
+
+WORKDIR /app
+
+COPY --chown=1001 ./app.py ./app.py
+
+ENTRYPOINT [ "python", "app.py" ]
\ No newline at end of file
diff --git a/dbrepo-auth-service/init/Pipfile b/dbrepo-auth-service/init/Pipfile
new file mode 100644
index 0000000000000000000000000000000000000000..7c6799865cc4f42f27b46cb768170c2d34237b13
--- /dev/null
+++ b/dbrepo-auth-service/init/Pipfile
@@ -0,0 +1,11 @@
+[[source]]
+url = "https://pypi.org/simple"
+verify_ssl = true
+name = "pypi"
+
+[packages]
+python-keycloak = "*"
+mariadb = "*"
+
+[requires]
+python_version = "3.11"
diff --git a/dbrepo-auth-service/init/Pipfile.lock b/dbrepo-auth-service/init/Pipfile.lock
new file mode 100644
index 0000000000000000000000000000000000000000..cc139b4931f2fb3b0acef6a537300fc7dc309a1d
--- /dev/null
+++ b/dbrepo-auth-service/init/Pipfile.lock
@@ -0,0 +1,391 @@
+{
+    "_meta": {
+        "hash": {
+            "sha256": "e7d1339d14c1425b18632357a83687250144a76d598d9e2ff66a4c758b41611a"
+        },
+        "pipfile-spec": 6,
+        "requires": {
+            "python_version": "3.11"
+        },
+        "sources": [
+            {
+                "name": "pypi",
+                "url": "https://pypi.org/simple",
+                "verify_ssl": true
+            }
+        ]
+    },
+    "default": {
+        "anyio": {
+            "hashes": [
+                "sha256:2f834749c602966b7d456a7567cafcb309f96482b5081d14ac93ccd457f9dd48",
+                "sha256:ea60c3723ab42ba6fff7e8ccb0488c898ec538ff4df1f1d5e642c3601d07e352"
+            ],
+            "markers": "python_version >= '3.9'",
+            "version": "==4.7.0"
+        },
+        "async-property": {
+            "hashes": [
+                "sha256:17d9bd6ca67e27915a75d92549df64b5c7174e9dc806b30a3934dc4ff0506380",
+                "sha256:8924d792b5843994537f8ed411165700b27b2bd966cefc4daeefc1253442a9d7"
+            ],
+            "version": "==0.2.2"
+        },
+        "certifi": {
+            "hashes": [
+                "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8",
+                "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==2024.8.30"
+        },
+        "cffi": {
+            "hashes": [
+                "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8",
+                "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2",
+                "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1",
+                "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15",
+                "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36",
+                "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824",
+                "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8",
+                "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36",
+                "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17",
+                "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf",
+                "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc",
+                "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3",
+                "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed",
+                "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702",
+                "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1",
+                "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8",
+                "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903",
+                "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6",
+                "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d",
+                "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b",
+                "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e",
+                "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be",
+                "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c",
+                "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683",
+                "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9",
+                "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c",
+                "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8",
+                "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1",
+                "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4",
+                "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655",
+                "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67",
+                "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595",
+                "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0",
+                "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65",
+                "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41",
+                "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6",
+                "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401",
+                "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6",
+                "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3",
+                "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16",
+                "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93",
+                "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e",
+                "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4",
+                "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964",
+                "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c",
+                "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576",
+                "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0",
+                "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3",
+                "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662",
+                "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3",
+                "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff",
+                "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5",
+                "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd",
+                "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f",
+                "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5",
+                "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14",
+                "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d",
+                "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9",
+                "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7",
+                "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382",
+                "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a",
+                "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e",
+                "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a",
+                "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4",
+                "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99",
+                "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87",
+                "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"
+            ],
+            "markers": "platform_python_implementation != 'PyPy'",
+            "version": "==1.17.1"
+        },
+        "charset-normalizer": {
+            "hashes": [
+                "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621",
+                "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6",
+                "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8",
+                "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912",
+                "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c",
+                "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b",
+                "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d",
+                "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d",
+                "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95",
+                "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e",
+                "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565",
+                "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64",
+                "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab",
+                "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be",
+                "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e",
+                "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907",
+                "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0",
+                "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2",
+                "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62",
+                "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62",
+                "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23",
+                "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc",
+                "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284",
+                "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca",
+                "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455",
+                "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858",
+                "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b",
+                "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594",
+                "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc",
+                "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db",
+                "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b",
+                "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea",
+                "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6",
+                "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920",
+                "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749",
+                "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7",
+                "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd",
+                "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99",
+                "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242",
+                "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee",
+                "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129",
+                "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2",
+                "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51",
+                "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee",
+                "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8",
+                "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b",
+                "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613",
+                "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742",
+                "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe",
+                "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3",
+                "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5",
+                "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631",
+                "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7",
+                "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15",
+                "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c",
+                "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea",
+                "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417",
+                "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250",
+                "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88",
+                "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca",
+                "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa",
+                "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99",
+                "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149",
+                "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41",
+                "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574",
+                "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0",
+                "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f",
+                "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d",
+                "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654",
+                "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3",
+                "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19",
+                "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90",
+                "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578",
+                "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9",
+                "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1",
+                "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51",
+                "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719",
+                "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236",
+                "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a",
+                "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c",
+                "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade",
+                "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944",
+                "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc",
+                "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6",
+                "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6",
+                "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27",
+                "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6",
+                "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2",
+                "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12",
+                "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf",
+                "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114",
+                "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7",
+                "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf",
+                "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d",
+                "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b",
+                "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed",
+                "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03",
+                "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4",
+                "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67",
+                "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365",
+                "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a",
+                "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748",
+                "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b",
+                "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079",
+                "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"
+            ],
+            "markers": "python_full_version >= '3.7.0'",
+            "version": "==3.4.0"
+        },
+        "cryptography": {
+            "hashes": [
+                "sha256:1923cb251c04be85eec9fda837661c67c1049063305d6be5721643c22dd4e2b7",
+                "sha256:37d76e6863da3774cd9db5b409a9ecfd2c71c981c38788d3fcfaf177f447b731",
+                "sha256:3c672a53c0fb4725a29c303be906d3c1fa99c32f58abe008a82705f9ee96f40b",
+                "sha256:404fdc66ee5f83a1388be54300ae978b2efd538018de18556dde92575e05defc",
+                "sha256:4ac4c9f37eba52cb6fbeaf5b59c152ea976726b865bd4cf87883a7e7006cc543",
+                "sha256:60eb32934076fa07e4316b7b2742fa52cbb190b42c2df2863dbc4230a0a9b385",
+                "sha256:62901fb618f74d7d81bf408c8719e9ec14d863086efe4185afd07c352aee1d2c",
+                "sha256:660cb7312a08bc38be15b696462fa7cc7cd85c3ed9c576e81f4dc4d8b2b31591",
+                "sha256:708ee5f1bafe76d041b53a4f95eb28cdeb8d18da17e597d46d7833ee59b97ede",
+                "sha256:761817a3377ef15ac23cd7834715081791d4ec77f9297ee694ca1ee9c2c7e5eb",
+                "sha256:831c3c4d0774e488fdc83a1923b49b9957d33287de923d58ebd3cec47a0ae43f",
+                "sha256:84111ad4ff3f6253820e6d3e58be2cc2a00adb29335d4cacb5ab4d4d34f2a123",
+                "sha256:8b3e6eae66cf54701ee7d9c83c30ac0a1e3fa17be486033000f2a73a12ab507c",
+                "sha256:9abcc2e083cbe8dde89124a47e5e53ec38751f0d7dfd36801008f316a127d7ba",
+                "sha256:9e6fc8a08e116fb7c7dd1f040074c9d7b51d74a8ea40d4df2fc7aa08b76b9e6c",
+                "sha256:a01956ddfa0a6790d594f5b34fc1bfa6098aca434696a03cfdbe469b8ed79285",
+                "sha256:abc998e0c0eee3c8a1904221d3f67dcfa76422b23620173e28c11d3e626c21bd",
+                "sha256:b15492a11f9e1b62ba9d73c210e2416724633167de94607ec6069ef724fad092",
+                "sha256:be4ce505894d15d5c5037167ffb7f0ae90b7be6f2a98f9a5c3442395501c32fa",
+                "sha256:c5eb858beed7835e5ad1faba59e865109f3e52b3783b9ac21e7e47dc5554e289",
+                "sha256:cd4e834f340b4293430701e772ec543b0fbe6c2dea510a5286fe0acabe153a02",
+                "sha256:d2436114e46b36d00f8b72ff57e598978b37399d2786fd39793c36c6d5cb1c64",
+                "sha256:eb33480f1bad5b78233b0ad3e1b0be21e8ef1da745d8d2aecbb20671658b9053",
+                "sha256:eca27345e1214d1b9f9490d200f9db5a874479be914199194e746c893788d417",
+                "sha256:ed3534eb1090483c96178fcb0f8893719d96d5274dfde98aa6add34614e97c8e",
+                "sha256:f3f6fdfa89ee2d9d496e2c087cebef9d4fcbb0ad63c40e821b39f74bf48d9c5e",
+                "sha256:f53c2c87e0fb4b0c00fa9571082a057e37690a8f12233306161c8f4b819960b7",
+                "sha256:f5e7cb1e5e56ca0933b4873c0220a78b773b24d40d186b6738080b73d3d0a756",
+                "sha256:f677e1268c4e23420c3acade68fac427fffcb8d19d7df95ed7ad17cdef8404f4"
+            ],
+            "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'",
+            "version": "==44.0.0"
+        },
+        "deprecation": {
+            "hashes": [
+                "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff",
+                "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"
+            ],
+            "version": "==2.1.0"
+        },
+        "h11": {
+            "hashes": [
+                "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d",
+                "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==0.14.0"
+        },
+        "httpcore": {
+            "hashes": [
+                "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c",
+                "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.0.7"
+        },
+        "httpx": {
+            "hashes": [
+                "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc",
+                "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==0.28.1"
+        },
+        "idna": {
+            "hashes": [
+                "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9",
+                "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==3.10"
+        },
+        "jwcrypto": {
+            "hashes": [
+                "sha256:150d2b0ebbdb8f40b77f543fb44ffd2baeff48788be71f67f03566692fd55789",
+                "sha256:771a87762a0c081ae6166958a954f80848820b2ab066937dc8b8379d65b1b039"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==1.5.6"
+        },
+        "mariadb": {
+            "hashes": [
+                "sha256:0f8de8d66ca71bd102f34a970a331b7d75bdf7f8050d80e37cdcc6ff3c85cf7a",
+                "sha256:2e72ea65f1d7d8563ee84e172f2a583193092bdb6ff83c470ca9722873273ecc",
+                "sha256:3f64b520089cb60c4f8302f365ed0ae057c4c859ab70fc8b1c4358192c3c8f27",
+                "sha256:579420293fa790d5ae0a6cb4bdb7e8be8facc2ceefb6123c2b0e8042b3fa725d",
+                "sha256:6f28d8ccc597a3a1368be14078110f743900dbb3b0c7f1cce3072d83bec59c8a",
+                "sha256:c1992ebf9c6f012ac158e33fef9f2c4ba899f721064c4ae3a3489233793296c0",
+                "sha256:cf6647cee081e21d0994b409ba8c8fa2077f3972f1de3627c5502fb31d14f806",
+                "sha256:d7302ccd15f0beee7b286885cbf6ac71ddc240374691d669784d99f89ba34d79",
+                "sha256:dbc4cf0e302ca82d46f9431a0b04f048e9c21ee56d6f3162c29605f84d63b40c",
+                "sha256:e94f1738bec09c97b601ddbb1908eb24524ba4630f507a775d82ffdb6c5794b3",
+                "sha256:f6dfdc954edf02b6519419a054798cda6034dc459d1d482e3329e37aa27d34f0"
+            ],
+            "index": "pypi",
+            "version": "==1.1.11"
+        },
+        "packaging": {
+            "hashes": [
+                "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
+                "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==24.2"
+        },
+        "pycparser": {
+            "hashes": [
+                "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6",
+                "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.22"
+        },
+        "python-keycloak": {
+            "hashes": [
+                "sha256:638a21a450a525989733299b6db1627a0656e770b6cadb2c1d21edb2244df3ce",
+                "sha256:bb819be1a0c2fca7f41fe045216c1aa03d612c1b62237fd9ccb98688156c4d2b"
+            ],
+            "index": "pypi",
+            "version": "==4.7.3"
+        },
+        "requests": {
+            "hashes": [
+                "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760",
+                "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.32.3"
+        },
+        "requests-toolbelt": {
+            "hashes": [
+                "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6",
+                "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
+            ],
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
+            "version": "==1.0.0"
+        },
+        "sniffio": {
+            "hashes": [
+                "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
+                "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==1.3.1"
+        },
+        "typing-extensions": {
+            "hashes": [
+                "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d",
+                "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==4.12.2"
+        },
+        "urllib3": {
+            "hashes": [
+                "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac",
+                "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"
+            ],
+            "markers": "python_version >= '3.8'",
+            "version": "==2.2.3"
+        }
+    },
+    "develop": {}
+}
diff --git a/dbrepo-auth-service/init/app.py b/dbrepo-auth-service/init/app.py
new file mode 100644
index 0000000000000000000000000000000000000000..d3a26a42fe56d46ceece4199a95b434e109d6ff3
--- /dev/null
+++ b/dbrepo-auth-service/init/app.py
@@ -0,0 +1,31 @@
+import os
+import mariadb
+from keycloak import KeycloakAdmin
+
+system_username = os.getenv('SYSTEM_USERNAME', 'admin')
+
+admin = KeycloakAdmin(server_url=os.getenv('AUTH_SERVICE_ENDPOINT', 'http://localhost:8080'),
+                      username=os.getenv('AUTH_SERVICE_ADMIN', 'admin'),
+                      password=os.getenv('AUTH_SERVICE_ADMIN_PASSWORD', 'admin'),
+                      verify=True)
+user_id = admin.get_user_id(username=system_username)
+print(f'Successfully fetched user id: {user_id}')
+
+try:
+    conn = mariadb.connect(user="root",
+                           password=os.getenv('METADATA_DB_PASSWORD', 'dbrepo'),
+                           host="metadata-db",
+                           port=3306,
+                           database=os.getenv('METADATA_DB', 'dbrepo'))
+    cursor = conn.cursor()
+    cursor.execute(
+        "INSERT IGNORE INTO `mdb_users` (`id`, `username`, `email`, `mariadb_password`) VALUES (?, ?, ?, PASSWORD(?))",
+        (user_id, system_username, 'some@admin', '1234567890'))
+    conn.commit()
+    conn.close()
+except mariadb.Error as e:
+    print(f"Error connecting to MariaDB Platform: {e}")
+    exit(1)
+
+print(f'Successfully inserted user')
+exit(0)
diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml
index 5f813b94c7f6861b26e36ceb70c74d3c8c8e26fd..87bdec0b480a7f63c792cf6625d75e03fbf90774 100644
--- a/dbrepo-data-service/pom.xml
+++ b/dbrepo-data-service/pom.xml
@@ -11,7 +11,7 @@
     <groupId>at.tuwien</groupId>
     <artifactId>dbrepo-data-service</artifactId>
     <name>dbrepo-data-service</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <description>Service that manages the data</description>
 
diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml
index a508c88343838c4e04601b6ad91496643eb7bb96..3917fc4976354fffd39805995f82e9a322742631 100644
--- a/dbrepo-data-service/querystore/pom.xml
+++ b/dbrepo-data-service/querystore/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-data-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-data-service-querystore</artifactId>
     <name>dbrepo-data-service-querystore</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies/>
 
diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml
index da3d605405f9b4ab85d3e23bd30f15025962f187..99c9261cea42c59e2daa5c68140e971c410874be 100644
--- a/dbrepo-data-service/report/pom.xml
+++ b/dbrepo-data-service/report/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-data-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>report</artifactId>
     <name>dbrepo-data-service-report</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
     <description>
         This module is only intended for the pipeline coverage report. See the detailed report in the
         respective modules
diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml
index 0859d437249495400f536e22aea82130fdd1ef98..9eb0cddee6c2577ea82dbe09f71f13192bc1a4c4 100644
--- a/dbrepo-data-service/rest-service/pom.xml
+++ b/dbrepo-data-service/rest-service/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-data-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>rest-service</artifactId>
     <name>dbrepo-data-service-rest-service</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
             <groupId>at.tuwien</groupId>
             <artifactId>services</artifactId>
-            <version>1.5.2</version>
+            <version>1.6.0</version>
         </dependency>
     </dependencies>
 
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 2a9beb3d04fdd137340571ea122bf8e398738044..08d287e15356beba71c57ea88aa17e21f13ad200 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
@@ -79,7 +79,7 @@ public class TableEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
             @ApiResponse(responseCode = "404",
-                    description = "Failed to find database in metadata database or table in data database",
+                    description = "Failed to find database or table in metadata database",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -97,7 +97,7 @@ public class TableEndpoint {
     public ResponseEntity<TableDto> create(@NotNull @PathVariable("databaseId") Long databaseId,
                                            @Valid @RequestBody TableCreateDto data) throws DatabaseNotFoundException,
             RemoteUnavailableException, TableMalformedException, DatabaseUnavailableException, TableExistsException,
-            TableNotFoundException, QueryMalformedException, MetadataServiceException {
+            TableNotFoundException, QueryMalformedException, MetadataServiceException, ContainerNotFoundException {
         log.debug("endpoint create table, databaseId={}, data.name={}", databaseId, data.getName());
         /* check */
         if (data.getConstraints().getPrimaryKey().isEmpty()) {
@@ -116,6 +116,50 @@ public class TableEndpoint {
         }
     }
 
+    @PutMapping("/{tableId}")
+    @PreAuthorize("hasAuthority('system')")
+    @Operation(summary = "Update table",
+            security = {@SecurityRequirement(name = "basicAuth")},
+            hidden = true)
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "202",
+                    description = "Updated table",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = TableDto.class))}),
+            @ApiResponse(responseCode = "400",
+                    description = "Table schema or query is malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "404",
+                    description = "Failed to find database or table in metadata database",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "503",
+                    description = "Failed to establish connection with the metadata service",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+    })
+    public ResponseEntity<TableDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
+                                           @NotNull @PathVariable("tableId") Long tableId,
+                                           @Valid @RequestBody TableUpdateDto data) throws RemoteUnavailableException,
+            TableMalformedException, DatabaseUnavailableException, TableNotFoundException, MetadataServiceException {
+        log.debug("endpoint update table, databaseId={}, data.description={}", databaseId, data.getDescription());
+        /* create */
+        final PrivilegedTableDto table = metadataServiceGateway.getTableById(databaseId, tableId);
+        try {
+            tableService.updateTable(table, data);
+            return ResponseEntity.status(HttpStatus.ACCEPTED)
+                    .build();
+        } catch (SQLException e) {
+            log.error("Failed to establish connection to database: {}", e.getMessage());
+            throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e);
+        }
+    }
+
     @DeleteMapping("/{tableId}")
     @PreAuthorize("hasAuthority('system')")
     @Operation(summary = "Delete table",
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java
index 38b33c4713031d2388ef6b6cf99b67ddc27776ce..a30ffb7b81ec455fc4eaa0ca11472eafa2c7aaf2 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/config/MariaDbConfig.java
@@ -265,7 +265,7 @@ public class MariaDbConfig {
             prepareStatement.setString(5, query.getQueryHash());
             prepareStatement.setString(6, query.getResultHash());
             prepareStatement.setLong(7, query.getResultNumber());
-            prepareStatement.setTimestamp(8, Timestamp.from(query.getCreated()));
+            prepareStatement.setTimestamp(8, Timestamp.from(query.getExecution()));
             prepareStatement.setTimestamp(9, Timestamp.from(query.getExecution()));
             log.trace("prepared statement: {}", prepareStatement);
             prepareStatement.executeUpdate();
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java
index f13b02caa2f8d268ba7449ab322d7e4deab34dd6..d9adc26ffeedfe80ae6d0436e46ed3216550e5e2 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java
@@ -86,7 +86,7 @@ public class TableEndpointUnitTest extends AbstractUnitTest {
     @WithMockUser(username = USER_LOCAL_ADMIN_USERNAME, authorities = {"system"})
     public void create_succeeds() throws DatabaseUnavailableException, TableMalformedException,
             DatabaseNotFoundException, TableExistsException, RemoteUnavailableException, SQLException,
-            TableNotFoundException, QueryMalformedException, MetadataServiceException {
+            TableNotFoundException, QueryMalformedException, MetadataServiceException, ContainerNotFoundException {
 
         /* mock */
         when(metadataServiceGateway.getDatabaseById(DATABASE_1_ID))
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/AnalyseServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/AnalyseServiceGatewayUnitTest.java
deleted file mode 100644
index f0a7346ae744a5ea507754ae0efcb5f3f17c99b1..0000000000000000000000000000000000000000
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/AnalyseServiceGatewayUnitTest.java
+++ /dev/null
@@ -1,152 +0,0 @@
-package at.tuwien.gateway;
-
-import at.tuwien.exception.*;
-import at.tuwien.test.AbstractUnitTest;
-import lombok.extern.log4j.Log4j2;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.boot.test.mock.mockito.MockBean;
-import org.springframework.http.*;
-import org.springframework.test.context.junit.jupiter.SpringExtension;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.HttpServerErrorException;
-import org.springframework.web.client.RestTemplate;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.when;
-
-@Log4j2
-@SpringBootTest
-@ExtendWith(SpringExtension.class)
-public class AnalyseServiceGatewayUnitTest extends AbstractUnitTest {
-
-    @MockBean
-    @Qualifier("restTemplate")
-    private RestTemplate restTemplate;
-
-    @Autowired
-    private AnalyseServiceGateway dataDatabaseSidecarGateway;
-
-    @BeforeEach
-    public void beforeEach() {
-        genesis();
-    }
-
-    @Test
-    public void importDataset_succeeds() throws RemoteUnavailableException, StorageNotFoundException,
-            AnalyseServiceException {
-
-        /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)))
-                .thenReturn(ResponseEntity.accepted()
-                        .build());
-
-        /* test */
-        dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename");
-    }
-
-    @Test
-    public void importDataset_unavailable_fails() {
-
-        /* mock */
-        doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
-                .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class));
-
-        /* test */
-        assertThrows(RemoteUnavailableException.class, () -> {
-            dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename");
-        });
-    }
-
-    @Test
-    public void importDataset_statusCode_fails() {
-
-        /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)))
-                .thenReturn(ResponseEntity.status(HttpStatus.OK)
-                        .build());
-
-        /* test */
-        assertThrows(AnalyseServiceException.class, () -> {
-            dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename");
-        });
-    }
-
-    @Test
-    public void importDataset_s3_fails() {
-
-        /* mock */
-        doThrow(HttpClientErrorException.BadRequest.class)
-                .when(restTemplate)
-                .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class));
-
-        /* test */
-        assertThrows(StorageNotFoundException.class, () -> {
-            dataDatabaseSidecarGateway.importDataset(DATABASE_1_ID, TABLE_1_ID, "filename");
-        });
-    }
-
-    @Test
-    public void exportTable_succeeds() throws RemoteUnavailableException, StorageNotFoundException,
-            AnalyseServiceException {
-
-        /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)))
-                .thenReturn(ResponseEntity.accepted()
-                        .build());
-
-        /* test */
-        dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID);
-    }
-
-    @Test
-    public void exportTable_unavailable_fails() {
-
-        /* mock */
-        doThrow(HttpServerErrorException.class)
-                .when(restTemplate)
-                .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class));
-
-        /* test */
-        assertThrows(RemoteUnavailableException.class, () -> {
-            dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID);
-        });
-    }
-
-    @Test
-    public void exportTable_statusCode_fails() {
-
-        /* mock */
-        when(restTemplate.exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class)))
-                .thenReturn(ResponseEntity.status(HttpStatus.OK)
-                        .build());
-
-        /* test */
-        assertThrows(AnalyseServiceException.class, () -> {
-            dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID);
-        });
-    }
-
-    @Test
-    public void exportTable_s3_fails() {
-
-        /* mock */
-        doThrow(HttpClientErrorException.BadRequest.class)
-                .when(restTemplate)
-                .exchange(anyString(), eq(HttpMethod.POST), eq(HttpEntity.EMPTY), eq(Void.class));
-
-        /* test */
-        assertThrows(StorageNotFoundException.class, () -> {
-            dataDatabaseSidecarGateway.exportTable(DATABASE_1_ID, TABLE_1_ID);
-        });
-    }
-
-}
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java
index 2730e94d9cb433b198681720a2d54d1de7fdef7a..6edded0f579ea558176a0bf65526aad674203216 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/gateway/MetadataServiceGatewayUnitTest.java
@@ -31,7 +31,8 @@ import java.util.List;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.*;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.when;
 
@@ -247,6 +248,8 @@ public class MetadataServiceGatewayUnitTest extends AbstractUnitTest {
         final HttpHeaders headers = new HttpHeaders();
         headers.set("X-Username", CONTAINER_1_PRIVILEGED_USERNAME);
         headers.set("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD);
+        headers.set("X-Host", CONTAINER_1_HOST);
+        headers.set("X-Port", "" + CONTAINER_1_PORT);
 
         /* mock */
         when(restTemplate.exchange(anyString(), eq(HttpMethod.GET), eq(HttpEntity.EMPTY), eq(PrivilegedDatabaseDto.class)))
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
index f1dc40b5af861fafe7bf81e5a2e9690574c2c1da..f1e5d0670cbcd6bc95456e578fea45104046b1a7 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java
@@ -58,8 +58,6 @@ public class DatabaseServiceIntegrationTest extends AbstractUnitTest {
         assertNull(response.getName());
         assertEquals(DATABASE_1_INTERNALNAME, response.getInternalName());
         assertEquals(EXCHANGE_DBREPO_NAME, response.getExchangeName());
-        assertNotNull(response.getCreator());
-        assertEquals(USER_1_ID, response.getCreator().getId());
         assertNotNull(response.getOwner());
         assertEquals(USER_1_ID, response.getOwner().getId());
         assertNotNull(response.getContact());
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
index 23503384b617ec7e066d9a0aeebe6c04c5f22a13..b6867b0c880cdb78ae3c8db040b962db8fdf0630 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SchemaServiceIntegrationTest.java
@@ -107,20 +107,13 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals(DATABASE_2_ID, response.getTdbid());
         assertTrue(response.getIsVersioned());
         assertEquals(DATABASE_2_PUBLIC, response.getIsPublic());
-        assertEquals(DATABASE_2_OWNER, response.getCreatedBy());
-        assertNotNull(response.getCreator());
-        assertEquals(DATABASE_2_OWNER, response.getCreator().getId());
-        assertEquals(USER_2_NAME, response.getCreator().getName());
-        assertEquals(USER_2_USERNAME, response.getCreator().getUsername());
-        assertEquals(USER_2_FIRSTNAME, response.getCreator().getFirstname());
-        assertEquals(USER_2_LASTNAME, response.getCreator().getLastname());
-        assertEquals(USER_2_QUALIFIED_NAME, response.getCreator().getQualifiedName());
-        assertNotNull(response.getCreator().getAttributes());
-        assertEquals(USER_2_AFFILIATION, response.getCreator().getAttributes().getAffiliation());
-        assertEquals(USER_2_THEME, response.getCreator().getAttributes().getTheme());
-        assertEquals(USER_2_LANGUAGE, response.getCreator().getAttributes().getLanguage());
-        assertEquals(USER_2_ORCID_URL, response.getCreator().getAttributes().getOrcid());
-        assertNull(response.getCreator().getAttributes().getMariadbPassword());
+        assertNotNull(response.getOwner());
+        assertEquals(DATABASE_2_OWNER, response.getOwner().getId());
+        assertEquals(USER_2_NAME, response.getOwner().getName());
+        assertEquals(USER_2_USERNAME, response.getOwner().getUsername());
+        assertEquals(USER_2_FIRSTNAME, response.getOwner().getFirstname());
+        assertEquals(USER_2_LASTNAME, response.getOwner().getLastname());
+        assertEquals(USER_2_QUALIFIED_NAME, response.getOwner().getQualifiedName());
         final List<IdentifierDto> identifiers = response.getIdentifiers();
         assertNotNull(identifiers);
         assertEquals(0, identifiers.size());
@@ -147,20 +140,13 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals(DATABASE_1_ID, response.getTdbid());
         assertTrue(response.getIsVersioned());
         assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
-        assertEquals(DATABASE_1_OWNER, response.getCreatedBy());
-        assertNotNull(response.getCreator());
-        assertEquals(DATABASE_1_OWNER, response.getCreator().getId());
-        assertEquals(USER_1_NAME, response.getCreator().getName());
-        assertEquals(USER_1_USERNAME, response.getCreator().getUsername());
-        assertEquals(USER_1_FIRSTNAME, response.getCreator().getFirstname());
-        assertEquals(USER_1_LASTNAME, response.getCreator().getLastname());
-        assertEquals(USER_1_QUALIFIED_NAME, response.getCreator().getQualifiedName());
-        assertNotNull(response.getCreator().getAttributes());
-        assertEquals(USER_1_AFFILIATION, response.getCreator().getAttributes().getAffiliation());
-        assertEquals(USER_1_THEME, response.getCreator().getAttributes().getTheme());
-        assertEquals(USER_1_LANGUAGE, response.getCreator().getAttributes().getLanguage());
-        assertEquals(USER_1_ORCID_UNCOMPRESSED, response.getCreator().getAttributes().getOrcid());
-        assertNull(response.getCreator().getAttributes().getMariadbPassword());
+        assertNotNull(response.getOwner());
+        assertEquals(DATABASE_1_OWNER, response.getOwner().getId());
+        assertEquals(USER_1_NAME, response.getOwner().getName());
+        assertEquals(USER_1_USERNAME, response.getOwner().getUsername());
+        assertEquals(USER_1_FIRSTNAME, response.getOwner().getFirstname());
+        assertEquals(USER_1_LASTNAME, response.getOwner().getLastname());
+        assertEquals(USER_1_QUALIFIED_NAME, response.getOwner().getQualifiedName());
         final List<IdentifierDto> identifiers = response.getIdentifiers();
         assertNotNull(identifiers);
         assertEquals(0, identifiers.size());
@@ -373,8 +359,7 @@ public class SchemaServiceIntegrationTest extends AbstractUnitTest {
         assertEquals("not_in_metadata_db2", response.getName());
         assertEquals(DATABASE_1_ID, response.getVdbid());
         assertEquals(DATABASE_1_ID, response.getDatabase().getId());
-        assertEquals(DATABASE_1_OWNER, response.getCreatedBy());
-        assertEquals(DATABASE_1_OWNER, response.getCreator().getId());
+        assertEquals(DATABASE_1_OWNER, response.getOwner().getId());
         assertFalse(response.getIsInitialView());
         assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
         assertTrue(response.getQuery().length() >= 69);
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java
index 0f0820926f71b5a78bebd0b6b97f763e99145abe..dc4179f61d44a49ce783c3b1e2e8b25ff7db0fb9 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java
@@ -8,7 +8,6 @@ import at.tuwien.config.MariaDbConfig;
 import at.tuwien.config.MariaDbContainerConfig;
 import at.tuwien.config.S3Config;
 import at.tuwien.exception.*;
-import at.tuwien.gateway.AnalyseServiceGateway;
 import at.tuwien.gateway.MetadataServiceGateway;
 import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
@@ -34,7 +33,6 @@ import java.util.Map;
 
 import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.when;
 
 @Log4j2
@@ -49,9 +47,6 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
     @MockBean
     private MetadataServiceGateway metadataServiceGateway;
 
-    @MockBean
-    private AnalyseServiceGateway dataDatabaseSidecarGateway;
-
     @MockBean
     private StorageService storageService;
 
@@ -78,8 +73,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
         Thread.sleep(1000) /* wait for test container some more */;
 
         /* mock */
-        when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY))
-                .thenReturn(QUERY_1_CREATOR);
+        when(metadataServiceGateway.getUserById(USER_1_ID))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 0L, 10L, null, null);
@@ -119,8 +114,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
         Thread.sleep(1000) /* wait for test container some more */;
 
         /* mock */
-        when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY))
-                .thenReturn(QUERY_1_CREATOR);
+        when(metadataServiceGateway.getUserById(USER_1_ID))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_7_STATEMENT, Instant.now(), USER_1_ID, 0L, 10L, null, null);
@@ -150,8 +145,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
         /* mock */
         when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, QUERY_1_ID))
                 .thenReturn(List.of(IDENTIFIER_2_DTO));
-        when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY))
-                .thenReturn(QUERY_1_CREATOR);
+        when(metadataServiceGateway.getUserById(USER_1_ID))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         final QueryResultDto response = queryService.execute(DATABASE_1_PRIVILEGED_DTO, QUERY_1_STATEMENT, Instant.now(), USER_1_ID, 0L, 1L, null, null);
@@ -255,8 +250,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
             InterruptedException {
 
         /* mock */
-        when(metadataServiceGateway.getUserById(QUERY_2_CREATED_BY))
-                .thenReturn(QUERY_2_CREATOR);
+        when(metadataServiceGateway.getUserById(USER_1_ID))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         persist_generic(QUERY_2_ID, List.of(IDENTIFIER_5_DTO), true);
@@ -271,8 +266,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
             InterruptedException {
 
         /* mock */
-        when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY))
-                .thenReturn(QUERY_1_CREATOR);
+        when(metadataServiceGateway.getUserById(USER_1_ID))
+                .thenReturn(USER_1_DTO);
 
         /* test */
         persist_generic(QUERY_1_ID, List.of(IDENTIFIER_2_DTO), false);
@@ -322,8 +317,8 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
         /* mock */
         when(metadataServiceGateway.getIdentifiers(DATABASE_1_ID, QUERY_1_ID))
                 .thenReturn(List.of(IDENTIFIER_2_DTO));
-        when(metadataServiceGateway.getUserById(QUERY_1_CREATED_BY))
-                .thenReturn(QUERY_1_CREATOR);
+        when(metadataServiceGateway.getUserById(USER_1_ID))
+                .thenReturn(USER_1_DTO);
         MariaDbConfig.insertQueryStore(DATABASE_1_PRIVILEGED_DTO, QUERY_1_DTO, USER_1_ID);
 
         /* test */
@@ -388,9 +383,6 @@ public class SubsetServiceIntegrationTest extends AbstractUnitTest {
         Thread.sleep(1000) /* wait for test container some more */;
 
         /* mock */
-        doNothing()
-                .when(dataDatabaseSidecarGateway)
-                .exportTable(anyLong(), anyLong());
         when(storageService.transformDataset(any(Dataset.class)))
                 .thenReturn(EXPORT_RESOURCE_DTO);
 
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 3b59dac2c14c6e1194af7b135869273719244d1f..eea27bae218b7ac77dbd81e7c31a3fa122e761a8 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
@@ -18,7 +18,6 @@ import at.tuwien.api.database.table.internal.TableCreateDto;
 import at.tuwien.config.MariaDbConfig;
 import at.tuwien.config.MariaDbContainerConfig;
 import at.tuwien.exception.*;
-import at.tuwien.gateway.AnalyseServiceGateway;
 import at.tuwien.gateway.MetadataServiceGateway;
 import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
@@ -42,8 +41,6 @@ import java.util.*;
 
 import static at.tuwien.service.SchemaServiceIntegrationTest.assertColumn;
 import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.anyLong;
-import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.when;
 
 @Log4j2
@@ -58,9 +55,6 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
     @MockBean
     private MetadataServiceGateway metadataServiceGateway;
 
-    @MockBean
-    private AnalyseServiceGateway dataDatabaseSidecarGateway;
-
     @MockBean
     private StorageService storageService;
 
@@ -742,18 +736,14 @@ public class TableServiceIntegrationTest extends AbstractUnitTest {
     }
 
     @Test
-    public void exportTable_succeeds() throws QueryMalformedException, RemoteUnavailableException,
-            StorageNotFoundException, StorageUnavailableException, AnalyseServiceException, TableNotFoundException,
-            MalformedException {
+    public void exportTable_succeeds() throws QueryMalformedException, StorageNotFoundException,
+            StorageUnavailableException, TableNotFoundException, MalformedException {
         final ExportResourceDto mock = ExportResourceDto.builder()
                 .filename("weather_aus.csv")
                 .resource(new InputStreamResource(InputStream.nullInputStream()))
                 .build();
 
         /* mock */
-        doNothing()
-                .when(dataDatabaseSidecarGateway)
-                .exportTable(anyLong(), anyLong());
         when(storageService.getResource("weather_aus.csv"))
                 .thenReturn(mock);
 
diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
index 4018c95334ffff498ac0f72aa28528e719d266f0..bcc0e38a46ef1452902b67136e0a7547d8c84336 100644
--- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
+++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java
@@ -115,8 +115,7 @@ public class ViewServiceIntegrationTest extends AbstractUnitTest {
         assertEquals("not_in_metadata_db2", view0.getInternalName());
         assertEquals(DATABASE_1_ID, view0.getVdbid());
         assertEquals(DATABASE_1_ID, view0.getDatabase().getId());
-        assertEquals(DATABASE_1_OWNER, view0.getCreatedBy());
-        assertEquals(DATABASE_1_OWNER, view0.getCreator().getId());
+        assertEquals(DATABASE_1_OWNER, view0.getOwner().getId());
         assertFalse(view0.getIsInitialView());
         assertEquals(DATABASE_1_PUBLIC, view0.getIsPublic());
         assertTrue(view0.getQuery().length() >= 69);
diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml
index ee3c9b2b6cb322239efcc4eb8c828a5c6c6e88dc..180987ded0cb6336af854b2d610a5a103619a166 100644
--- a/dbrepo-data-service/services/pom.xml
+++ b/dbrepo-data-service/services/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-data-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>services</artifactId>
     <name>dbrepo-data-service-services</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
             <groupId>at.tuwien</groupId>
             <artifactId>dbrepo-data-service-querystore</artifactId>
-            <version>1.5.2</version>
+            <version>1.6.0</version>
         </dependency>
     </dependencies>
 
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/AnalyseServiceGateway.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/AnalyseServiceGateway.java
deleted file mode 100644
index 0257f0b2c78ad4c2fff130ff1a96ef2fd6906677..0000000000000000000000000000000000000000
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/AnalyseServiceGateway.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package at.tuwien.gateway;
-
-import at.tuwien.exception.*;
-
-public interface AnalyseServiceGateway {
-
-    /**
-     * Imports a given dataset name into the given database.
-     *
-     * @param databaseId The database id.
-     * @param tableId    The table id.
-     * @param filename   The dataset name.
-     * @throws StorageNotFoundException   The dataset name was not found in the storage service.
-     * @throws RemoteUnavailableException Connection to the sidecar could not be established.
-     * @throws AnalyseServiceException    The analyse service failed to import the dataset.
-     */
-    void importDataset(Long databaseId, Long tableId, String filename) throws StorageNotFoundException,
-            RemoteUnavailableException, AnalyseServiceException;
-
-    /**
-     * Exports a given dataset name from the given database.
-     *
-     * @param databaseId The database id.
-     * @param tableId    The table id.
-     * @throws StorageNotFoundException   The dataset name was not found in the storage service.
-     * @throws RemoteUnavailableException Connection to the sidecar could not be established.
-     * @throws AnalyseServiceException    The analyse service failed to export the dataset.
-     */
-    void exportTable(Long databaseId, Long tableId) throws StorageNotFoundException,
-            RemoteUnavailableException, AnalyseServiceException;
-}
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/AnalyseServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/AnalyseServiceGatewayImpl.java
deleted file mode 100644
index 2ab9d0a0188d1c351584610a2b70287750e6e3c8..0000000000000000000000000000000000000000
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/gateway/impl/AnalyseServiceGatewayImpl.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package at.tuwien.gateway.impl;
-
-import at.tuwien.config.GatewayConfig;
-import at.tuwien.exception.AnalyseServiceException;
-import at.tuwien.exception.RemoteUnavailableException;
-import at.tuwien.exception.StorageNotFoundException;
-import at.tuwien.gateway.AnalyseServiceGateway;
-import lombok.extern.log4j.Log4j2;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.HttpEntity;
-import org.springframework.http.HttpMethod;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Service;
-import org.springframework.web.client.HttpClientErrorException;
-import org.springframework.web.client.HttpServerErrorException;
-import org.springframework.web.client.RestTemplate;
-
-@Log4j2
-@Service
-public class AnalyseServiceGatewayImpl implements AnalyseServiceGateway {
-
-    private final RestTemplate restTemplate;
-    private final GatewayConfig gatewayConfig;
-
-    @Autowired
-    public AnalyseServiceGatewayImpl(RestTemplate restTemplate, GatewayConfig gatewayConfig) {
-        this.restTemplate = restTemplate;
-        this.gatewayConfig = gatewayConfig;
-    }
-
-    @Override
-    public void importDataset(Long databaseId, Long tableId, String filename) throws StorageNotFoundException,
-            RemoteUnavailableException, AnalyseServiceException {
-        final ResponseEntity<Void> response;
-        final String url = new StringBuilder(gatewayConfig.getAnalyseEndpoint())
-                .append("/api/analyse/import?database_id=")
-                .append(databaseId)
-                .append("&table_id=")
-                .append(tableId)
-                .append("&filename=")
-                .append(filename)
-                .toString();
-        log.debug("import file into data database: {}", url);
-        try {
-            response = restTemplate.exchange(url, HttpMethod.POST, HttpEntity.EMPTY, Void.class);
-        } catch (HttpServerErrorException e) {
-            log.error("Failed to import dataset with filename: {}: {}", filename, e.getMessage());
-            throw new RemoteUnavailableException("Failed to import dataset: " + e.getMessage(), e);
-        } catch (HttpClientErrorException.BadRequest e) {
-            log.error("Failed to import dataset with filename: {}: not found: {}", filename, e.getMessage());
-            throw new StorageNotFoundException("Failed to import dataset: not found: " + e.getMessage(), e);
-        }
-        if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
-            log.error("Failed to import dataset with filename: {}: service responded unsuccessful: {}", filename, response.getStatusCode());
-            throw new AnalyseServiceException("Failed to import dataset: service responded unsuccessful: " + response.getStatusCode());
-        }
-    }
-
-    @Override
-    public void exportTable(Long databaseId, Long tableId) throws StorageNotFoundException, RemoteUnavailableException,
-            AnalyseServiceException {
-        final ResponseEntity<Void> response;
-        final String url = new StringBuilder(gatewayConfig.getAnalyseEndpoint())
-                .append("/api/analyse/export?database_id=")
-                .append(databaseId)
-                .append("&table_id=")
-                .append(tableId)
-                .toString();
-        log.debug("export file from data database: {}", url);
-        try {
-            response = restTemplate.exchange(url, HttpMethod.POST, HttpEntity.EMPTY, Void.class);
-        } catch (HttpServerErrorException e) {
-            log.error("Failed to export dataset: {}", e.getMessage());
-            throw new RemoteUnavailableException("Failed to export dataset: " + e.getMessage(), e);
-        } catch (HttpClientErrorException.BadRequest e) {
-            log.error("Failed to export dataset: not found: {}", e.getMessage());
-            throw new StorageNotFoundException("Failed to export dataset: not found: " + e.getMessage(), e);
-        }
-        if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
-            log.error("Failed to export dataset: service responded unsuccessful: {}", response.getStatusCode());
-            throw new AnalyseServiceException("Failed to export dataset: service responded unsuccessful: " + response.getStatusCode());
-        }
-    }
-}
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 3c03f022b311bbbe1d161888cec1a10d07bae55a..b6593238fd82daadec664bbb2aa7a09a84e50417 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
@@ -103,7 +103,7 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
             log.error("Failed to find database with id {}: service responded unsuccessful: {}", id, response.getStatusCode());
             throw new MetadataServiceException("Failed to find database: service responded unsuccessful: " + response.getStatusCode());
         }
-        final List<String> expectedHeaders = List.of("X-Username", "X-Password");
+        final List<String> expectedHeaders = List.of("X-Username", "X-Password", "X-Host", "X-Port");
         if (!response.getHeaders().keySet().containsAll(expectedHeaders)) {
             log.error("Failed to find all privileged database headers");
             log.debug("expected headers: {}", expectedHeaders);
@@ -117,6 +117,8 @@ public class MetadataServiceGatewayImpl implements MetadataServiceGateway {
         final PrivilegedDatabaseDto database = response.getBody();
         database.getContainer().setUsername(response.getHeaders().get("X-Username").get(0));
         database.getContainer().setPassword(response.getHeaders().get("X-Password").get(0));
+        database.getContainer().setHost(response.getHeaders().get("X-Host").get(0));
+        database.getContainer().setPort(Integer.parseInt(response.getHeaders().get("X-Port").get(0)));
         log.debug("found privileged database username={}", database.getContainer().getUsername());
         return database;
     }
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
index 7a268f52487c55fed35ddd8576c78559d57792d1..f617766d2c50fd4fd10760a99afa11a6f9767c69 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java
@@ -20,7 +20,7 @@ import at.tuwien.api.database.table.constraints.foreign.ForeignKeyReferenceDto;
 import at.tuwien.api.database.table.constraints.foreign.ReferenceTypeDto;
 import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto;
 import at.tuwien.api.database.table.constraints.unique.UniqueDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.config.QueryConfig;
 import at.tuwien.exception.QueryNotFoundException;
 import at.tuwien.exception.TableNotFoundException;
@@ -115,8 +115,7 @@ public interface DataMapper {
                         .toString())
                 .columns(new LinkedList<>())
                 .identifiers(new LinkedList<>())
-                .creator(database.getOwner())
-                .createdBy(database.getOwner().getId())
+                .owner(database.getOwner())
                 .build();
     }
 
@@ -369,13 +368,9 @@ public interface DataMapper {
         /* note that next() is called outside this mapping function */
         return QueryDto.builder()
                 .id(data.getLong(1))
-                .created(LocalDateTime.parse(data.getString(2), mariaDbFormatter)
-                        .atZone(ZoneId.of("UTC"))
-                        .toInstant())
-                .creator(UserDto.builder()
+                .owner(UserBriefDto.builder()
                         .id(UUID.fromString(data.getString(3)))
                         .build())
-                .createdBy(UUID.fromString(data.getString(3)))
                 .query(data.getString(4))
                 .queryHash(data.getString(5))
                 .resultHash(data.getString(6))
@@ -489,7 +484,7 @@ public interface DataMapper {
         if (!resultSet.next()) {
             throw new TableNotFoundException("Failed to find table in the information schema");
         }
-        final TableDto table = TableDto.builder()
+        return TableDto.builder()
                 .name(resultSet.getString(1))
                 .internalName(resultSet.getString(1))
                 .isVersioned(resultSet.getString(2).equals("SYSTEM VERSIONED"))
@@ -503,7 +498,7 @@ public interface DataMapper {
                 .description(resultSet.getString(10))
                 .columns(new LinkedList<>())
                 .identifiers(new LinkedList<>())
-                .creator(database.getOwner())
+                .owner(database.getOwner())
                 .owner(database.getOwner())
                 .constraints(ConstraintsDto.builder()
                         .foreignKeys(new LinkedList<>())
@@ -513,11 +508,6 @@ public interface DataMapper {
                         .build())
                 .isPublic(database.getIsPublic())
                 .build();
-        if (resultSet.getString(7) != null && !resultSet.getString(7).isEmpty()) {
-            table.setCreated(Timestamp.valueOf(resultSet.getString(7))
-                    .toInstant());
-        }
-        return table;
     }
 
     default Object dataColumnToObject(Object data, ColumnDto column) {
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 62a5fada07dd427822fb6ef39e697ccee71c8cdc..56f51468b7188b463c8fa1e4d10129b17c0cfca7 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
@@ -307,6 +307,14 @@ public interface MariaDbMapper {
         return statement.toString();
     }
 
+    default String tableNameToUpdateTableRawQuery(String internalName) {
+        final StringBuilder stringBuilder = new StringBuilder("ALTER TABLE `")
+                .append(internalName)
+                .append("` COMMENT = ?;");
+        log.trace("mapped update table statement: {}", stringBuilder);
+        return stringBuilder.toString();
+    }
+
     default String tableCreateDtoToCreateTableRawQuery(at.tuwien.api.database.table.internal.TableCreateDto data) {
         final StringBuilder stringBuilder = new StringBuilder("CREATE TABLE `")
                 .append(nameToInternalName(data.getName()))
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java
index a585f2e98ad8d39b4c0c290ae9c48fc8840f7581..61a95b32d3f004de402c3619aa322a349a040d32 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java
@@ -13,6 +13,8 @@ import at.tuwien.api.database.table.TableBriefDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.api.database.table.internal.PrivilegedTableDto;
+import at.tuwien.api.identifier.IdentifierBriefDto;
+import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.user.PrivilegedUserDto;
 import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.api.user.UserDto;
@@ -55,4 +57,6 @@ public interface MetadataMapper {
     })
     TableBriefDto tableDtoToTableBriefDto(TableDto data);
 
+    IdentifierBriefDto identifierDtoToIdentifierBriefDto(IdentifierDto data);
+
 }
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java
index b346a187a59756a934ed47c1168472c485252ffc..77482805ee6fb49d9ae992cd1f871ae162430499 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/StorageService.java
@@ -1,14 +1,12 @@
 package at.tuwien.service;
 
 import at.tuwien.ExportResourceDto;
-import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.exception.MalformedException;
 import at.tuwien.exception.StorageNotFoundException;
 import at.tuwien.exception.StorageUnavailableException;
 import org.apache.spark.sql.Dataset;
 import org.apache.spark.sql.Row;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 
@@ -71,7 +69,7 @@ public interface StorageService {
     /**
      * Transforms the given dataset into a downloadable dataset.
      *
-     * @param data    The dataset.
+     * @param data The dataset.
      * @throws StorageUnavailableException The object failed to be loaded from the Storage Service.
      */
     ExportResourceDto transformDataset(Dataset<Row> data) throws StorageUnavailableException;
@@ -85,6 +83,7 @@ public interface StorageService {
      * @return The dataset.
      * @throws StorageNotFoundException    The key was not found in the Storage Service.
      * @throws StorageUnavailableException The object failed to be loaded from the Storage Service.
+     * @throws MalformedException          The field lengths for the table and dataset are not the same.
      */
     Dataset<Row> loadDataset(List<String> columns, String key, Boolean withHeader) throws StorageNotFoundException,
             StorageUnavailableException, MalformedException;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java
index 938da8820c829113193be4e5fd95d2e20e0c0029..78b2fe8f8986c97b39618022284f011020e1e26c 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/SubsetService.java
@@ -82,6 +82,7 @@ public interface SubsetService {
      * @return The row count.
      * @throws TableMalformedException The table is malformed.
      * @throws SQLException            The connection to the database could not be established.
+     * @throws QueryMalformedException The re-execute query is malformed.
      */
     Long reExecuteCount(PrivilegedDatabaseDto database, QueryDto query) throws TableMalformedException,
             SQLException, QueryMalformedException;
@@ -113,10 +114,11 @@ public interface SubsetService {
      * @throws StorageNotFoundException    The exported subset was not found from the key provided by the sidecar in the Storage Service.
      * @throws StorageUnavailableException The communication to the Storage Service failed.
      * @throws RemoteUnavailableException  The privileged database information could not be found in the Metadata Service.
+     * @throws ViewNotFoundException       The source view was not found in the metadata database.
      */
     ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp) throws SQLException,
             QueryMalformedException, StorageNotFoundException, StorageUnavailableException, RemoteUnavailableException,
-            ViewNotFoundException, MalformedException;
+            ViewNotFoundException;
 
     /**
      * Executes a subset query without saving it.
@@ -141,12 +143,11 @@ public interface SubsetService {
      * @throws QueryNotFoundException     The query store did not return a query.
      * @throws SQLException               The connection to the database could not be established.
      * @throws RemoteUnavailableException The privileged database information could not be found in the Metadata Service.
-     * @throws UserNotFoundException      The user that created the query was not found in the Metadata Service.
      * @throws DatabaseNotFoundException  The database metadata was not found in the Metadata Service.
      * @throws MetadataServiceException   Communication with the Metadata Service failed.
      */
     QueryDto findById(PrivilegedDatabaseDto database, Long queryId) throws QueryNotFoundException, SQLException,
-            RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, MetadataServiceException;
+            RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException;
 
     /**
      * Inserts a query and metadata to the query store of a given database id.
@@ -182,6 +183,16 @@ public interface SubsetService {
      */
     void deleteStaleQueries(PrivilegedDatabaseDto database) throws SQLException, QueryStoreGCException;
 
-    Dataset<Row> getData(@NotNull PrivilegedDatabaseDto database, String viewName, Instant timestamp) throws ViewNotFoundException,
-            QueryMalformedException;
+    /**
+     * Exports data as dataset from the database view with given name at a given timestamp.
+     *
+     * @param database  The database.
+     * @param viewName  The view name.
+     * @param timestamp The timestamp.
+     * @return The dataset.
+     * @throws ViewNotFoundException   The view was not found in the metadata database.
+     * @throws QueryMalformedException The query to eis malformed.
+     */
+    Dataset<Row> getData(@NotNull PrivilegedDatabaseDto database, String viewName, Instant timestamp)
+            throws ViewNotFoundException, QueryMalformedException;
 }
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 c70d1b703f714f9201aa8ffb972763aca1c72691..7bf4fb3f566b0e490d0ded26abb7dbc568d4e77f 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
@@ -61,14 +61,26 @@ public interface TableService {
      * @param database The data database privileged object.
      * @param data     The table definition.
      * @return The created table, if successful.
-     * @throws SQLException           Failed to parse SQL query, contains invalid syntax.
-     * @throws TableNotFoundException The table could not be inspected in the data database.
-     * @throws TableExistsException   The table name already exists in the information_schema.
-     * @throws TableNotFoundException The table could not be inspected in the data database.
+     * @throws SQLException            Query statement is malformed.
+     * @throws TableMalformedException The table schema is malformed.
+     * @throws TableExistsException    The table name already exists in the information_schema.
+     * @throws TableNotFoundException  The table could not be inspected in the metadata database.
      */
     TableDto createTable(PrivilegedDatabaseDto database, TableCreateDto data) throws SQLException,
             TableMalformedException, TableExistsException, TableNotFoundException;
 
+    /**
+     * Updating table description.
+     *
+     * @param table The table.
+     * @param data  The description.
+     * @throws SQLException            Query statement is malformed.
+     * @throws TableMalformedException The table schema is malformed.
+     * @throws TableNotFoundException  The table could not be inspected in the metadata database.
+     */
+    void updateTable(PrivilegedTableDto table, TableUpdateDto data) throws SQLException,
+            TableMalformedException, TableNotFoundException;
+
     /**
      * Drops a table in given table object.
      *
@@ -122,8 +134,8 @@ public interface TableService {
      * @param table The table.
      * @param data  The dataset metadata.
      * @throws MalformedException          The dataset is malformed.
-     * @throws StorageUnavailableException Failed to establish a connection with the Storage Service.
      * @throws StorageNotFoundException    The storage service was not able to find the dataset for import.
+     * @throws StorageUnavailableException Failed to establish a connection with the Storage Service.
      * @throws SQLException                Failed to parse SQL query, contains invalid syntax.
      * @throws QueryMalformedException     The import query is malformed, likely due to a bug in the application.
      */
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java
index 26c04e401bb15945f1b438bd5af10beeccd470f7..48aa5ec3cfbd3968a00f3d1dcaf46108fd33eb07 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/ViewService.java
@@ -6,7 +6,6 @@ import at.tuwien.api.database.ViewDto;
 import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.internal.PrivilegedViewDto;
 import at.tuwien.api.database.query.QueryResultDto;
-import at.tuwien.api.database.table.internal.PrivilegedTableDto;
 import at.tuwien.exception.*;
 import jakarta.validation.constraints.NotNull;
 import org.apache.spark.sql.Dataset;
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
index b2a9b0c8408953e0a694a1ae6d3e36c8ebfe485d..7bb5927692131560b8a54e78c78c418d67ecc757 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java
@@ -3,7 +3,7 @@ package at.tuwien.service.impl;
 import at.tuwien.api.container.internal.PrivilegedContainerDto;
 import at.tuwien.api.database.internal.CreateDatabaseDto;
 import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.api.user.internal.UpdateUserPasswordDto;
 import at.tuwien.config.RabbitConfig;
 import at.tuwien.exception.DatabaseMalformedException;
@@ -53,13 +53,10 @@ public class DatabaseServiceMariaDbImpl extends HibernateConnector implements Da
         return PrivilegedDatabaseDto.builder()
                 .internalName(data.getInternalName())
                 .exchangeName(rabbitConfig.getExchangeName())
-                .creator(UserDto.builder()
+                .owner(UserBriefDto.builder()
                         .id(data.getUserId())
                         .build())
-                .owner(UserDto.builder()
-                        .id(data.getUserId())
-                        .build())
-                .contact(UserDto.builder()
+                .contact(UserBriefDto.builder()
                         .id(data.getUserId())
                         .build())
                 .container(container)
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java
index 1aba3c6b9942386f171c1a4fe029658667a633a1..faa9510a0981106a1fd6f82038143429d6f71f2b 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java
@@ -105,9 +105,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
                 }
             }
             table.setTdbid(database.getId());
-            database.getCreator().getAttributes().setMariadbPassword(null);
-            table.setCreator(database.getCreator());
-            table.setCreatedBy(database.getCreator().getId());
+            table.setOwner(database.getOwner());
             final TableDto tmpTable = table;
             tmpTable.getColumns()
                     .forEach(column -> {
@@ -143,8 +141,7 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche
             ViewDto view = dataMapper.schemaResultSetToView(database, resultSet1);
             view.setDatabase(database);
             view.setVdbid(database.getId());
-            view.setCreator(database.getOwner());
-            view.setCreatedBy(privilegedDatabase.getOwner().getId());
+            view.setOwner(database.getOwner());
             /* obtain view columns */
             start = System.currentTimeMillis();
             final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery());
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java
index 8c5cc6d601a4165d4abc22c1a9ab1e0e94766656..9a0f1fb27902a291e4676ba3b565b6161e41a152 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java
@@ -8,6 +8,7 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.query.QueryResultDto;
 import at.tuwien.api.database.table.columns.ColumnDto;
+import at.tuwien.api.identifier.IdentifierBriefDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.identifier.IdentifierTypeDto;
 import at.tuwien.exception.*;
@@ -162,6 +163,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs
                 query.setIdentifiers(identifiers.stream()
                         .filter(i -> i.getType().equals(IdentifierTypeDto.SUBSET))
                         .filter(i -> i.getQueryId().equals(query.getId()))
+                        .map(metadataMapper::identifierDtoToIdentifierBriefDto)
                         .toList());
                 queries.add(query);
             }
@@ -178,7 +180,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs
     @Override
     public ExportResourceDto export(PrivilegedDatabaseDto database, QueryDto query, Instant timestamp)
             throws SQLException, QueryMalformedException, StorageNotFoundException, StorageUnavailableException,
-            RemoteUnavailableException, ViewNotFoundException, MalformedException {
+            RemoteUnavailableException, ViewNotFoundException {
         final String viewName = "ex_" + Hashing.sha512()
                 .hashString(new String(RandomUtils.nextBytes(256), Charset.defaultCharset()), Charset.defaultCharset())
                 .toString()
@@ -261,7 +263,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs
 
     @Override
     public QueryDto findById(PrivilegedDatabaseDto database, Long queryId) throws QueryNotFoundException, SQLException,
-            RemoteUnavailableException, UserNotFoundException, DatabaseNotFoundException, MetadataServiceException {
+            RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException {
         final ComboPooledDataSource dataSource = getPrivilegedDataSource(database);
         final Connection connection = dataSource.getConnection();
         try {
@@ -274,8 +276,12 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs
                 throw new QueryNotFoundException("Failed to find query");
             }
             final QueryDto query = dataMapper.resultSetToQueryDto(resultSet);
-            query.setIdentifiers(metadataServiceGateway.getIdentifiers(database.getId(), queryId));
-            query.setCreator(database.getOwner());
+            final List<IdentifierBriefDto> identifiers = metadataServiceGateway.getIdentifiers(database.getId(), queryId)
+                    .stream()
+                    .map(metadataMapper::identifierDtoToIdentifierBriefDto)
+                    .toList();
+            query.setIdentifiers(identifiers);
+            query.setOwner(database.getOwner());
             query.setDatabaseId(database.getId());
             return query;
         } catch (SQLException e) {
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 0eea223f7e450ad54efba1cd28063b116ea9afe9..db46aed12b9917c25ef5c1a6a348f179e8fd6a42 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
@@ -166,6 +166,30 @@ public class TableServiceMariaDbImpl extends HibernateConnector implements Table
         return table;
     }
 
+    @Override
+    public void updateTable(PrivilegedTableDto table, TableUpdateDto data) throws SQLException,
+            TableMalformedException {
+        final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase());
+        final Connection connection = dataSource.getConnection();
+        try {
+            /* create table if not exists */
+            final long start = System.currentTimeMillis();
+            final PreparedStatement statement = connection.prepareStatement(mariaDbMapper.tableNameToUpdateTableRawQuery(table.getInternalName()));
+            log.trace("prepare with arg 1={}", data.getDescription());
+            statement.setString(1, data.getDescription());
+            statement.executeUpdate();
+            log.debug("executed statement in {} ms", System.currentTimeMillis() - start);
+            connection.commit();
+        } catch (SQLException e) {
+            connection.rollback();
+            log.error("Failed to update table: {}", e.getMessage());
+            throw new TableMalformedException("Failed to update table: " + e.getMessage(), e);
+        } finally {
+            dataSource.close();
+        }
+        log.info("Updated table with name {}", table.getInternalName());
+    }
+
     @Override
     public void delete(PrivilegedTableDto table) throws SQLException, QueryMalformedException {
         final ComboPooledDataSource dataSource = getPrivilegedDataSource(table.getDatabase());
diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java
index 7ca776ff8a37987aaf640012d665036f695bf058..49cc6b7505ce3561b6f336196438c692a08e2b16 100644
--- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java
+++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java
@@ -114,8 +114,7 @@ public class ViewServiceMariaDbImpl extends HibernateConnector implements ViewSe
                         .hashString(data.getQuery(), StandardCharsets.UTF_8)
                         .toString())
                 .isPublic(database.getIsPublic())
-                .creator(database.getOwner())
-                .createdBy(database.getOwner().getId())
+                .owner(database.getOwner())
                 .identifiers(new LinkedList<>())
                 .isInitialView(false)
                 .vdbid(database.getId())
diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf
index dfec5ea42bbe5f4c77e0858d7e54213c60d99372..15daf4381ddfa3195e999801d509aba4a778cb6c 100644
--- a/dbrepo-gateway-service/dbrepo.conf
+++ b/dbrepo-gateway-service/dbrepo.conf
@@ -105,7 +105,7 @@ server {
         proxy_read_timeout      90;
     }
 
-    location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export|statistic) {
+    location ~ /api/database/([0-9]+)/table/([0-9]+)/(data|history|export) {
         proxy_set_header        Host $host;
         proxy_set_header        X-Real-IP $remote_addr;
         proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
diff --git a/dbrepo-metadata-db/1_setup-schema.sql b/dbrepo-metadata-db/1_setup-schema.sql
index 29a0e856569f3a2b1a0c69d207a7a4bdf5b079cc..0a43ef604460e8deb4e4fee4f457c0ca833fc6a2 100644
--- a/dbrepo-metadata-db/1_setup-schema.sql
+++ b/dbrepo-metadata-db/1_setup-schema.sql
@@ -78,23 +78,23 @@ CREATE TABLE IF NOT EXISTS `mdb_licenses`
 
 CREATE TABLE IF NOT EXISTS `mdb_databases`
 (
-    id             SERIAL,
-    cid            BIGINT UNSIGNED        NOT NULL,
-    name           character varying(255) NOT NULL,
-    internal_name  character varying(255) NOT NULL,
-    exchange_name  character varying(255) NOT NULL,
-    description    text,
-    engine         character varying(20),
-    is_public      boolean                NOT NULL DEFAULT TRUE,
-    image          longblob,
-    created_by     character varying(36),
-    owned_by       character varying(36),
-    contact_person character varying(36),
-    created        timestamp              NOT NULL DEFAULT NOW(),
-    last_modified  timestamp,
+    id               SERIAL,
+    cid              BIGINT UNSIGNED        NOT NULL,
+    name             character varying(255) NOT NULL,
+    internal_name    character varying(255) NOT NULL,
+    exchange_name    character varying(255) NOT NULL,
+    description      text,
+    engine           character varying(20),
+    is_public        boolean                NOT NULL DEFAULT TRUE,
+    is_schema_public boolean                NOT NULL DEFAULT TRUE,
+    image            longblob,
+    owned_by         character varying(36),
+    contact_person   character varying(36),
+    created          timestamp              NOT NULL DEFAULT NOW(),
+    last_modified    timestamp,
     PRIMARY KEY (id),
     FOREIGN KEY (cid) REFERENCES mdb_containers (id),
-    FOREIGN KEY (created_by) REFERENCES mdb_users (id),
+    FOREIGN KEY (owned_by) REFERENCES mdb_users (id),
     FOREIGN KEY (owned_by) REFERENCES mdb_users (id),
     FOREIGN KEY (contact_person) REFERENCES mdb_users (id)
 ) WITH SYSTEM VERSIONING;
@@ -108,33 +108,34 @@ CREATE TABLE IF NOT EXISTS `mdb_databases_subjects`
 
 CREATE TABLE IF NOT EXISTS `mdb_tables`
 (
-    ID              SERIAL,
-    tDBID           BIGINT UNSIGNED       NOT NULL,
-    tName           VARCHAR(64)           NOT NULL,
-    internal_name   VARCHAR(64)           NOT NULL,
-    queue_name      VARCHAR(255)          NOT NULL,
-    routing_key     VARCHAR(255),
-    tDescription    VARCHAR(2048),
-    num_rows        BIGINT,
-    data_length     BIGINT,
-    max_data_length BIGINT,
-    avg_row_length  BIGINT,
-    `separator`     CHAR(1),
-    quote           CHAR(1),
-    element_null    VARCHAR(50),
-    skip_lines      BIGINT,
-    element_true    VARCHAR(50),
-    element_false   VARCHAR(50),
-    Version         TEXT,
-    created         timestamp             NOT NULL DEFAULT NOW(),
-    versioned       boolean               not null default true,
-    created_by      character varying(36) NOT NULL,
-    owned_by        character varying(36) NOT NULL,
-    last_modified   timestamp,
+    ID               SERIAL,
+    tDBID            BIGINT UNSIGNED       NOT NULL,
+    tName            VARCHAR(64)           NOT NULL,
+    internal_name    VARCHAR(64)           NOT NULL,
+    queue_name       VARCHAR(255)          NOT NULL,
+    routing_key      VARCHAR(255),
+    tDescription     VARCHAR(2048),
+    num_rows         BIGINT,
+    data_length      BIGINT,
+    max_data_length  BIGINT,
+    avg_row_length   BIGINT,
+    `separator`      CHAR(1),
+    quote            CHAR(1),
+    element_null     VARCHAR(50),
+    skip_lines       BIGINT,
+    element_true     VARCHAR(50),
+    element_false    VARCHAR(50),
+    Version          TEXT,
+    created          timestamp             NOT NULL DEFAULT NOW(),
+    versioned        boolean               not null default true,
+    is_public        boolean               not null default true,
+    is_schema_public boolean               not null default true,
+    owned_by         character varying(36) NOT NULL,
+    last_modified    timestamp,
     PRIMARY KEY (ID),
     UNIQUE (tDBID, internal_name),
     FOREIGN KEY (tDBID) REFERENCES mdb_databases (id),
-    FOREIGN KEY (created_by) REFERENCES mdb_users (id),
+    FOREIGN KEY (owned_by) REFERENCES mdb_users (id),
     FOREIGN KEY (owned_by) REFERENCES mdb_users (id)
 ) WITH SYSTEM VERSIONING;
 
@@ -314,20 +315,21 @@ CREATE TABLE IF NOT EXISTS `mdb_columns_units`
 
 CREATE TABLE IF NOT EXISTS `mdb_view`
 (
-    id            SERIAL,
-    vdbid         BIGINT UNSIGNED       NOT NULL,
-    vName         VARCHAR(64)           NOT NULL,
-    internal_name VARCHAR(64)           NOT NULL,
-    Query         TEXT                  NOT NULL,
-    query_hash    VARCHAR(255)          NOT NULL,
-    Public        BOOLEAN               NOT NULL,
-    InitialView   BOOLEAN               NOT NULL,
-    created       timestamp             NOT NULL DEFAULT NOW(),
-    last_modified timestamp,
-    created_by    character varying(36) NOT NULL,
+    id               SERIAL,
+    vdbid            BIGINT UNSIGNED       NOT NULL,
+    vName            VARCHAR(64)           NOT NULL,
+    internal_name    VARCHAR(64)           NOT NULL,
+    Query            TEXT                  NOT NULL,
+    query_hash       VARCHAR(255)          NOT NULL,
+    Public           BOOLEAN               NOT NULL DEFAULT TRUE,
+    is_schema_public boolean               NOT NULL DEFAULT TRUE,
+    InitialView      BOOLEAN               NOT NULL,
+    created          timestamp             NOT NULL DEFAULT NOW(),
+    last_modified    timestamp,
+    owned_by         character varying(36) NOT NULL,
     PRIMARY KEY (id),
     FOREIGN KEY (vdbid) REFERENCES mdb_databases (id),
-    FOREIGN KEY (created_by) REFERENCES mdb_users (id)
+    FOREIGN KEY (owned_by) REFERENCES mdb_users (id)
 ) WITH SYSTEM VERSIONING;
 
 CREATE TABLE IF NOT EXISTS `mdb_banner_messages`
@@ -395,11 +397,11 @@ CREATE TABLE IF NOT EXISTS `mdb_identifiers`
     result_number     BIGINT,
     doi               VARCHAR(255),
     created           TIMESTAMP                                    NOT NULL DEFAULT NOW(),
-    created_by        VARCHAR(36)                                  NOT NULL,
+    owned_by          VARCHAR(36)                                  NOT NULL,
     last_modified     TIMESTAMP,
     PRIMARY KEY (id), /* must be a single id from persistent identifier concept */
     FOREIGN KEY (dbid) REFERENCES mdb_databases (id),
-    FOREIGN KEY (created_by) REFERENCES mdb_users (id)
+    FOREIGN KEY (owned_by) REFERENCES mdb_users (id)
 ) WITH SYSTEM VERSIONING;
 
 CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses`
@@ -451,8 +453,8 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions`
 CREATE TABLE IF NOT EXISTS `mdb_related_identifiers`
 (
     id       SERIAL,
-    pid      BIGINT UNSIGNED NOT NULL,
-    value    varchar(255)    NOT NULL,
+    pid      BIGINT UNSIGNED                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      NOT NULL,
+    value    varchar(255)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         NOT NULL,
     type     ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID')                                                                                                                                                                                                                                                                                                                                                                                                                             NOT NULL,
     relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL,
     PRIMARY KEY (id), /* must be a single id from persistent identifier concept */
diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml
index 9196e2d228a12234adee7a5cbf0eb9a51da8adf6..8e77c818a4f1c0b353a854636b1f437edf4d5546 100644
--- a/dbrepo-metadata-service/api/pom.xml
+++ b/dbrepo-metadata-service/api/pom.xml
@@ -6,18 +6,18 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-metadata-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-api</artifactId>
     <name>dbrepo-metadata-service-api</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
             <groupId>at.tuwien</groupId>
             <artifactId>dbrepo-metadata-service-entities</artifactId>
-            <version>1.5.2</version>
+            <version>1.6.0</version>
             <scope>compile</scope>
         </dependency>
     </dependencies>
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java
index 7acd4fc3ce7d225eb38de8a369dc34c60d185c49..4038a39dc608db197ca0572882cca1218b4f6c32 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerBriefDto.java
@@ -46,9 +46,4 @@ public class ContainerBriefDto {
     @NotNull
     @Schema(example = "10")
     private Integer count;
-
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
index 8f745f9ee9795b1dc69dd92bdd0a660ee8e2b071..9928c8e54d39287fc7a19bf84b6a99c7429f69bd 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/ContainerDto.java
@@ -35,6 +35,7 @@ public class ContainerDto {
     @NotBlank
     private String host;
 
+    @NotNull
     private Integer port;
 
     @JsonProperty("ui_host")
@@ -54,9 +55,4 @@ public class ContainerDto {
     @Schema(example = "10")
     private Long count;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java
index 3a7a375618d22c2fb3f85bb14d5494401d03dc04..545bd2a2d91cffbffa330ba047532ca654a9b256 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/container/internal/PrivilegedContainerDto.java
@@ -35,6 +35,7 @@ public class PrivilegedContainerDto {
     @NotBlank
     private String host;
 
+    @NotNull
     private Integer port;
 
     @JsonProperty("ui_host")
@@ -46,19 +47,10 @@ public class PrivilegedContainerDto {
     @NotNull
     private ImageDto image;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
     @ToString.Exclude
     private String username;
 
     @ToString.Exclude
     private String password;
 
-    private Long defaultTimestampFormatId;
-
-    private Long defaultDateFormatId;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java
index 271bae9b4d589c0b1fd03b2e0413ddacfcca20d4..7abc667741cc8ae31f3e0a7dd3e4ef66e8b78ccd 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseAccessDto.java
@@ -1,6 +1,7 @@
 
 package at.tuwien.api.database;
 
+import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.api.user.UserDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -33,14 +34,9 @@ public class DatabaseAccessDto {
     private Long hdbid;
 
     @NotNull
-    private UserDto user;
+    private UserBriefDto user;
 
     @NotNull
     private AccessTypeDto type;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java
index 49c7c58e8a1dfb00bd89dafca87afa74effbeea9..e8456c42ef8d0dc6a464a43be64c940faa46c792 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseBriefDto.java
@@ -1,5 +1,6 @@
 package at.tuwien.api.database;
 
+import at.tuwien.api.identifier.IdentifierBriefDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -42,18 +43,14 @@ public class DatabaseBriefDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
-    private List<IdentifierDto> identifiers;
+    private List<IdentifierBriefDto> identifiers;
 
     @ToString.Exclude
     @NotNull
     private UserBriefDto contact;
 
     @NotNull
-    private UserBriefDto owner;
-
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
+    @JsonProperty("owner_id")
+    private UserBriefDto ownerId;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java
index 264919dfaa0631f503bc50b5aecb1c966d6e0018..a20d9456bbd33addde563579ee03e9f7d17c6f73 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseCreateDto.java
@@ -30,4 +30,9 @@ public class DatabaseCreateDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
index d68e6802da3141d362eafed4c1e258eeeecdf3de..3343f23b68597b89d1fcd1af177191365ce20d1c 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseDto.java
@@ -1,9 +1,9 @@
 package at.tuwien.api.database;
 
-import at.tuwien.api.container.ContainerDto;
-import at.tuwien.api.database.table.TableDto;
-import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.container.ContainerBriefDto;
+import at.tuwien.api.database.table.TableBriefDto;
+import at.tuwien.api.identifier.IdentifierBriefDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -48,42 +48,39 @@ public class DatabaseDto {
     @Schema(example = "Air Quality")
     private String description;
 
-    private List<TableDto> tables;
+    private List<TableBriefDto> tables;
 
-    private List<ViewDto> views;
+    private List<ViewBriefDto> views;
 
     @NotNull
     @JsonProperty("is_public")
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
     @ToString.Exclude
     @NotNull
-    private ContainerDto container;
+    private ContainerBriefDto container;
 
     private List<DatabaseAccessDto> accesses;
 
-    private List<IdentifierDto> identifiers;
+    private List<IdentifierBriefDto> identifiers;
 
-    private List<IdentifierDto> subsets;
+    private List<IdentifierBriefDto> subsets;
 
     @ToString.Exclude
     @NotNull
-    private UserDto creator;
+    private UserBriefDto contact;
 
     @ToString.Exclude
     @NotNull
-    private UserDto contact;
-
-    @NotNull
-    private UserDto owner;
+    private UserBriefDto owner;
 
     @JsonProperty("preview_image")
     private String previewImage;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java
index 9fb05f6d09d3dbc17a38159c56adbf2ba6bf4ea3..f5a9aa0961a5e9bb99862354e723701ba1b5ba74 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/DatabaseModifyVisibilityDto.java
@@ -21,4 +21,9 @@ public class DatabaseModifyVisibilityDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java
index fbdbcc53801811c82f4e66aa30e30107e63f0cfc..7c4a9a72472e8b36cfe3964262c75c77ef916e10 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/LoadFileDto.java
@@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class LoadFileDto {
 
-    @NotBlank(message = "filepath is required")
+    @NotBlank
     @Schema(example = "sample.csv")
     private String filepath;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java
index ffb4ccb3de3964661744f8e4555f89178df5c2a3..e29bfbc109b13b9671b66e94d86d104e2fa2ad23 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewBriefDto.java
@@ -1,15 +1,12 @@
 package at.tuwien.api.database;
 
-import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
 import java.time.Instant;
@@ -40,12 +37,14 @@ public class ViewBriefDto {
     @Schema(example = "air_quality")
     private String internalName;
 
-    private IdentifierDto identifier;
-
     @JsonProperty("is_public")
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
     @JsonProperty("initial_view")
     @Schema(example = "true", description = "True if it is the default view for the database")
     private Boolean isInitialView;
@@ -59,20 +58,7 @@ public class ViewBriefDto {
     @Schema(example = "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916")
     private String queryHash;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
-    @JsonIgnore
-    private UUID createdBy;
-
-    @NotNull
-    private UserDto creator;
-
-    @JsonProperty("last_modified")
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
+    @JsonProperty("owned_by")
+    private UUID ownedBy;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java
index 583b5f0d81aab8f8af7ca71efcd743ac8a079b27..9fcb734f58e342c7bef4d28ab062b6752176eb9f 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewCreateDto.java
@@ -32,4 +32,9 @@ public class ViewCreateDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
index 30f16448d36462da23dc27ba38512f61dab58b25..294bd04bd4ef873ac08cab943d0726f6ba9efaeb 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewDto.java
@@ -1,20 +1,17 @@
 package at.tuwien.api.database;
 
 import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import lombok.extern.jackson.Jacksonized;
-
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import lombok.*;
+import lombok.extern.jackson.Jacksonized;
 
 import java.time.Instant;
 import java.util.List;
-import java.util.UUID;
 
 @Getter
 @Setter
@@ -51,6 +48,10 @@ public class ViewDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
     @JsonProperty("initial_view")
     @Schema(example = "true", description = "True if it is the default view for the database")
     private Boolean isInitialView;
@@ -65,22 +66,9 @@ public class ViewDto {
     private String queryHash;
 
     @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
-    @JsonIgnore
-    private UUID createdBy;
-
-    @NotNull
-    private UserDto creator;
+    private UserBriefDto owner;
 
     @NotNull
     private List<ViewColumnDto> columns;
 
-    @JsonProperty("last_modified")
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewUpdateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewUpdateDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..434ce0d9b695ba45d127bcc16725cc72e3bc83c2
--- /dev/null
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/ViewUpdateDto.java
@@ -0,0 +1,28 @@
+package at.tuwien.api.database;
+
+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;
+
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Jacksonized
+@ToString
+public class ViewUpdateDto {
+
+    @NotNull
+    @JsonProperty("is_public")
+    @Schema(example = "true")
+    private Boolean isPublic;
+
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
+}
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java
index 2ad2c1a968bf2b59ac6a9812d5b9dc09bf2ca53a..a9eaba6a8556d931c73f599bb1c9716ee8663c27 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedDatabaseDto.java
@@ -5,8 +5,7 @@ import at.tuwien.api.database.DatabaseAccessDto;
 import at.tuwien.api.database.ViewDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
-import com.fasterxml.jackson.annotation.JsonFormat;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
@@ -14,7 +13,6 @@ import jakarta.validation.constraints.NotNull;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
-import java.time.Instant;
 import java.util.List;
 
 @Getter
@@ -59,6 +57,12 @@ public class PrivilegedDatabaseDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
+    @ToString.Exclude
     @NotNull
     private PrivilegedContainerDto container;
 
@@ -66,18 +70,17 @@ public class PrivilegedDatabaseDto {
 
     private List<IdentifierDto> identifiers;
 
-    @NotNull
-    private UserDto creator;
+    private List<IdentifierDto> subsets;
 
+    @ToString.Exclude
     @NotNull
-    private UserDto contact;
+    private UserBriefDto contact;
 
+    @ToString.Exclude
     @NotNull
-    private UserDto owner;
+    private UserBriefDto owner;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
+    @JsonProperty("preview_image")
+    private String previewImage;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java
index 5053f8c5d6330834acf382435218353841be4c8b..135073d55646eb8aab92a2d4311b686527b2bc1e 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/internal/PrivilegedViewDto.java
@@ -1,23 +1,18 @@
 package at.tuwien.api.database.internal;
 
-import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.database.ViewColumnDto;
-import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
-import org.springframework.data.annotation.Id;
 
 import java.time.Instant;
 import java.util.List;
-import java.util.UUID;
 
 @Getter
 @Setter
@@ -28,7 +23,6 @@ import java.util.UUID;
 @ToString
 public class PrivilegedViewDto {
 
-    @Id
     @NotNull
     private Long id;
 
@@ -37,6 +31,7 @@ public class PrivilegedViewDto {
     private Long vdbid;
 
     @NotNull
+    @ToString.Exclude
     private PrivilegedDatabaseDto database;
 
     @NotBlank
@@ -54,6 +49,10 @@ public class PrivilegedViewDto {
     @Schema(example = "true")
     private Boolean isPublic;
 
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
     @JsonProperty("initial_view")
     @Schema(example = "true", description = "True if it is the default view for the database")
     private Boolean isInitialView;
@@ -68,22 +67,9 @@ public class PrivilegedViewDto {
     private String queryHash;
 
     @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
-    @JsonIgnore
-    private UUID createdBy;
+    private UserBriefDto owner;
 
     @NotNull
-    private UserDto creator;
-
-    @NotNull(message = "columns are required")
     private List<ViewColumnDto> columns;
 
-    @JsonProperty("last_modified")
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java
index afc6a6b640051597b35ad5927f42b0ee48f8b42c..fbc8bfebe0b58bfe48e976af1c2e00fcc159e12d 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExecuteStatementDto.java
@@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class ExecuteStatementDto {
 
-    @NotBlank(message = "statement is required")
+    @NotBlank
     @Schema(example = "SELECT `id` FROM `air_quality`")
     private String statement;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java
index b844947b836a0b2cee5771fc8ecdb022664a0b33..1b2b1e03865f982d79d1a226990d6bd45bd07d10 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ExportDto.java
@@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class ExportDto {
 
-    @NotBlank(message = "location is required")
+    @NotBlank
     @Schema(example = "/tmp/file.csv")
     private String location;
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java
index 1b31d9d6199c3f6ba2c24ae8a25c09dbd1cf0522..a50c2d1bdf3e0cce964669dfe6bf779581c2b2b5 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/ImportDto.java
@@ -17,7 +17,7 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class ImportDto {
 
-    @NotBlank(message = "location is required")
+    @NotBlank
     @Schema(example = "file.csv")
     private String location;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java
index 64a54bcb1a2fb7940c10ec996cff3a53db14900e..28f8b61a52cd63df6ad0a750cf9dad28ee04dba8 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryBriefDto.java
@@ -1,20 +1,17 @@
 package at.tuwien.api.database.query;
 
-import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.identifier.IdentifierBriefDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
 import java.time.Instant;
 import java.util.List;
-import java.util.UUID;
 
 
 @Getter
@@ -26,26 +23,22 @@ import java.util.UUID;
 @ToString
 public class QueryBriefDto {
 
-    @NotNull(message = "id is required")
+    @NotNull
     private Long id;
 
-    @NotNull(message = "database id is required")
+    @NotNull
     @JsonProperty("database_id")
     private Long databaseId;
 
-    @JsonIgnore
-    @NotNull(message = "created by is required")
-    private UUID createdBy;
-
-    @NotNull(message = "creator is required")
-    private UserDto creator;
+    @NotNull
+    private UserBriefDto owner;
 
     @NotNull
     @Schema(example = "2022-01-01 08:00:00.000")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "UTC")
     private Instant execution;
 
-    @NotBlank(message = "statement is required")
+    @NotBlank
     @Schema(example = "SELECT `id` FROM `air_quality`")
     private String query;
 
@@ -53,7 +46,7 @@ public class QueryBriefDto {
     @Schema(example = "SELECT `id` FROM `air_quality`")
     private String queryNormalized;
 
-    @NotBlank(message = "query hash is required")
+    @NotBlank
     @JsonProperty("query_hash")
     @Schema(example = "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76")
     private String queryHash;
@@ -74,17 +67,6 @@ public class QueryBriefDto {
     @Schema(example = "query")
     private QueryTypeDto type;
 
-    private List<IdentifierDto> identifiers;
-
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
-    @NotNull
-    @JsonProperty("last_modified")
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
+    private List<IdentifierBriefDto> identifiers;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java
index 8ba38220618c88065402f2bbc1664313311177b2..b26a8c3c4ef8dbd4144f373d8d5211f6f4b3ae5d 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/QueryDto.java
@@ -1,20 +1,17 @@
 package at.tuwien.api.database.query;
 
-import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.identifier.IdentifierBriefDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
 import java.time.Instant;
 import java.util.List;
-import java.util.UUID;
 
 @Getter
 @Setter
@@ -25,27 +22,22 @@ import java.util.UUID;
 @ToString
 public class QueryDto {
 
-    @NotNull(message = "id is required")
+    @NotNull
     private Long id;
 
-    @NotNull(message = "database id is required")
+    @NotNull
     @JsonProperty("database_id")
     private Long databaseId;
 
-    @JsonIgnore
-    @EqualsAndHashCode.Exclude
-    @NotNull(message = "created by is required")
-    private UUID createdBy;
-
-    @NotNull(message = "creator is required")
-    private UserDto creator;
+    @NotNull
+    private UserBriefDto owner;
 
     @NotNull
     @Schema(example = "2021-03-12T15:26:21Z")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant execution;
 
-    @NotBlank(message = "statement is required")
+    @NotBlank
     @Schema(example = "SELECT `id` FROM `air_quality`")
     private String query;
 
@@ -58,9 +50,9 @@ public class QueryDto {
     private QueryTypeDto type;
 
     @NotNull
-    private List<IdentifierDto> identifiers;
+    private List<IdentifierBriefDto> identifiers;
 
-    @NotBlank(message = "query hash is required")
+    @NotBlank
     @JsonProperty("query_hash")
     @Schema(example = "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76")
     private String queryHash;
@@ -78,15 +70,4 @@ public class QueryDto {
     @Schema(example = "1")
     private Long resultNumber;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonProperty("last_modified")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java
index 724d3da41ac0e71d52a009e1733e73c093413a55..19fd6ffbaf7827b60f63f1a08bd9103363a40e26 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/query/SaveStatementDto.java
@@ -15,7 +15,7 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class SaveStatementDto {
 
-    @NotBlank(message = "statement is required")
+    @NotBlank
     @Schema(example = "SELECT `id` FROM `air_quality`")
     private String statement;
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java
index 11f99f48eb7cf29d06a03b7ab8b8fb6930769672..615948486cd07626d9701b03df99852df4cebb9c 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableBriefDto.java
@@ -12,6 +12,7 @@ import jakarta.validation.constraints.NotNull;
 import lombok.extern.jackson.Jacksonized;
 
 import java.util.List;
+import java.util.UUID;
 
 @Getter
 @Setter
@@ -47,5 +48,16 @@ public class TableBriefDto {
     private Boolean isVersioned;
 
     @NotNull
-    private UserBriefDto owner;
+    @JsonProperty("is_public")
+    @Schema(example = "true")
+    private Boolean isPublic;
+
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
+    @NotNull
+    @JsonProperty("owned_by")
+    private UUID ownedBy;
 }
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 e2ef252708c4457165e126ea228b17aa00177c57..602eef4e5dcd6ad6155df627afdea411ce1bc73e 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
@@ -31,6 +31,16 @@ public class TableCreateDto {
     @Schema(example = "Air Quality in Austria")
     private String description;
 
+    @NotNull
+    @JsonProperty("is_public")
+    @Schema(example = "true")
+    private Boolean isPublic;
+
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
     @NotNull
     private List<ColumnCreateDto> columns;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
index a512cf8010195e5c107f35d8d2756251460bca62..2370f45429c10e01b5de09ea3a2a8dd278e2c729 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableDto.java
@@ -3,20 +3,18 @@ package at.tuwien.api.database.table;
 import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.api.database.table.constraints.ConstraintsDto;
 import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Size;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-
 import java.time.Instant;
 import java.util.List;
-import java.util.UUID;
 
 @Getter
 @Setter
@@ -57,14 +55,12 @@ public class TableDto {
     private Boolean isVersioned;
 
     @NotNull
-    @JsonProperty("created_by")
-    private UUID createdBy;
-
-    @NotNull
-    private UserDto creator;
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
 
     @NotNull
-    private UserDto owner;
+    private UserBriefDto owner;
 
     @NotBlank
     @JsonProperty("queue_name")
@@ -84,7 +80,7 @@ public class TableDto {
     @Schema(example = "Air Quality in Austria")
     private String description;
 
-    @NotNull(message = "isPublic is required")
+    @NotNull
     @JsonProperty("is_public")
     @Schema(example = "true")
     private Boolean isPublic;
@@ -105,11 +101,6 @@ public class TableDto {
     @Schema(example = "3276", description = "in bytes")
     private Long avgRowLength;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
     @NotNull
     private List<ColumnDto> columns;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java
index b127b0b1b8a8712ab3bf284ab1014bc7c2f10bae..87dfbd2eef6b121f27febf12357821ce6a585327 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableHistoryDto.java
@@ -18,15 +18,15 @@ import java.time.Instant;
 @ToString
 public class TableHistoryDto {
 
-    @NotNull(message = "event timestamp is required")
+    @NotNull
     @Schema(example = "2021-03-12T15:26:21Z")
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
     private Instant timestamp;
 
-    @NotNull(message = "event name is required")
+    @NotNull
     private String event;
 
-    @NotNull(message = "total number is required")
+    @NotNull
     @Schema(example = "1")
     private Long total;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableUpdateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableUpdateDto.java
new file mode 100644
index 0000000000000000000000000000000000000000..d8db27005306a871fc3b8c250fcda5737abd79ef
--- /dev/null
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TableUpdateDto.java
@@ -0,0 +1,32 @@
+package at.tuwien.api.database.table;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.*;
+import lombok.extern.jackson.Jacksonized;
+
+@Getter
+@Setter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Jacksonized
+@ToString
+public class TableUpdateDto {
+
+    @Size(max = 180)
+    @Schema(example = "Air Quality in Austria")
+    private String description;
+
+    @NotNull
+    @JsonProperty("is_public")
+    @Schema(example = "true")
+    private Boolean isPublic;
+
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+}
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java
index e3a0845c88a6b310a21094ab533281ded387b817..eb626b0eaf806fab422ffb2c91f0cd38ac8e486c 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleDeleteDto.java
@@ -16,7 +16,7 @@ import java.util.Map;
 @ToString
 public class TupleDeleteDto {
 
-    @NotNull(message = "primary key columns are required")
+    @NotNull
     private Map<String, Object> keys;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java
index 2378318ae534ab75a30811cd27cde6da8927dd3b..fee00469b127f71361fbfd88013c915038023fae 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/TupleUpdateDto.java
@@ -16,10 +16,10 @@ import java.util.Map;
 @ToString
 public class TupleUpdateDto {
 
-    @NotNull(message = "data is required")
+    @NotNull
     private Map<String, Object> data;
 
-    @NotNull(message = "primary key columns are required")
+    @NotNull
     private Map<String, Object> keys;
 
 }
\ No newline at end of file
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java
index e811991912c8188ae0506d8bc344eb53f208e90d..938315457433287d353a1e5722719d53a776098c 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/ColumnBriefDto.java
@@ -17,22 +17,22 @@ import lombok.extern.jackson.Jacksonized;
 @ToString
 public class ColumnBriefDto {
 
-    @NotNull(message = "id is required")
+    @NotNull
     private Long id;
 
     @JsonProperty("database_id")
-    @NotNull(message = "database id is required")
+    @NotNull
     private Long databaseId;
 
     @JsonProperty("table_id")
-    @NotNull(message = "table id is required")
+    @NotNull
     private Long tableId;
 
-    @NotBlank(message = "name is required")
+    @NotBlank
     @Schema(example = "date")
     private String name;
 
-    @NotBlank(message = "internal name is required")
+    @NotBlank
     @JsonProperty("internal_name")
     @Schema(example = "mdb_date")
     private String internalName;
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java
index dc9c62f00a27a4fd6d86c5f6a32c84a759d7d628..df171a5ee45c2dd81af2454d9c6a564ed333cfca 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/ConceptDto.java
@@ -32,11 +32,6 @@ public class ConceptDto {
 
     private String description;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
     @NotNull
     private List<ColumnBriefDto> columns;
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java
index 89c64b2c03895b8662dfc174d215434a17f651bc..bd2975c0cc53162fab217c49f8a4a0001f6b047d 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/columns/concepts/UnitDto.java
@@ -32,11 +32,6 @@ public class UnitDto {
 
     private String description;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
     @NotNull
     private List<ColumnBriefDto> columns;
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java
index e166e4e0b2c9e5922ca49aa3769081a9b50629b1..fcc95fdc0c63d58803d3fe6ca2136dbd6322f8f1 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/database/table/internal/PrivilegedTableDto.java
@@ -4,18 +4,18 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.api.database.table.constraints.ConstraintsDto;
 import at.tuwien.api.identifier.IdentifierDto;
-import at.tuwien.api.user.UserDto;
+import at.tuwien.api.user.UserBriefDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
 import java.time.Instant;
 import java.util.List;
-import java.util.UUID;
 
 @Getter
 @Setter
@@ -24,6 +24,7 @@ import java.util.UUID;
 @AllArgsConstructor
 @Jacksonized
 @ToString
+@EqualsAndHashCode(onlyExplicitlyIncluded = true)
 public class PrivilegedTableDto {
 
     @NotNull
@@ -31,6 +32,7 @@ public class PrivilegedTableDto {
 
     @NotNull
     @JsonProperty("database_id")
+    @EqualsAndHashCode.Include
     private Long tdbid;
 
     @NotBlank
@@ -40,6 +42,7 @@ public class PrivilegedTableDto {
     @NotBlank
     @JsonProperty("internal_name")
     @Schema(example = "air_quality")
+    @EqualsAndHashCode.Include
     private String internalName;
 
     @Schema
@@ -53,14 +56,12 @@ public class PrivilegedTableDto {
     private Boolean isVersioned;
 
     @NotNull
-    @JsonProperty("created_by")
-    private UUID createdBy;
-
-    @NotNull
-    private UserDto creator;
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
 
     @NotNull
-    private UserDto owner;
+    private UserBriefDto owner;
 
     @NotBlank
     @JsonProperty("queue_name")
@@ -73,13 +74,14 @@ public class PrivilegedTableDto {
 
     @NotBlank
     @JsonProperty("routing_key")
-    @Schema(example = "dbrepo.database.air_quality")
+    @Schema(example = "dbrepo.1.2")
     private String routingKey;
 
+    @Size(max = 2048)
     @Schema(example = "Air Quality in Austria")
     private String description;
 
-    @NotNull(message = "isPublic is required")
+    @NotNull
     @JsonProperty("is_public")
     @Schema(example = "true")
     private Boolean isPublic;
@@ -100,11 +102,6 @@ public class PrivilegedTableDto {
     @Schema(example = "3276", description = "in bytes")
     private Long avgRowLength;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
     @NotNull
     private List<ColumnDto> 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 0db45a9f1b5690c4cb1d4e3a988b4c76824713e1..777a870bb9650f0e06b732f0a5776a6768902945 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,6 +2,7 @@ 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;
@@ -29,6 +30,16 @@ public class TableCreateDto {
     @Schema(example = "Air Quality in Austria")
     private String description;
 
+    @NotNull
+    @JsonProperty("is_public")
+    @Schema(example = "true")
+    private Boolean isPublic;
+
+    @NotNull
+    @JsonProperty("is_schema_public")
+    @Schema(example = "true")
+    private Boolean isSchemaPublic;
+
     @NotNull
     private List<ColumnCreateDto> columns;
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java
index 686c86e5c65ca7356160e4cee5ff890cc6a1bf78..0a36c561a30a480f14251e1ddab396b8a3fcc9ae 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierBriefDto.java
@@ -3,11 +3,13 @@ package at.tuwien.api.identifier;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
 
 import java.time.Instant;
+import java.util.List;
 import java.util.UUID;
 
 @Getter
@@ -27,21 +29,40 @@ public class IdentifierBriefDto {
     @Schema(example = "1")
     private Long databaseId;
 
-    private IdentifierStatusTypeDto status;
+    @JsonProperty("query_id")
+    @Schema(example = "1")
+    private Long queryId;
+
+    @JsonProperty("table_id")
+    @Schema(example = "1")
+    private Long tableId;
+
+    @JsonProperty("view_id")
+    @Schema(example = "1")
+    private Long viewId;
 
     @NotNull
-    @JsonProperty("created_by")
-    private UUID createdBy;
+    private IdentifierTypeDto type;
 
     @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
+    private List<IdentifierTitleDto> titles;
+
+    @Schema(example = "10.1038/nphys1170")
+    private String doi;
+
+    @NotBlank
+    @Schema(example = "TU Wien")
+    private String publisher;
+
+    @NotNull
+    @JsonProperty("publication_year")
+    @Schema(example = "2022")
+    private Integer publicationYear;
+
+    private IdentifierStatusTypeDto status;
 
     @NotNull
-    @JsonProperty("last_modified")
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
+    @JsonProperty("created_by")
+    private UUID createdBy;
 
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java
index 156111771606f756ad997d71659a19a4da9f731e..bff087c5905b817df53f5b338d2cee0284dfa95e 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/IdentifierDto.java
@@ -4,14 +4,12 @@ import at.tuwien.api.database.LanguageTypeDto;
 import at.tuwien.api.database.LicenseDto;
 import at.tuwien.api.user.UserDto;
 import com.fasterxml.jackson.annotation.JsonFormat;
-import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import lombok.*;
 import lombok.extern.jackson.Jacksonized;
-import org.springframework.data.annotation.Id;
 
 import java.time.Instant;
 import java.util.List;
@@ -94,7 +92,7 @@ public class IdentifierDto {
     private String publisher;
 
     @NotNull
-    private UserDto creator;
+    private UserDto owner;
 
     @JsonProperty("publication_day")
     @Schema(example = "15")
@@ -122,15 +120,4 @@ public class IdentifierDto {
     @JsonProperty("created_by")
     private UUID createdBy;
 
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
-    @NotNull
-    @JsonProperty("last_modified")
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant lastModified;
-
 }
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java
index 0306da3a7c390e0cb02fe77ff9875b6659365379..271333c49dcce9d0be8a16605c6dd89ad11f837e 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/identifier/RelatedIdentifierDto.java
@@ -37,11 +37,6 @@ public class RelatedIdentifierDto {
     @Schema(example = "Cites")
     private RelationTypeDto relation;
 
-    @ToString.Exclude
-    @JsonIgnore
-    @NotNull
-    private UserDto creator;
-
 }
 
 
diff --git a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java
index c5972276838a99410b941e352d83b98e874ea5ae..09099331ec7cb5a37fd2b3ce8604f59b97005d7b 100644
--- a/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java
+++ b/dbrepo-metadata-service/api/src/main/java/at/tuwien/api/semantics/OntologyDto.java
@@ -51,11 +51,4 @@ public class OntologyDto {
     @Schema(example = "rdf/om-2.0.rdf")
     private String rdfPath;
 
-    private UserBriefDto creator;
-
-    @NotNull
-    @Schema(example = "2021-03-12T15:26:21Z")
-    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
-    private Instant created;
-
 }
diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml
index c308f0163b8da4f65b01efcfbedce90d7a0fb9c1..6a8f527f188040713c0f259fb9ade60e7ef5b4dd 100644
--- a/dbrepo-metadata-service/entities/pom.xml
+++ b/dbrepo-metadata-service/entities/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-metadata-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-entities</artifactId>
     <name>dbrepo-metadata-service-entity</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies/>
 
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 17b8308bbaac7e202557208875e566240d928d32..41808a14535ff310233cc77627376cc6684365bc 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
@@ -50,17 +50,6 @@ public class Database implements Serializable {
     @Column(updatable = false, nullable = false)
     private Long id;
 
-    @ToString.Exclude
-    @JdbcTypeCode(java.sql.Types.VARCHAR)
-    @Column(name = "created_by", columnDefinition = "VARCHAR(36)")
-    private UUID createdBy;
-
-    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
-    @JoinColumns({
-            @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false)
-    })
-    private User creator;
-
     @ToString.Exclude
     @JdbcTypeCode(java.sql.Types.VARCHAR)
     @Column(name = "owned_by", columnDefinition = "VARCHAR(36)")
@@ -130,9 +119,12 @@ public class Database implements Serializable {
     @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true)
     private List<DatabaseAccess> accesses;
 
-    @Column(nullable = false)
+    @Column(nullable = false, columnDefinition = "boolean default true")
     private Boolean isPublic;
 
+    @Column(nullable = false, columnDefinition = "boolean default true")
+    private Boolean isSchemaPublic;
+
     @Lob
     @Basic(fetch = FetchType.LAZY)
     @Column(columnDefinition = "LONGBLOB")
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
index 28f2ec69c28e84dffcb7c08f9f28941c4dcced54..2421612358cf37f8ce600c494dc3eca30afe0762 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/database/View.java
@@ -29,9 +29,9 @@ import java.util.UUID;
 @Table(name = "mdb_view")
 @NamedQueries({
         @NamedQuery(name = "View.findAllPublicByDatabaseId", query = "select v from View v where v.database.id = ?1 and v.isPublic = true"),
-        @NamedQuery(name = "View.findAllPublicOrMineByDatabaseId", query = "select v from View v where v.database.id = ?1 and (v.isPublic = true or v.createdBy = ?2)"),
+        @NamedQuery(name = "View.findAllPublicOrMineByDatabaseId", query = "select v from View v where v.database.id = ?1 and (v.isPublic = true or v.ownedBy = ?2)"),
         @NamedQuery(name = "View.findPublicByDatabaseIdAndId", query = "select v from View v where v.database.id = ?1 and v.id = ?2 and v.isPublic = true"),
-        @NamedQuery(name = "View.findPublicOrMineByDatabaseIdAndId", query = "select v from View v where v.database.id = ?1 and v.id = ?2 and (v.isPublic = true or v.createdBy = ?3)")
+        @NamedQuery(name = "View.findPublicOrMineByDatabaseIdAndId", query = "select v from View v where v.database.id = ?1 and v.id = ?2 and (v.isPublic = true or v.ownedBy = ?3)")
 })
 public class View {
 
@@ -48,14 +48,14 @@ public class View {
 
     @ToString.Exclude
     @JdbcTypeCode(java.sql.Types.VARCHAR)
-    @Column(name = "created_by", columnDefinition = "VARCHAR(36)")
-    private UUID createdBy;
+    @Column(name = "owned_by", columnDefinition = "VARCHAR(36)")
+    private UUID ownedBy;
 
     @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
     @JoinColumns({
-            @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false)
+            @JoinColumn(name = "owned_by", referencedColumnName = "ID", insertable = false, updatable = false)
     })
-    private User creator;
+    private User owner;
 
     @Column(name = "vname", nullable = false, columnDefinition = "VARCHAR(64)")
     private String name;
@@ -63,9 +63,12 @@ public class View {
     @Column(nullable = false, columnDefinition = "VARCHAR(64)")
     private String internalName;
 
-    @Column(name = "public", nullable = false)
+    @Column(name = "public", nullable = false, columnDefinition = "boolean default true")
     private Boolean isPublic;
 
+    @Column(name = "is_schema_public", nullable = false, columnDefinition = "boolean default true")
+    private Boolean isSchemaPublic;
+
     @Column(name = "initialview", nullable = false)
     private Boolean isInitialView;
 
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 08f6bd9426a8906d4edc4863ecc6f3540cb39448..2fe81e2e37df1e23822ae8a4216a332411d221fe 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
@@ -1,13 +1,14 @@
 package at.tuwien.entities.database.table;
 
-import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.entities.database.Database;
+import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.entities.database.table.constraints.Constraints;
 import at.tuwien.entities.identifier.Identifier;
 import at.tuwien.entities.user.User;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.persistence.CascadeType;
 import jakarta.persistence.OrderBy;
+import jakarta.persistence.*;
 import lombok.*;
 import lombok.extern.log4j.Log4j2;
 import org.hibernate.annotations.*;
@@ -15,8 +16,6 @@ import org.springframework.data.annotation.CreatedDate;
 import org.springframework.data.annotation.LastModifiedDate;
 import org.springframework.data.jpa.domain.support.AuditingEntityListener;
 
-import jakarta.persistence.*;
-
 import java.time.Instant;
 import java.util.List;
 import java.util.UUID;
@@ -45,18 +44,6 @@ public class Table {
     @Column(updatable = false, nullable = false)
     private Long tdbid;
 
-    @JdbcTypeCode(java.sql.Types.VARCHAR)
-    @Column(name = "created_by", columnDefinition = "VARCHAR(36)")
-    private UUID createdBy;
-
-    @ToString.Exclude
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumns({
-            @JoinColumn(name = "created_by", referencedColumnName = "ID", insertable = false, updatable = false)
-    })
-    private User creator;
-
-
     @JdbcTypeCode(java.sql.Types.VARCHAR)
     @Column(name = "owned_by", columnDefinition = "VARCHAR(36)")
     private UUID ownedBy;
@@ -103,9 +90,15 @@ public class Table {
     @Embedded
     private Constraints constraints;
 
-    @Column(name = "versioned", columnDefinition = "boolean default true")
+    @Column(name = "versioned", nullable = false, columnDefinition = "boolean default true")
     private Boolean isVersioned;
 
+    @Column(name = "is_public", nullable = false, columnDefinition = "boolean default true")
+    private Boolean isPublic;
+
+    @Column(name = "is_schema_public", nullable = false, columnDefinition = "boolean default true")
+    private Boolean isSchemaPublic;
+
     @Column(name = "num_rows")
     private Long numRows;
 
diff --git a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
index abf76758cc49fefe717f6546198559fa2b0e17af..7e4252a44504746f8c3d4c409f4242e3a523d9f1 100644
--- a/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
+++ b/dbrepo-metadata-service/entities/src/main/java/at/tuwien/entities/identifier/Identifier.java
@@ -155,9 +155,9 @@ public class Identifier implements Serializable {
     @Column
     private String doi;
 
-    @Column(nullable = false)
+    @Column(name = "owned_by", nullable = false)
     @JdbcTypeCode(java.sql.Types.VARCHAR)
-    private UUID createdBy;
+    private UUID ownedBy;
 
     /**
      * Users are never created/updated/deleted by the Identifier entity.
@@ -165,9 +165,9 @@ public class Identifier implements Serializable {
     @ToString.Exclude
     @ManyToOne(fetch = FetchType.LAZY)
     @JoinColumns({
-            @JoinColumn(name = "createdBy", referencedColumnName = "ID", insertable = false, updatable = false)
+            @JoinColumn(name = "owned_by", referencedColumnName = "ID", insertable = false, updatable = false)
     })
-    private User creator;
+    private User owner;
 
     @CreatedDate
     @Column(nullable = false, updatable = false, columnDefinition = "TIMESTAMP default NOW()")
diff --git a/dbrepo-metadata-service/metrics.md b/dbrepo-metadata-service/metrics.md
index 440f20b8e05ea12053ab275bb019a8cd444b1180..56a69c68f6913ab2e3ea192cde66f329ea336e10 100644
--- a/dbrepo-metadata-service/metrics.md
+++ b/dbrepo-metadata-service/metrics.md
@@ -51,6 +51,7 @@
 | `dbrepo_statistic_table_update`    | Update statistics             |
 | `dbrepo_table_create`              | Create table                  |
 | `dbrepo_table_delete`              | Delete table                  |
+| `dbrepo_table_update`              | Update table                  |
 | `dbrepo_tables_find`               | Find table                    |
 | `dbrepo_tables_findall`            | List tables                   |
 | `dbrepo_tables_refresh`            | Update database table schemas |
@@ -64,5 +65,6 @@
 | `dbrepo_view_create`               | Create view                   |
 | `dbrepo_view_delete`               | Delete view                   |
 | `dbrepo_view_find`                 | Get view                      |
+| `dbrepo_view_update`               | Update view                   |
 | `dbrepo_views_findall`             | List views                    |
 | `dbrepo_views_refresh`             | Update database view schemas  |
diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml
index fddf87ecb4127be0539b63697cba01d0ffa59d61..32925ee9ff1c042a0edb5a22ebb1929f9ff63390 100644
--- a/dbrepo-metadata-service/oai/pom.xml
+++ b/dbrepo-metadata-service/oai/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-metadata-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-oai</artifactId>
     <name>dbrepo-metadata-service-oai</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies/>
 
diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml
index 56ab43349a657baf2cdc5b8bd84f7d1fc19e72f2..138d346aeedf77ed2ae7c991a209e76ba11ae443 100644
--- a/dbrepo-metadata-service/pom.xml
+++ b/dbrepo-metadata-service/pom.xml
@@ -11,7 +11,7 @@
     <groupId>at.tuwien</groupId>
     <artifactId>dbrepo-metadata-service</artifactId>
     <name>dbrepo-metadata-service</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <description>Service that manages the metadata</description>
 
diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml
index 95ea8b8b975a11e5851dbde6e60de8e01a8f20f5..f71cbfeb96f6307986b2ee87a5f9ba99f8cfd001 100644
--- a/dbrepo-metadata-service/report/pom.xml
+++ b/dbrepo-metadata-service/report/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <artifactId>dbrepo-metadata-service</artifactId>
         <groupId>at.tuwien</groupId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-report</artifactId>
     <name>dbrepo-metadata-service-report</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml
index 816f71a1cb2390a56ecf35eb3682ed29e34d0372..480ba479be0f98ca6d7748a25545625cce000ecd 100644
--- a/dbrepo-metadata-service/repositories/pom.xml
+++ b/dbrepo-metadata-service/repositories/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <artifactId>dbrepo-metadata-service</artifactId>
         <groupId>at.tuwien</groupId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-repositories</artifactId>
     <name>dbrepo-metadata-service-repositories</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
index 82e09d1c0f2f5867a2064a67853691a5bb034778..98c77c7b0d64d8ced9436ae67cda9fca73bf07b1 100644
--- a/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
+++ b/dbrepo-metadata-service/repositories/src/main/java/at/tuwien/mapper/MetadataMapper.java
@@ -10,6 +10,7 @@ import at.tuwien.api.container.image.ImageCreateDto;
 import at.tuwien.api.container.image.ImageDto;
 import at.tuwien.api.crossref.CrossrefDto;
 import at.tuwien.api.database.*;
+import at.tuwien.api.database.internal.PrivilegedDatabaseDto;
 import at.tuwien.api.database.table.TableBriefDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
@@ -117,7 +118,9 @@ public interface MetadataMapper {
             @Mapping(target = "id", source = "id"),
             @Mapping(target = "count", expression = "java(data.getDatabases().size())"),
     })
-    ContainerBriefDto containerToDatabaseContainerBriefDto(Container data);
+    ContainerBriefDto containerToContainerBriefDto(Container data);
+
+    PrivilegedDatabaseDto databaseToPrivilegedDatabaseDto(Database data);
 
     @Mappings({
             @Mapping(target = "titles", source = "."),
@@ -298,6 +301,9 @@ public interface MetadataMapper {
     })
     IdentifierDto identifierToIdentifierDto(Identifier data);
 
+    @Mappings({
+            @Mapping(target = "databaseId", source = "database.id")
+    })
     IdentifierBriefDto identifierToIdentifierBriefDto(Identifier data);
 
     default IdentifierTitle identifierToIdentifierTitle(Identifier data, String lang) {
@@ -477,12 +483,11 @@ public interface MetadataMapper {
 
     @Mappings({
             @Mapping(target = "databaseId", source = "tdbid"),
+            @Mapping(target = "isPublic", source = "database.isPublic"),
     })
     TableBriefDto tableToTableBriefDto(Table data);
 
     default UniqueDto uniqueToUniqueDto(Unique data) {
-//        data.getTable().setOwner(null); /* loop */
-//        data.getTable().setCreator(null); /* loop */
         return UniqueDto.builder()
                 .id(data.getId())
                 .name(data.getName())
@@ -494,10 +499,6 @@ public interface MetadataMapper {
                 .build();
     }
 
-    @Mappings({
-            @Mapping(target = "table.owner", ignore = true),
-            @Mapping(target = "referencedTable.owner", ignore = true),
-    })
     ForeignKeyDto foreignKeyToForeignKeyDto(ForeignKey data);
 
     ForeignKeyBriefDto foreignKeyDtoToForeignKeyBriefDto(ForeignKeyDto data);
@@ -524,73 +525,82 @@ public interface MetadataMapper {
     }
 
     default TableDto customTableToTableDto(Table data) {
+        return customTableToTableDto(data, true, true, true);
+    }
+
+    default TableDto customTableToTableDto(Table data, Boolean broker, Boolean statistic, Boolean schema) {
         final TableDto table = TableDto.builder()
                 .id(data.getId())
                 .name(data.getName())
                 .internalName(data.getInternalName())
-                .owner(userToUserDto(data.getOwner()))
-                .createdBy(data.getCreatedBy())
-                .creator(userToUserDto(data.getCreator()))
+                .owner(userToUserBriefDto(data.getOwner()))
                 .tdbid(data.getTdbid())
-                .routingKey("dbrepo." + data.getTdbid() + "." + data.getId())
-                .queueName(data.getQueueName())
                 .isPublic(data.getDatabase().getIsPublic())
+                .isSchemaPublic(data.getIsSchemaPublic())
                 .isVersioned(true)
-                .avgRowLength(data.getAvgRowLength())
-                .maxDataLength(data.getMaxDataLength())
-                .dataLength(data.getDataLength())
-                .numRows(data.getNumRows())
                 .description(data.getDescription())
                 .identifiers(new LinkedList<>())
                 .columns(new LinkedList<>())
-                .created(data.getCreated())
                 .constraints(constraintsToConstraintsDto(data.getConstraints()))
                 .build();
-        table.getConstraints()
-                .getPrimaryKey()
-                .forEach(pk -> {
-                    pk.getTable().setDatabaseId(data.getDatabase().getId());
-                    pk.getColumn().setTableId(data.getId());
-                    pk.getColumn().setDatabaseId(data.getDatabase().getId());
-                });
-        table.getConstraints()
-                .getForeignKeys()
-                .forEach(fk -> {
-                    fk.getTable().setDatabaseId(table.getTdbid());
-                    fk.getReferencedTable().setDatabaseId(table.getTdbid());
-                    fk.getReferences()
-                            .forEach(ref -> {
-                                ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk));
-                                ref.getColumn().setTableId(table.getId());
-                                ref.getColumn().setDatabaseId(table.getTdbid());
-                                ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId());
-                                ref.getReferencedColumn().setDatabaseId(table.getTdbid());
-                            });
-                });
-        table.getConstraints()
-                .getUniques()
-                .forEach(uk -> {
-                    uk.getTable().setDatabaseId(data.getDatabase().getId());
-                    uk.getColumns()
-                            .forEach(column -> {
-                                column.setTableId(data.getId());
-                                column.setDatabaseId(data.getDatabase().getId());
-                            });
-                });
-        if (data.getConstraints().getChecks() == null || data.getConstraints().getChecks().isEmpty()) {
-            table.getConstraints().setChecks(new LinkedHashSet<>());
-        }
         if (data.getIdentifiers() != null) {
             table.setIdentifiers(new LinkedList<>(data.getIdentifiers()
                     .stream()
                     .map(this::identifierToIdentifierDto)
                     .toList()));
         }
-        if (data.getColumns() != null) {
-            table.setColumns(new LinkedList<>(data.getColumns()
-                    .stream()
-                    .map(this::tableColumnToColumnDto)
-                    .toList()));
+        if (broker) {
+            table.setQueueName(data.getQueueName());
+            table.setQueueType("quorum");
+            table.setRoutingKey("dbrepo." + data.getTdbid() + "." + data.getId());
+        }
+        if (statistic) {
+            table.setAvgRowLength(data.getAvgRowLength());
+            table.setMaxDataLength(data.getMaxDataLength());
+            table.setDataLength(data.getDataLength());
+            table.setNumRows(data.getNumRows());
+        }
+        if (schema) {
+            table.getConstraints()
+                    .getPrimaryKey()
+                    .forEach(pk -> {
+                        pk.getTable().setDatabaseId(data.getDatabase().getId());
+                        pk.getColumn().setTableId(data.getId());
+                        pk.getColumn().setDatabaseId(data.getDatabase().getId());
+                    });
+            table.getConstraints()
+                    .getForeignKeys()
+                    .forEach(fk -> {
+                        fk.getTable().setDatabaseId(table.getTdbid());
+                        fk.getReferencedTable().setDatabaseId(table.getTdbid());
+                        fk.getReferences()
+                                .forEach(ref -> {
+                                    ref.setForeignKey(foreignKeyDtoToForeignKeyBriefDto(fk));
+                                    ref.getColumn().setTableId(table.getId());
+                                    ref.getColumn().setDatabaseId(table.getTdbid());
+                                    ref.getReferencedColumn().setTableId(fk.getReferencedTable().getId());
+                                    ref.getReferencedColumn().setDatabaseId(table.getTdbid());
+                                });
+                    });
+            table.getConstraints()
+                    .getUniques()
+                    .forEach(uk -> {
+                        uk.getTable().setDatabaseId(data.getDatabase().getId());
+                        uk.getColumns()
+                                .forEach(column -> {
+                                    column.setTableId(data.getId());
+                                    column.setDatabaseId(data.getDatabase().getId());
+                                });
+                    });
+            if (data.getConstraints().getChecks() == null || data.getConstraints().getChecks().isEmpty()) {
+                table.getConstraints().setChecks(new LinkedHashSet<>());
+            }
+            if (data.getColumns() != null) {
+                table.setColumns(new LinkedList<>(data.getColumns()
+                        .stream()
+                        .map(this::tableColumnToColumnDto)
+                        .toList()));
+            }
         }
         return table;
     }
@@ -615,9 +625,6 @@ public interface MetadataMapper {
     })
     Table tableDtoToTable(TableDto data);
 
-    @Mappings({
-            @Mapping(target = "table.owner", ignore = true)
-    })
     PrimaryKeyDto primaryKeyToPrimaryKeyDto(PrimaryKey data);
 
     ReferenceType referenceTypeDtoToReferenceType(ReferenceTypeDto data);
@@ -831,9 +838,6 @@ public interface MetadataMapper {
 
     ViewBriefDto viewToViewBriefDto(View data);
 
-    @Mappings({
-            @Mapping(target = "createdBy", source = "creator.id"),
-    })
     View viewDtoToView(ViewDto data);
 
     /* keep */
@@ -855,7 +859,18 @@ public interface MetadataMapper {
 
     LanguageType languageTypeDtoToLanguageType(LanguageTypeDto data);
 
-    default DatabaseDto customDatabaseToDatabaseDto(Database data) {
+    default Boolean onlyIsPublicOrOwner(Boolean isPublic, User caller, User owner, User databaseOwner) {
+        if (isPublic) {
+            return true;
+        }
+        /* private schema */
+        if (caller == null) {
+            return false;
+        }
+        return owner.equals(caller) || databaseOwner.equals(caller);
+    }
+
+    default DatabaseDto customDatabaseToDatabaseDto(Database data, User caller) {
         if (data == null) {
             return null;
         }
@@ -867,11 +882,10 @@ public interface MetadataMapper {
                 .exchangeName(data.getExchangeName())
                 .previewImage(data.getImage() != null ? "/api/database/" + data.getId() + "/image" : null)
                 .isPublic(data.getIsPublic())
-                .container(containerToContainerDto(data.getContainer()))
-                .creator(userToUserDto(data.getCreator()))
-                .owner(userToUserDto(data.getOwner()))
-                .created(data.getCreated())
-                .contact(userToUserDto(data.getContact()))
+                .isSchemaPublic(data.getIsSchemaPublic())
+                .container(containerToContainerBriefDto(data.getContainer()))
+                .owner(userToUserBriefDto(data.getOwner()))
+                .contact(userToUserBriefDto(data.getContact()))
                 .subsets(new LinkedList<>())
                 .accesses(new LinkedList<>())
                 .tables(new LinkedList<>())
@@ -880,19 +894,21 @@ public interface MetadataMapper {
         if (data.getSubsets() != null) {
             database.setSubsets(new LinkedList<>(data.getSubsets()
                     .stream()
-                    .map(this::identifierToIdentifierDto)
+                    .map(this::identifierToIdentifierBriefDto)
                     .toList()));
         }
         if (data.getTables() != null) {
             database.setTables(new LinkedList<>(data.getTables()
                     .stream()
-                    .map(this::customTableToTableDto)
+                    .filter(t -> onlyIsPublicOrOwner(t.getIsSchemaPublic() || t.getIsPublic(), caller, t.getOwner(), t.getDatabase().getOwner()))
+                    .map(this::tableToTableBriefDto)
                     .toList()));
         }
         if (data.getViews() != null) {
             database.setViews(new LinkedList<>(data.getViews()
                     .stream()
-                    .map(this::viewToViewDto)
+                    .filter(v -> onlyIsPublicOrOwner(v.getIsSchemaPublic() || v.getIsPublic(), caller, v.getOwner(), v.getDatabase().getOwner()))
+                    .map(this::viewToViewBriefDto)
                     .toList()));
         }
         if (data.getAccesses() != null) {
@@ -904,15 +920,12 @@ public interface MetadataMapper {
         if (data.getIdentifiers() != null) {
             database.setIdentifiers(new LinkedList<>(data.getIdentifiers()
                     .stream()
-                    .map(this::identifierToIdentifierDto)
+                    .map(this::identifierToIdentifierBriefDto)
                     .toList()));
         }
         return database;
     }
 
-    @Mappings({
-            @Mapping(target = "created", source = "created", dateFormat = "dd-MM-yyyy HH:mm"),
-    })
     DatabaseBriefDto databaseToDatabaseBriefDto(Database data);
 
     AccessType accessTypeDtoToAccessType(AccessTypeDto data);
diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml
index 613d4c4d4a6bd2db151b037fc8933013a370e9bd..67b149976cd1bb218d2e995b89e6c3d8e81ced3a 100644
--- a/dbrepo-metadata-service/rest-service/pom.xml
+++ b/dbrepo-metadata-service/rest-service/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <artifactId>dbrepo-metadata-service</artifactId>
         <groupId>at.tuwien</groupId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-rest-service</artifactId>
     <name>dbrepo-metadata-service-rest</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
index 62319662e24b78f9e456d1d0cabd8fd79639c85f..7995b79bf62117f2f360375af08eb93e1d80eee5 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ContainerEndpoint.java
@@ -67,7 +67,7 @@ public class ContainerEndpoint {
         log.debug("endpoint find all containers, limit={}", limit);
         final List<ContainerBriefDto> dtos = containerService.getAll(limit)
                 .stream()
-                .map(metadataMapper::containerToDatabaseContainerBriefDto)
+                .map(metadataMapper::containerToContainerBriefDto)
                 .collect(Collectors.toList());
         log.debug("find all containers resulted in {} container(s)", dtos.size());
         return ResponseEntity.ok()
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
index 2eeb947c5586bbcfedceebed30918c3ea7212bd8..f0e2aaeaa1c046aa582d6ea97931fa5c706dcf2d 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/DatabaseEndpoint.java
@@ -3,7 +3,6 @@ package at.tuwien.endpoints;
 import at.tuwien.api.database.*;
 import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.entities.container.Container;
-import at.tuwien.entities.container.image.DataType;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.DatabaseAccess;
 import at.tuwien.entities.user.User;
@@ -155,13 +154,14 @@ public class DatabaseEndpoint {
             SearchServiceException, SearchServiceConnectionException, ContainerQuotaException {
         log.debug("endpoint create database, data.name={}", data.getName());
         final Container container = containerService.find(data.getCid());
+        final User caller = userService.findByUsername(principal.getName());
         if (container.getDatabases().size() + 1 > container.getQuota()) {
             log.error("Failed to create database: quota of {} exceeded", container.getQuota());
             throw new ContainerQuotaException("Failed to create database: quota of " + container.getQuota() + " exceeded");
         }
         final User user = userService.findByUsername(principal.getName());
         final Database database = databaseService.create(container, data, user);
-        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database);
+        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller);
         return ResponseEntity.status(HttpStatus.CREATED)
                 .body(dto);
     }
@@ -207,16 +207,17 @@ public class DatabaseEndpoint {
     })
     public ResponseEntity<DatabaseDto> refreshTableMetadata(@NotNull @PathVariable("databaseId") Long databaseId,
                                                             @NotNull Principal principal) throws DataServiceException,
-            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException,
+            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException,
             SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, MalformedException,
             TableNotFoundException {
         log.debug("endpoint refresh database metadata, databaseId={}", databaseId);
-        Database database = databaseService.findById(databaseId);
+        final Database database = databaseService.findById(databaseId);
+        final User caller = userService.findByUsername(principal.getName());
         if (!database.getOwner().equals(principal)) {
             log.error("Failed to refresh database tables metadata: not owner");
             throw new NotAllowedException("Failed to refresh tables metadata: not owner");
         }
-        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateTableMetadata(database));
+        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateTableMetadata(database), caller);
         return ResponseEntity.ok(dto);
     }
 
@@ -256,15 +257,16 @@ public class DatabaseEndpoint {
     })
     public ResponseEntity<DatabaseDto> refreshViewMetadata(@NotNull @PathVariable("databaseId") Long databaseId,
                                                            @NotNull Principal principal) throws DataServiceException,
-            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException,
+            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, UserNotFoundException,
             SearchServiceConnectionException, NotAllowedException, QueryNotFoundException, ViewNotFoundException {
         log.debug("endpoint refresh database metadata, databaseId={}", databaseId);
-        Database database = databaseService.findById(databaseId);
+        final Database database = databaseService.findById(databaseId);
+        final User caller = userService.findByUsername(principal.getName());
         if (!database.getOwner().equals(principal)) {
             log.error("Failed to refresh database views metadata: not owner");
             throw new NotAllowedException("Failed to refresh database views metadata: not owner");
         }
-        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateViewMetadata(database));
+        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.updateViewMetadata(database), caller);
         return ResponseEntity.ok(dto);
     }
 
@@ -310,14 +312,15 @@ public class DatabaseEndpoint {
     public ResponseEntity<DatabaseDto> visibility(@NotNull @PathVariable("databaseId") Long databaseId,
                                                   @Valid @RequestBody DatabaseModifyVisibilityDto data,
                                                   @NotNull Principal principal) throws DatabaseNotFoundException,
-            NotAllowedException, SearchServiceException, SearchServiceConnectionException {
+            NotAllowedException, SearchServiceException, SearchServiceConnectionException, UserNotFoundException {
         log.debug("endpoint modify database visibility, databaseId={}, data={}", databaseId, data);
         final Database database = databaseService.findById(databaseId);
-        if (!database.getOwner().equals(principal)) {
+        final User caller = userService.findByUsername(principal.getName());
+        if (!database.getOwner().equals(caller)) {
             log.error("Failed to modify database visibility: not owner");
             throw new NotAllowedException("Failed to modify database visibility: not owner");
         }
-        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyVisibility(database, data));
+        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyVisibility(database, data), caller);
         return ResponseEntity.accepted()
                 .body(dto);
     }
@@ -368,13 +371,13 @@ public class DatabaseEndpoint {
             SearchServiceException, SearchServiceConnectionException {
         log.debug("endpoint transfer database, databaseId={}, transferDto.id={}", databaseId, data.getId());
         final Database database = databaseService.findById(databaseId);
-        final User user = userService.findByUsername(principal.getName());
+        final User caller = userService.findByUsername(principal.getName());
         final User newOwner = userService.findById(data.getId());
-        if (!database.getOwner().equals(user)) {
+        if (!database.getOwner().equals(caller)) {
             log.error("Failed to transfer database: not owner");
             throw new NotAllowedException("Failed to transfer database: not owner");
         }
-        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyOwner(database, newOwner));
+        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyOwner(database, newOwner), caller);
         return ResponseEntity.accepted()
                 .body(dto);
     }
@@ -425,8 +428,8 @@ public class DatabaseEndpoint {
             StorageUnavailableException, StorageNotFoundException {
         log.debug("endpoint modify database image, databaseId={}, data.key={}", databaseId, data.getKey());
         final Database database = databaseService.findById(databaseId);
-        final User user = userService.findByUsername(principal.getName());
-        if (!database.getOwner().equals(user)) {
+        final User caller = userService.findByUsername(principal.getName());
+        if (!database.getOwner().equals(caller)) {
             log.error("Failed to update database image: not owner");
             throw new NotAllowedException("Failed to update database image: not owner");
         }
@@ -435,7 +438,7 @@ public class DatabaseEndpoint {
         if (data.getKey() != null) {
             image = storageService.getBytes(data.getKey());
         }
-        dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyImage(database, image));
+        dto = databaseMapper.customDatabaseToDatabaseDto(databaseService.modifyImage(database, image), caller);
         return ResponseEntity.accepted()
                 .body(dto);
     }
@@ -480,7 +483,7 @@ public class DatabaseEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = DatabaseDto.class))}),
             @ApiResponse(responseCode = "404",
-                    description = "Database or exchange could not be found",
+                    description = "Database, user or exchange could not be found",
                     content = {@Content(
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
@@ -497,10 +500,16 @@ public class DatabaseEndpoint {
     })
     public ResponseEntity<DatabaseDto> findById(@NotNull @PathVariable("databaseId") Long databaseId,
                                                 Principal principal) throws DataServiceException,
-            DataServiceConnectionException, DatabaseNotFoundException, ExchangeNotFoundException {
+            DataServiceConnectionException, DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException {
         log.debug("endpoint find database, databaseId={}", databaseId);
         final Database database = databaseService.findById(databaseId);
-        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database);
+        final User caller;
+        if (principal != null) {
+            caller = userService.findByUsername(principal.getName());
+        } else {
+            caller = null;
+        }
+        final DatabaseDto dto = databaseMapper.customDatabaseToDatabaseDto(database, caller);
         if (database.getOwner().equals(principal)) {
             log.debug("current logged-in user is also the owner: additionally load access list");
             /* only owner sees the access rights */
@@ -514,7 +523,9 @@ public class DatabaseEndpoint {
         if (UserUtil.isSystem(principal)) {
             headers.set("X-Username", database.getContainer().getPrivilegedUsername());
             headers.set("X-Password", database.getContainer().getPrivilegedPassword());
-            headers.set("Access-Control-Expose-Headers", "X-Username X-Password");
+            headers.set("X-Host", database.getContainer().getHost());
+            headers.set("X-Port", "" + database.getContainer().getPort());
+            headers.set("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port");
         }
         return ResponseEntity.status(HttpStatus.OK)
                 .headers(headers)
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
index 7f2e0ee93d25bd1a0b593803983fd870bc22214a..354b7245fd1daa18faa5824c74d20fb5ffb1ce58 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/IdentifierEndpoint.java
@@ -3,7 +3,10 @@ package at.tuwien.endpoints;
 import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.table.columns.concepts.ConceptDto;
 import at.tuwien.api.error.ApiErrorDto;
-import at.tuwien.api.identifier.*;
+import at.tuwien.api.identifier.BibliographyTypeDto;
+import at.tuwien.api.identifier.IdentifierCreateDto;
+import at.tuwien.api.identifier.IdentifierDto;
+import at.tuwien.api.identifier.IdentifierSaveDto;
 import at.tuwien.api.identifier.ld.LdDatasetDto;
 import at.tuwien.api.user.external.ExternalMetadataDto;
 import at.tuwien.config.EndpointConfig;
@@ -409,7 +412,7 @@ public class IdentifierEndpoint {
         final User user = userService.findByUsername(principal.getName());
         final Identifier identifier = identifierService.find(identifierId);
         /* check owner */
-        if (!identifier.getCreator().equals(user) && !UserUtil.hasRole(principal, "create-foreign-identifier")) {
+        if (!identifier.getOwner().equals(user) && !UserUtil.hasRole(principal, "create-foreign-identifier")) {
             log.error("Failed to save identifier: foreign user");
             throw new NotAllowedException("Failed to save identifier: foreign user");
         }
@@ -436,7 +439,7 @@ public class IdentifierEndpoint {
                     throw new MalformedException("Failed to save view identifier: only parameters database_id & view_id must be present");
                 }
                 final View view = viewService.findById(database, data.getViewId());
-                if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(view.getCreator(), principal, access, "create-foreign-identifier")) {
+                if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(view.getOwner(), principal, access, "create-foreign-identifier")) {
                     log.error("Failed to save view identifier: insufficient access or role");
                     throw new MalformedException("Failed to save view identifier: insufficient access or role");
                 }
@@ -459,7 +462,7 @@ public class IdentifierEndpoint {
                 }
                 log.debug("retrieving subset from data service: data.database_id={}, data.query_id={}", data.getDatabaseId(), data.getQueryId());
                 final QueryDto query = dataServiceGateway.findQuery(data.getDatabaseId(), data.getQueryId());
-                final User queryCreator = userService.findById(query.getCreator().getId());
+                final User queryCreator = userService.findById(query.getOwner().getId());
                 if (!endpointValidator.validateOnlyMineOrReadAccessOrHasRole(queryCreator, principal, access, "create-foreign-identifier")) {
                     log.error("Failed to create subset identifier: insufficient access or role");
                     throw new MalformedException("Failed to create subset identifier: insufficient access or role");
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
index ef897d06ee3701c5018fd7bc3e3ae8fd20de0bf0..3dbc450735cc1db936d1351cf89087411ee7dba8 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/TableEndpoint.java
@@ -3,6 +3,7 @@ package at.tuwien.endpoints;
 import at.tuwien.api.database.table.TableBriefDto;
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.TableDto;
+import at.tuwien.api.database.table.TableUpdateDto;
 import at.tuwien.api.database.table.columns.ColumnDto;
 import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto;
 import at.tuwien.api.error.ApiErrorDto;
@@ -14,10 +15,7 @@ import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.mapper.MetadataMapper;
-import at.tuwien.service.DatabaseService;
-import at.tuwien.service.EntityService;
-import at.tuwien.service.TableService;
-import at.tuwien.service.UserService;
+import at.tuwien.service.*;
 import at.tuwien.utils.UserUtil;
 import at.tuwien.validation.EndpointValidator;
 import io.micrometer.observation.annotation.Observed;
@@ -53,17 +51,19 @@ public class TableEndpoint {
     private final UserService userService;
     private final TableService tableService;
     private final EntityService entityService;
+    private final AccessService accessService;
     private final MetadataMapper metadataMapper;
     private final DatabaseService databaseService;
     private final EndpointValidator endpointValidator;
 
     @Autowired
     public TableEndpoint(UserService userService, TableService tableService, EntityService entityService,
-                         MetadataMapper metadataMapper, DatabaseService databaseService,
+                         AccessService accessService, MetadataMapper metadataMapper, DatabaseService databaseService,
                          EndpointValidator endpointValidator) {
         this.userService = userService;
         this.tableService = tableService;
         this.entityService = entityService;
+        this.accessService = accessService;
         this.metadataMapper = metadataMapper;
         this.databaseService = databaseService;
         this.endpointValidator = endpointValidator;
@@ -151,12 +151,12 @@ public class TableEndpoint {
                 .body(dtos);
     }
 
-    @PutMapping("/{tableId}")
+    @PutMapping("/{tableId}/statistic")
     @Transactional
     @PreAuthorize("hasAuthority('update-table-statistic')")
     @Observed(name = "dbrepo_statistic_table_update")
     @Operation(summary = "Update statistics",
-            description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. Requires role `update-table-statistic`",
+            description = "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. Requires role `update-table-statistic`.",
             security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "202",
@@ -358,6 +358,63 @@ public class TableEndpoint {
                 .body(dto);
     }
 
+    @PutMapping("/{tableId}")
+    @Transactional(rollbackFor = {Exception.class})
+    @PreAuthorize("hasAuthority('update-table')")
+    @Observed(name = "dbrepo_table_update")
+    @Operation(summary = "Update table",
+            description = "Updates a table in the database with id. Requires role `update-table`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "202",
+                    description = "Updated the table",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = TableBriefDto.class))}),
+            @ApiResponse(responseCode = "400",
+                    description = "Update table visibility payload is malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "403",
+                    description = "Update table visibility not permitted",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "404",
+                    description = "Table could not be found",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "502",
+                    description = "Connection to search service failed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "503",
+                    description = "Failed to save in search service",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+    })
+    public ResponseEntity<TableDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
+                                           @NotNull @PathVariable("tableId") Long tableId,
+                                           @NotNull @Valid @RequestBody TableUpdateDto data,
+                                           @NotNull Principal principal) throws NotAllowedException,
+            DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException,
+            SearchServiceException, SearchServiceConnectionException {
+        log.debug("endpoint update table, databaseId={}, data.is_public={}", databaseId, data.getIsPublic());
+        final Table table = tableService.findById(databaseId, tableId);
+        if (!table.getOwner().equals(principal)) {
+            log.error("Failed to update table: not owner");
+            throw new NotAllowedException("Failed to update table: not owner");
+        }
+        final TableDto dto = metadataMapper.customTableToTableDto(tableService.updateTable(table, data));
+        log.info("Updated table with id {}", dto.getId());
+        return ResponseEntity.status(HttpStatus.ACCEPTED)
+                .body(dto);
+    }
+
     @GetMapping("/{tableId}")
     @Transactional(readOnly = true)
     @Observed(name = "dbrepo_tables_find")
@@ -405,7 +462,23 @@ public class TableEndpoint {
             DataServiceConnectionException, TableNotFoundException, DatabaseNotFoundException, QueueNotFoundException {
         log.debug("endpoint find table, databaseId={}, tableId={}", databaseId, tableId);
         final Table table = tableService.findById(databaseId, tableId);
-        final TableDto dto = metadataMapper.customTableToTableDto(table);
+        boolean hasAccess = UserUtil.isSystem(principal);
+        boolean isOwner = false;
+        try {
+            if (principal != null) {
+                final User user = userService.findByUsername(principal.getName());
+                accessService.find(table.getDatabase(), user);
+                hasAccess = true;
+                isOwner = table.getOwner().equals(user);
+            }
+        } catch (UserNotFoundException | AccessNotFoundException e) {
+            /* ignore */
+        }
+        final boolean includeSchema = UserUtil.isSystem(principal) || isOwner || table.getIsSchemaPublic();
+        log.trace("user has access: {}", hasAccess);
+        log.trace("include schema in mapping: {}", includeSchema);
+        final TableDto dto = metadataMapper.customTableToTableDto(table, hasAccess, table.getDatabase().getIsPublic(),
+                includeSchema);
         final HttpHeaders headers = new HttpHeaders();
         if (UserUtil.isSystem(principal)) {
             headers.set("X-Username", table.getDatabase().getContainer().getPrivilegedUsername());
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
index cfcc554885e171ac9d35ae3e9f1c24df59f258db..75958f5bde9f8aca33cf1e517fab437d376866cf 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/endpoints/ViewEndpoint.java
@@ -3,6 +3,7 @@ package at.tuwien.endpoints;
 import at.tuwien.api.database.ViewBriefDto;
 import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.api.database.ViewDto;
+import at.tuwien.api.database.ViewUpdateDto;
 import at.tuwien.api.error.ApiErrorDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
@@ -94,7 +95,7 @@ public class ViewEndpoint {
     @PreAuthorize("hasAuthority('create-database-view')")
     @Observed(name = "dbrepo_view_create")
     @Operation(summary = "Create view",
-            description = "Creates a view. Requires role `create-database-view`.",
+            description = "Creates a view. This can only be performed by the database owner. Requires role `create-database-view`.",
             security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
     @ApiResponses(value = {
             @ApiResponse(responseCode = "201",
@@ -248,9 +249,9 @@ public class ViewEndpoint {
                             mediaType = "application/json",
                             schema = @Schema(implementation = ApiErrorDto.class))}),
     })
-    public ResponseEntity<View> delete(@NotNull @PathVariable("databaseId") Long databaseId,
-                                       @NotNull @PathVariable("viewId") Long viewId,
-                                       @NotNull Principal principal) throws NotAllowedException, DataServiceException,
+    public ResponseEntity<?> delete(@NotNull @PathVariable("databaseId") Long databaseId,
+                                    @NotNull @PathVariable("viewId") Long viewId,
+                                    @NotNull Principal principal) throws NotAllowedException, DataServiceException,
             DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException,
             SearchServiceConnectionException {
         log.debug("endpoint delete view, databaseId={}, viewId={}", databaseId, viewId);
@@ -265,4 +266,57 @@ public class ViewEndpoint {
                 .build();
     }
 
+    @PutMapping("/{viewId}")
+    @Transactional
+    @PreAuthorize("hasAuthority('modify-view-visibility')")
+    @Observed(name = "dbrepo_view_update")
+    @Operation(summary = "Update view",
+            description = "Updates a view with id. This can only be performed by the view owner or database owner. Requires role `create-database-view`.",
+            security = {@SecurityRequirement(name = "bearerAuth"), @SecurityRequirement(name = "basicAuth")})
+    @ApiResponses(value = {
+            @ApiResponse(responseCode = "202",
+                    description = "Update view successfully"),
+            @ApiResponse(responseCode = "400",
+                    description = "Update view query is malformed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "403",
+                    description = "Update not allowed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "404",
+                    description = "Database or View could not be found",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "502",
+                    description = "Connection to search service failed",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+            @ApiResponse(responseCode = "503",
+                    description = "Failed to save in search service",
+                    content = {@Content(
+                            mediaType = "application/json",
+                            schema = @Schema(implementation = ApiErrorDto.class))}),
+    })
+    public ResponseEntity<ViewDto> update(@NotNull @PathVariable("databaseId") Long databaseId,
+                                          @NotNull @PathVariable("viewId") Long viewId,
+                                          @NotNull @Valid @RequestBody ViewUpdateDto data,
+                                          @NotNull Principal principal) throws NotAllowedException,
+            DataServiceConnectionException, DatabaseNotFoundException, ViewNotFoundException, SearchServiceException,
+            SearchServiceConnectionException {
+        log.debug("endpoint update view, databaseId={}, viewId={}", databaseId, viewId);
+        final Database database = databaseService.findById(databaseId);
+        final View view = viewService.findById(database, viewId);
+        if (!database.getOwner().equals(principal) && !view.getOwner().equals(principal)) {
+            log.error("Failed to update view: not the database- or view owner");
+            throw new NotAllowedException("Failed to update view: not the database- or view owner");
+        }
+        return ResponseEntity.accepted()
+                .body(metadataMapper.viewToViewDto(viewService.update(database, view, data)));
+    }
+
 }
diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java
index 75f76d440a4d059dfe9c918952519976aa5cbdb3..75c277a3b9699a722a5d43a6eb6548a809de0406 100644
--- a/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java
+++ b/dbrepo-metadata-service/rest-service/src/main/java/at/tuwien/validation/EndpointValidator.java
@@ -188,8 +188,8 @@ public class EndpointValidator {
         return false;
     }
 
-    public boolean validateOnlyMineOrReadAccessOrHasRole(User creator, Principal principal, DatabaseAccess access, String role) {
-        if (validateOnlyMineOrWriteAccessOrHasRole(creator, principal, access, role)) {
+    public boolean validateOnlyMineOrReadAccessOrHasRole(User owner, Principal principal, DatabaseAccess access, String role) {
+        if (validateOnlyMineOrWriteAccessOrHasRole(owner, principal, access, role)) {
             return true;
         }
         if (access.getType().equals(AccessType.READ)) {
@@ -203,23 +203,23 @@ public class EndpointValidator {
     @Transactional(readOnly = true)
     public void validateOnlyOwnerOrWriteAll(Table table, User user) throws NotAllowedException,
             AccessNotFoundException {
-        log.trace("table creator: {}", table.getCreatedBy());
+        log.trace("table owner: {}", table.getOwnedBy());
         final DatabaseAccess access = accessService.find(table.getDatabase(), user);
         log.trace("found access {}", access);
         if (access.getType().equals(AccessType.READ)) {
             log.error("Access not allowed: insufficient access (only read-access)");
             throw new NotAllowedException("Access not allowed: insufficient access (only read-access)");
         }
-        if (table.getCreatedBy().equals(user.getId()) && (access.getType().equals(AccessType.WRITE_OWN) || access.getType().equals(AccessType.WRITE_ALL))) {
-            log.trace("grant access: table creator with write access");
+        if (table.getOwnedBy().equals(user.getId()) && (access.getType().equals(AccessType.WRITE_OWN) || access.getType().equals(AccessType.WRITE_ALL))) {
+            log.trace("grant access: table owner with write access");
             return;
         }
         if (access.getType().equals(AccessType.WRITE_ALL)) {
             log.trace("grant access: write-all access");
             return;
         }
-        log.error("Access not allowed: insufficient access (neither creator {} nor write-all access)", table.getCreatedBy());
-        throw new NotAllowedException("Access not allowed: insufficient access (neither creator nor write-all access)");
+        log.error("Access not allowed: insufficient access (neither owner {} nor write-all access)", table.getOwnedBy());
+        throw new NotAllowedException("Access not allowed: insufficient access (neither owner nor write-all access)");
     }
 
     public void validateOnlyPrivateHasRole(Database database, Principal principal, String role)
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java
index 2d6033ed92c7982b0d87bef1cf433dd1176ba106..9852cde936981ed222260675c248345745314317 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/DatabaseEndpointUnitTest.java
@@ -1,17 +1,14 @@
 package at.tuwien.endpoints;
 
-import at.tuwien.service.StorageService;
-import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.api.database.*;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.KeycloakGateway;
 import at.tuwien.repository.UserRepository;
-import at.tuwien.service.AccessService;
-import at.tuwien.service.ContainerService;
-import at.tuwien.service.BrokerService;
+import at.tuwien.service.*;
 import at.tuwien.service.impl.DatabaseServiceImpl;
+import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -56,7 +53,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     private DatabaseServiceImpl databaseService;
 
     @MockBean
-    private UserRepository userRepository;
+    private UserService userService;
 
     @MockBean
     private StorageService storageService;
@@ -104,7 +101,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     public void create_succeeds() throws DataServiceException, DataServiceConnectionException, UserNotFoundException,
             DatabaseNotFoundException, ContainerNotFoundException, SearchServiceException,
             SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException,
-            CredentialsInvalidException, BrokerServiceException, BrokerServiceConnectionException, ContainerQuotaException {
+            BrokerServiceException, BrokerServiceConnectionException, ContainerQuotaException {
         final DatabaseCreateDto request = DatabaseCreateDto.builder()
                 .cid(CONTAINER_1_ID)
                 .name(DATABASE_1_NAME)
@@ -121,8 +118,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .setVirtualHostPermissions(USER_1);
         when(keycloakGateway.findByUsername(USER_1_USERNAME))
                 .thenReturn(USER_1_KEYCLOAK_DTO);
-        when(userRepository.findByUsername(USER_1_USERNAME))
-                .thenReturn(Optional.of(USER_1));
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
 
         /* test */
         create_generic(request, USER_1_PRINCIPAL, USER_1);
@@ -194,7 +191,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-visibility"})
     public void visibility_hasRole_succeeds() throws NotAllowedException, UserNotFoundException,
             DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, AuthServiceException,
-            AuthServiceConnectionException, CredentialsInvalidException {
+            AuthServiceConnectionException {
         final DatabaseModifyVisibilityDto request = DatabaseModifyVisibilityDto.builder()
                 .isPublic(true)
                 .build();
@@ -202,8 +199,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
         /* mock */
         when(keycloakGateway.findByUsername(USER_1_USERNAME))
                 .thenReturn(USER_1_KEYCLOAK_DTO);
-        when(userRepository.findByUsername(USER_1_USERNAME))
-                .thenReturn(Optional.of(USER_1));
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
 
         /* test */
         visibility_generic(DATABASE_1_ID, DATABASE_1, request, USER_1_PRINCIPAL);
@@ -224,14 +221,14 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-database-visibility"})
-    public void visibility_hasRoleForeign_fails() {
+    public void visibility_hasRoleForeign_fails() throws UserNotFoundException {
         final DatabaseModifyVisibilityDto request = DatabaseModifyVisibilityDto.builder()
                 .isPublic(true)
                 .build();
 
         /* mock */
-        when(userRepository.findByUsername(USER_2_USERNAME))
-                .thenReturn(Optional.of(USER_2));
+        when(userService.findByUsername(USER_2_USERNAME))
+                .thenReturn(USER_2);
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -264,8 +261,8 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
         /* mock */
         when(databaseService.findById(DATABASE_1_ID))
                 .thenReturn(DATABASE_1);
-        when(userRepository.findByUsername(USER_1_USERNAME))
-                .thenReturn(Optional.of(USER_1));
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
         when(storageService.getBytes(request.getKey()))
                 .thenReturn(new byte[]{});
 
@@ -288,7 +285,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_2_USERNAME, authorities = {"modify-database-owner"})
-    public void transfer_hasRoleForeign_fails() throws DatabaseNotFoundException {
+    public void transfer_hasRoleForeign_fails() throws DatabaseNotFoundException, UserNotFoundException {
         final DatabaseTransferDto request = DatabaseTransferDto.builder()
                 .id(USER_4_ID)
                 .build();
@@ -296,10 +293,10 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
         /* mock */
         when(databaseService.findById(DATABASE_1_ID))
                 .thenReturn(DATABASE_1);
-        when(userRepository.findByUsername(USER_2_USERNAME))
-                .thenReturn(Optional.of(USER_2));
-        when(userRepository.findById(USER_4_ID))
-                .thenReturn(Optional.of(USER_4));
+        when(userService.findByUsername(USER_2_USERNAME))
+                .thenReturn(USER_2);
+        when(userService.findById(USER_4_ID))
+                .thenReturn(USER_4);
 
         /* test */
         assertThrows(NotAllowedException.class, () -> {
@@ -311,8 +308,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-owner"})
     public void transfer_hasRole_succeeds() throws DataServiceConnectionException, DataServiceException,
             NotAllowedException, UserNotFoundException, DatabaseNotFoundException, SearchServiceException,
-            SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException,
-            CredentialsInvalidException {
+            SearchServiceConnectionException, AuthServiceException, AuthServiceConnectionException {
         final DatabaseTransferDto request = DatabaseTransferDto.builder()
                 .id(USER_4_ID)
                 .build();
@@ -322,10 +318,10 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
                 .thenReturn(DATABASE_1);
         when(keycloakGateway.findByUsername(USER_1_USERNAME))
                 .thenReturn(USER_1_KEYCLOAK_DTO);
-        when(userRepository.findByUsername(USER_1_USERNAME))
-                .thenReturn(Optional.of(USER_1));
-        when(userRepository.findById(USER_4_ID))
-                .thenReturn(Optional.of(USER_4));
+        when(userService.findByUsername(USER_1_USERNAME))
+                .thenReturn(USER_1);
+        when(userService.findById(USER_4_ID))
+                .thenReturn(USER_4);
 
         /* test */
         databaseEndpoint.transfer(DATABASE_1_ID, request, USER_1_PRINCIPAL);
@@ -333,7 +329,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
 
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"modify-database-owner"})
-    public void transfer_hasRoleUserNotExists_succeeds() throws DatabaseNotFoundException {
+    public void transfer_hasRoleUserNotExists_succeeds() throws DatabaseNotFoundException, UserNotFoundException {
         final DatabaseTransferDto request = DatabaseTransferDto.builder()
                 .id(UUID.randomUUID())
                 .build();
@@ -341,8 +337,9 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
         /* mock */
         when(databaseService.findById(DATABASE_1_ID))
                 .thenReturn(DATABASE_1);
-        when(userRepository.findById(any(UUID.class)))
-                .thenReturn(Optional.empty());
+        doThrow(UserNotFoundException.class)
+                .when(userService)
+                .findById(any(UUID.class));
 
         /* test */
         assertThrows(UserNotFoundException.class, () -> {
@@ -353,7 +350,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithAnonymousUser
     public void findById_anonymous_succeeds() throws DataServiceException, DataServiceConnectionException,
-            DatabaseNotFoundException, ExchangeNotFoundException {
+            DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException {
 
         /* test */
         findById_generic(DATABASE_1_ID, DATABASE_1, null);
@@ -372,7 +369,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"})
     public void findById_hasRole_succeeds() throws DataServiceException, DataServiceConnectionException,
-            DatabaseNotFoundException, ExchangeNotFoundException {
+            DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException {
 
         /* pre-condition */
         assertTrue(DATABASE_3_PUBLIC);
@@ -384,7 +381,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"})
     public void findById_hasRoleForeign_succeeds() throws DataServiceException, DataServiceConnectionException,
-            DatabaseNotFoundException, ExchangeNotFoundException {
+            DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException {
 
         /* pre-condition */
         assertTrue(DATABASE_3_PUBLIC);
@@ -396,7 +393,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
     @Test
     @WithMockUser(username = USER_1_USERNAME, authorities = {"find-database"})
     public void findById_ownerSeesAccessRights_succeeds() throws DataServiceException, DataServiceConnectionException,
-            DatabaseNotFoundException, ExchangeNotFoundException {
+            DatabaseNotFoundException, ExchangeNotFoundException, UserNotFoundException {
 
         /* mock */
         when(accessService.list(DATABASE_1))
@@ -501,7 +498,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
 
     public void visibility_generic(Long databaseId, Database database, DatabaseModifyVisibilityDto data,
                                    Principal principal) throws NotAllowedException, DatabaseNotFoundException,
-            SearchServiceException, SearchServiceConnectionException {
+            SearchServiceException, SearchServiceConnectionException, UserNotFoundException {
 
         /* mock */
         if (database != null) {
@@ -523,7 +520,7 @@ public class DatabaseEndpointUnitTest extends AbstractUnitTest {
 
     public DatabaseDto findById_generic(Long databaseId, Database database, Principal principal)
             throws DataServiceConnectionException, DatabaseNotFoundException, ExchangeNotFoundException,
-            DataServiceException {
+            DataServiceException, UserNotFoundException {
 
         /* mock */
         if (database != null) {
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
index af98f87e571bac44fd2e422848cbfc8e37262ffd..8a98bf11f5035e5e746e3fccfec77691d70a9ff7 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/endpoints/IdentifierEndpointUnitTest.java
@@ -1,12 +1,11 @@
 package at.tuwien.endpoints;
 
-import at.tuwien.entities.identifier.IdentifierType;
-import at.tuwien.test.AbstractUnitTest;
 import at.tuwien.api.identifier.*;
 import at.tuwien.config.EndpointConfig;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.DatabaseAccess;
 import at.tuwien.entities.identifier.Identifier;
+import at.tuwien.entities.identifier.IdentifierType;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
 import at.tuwien.gateway.DataServiceGateway;
@@ -14,6 +13,7 @@ import at.tuwien.service.AccessService;
 import at.tuwien.service.DatabaseService;
 import at.tuwien.service.IdentifierService;
 import at.tuwien.service.UserService;
+import at.tuwien.test.AbstractUnitTest;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.io.FileUtils;
@@ -97,8 +97,6 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest {
         assertEquals(compare.getTitles().size(), body.getTitles().size());
         assertEquals(compare.getDescriptions().size(), body.getDescriptions().size());
         assertEquals(compare.getDescriptions(), body.getDescriptions());
-        assertEquals(compare.getCreated(), body.getCreated());
-        assertEquals(compare.getLastModified(), body.getLastModified());
         assertEquals(compare.getDoi(), body.getDoi());
         assertEquals(compare.getLicenses().size(), body.getLicenses().size());
         assertEquals(compare.getPublicationDay(), body.getPublicationDay());
@@ -136,8 +134,6 @@ public class IdentifierEndpointUnitTest extends AbstractUnitTest {
         assertEquals(compare.getDescriptions().get(0).getDescription(), body.getDescriptions().get(0).getDescription());
         assertEquals(compare.getDescriptions().get(0).getLanguage(), body.getDescriptions().get(0).getLanguage());
         assertEquals(compare.getDescriptions().get(0).getDescriptionType(), body.getDescriptions().get(0).getDescriptionType());
-        assertEquals(compare.getCreated(), body.getCreated());
-        assertEquals(compare.getLastModified(), body.getLastModified());
         assertEquals(compare.getDoi(), body.getDoi());
         assertEquals(compare.getLicenses().size(), body.getLicenses().size());
         assertEquals(compare.getLicenses().get(0).getIdentifier(), body.getLicenses().get(0).getIdentifier());
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
index c84990098596b159be2aa65459638ba0b498c7ee..66add61c3988c483a83b20d9d10b3cbb123d4fcd 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mapper/MetadataMapperUnitTest.java
@@ -2,19 +2,13 @@ package at.tuwien.mapper;
 
 import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.api.database.ViewDto;
-import at.tuwien.api.database.table.TableDto;
-import at.tuwien.api.database.table.columns.ColumnTypeDto;
-import at.tuwien.api.database.table.constraints.foreign.ForeignKeyDto;
-import at.tuwien.api.database.table.constraints.foreign.ForeignKeyReferenceDto;
-import at.tuwien.api.database.table.constraints.foreign.ReferenceTypeDto;
-import at.tuwien.api.database.table.constraints.primary.PrimaryKeyDto;
-import at.tuwien.api.database.table.constraints.unique.UniqueDto;
+import at.tuwien.api.database.table.TableBriefDto;
+import at.tuwien.api.identifier.IdentifierBriefDto;
 import at.tuwien.api.identifier.IdentifierDto;
 import at.tuwien.api.identifier.IdentifierTypeDto;
 import at.tuwien.api.user.UserBriefDto;
 import at.tuwien.api.user.UserDto;
 import at.tuwien.entities.container.Container;
-import at.tuwien.entities.database.Database;
 import at.tuwien.entities.identifier.*;
 import at.tuwien.test.AbstractUnitTest;
 import lombok.extern.log4j.Log4j2;
@@ -30,7 +24,6 @@ import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Stream;
 
@@ -149,7 +142,7 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
         assertNull(response.getViewId());
         assertNull(response.getQueryId());
         assertNull(response.getTableId());
-        assertEquals(IDENTIFIER_1_DOI_NOT_NULL, response.getDoi());
+        assertEquals(IDENTIFIER_1_DOI, response.getDoi());
         assertEquals(IDENTIFIER_1_TYPE, response.getType());
     }
 
@@ -183,249 +176,54 @@ public class MetadataMapperUnitTest extends AbstractUnitTest {
     public void customDatabaseToDatabaseDto_succeeds() {
 
         /* test */
-        final DatabaseDto response = metadataMapper.customDatabaseToDatabaseDto(DATABASE_1);
+        final DatabaseDto response = metadataMapper.customDatabaseToDatabaseDto(DATABASE_1, USER_1);
         assertEquals(DATABASE_1_ID, response.getId());
         assertNotNull(response.getContact());
         assertEquals(USER_1_ID, response.getContact().getId());
+        assertEquals(DATABASE_1_PUBLIC, response.getIsPublic());
+        assertEquals(DATABASE_1_SCHEMA_PUBLIC, response.getIsSchemaPublic());
         /* identifiers formatted */
         assertEquals(4, response.getIdentifiers().size());
-        final IdentifierDto identifier1 = response.getIdentifiers().get(0);
+        final IdentifierBriefDto identifier1 = response.getIdentifiers().get(0);
         assertEquals(DATABASE_1_ID, identifier1.getDatabaseId());
-        assertNotNull(identifier1.getCreator());
-        assertEquals(IDENTIFIER_1_CREATED_BY, identifier1.getCreator().getId());
-        assertNotNull(identifier1.getCreated());
-        assertNotNull(identifier1.getLastModified());
-        final IdentifierDto identifier2 = response.getIdentifiers().get(1);
+        final IdentifierBriefDto identifier2 = response.getIdentifiers().get(1);
         assertEquals(DATABASE_1_ID, identifier2.getDatabaseId());
-        assertNotNull(identifier2.getCreator());
-        assertEquals(IDENTIFIER_2_CREATED_BY, identifier2.getCreator().getId());
-        assertNotNull(identifier2.getCreated());
-        assertNotNull(identifier2.getLastModified());
-        final IdentifierDto identifier3 = response.getIdentifiers().get(2);
+        final IdentifierBriefDto identifier3 = response.getIdentifiers().get(2);
         assertEquals(DATABASE_1_ID, identifier3.getDatabaseId());
-        assertNotNull(identifier3.getCreator());
-        assertEquals(IDENTIFIER_3_CREATED_BY, identifier3.getCreator().getId());
-        assertNotNull(identifier3.getCreated());
-        assertNotNull(identifier3.getLastModified());
-        final IdentifierDto identifier4 = response.getIdentifiers().get(3);
+        final IdentifierBriefDto identifier4 = response.getIdentifiers().get(3);
         assertEquals(DATABASE_1_ID, identifier4.getDatabaseId());
-        assertNotNull(identifier4.getCreator());
-        assertEquals(IDENTIFIER_4_CREATED_BY, identifier4.getCreator().getId());
-        assertNotNull(identifier4.getCreated());
-        assertNotNull(identifier4.getLastModified());
         /* Table 1 formatted */
-        final TableDto table0 = response.getTables().get(0);
+        final TableBriefDto table0 = response.getTables().get(0);
         assertEquals(TABLE_1_ID, table0.getId());
         assertEquals(TABLE_1_NAME, table0.getName());
         assertEquals(TABLE_1_INTERNALNAME, table0.getInternalName());
         assertEquals(TABLE_1_DESCRIPTION, table0.getDescription());
-        assertEquals(DATABASE_1_ID, table0.getTdbid());
-        assertEquals(USER_1_ID, table0.getCreatedBy());
-        assertNotNull(table0.getOwner());
-        assertEquals(USER_1_ID, table0.getOwner().getId());
-        assertNotNull(table0.getCreator());
-        assertEquals(USER_1_ID, table0.getCreator().getId());
-        assertEquals(TABLE_1_AVG_ROW_LENGTH, table0.getAvgRowLength());
-        assertEquals(TABLE_1_NUM_ROWS, table0.getNumRows());
-        assertEquals(TABLE_1_DATA_LENGTH, table0.getDataLength());
-        assertEquals(TABLE_1_MAX_DATA_LENGTH, table0.getMaxDataLength());
-        assertNotNull(table0.getCreated());
-        /* columns formatted */
-        assertEquals(TABLE_1_COLUMNS.size(), table0.getColumns().size());
-        for (int i = 0; i < TABLE_1_COLUMNS.size(); i++) {
-            assertEquals(TABLE_1_COLUMNS.get(i).getId(), table0.getColumns().get(i).getId());
-            assertEquals(TABLE_1_COLUMNS.get(i).getOrdinalPosition(), table0.getColumns().get(i).getOrdinalPosition());
-            assertNotNull(table0.getColumns().get(i).getOrdinalPosition());
-            assertEquals(TABLE_1_COLUMNS.get(i).getTable().getId(), table0.getColumns().get(i).getTableId());
-            assertEquals(TABLE_1_COLUMNS.get(i).getName(), table0.getColumns().get(i).getName());
-            assertEquals(TABLE_1_COLUMNS.get(i).getInternalName(), table0.getColumns().get(i).getInternalName());
-            assertEquals(List.of(ColumnTypeDto.SERIAL, ColumnTypeDto.DATE, ColumnTypeDto.VARCHAR, ColumnTypeDto.DECIMAL, ColumnTypeDto.DECIMAL).get(i), table0.getColumns().get(i).getColumnType());
-            assertEquals(TABLE_1_COLUMNS.get(i).getSize(), table0.getColumns().get(i).getSize());
-            assertEquals(TABLE_1_COLUMNS.get(i).getD(), table0.getColumns().get(i).getD());
-            assertEquals(TABLE_1_COLUMNS.get(i).getIsNullAllowed(), table0.getColumns().get(i).getIsNullAllowed());
-            assertEquals(TABLE_1_COLUMNS.get(i).getEnums(), table0.getColumns().get(i).getEnums());
-            assertEquals(TABLE_1_COLUMNS.get(i).getSets(), table0.getColumns().get(i).getSets());
-        }
-        /* constraints formatted */
-        assertNotNull(table0.getConstraints());
-        assertEquals(0, table0.getConstraints().getUniques().size());
-        assertEquals(0, table0.getConstraints().getChecks().size());
-        assertEquals(0, table0.getConstraints().getForeignKeys().size());
-        assertEquals(1, table0.getConstraints().getPrimaryKey().size());
-        final PrimaryKeyDto table0pk = new ArrayList<>(table0.getConstraints().getPrimaryKey()).get(0);
-        assertEquals(1L, table0pk.getId());
-        assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getId(), table0pk.getColumn().getId());
-        assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getName(), table0pk.getColumn().getName());
-        assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getId(), table0pk.getColumn().getId());
-        assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getName(), table0pk.getColumn().getName());
-        assertEquals(TABLE_1_COLUMNS_BRIEF_0_DTO.getInternalName(), table0pk.getColumn().getInternalName());
-        assertEquals(TABLE_1_ID, table0pk.getTable().getId());
-        assertEquals(DATABASE_1_ID, table0pk.getTable().getDatabaseId());
-        assertEquals(ColumnTypeDto.SERIAL, table0pk.getColumn().getColumnType());
-        assertNull(table0pk.getColumn().getAlias());
-        assertEquals(TABLE_1_ID, table0pk.getColumn().getTableId());
-        assertEquals(DATABASE_1_ID, table0pk.getColumn().getDatabaseId());
+        assertEquals(DATABASE_1_ID, table0.getDatabaseId());
+        assertEquals(TABLE_1_SCHEMA_PUBLIC, table0.getIsSchemaPublic());
         /* Table 2 formatted */
-        final TableDto table1 = response.getTables().get(1);
+        final TableBriefDto table1 = response.getTables().get(1);
         assertEquals(TABLE_2_ID, table1.getId());
         assertEquals(TABLE_2_NAME, table1.getName());
         assertEquals(TABLE_2_INTERNALNAME, table1.getInternalName());
         assertEquals(TABLE_2_DESCRIPTION, table1.getDescription());
-        assertEquals(DATABASE_1_ID, table1.getTdbid());
-        assertEquals(USER_2_ID, table1.getCreatedBy());
-        assertNotNull(table1.getOwner());
-        assertEquals(USER_2_ID, table1.getOwner().getId());
-        assertNotNull(table1.getCreator());
-        assertEquals(USER_2_ID, table1.getCreator().getId());
-        assertEquals(TABLE_2_AVG_ROW_LENGTH, table1.getAvgRowLength());
-        assertEquals(TABLE_2_NUM_ROWS, table1.getNumRows());
-        assertEquals(TABLE_2_DATA_LENGTH, table1.getDataLength());
-        assertEquals(TABLE_2_MAX_DATA_LENGTH, table1.getMaxDataLength());
-        assertNotNull(table1.getCreated());
-        /* columns formatted */
-        assertEquals(TABLE_2_COLUMNS.size(), table1.getColumns().size());
-        for (int i = 0; i < TABLE_2_COLUMNS.size(); i++) {
-            assertEquals(TABLE_2_COLUMNS.get(i).getId(), table1.getColumns().get(i).getId());
-            assertEquals(TABLE_2_COLUMNS.get(i).getOrdinalPosition(), table1.getColumns().get(i).getOrdinalPosition());
-            assertNotNull(table1.getColumns().get(i).getOrdinalPosition());
-            assertEquals(TABLE_2_COLUMNS.get(i).getTable().getId(), table1.getColumns().get(i).getTableId());
-            assertEquals(TABLE_2_COLUMNS.get(i).getName(), table1.getColumns().get(i).getName());
-            assertEquals(TABLE_2_COLUMNS.get(i).getInternalName(), table1.getColumns().get(i).getInternalName());
-            assertEquals(List.of(ColumnTypeDto.VARCHAR, ColumnTypeDto.DECIMAL, ColumnTypeDto.DECIMAL).get(i), table1.getColumns().get(i).getColumnType());
-            assertEquals(TABLE_2_COLUMNS.get(i).getSize(), table1.getColumns().get(i).getSize());
-            assertEquals(TABLE_2_COLUMNS.get(i).getD(), table1.getColumns().get(i).getD());
-            assertEquals(TABLE_2_COLUMNS.get(i).getIsNullAllowed(), table1.getColumns().get(i).getIsNullAllowed());
-            assertEquals(TABLE_2_COLUMNS.get(i).getEnums(), table1.getColumns().get(i).getEnums());
-            assertEquals(TABLE_2_COLUMNS.get(i).getSets(), table1.getColumns().get(i).getSets());
-        }
-        /* constraints formatted */
-        assertNotNull(table1.getConstraints());
-        assertEquals(1, table1.getConstraints().getUniques().size());
-        final UniqueDto table1uk = table1.getConstraints().getUniques().get(0);
-        assertEquals(1L, table1uk.getId());
-        assertEquals(TABLE_2_ID, table1uk.getTable().getId());
-        assertEquals(DATABASE_1_ID, table1uk.getTable().getDatabaseId());
-        assertEquals("uk_1", table1uk.getName());
-        assertEquals(TABLE_2_COLUMNS_DTO.get(1).getId(), table1uk.getColumns().get(0).getId());
-        assertEquals(1, table1.getConstraints().getChecks().size());
-        assertEquals("`mintemp` > 0", new ArrayList<>(table1.getConstraints().getChecks()).get(0));
-        assertEquals(1, table1.getConstraints().getForeignKeys().size());
-        final ForeignKeyDto table1fk = new ArrayList<>(table1.getConstraints().getForeignKeys()).get(0);
-        assertEquals("fk_location", table1fk.getName());
-        assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnDelete());
-        assertEquals(ReferenceTypeDto.NO_ACTION, table1fk.getOnUpdate());
-        assertEquals(TABLE_2_ID, table1fk.getTable().getId());
-        assertEquals(DATABASE_1_ID, table1fk.getTable().getDatabaseId());
-        assertEquals(TABLE_1_ID, table1fk.getReferencedTable().getId());
-        assertEquals(DATABASE_1_ID, table1fk.getReferencedTable().getDatabaseId());
-        final ForeignKeyReferenceDto table1fkr = table1fk.getReferences().get(0);
-        assertEquals(1L, table1fkr.getId());
-        assertEquals(TABLE_2_COLUMNS_DTO.get(2).getId(), table1fkr.getColumn().getId());
-        assertEquals(TABLE_2_COLUMNS_DTO.get(2).getTableId(), table1fkr.getColumn().getTableId());
-        assertEquals(TABLE_2_COLUMNS_DTO.get(2).getDatabaseId(), table1fkr.getColumn().getDatabaseId());
-        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getId(), table1fkr.getReferencedColumn().getId());
-        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getTableId(), table1fkr.getReferencedColumn().getTableId());
-        assertEquals(TABLE_1_COLUMNS_DTO.get(0).getDatabaseId(), table1fkr.getReferencedColumn().getDatabaseId());
-        assertEquals(1, table1.getConstraints().getPrimaryKey().size());
-        final PrimaryKeyDto table1pk = new ArrayList<>(table1.getConstraints().getPrimaryKey()).get(0);
-        assertEquals(2L, table1pk.getId());
-        assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getId(), table1pk.getColumn().getId());
-        assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getName(), table1pk.getColumn().getName());
-        assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getId(), table1pk.getColumn().getId());
-        assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getName(), table1pk.getColumn().getName());
-        assertEquals(TABLE_2_COLUMNS_BRIEF_0_DTO.getInternalName(), table1pk.getColumn().getInternalName());
-        assertEquals(ColumnTypeDto.VARCHAR, table1pk.getColumn().getColumnType());
-        assertNull(table1pk.getColumn().getAlias());
-        assertEquals(TABLE_2_ID, table1pk.getColumn().getTableId());
-        assertEquals(DATABASE_1_ID, table1pk.getColumn().getDatabaseId());
+        assertEquals(DATABASE_1_ID, table1.getDatabaseId());
+        assertEquals(TABLE_2_SCHEMA_PUBLIC, table1.getIsSchemaPublic());
         /* Table 3 formatted */
-        final TableDto table2 = response.getTables().get(2);
+        final TableBriefDto table2 = response.getTables().get(2);
         assertEquals(TABLE_3_ID, table2.getId());
         assertEquals(TABLE_3_NAME, table2.getName());
         assertEquals(TABLE_3_INTERNALNAME, table2.getInternalName());
         assertEquals(TABLE_3_DESCRIPTION, table2.getDescription());
-        assertEquals(DATABASE_1_ID, table2.getTdbid());
-        assertEquals(USER_3_ID, table2.getCreatedBy());
-        assertNotNull(table2.getOwner());
-        assertEquals(USER_3_ID, table2.getOwner().getId());
-        assertNotNull(table2.getCreator());
-        assertEquals(USER_3_ID, table2.getCreator().getId());
-        assertEquals(TABLE_3_AVG_ROW_LENGTH, table2.getAvgRowLength());
-        assertEquals(TABLE_3_NUM_ROWS, table2.getNumRows());
-        assertEquals(TABLE_3_DATA_LENGTH, table2.getDataLength());
-        assertEquals(TABLE_3_MAX_DATA_LENGTH, table2.getMaxDataLength());
-        assertNotNull(table2.getCreated());
-        /* columns formatted */
-        assertEquals(TABLE_3_COLUMNS.size(), table2.getColumns().size());
-        for (int i = 0; i < TABLE_3_COLUMNS.size(); i++) {
-            assertEquals(TABLE_3_COLUMNS.get(i).getId(), table2.getColumns().get(i).getId());
-            assertEquals(TABLE_3_COLUMNS.get(i).getOrdinalPosition(), table2.getColumns().get(i).getOrdinalPosition());
-            assertNotNull(table2.getColumns().get(i).getOrdinalPosition());
-            assertEquals(TABLE_3_COLUMNS.get(i).getTable().getId(), table2.getColumns().get(i).getTableId());
-            assertEquals(TABLE_3_COLUMNS.get(i).getName(), table2.getColumns().get(i).getName());
-            assertEquals(TABLE_3_COLUMNS.get(i).getInternalName(), table2.getColumns().get(i).getInternalName());
-            assertEquals(List.of(ColumnTypeDto.BIGINT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.DATE, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.DATE, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.DATE, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT, ColumnTypeDto.INT).get(i), table2.getColumns().get(i).getColumnType());
-            assertEquals(TABLE_3_COLUMNS.get(i).getSize(), table2.getColumns().get(i).getSize());
-            assertEquals(TABLE_3_COLUMNS.get(i).getD(), table2.getColumns().get(i).getD());
-            assertEquals(TABLE_3_COLUMNS.get(i).getIsNullAllowed(), table2.getColumns().get(i).getIsNullAllowed());
-            assertEquals(TABLE_3_COLUMNS.get(i).getEnums(), table2.getColumns().get(i).getEnums());
-            assertEquals(TABLE_3_COLUMNS.get(i).getSets(), table2.getColumns().get(i).getSets());
-        }
-        /* constraints formatted */
-        final PrimaryKeyDto table2pk = new ArrayList<>(table2.getConstraints().getPrimaryKey()).get(0);
-        assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getId(), table2pk.getColumn().getId());
-        assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getName(), table2pk.getColumn().getName());
-        assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getId(), table2pk.getColumn().getId());
-        assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getName(), table2pk.getColumn().getName());
-        assertEquals(TABLE_3_COLUMNS_BRIEF_0_DTO.getInternalName(), table2pk.getColumn().getInternalName());
-        assertEquals(ColumnTypeDto.BIGINT, table2pk.getColumn().getColumnType());
-        assertNull(table2pk.getColumn().getAlias());
-        assertEquals(TABLE_3_ID, table2pk.getColumn().getTableId());
-        assertEquals(DATABASE_1_ID, table2pk.getColumn().getDatabaseId());
+        assertEquals(DATABASE_1_ID, table2.getDatabaseId());
+        assertEquals(TABLE_3_SCHEMA_PUBLIC, table2.getIsSchemaPublic());
         /* Table 4 formatted */
-        final TableDto table3 = response.getTables().get(3);
+        final TableBriefDto table3 = response.getTables().get(3);
         assertEquals(TABLE_4_ID, table3.getId());
         assertEquals(TABLE_4_NAME, table3.getName());
         assertEquals(TABLE_4_INTERNALNAME, table3.getInternalName());
         assertEquals(TABLE_4_DESCRIPTION, table3.getDescription());
-        assertEquals(DATABASE_1_ID, table3.getTdbid());
-        assertEquals(USER_1_ID, table3.getCreatedBy());
-        assertNotNull(table3.getOwner());
-        assertEquals(USER_1_ID, table3.getOwner().getId());
-        assertNotNull(table3.getCreator());
-        assertEquals(USER_1_ID, table3.getCreator().getId());
-        assertEquals(TABLE_4_AVG_ROW_LENGTH, table3.getAvgRowLength());
-        assertEquals(TABLE_4_NUM_ROWS, table3.getNumRows());
-        assertEquals(TABLE_4_DATA_LENGTH, table3.getDataLength());
-        assertEquals(TABLE_4_MAX_DATA_LENGTH, table3.getMaxDataLength());
-        assertNotNull(table3.getCreated());
-        /* columns formatted */
-        assertEquals(TABLE_4_COLUMNS.size(), table3.getColumns().size());
-        for (int i = 0; i < TABLE_4_COLUMNS.size(); i++) {
-            assertEquals(TABLE_4_COLUMNS.get(i).getId(), table3.getColumns().get(i).getId());
-            assertEquals(TABLE_4_COLUMNS.get(i).getOrdinalPosition(), table3.getColumns().get(i).getOrdinalPosition());
-            assertNotNull(table3.getColumns().get(i).getOrdinalPosition());
-            assertEquals(TABLE_4_COLUMNS.get(i).getTable().getId(), table3.getColumns().get(i).getTableId());
-            assertEquals(TABLE_4_COLUMNS.get(i).getName(), table3.getColumns().get(i).getName());
-            assertEquals(TABLE_4_COLUMNS.get(i).getInternalName(), table3.getColumns().get(i).getInternalName());
-            assertEquals(List.of(ColumnTypeDto.TIMESTAMP, ColumnTypeDto.DECIMAL).get(i), table3.getColumns().get(i).getColumnType());
-            assertEquals(TABLE_4_COLUMNS.get(i).getSize(), table3.getColumns().get(i).getSize());
-            assertEquals(TABLE_4_COLUMNS.get(i).getD(), table3.getColumns().get(i).getD());
-            assertEquals(TABLE_4_COLUMNS.get(i).getIsNullAllowed(), table3.getColumns().get(i).getIsNullAllowed());
-            assertEquals(TABLE_4_COLUMNS.get(i).getEnums(), table3.getColumns().get(i).getEnums());
-            assertEquals(TABLE_4_COLUMNS.get(i).getSets(), table3.getColumns().get(i).getSets());
-        }
-        /* constraints formatted */
-        final PrimaryKeyDto table3pk = new ArrayList<>(table3.getConstraints().getPrimaryKey()).get(0);
-        assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getId(), table3pk.getColumn().getId());
-        assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getName(), table3pk.getColumn().getName());
-        assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getId(), table3pk.getColumn().getId());
-        assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getName(), table3pk.getColumn().getName());
-        assertEquals(TABLE_4_COLUMNS_BRIEF_0_DTO.getInternalName(), table3pk.getColumn().getInternalName());
-        assertEquals(ColumnTypeDto.TIMESTAMP, table3pk.getColumn().getColumnType());
-        assertNull(table3pk.getColumn().getAlias());
-        assertEquals(TABLE_4_ID, table3pk.getColumn().getTableId());
-        assertEquals(DATABASE_1_ID, table3pk.getColumn().getDatabaseId());
+        assertEquals(DATABASE_1_ID, table3.getDatabaseId());
+        assertEquals(TABLE_4_SCHEMA_PUBLIC, table3.getIsSchemaPublic());
     }
 
     public static Stream<Arguments> nameToInternalName_parameters() {
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java
index 6a01ae6fec9e06d679fc848af0b697fcfbeba3df..1b8419612e2674b43c29c4c377f88ca38b3c7784 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/AuthenticationPrivilegedIntegrationMvcTest.java
@@ -28,7 +28,9 @@ import org.testcontainers.junit.jupiter.Container;
 import org.testcontainers.junit.jupiter.Testcontainers;
 
 import java.util.List;
+import java.util.Optional;
 
+import static org.mockito.Mockito.when;
 import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
@@ -81,7 +83,7 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest
         genesis();
         /* metadata database */
         licenseRepository.save(LICENSE_1);
-        userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4));
+        userRepository.saveAll(List.of(USER_1, USER_2, USER_3, USER_4, USER_LOCAL));
         containerRepository.save(CONTAINER_1);
         databaseRepository.save(DATABASE_1);
         /* keycloak */
@@ -114,7 +116,9 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest
                 .andDo(print())
                 .andExpect(header().string("X-Username", CONTAINER_1_PRIVILEGED_USERNAME))
                 .andExpect(header().string("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD))
-                .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password"))
+                .andExpect(header().string("X-Host", CONTAINER_1_HOST))
+                .andExpect(header().string("X-Port", "" + CONTAINER_1_PORT))
+                .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port"))
                 .andExpect(status().isOk());
     }
 
@@ -127,7 +131,9 @@ public class AuthenticationPrivilegedIntegrationMvcTest extends AbstractUnitTest
                 .andDo(print())
                 .andExpect(header().string("X-Username", CONTAINER_1_PRIVILEGED_USERNAME))
                 .andExpect(header().string("X-Password", CONTAINER_1_PRIVILEGED_PASSWORD))
-                .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password"))
+                .andExpect(header().string("X-Host", CONTAINER_1_HOST))
+                .andExpect(header().string("X-Port", "" + CONTAINER_1_PORT))
+                .andExpect(header().string("Access-Control-Expose-Headers", "X-Username X-Password X-Host X-Port"))
                 .andExpect(status().isOk());
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java
index 9c79f01d66c07e36b22d1ab112464b7d3943a693..96af6cfa8d14e4974a4afb8e410d9cc9a29bbbeb 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/mvc/MetadataEndpointMvcTest.java
@@ -96,7 +96,7 @@ public class MetadataEndpointMvcTest extends AbstractUnitTest {
                 .andDo(print())
                 .andExpect(content().contentType("text/xml;charset=UTF-8"))
                 .andExpect(xpath("//request[@verb='ListIdentifiers']").exists())
-                .andExpect(xpath("//header[1]/identifier").string("oai:" + IDENTIFIER_1_ID))
+                .andExpect(xpath("//header[1]/identifier").string("doi:" + IDENTIFIER_1_DOI))
                 .andExpect(xpath("//header[2]/identifier").string("oai:" + IDENTIFIER_2_ID))
                 .andExpect(xpath("//header[3]/identifier").string("oai:" + IDENTIFIER_3_ID))
                 .andExpect(xpath("//header[4]/identifier").string("oai:" + IDENTIFIER_4_ID))
@@ -127,7 +127,7 @@ public class MetadataEndpointMvcTest extends AbstractUnitTest {
                 .andExpect(content().contentType("text/xml;charset=UTF-8"))
                 .andExpect(xpath("//request[@verb='GetRecord']").exists())
                 .andExpect(xpath("//request[@identifier='oai:" + IDENTIFIER_1_ID + "']").exists())
-                .andExpect(xpath("//identifier").string("oai:" + IDENTIFIER_1_ID))
+                .andExpect(xpath("//identifier").string("doi:" + IDENTIFIER_1_DOI))
                 .andExpect(status().isOk());
     }
 
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
index 648bb6ab290b319a817aba31d49310d43416e4a3..a319044d3909efc8f87f703c9f6658e1d6be8b5b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DataCiteIdentifierServicePersistenceTest.java
@@ -210,7 +210,7 @@ public class DataCiteIdentifierServicePersistenceTest extends AbstractUnitTest {
 
         /* test */
         final Identifier response = dataCiteIdentifierService.create(DATABASE_1, USER_1, IDENTIFIER_1_CREATE_WITH_DOI_DTO);
-        assertEquals(IDENTIFIER_1_DOI_NOT_NULL, response.getDoi());
+        assertEquals(IDENTIFIER_1_DOI, response.getDoi());
     }
 
     @Test
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java
index 436ccd18794fe1ba46e772c65c785ec4f1240f32..b324a94c9e1c9ba8346eb4d3e3c6a81ecc7cad0b 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServicePersistenceTest.java
@@ -1,7 +1,7 @@
 package at.tuwien.service;
 
 import at.tuwien.entities.database.Database;
-import at.tuwien.exception.*;
+import at.tuwien.exception.DatabaseNotFoundException;
 import at.tuwien.repository.ContainerRepository;
 import at.tuwien.repository.DatabaseRepository;
 import at.tuwien.repository.LicenseRepository;
@@ -19,7 +19,8 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
-import static org.junit.jupiter.api.Assertions.*;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 @Log4j2
 @SpringBootTest
@@ -81,13 +82,13 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest {
         assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry());
         assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort());
         /* creator */
-        assertNotNull(response.getCreator());
-        assertEquals(USER_1_ID, response.getCreator().getId());
-        assertEquals(USER_1_USERNAME, response.getCreator().getUsername());
-        assertEquals(USER_1_EMAIL, response.getCreator().getEmail());
-        assertEquals(USER_1_THEME, response.getCreator().getTheme());
-        assertEquals(USER_1_LANGUAGE, response.getCreator().getLanguage());
-        assertNotNull(response.getCreator().getAccesses());
+        assertNotNull(response.getOwner());
+        assertEquals(USER_1_ID, response.getOwner().getId());
+        assertEquals(USER_1_USERNAME, response.getOwner().getUsername());
+        assertEquals(USER_1_EMAIL, response.getOwner().getEmail());
+        assertEquals(USER_1_THEME, response.getOwner().getTheme());
+        assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage());
+        assertNotNull(response.getOwner().getAccesses());
     }
 
     @Test
@@ -119,13 +120,13 @@ public class DatabaseServicePersistenceTest extends AbstractUnitTest {
         assertEquals(IMAGE_1_REGISTRY, response.getContainer().getImage().getRegistry());
         assertEquals(IMAGE_1_PORT, response.getContainer().getImage().getDefaultPort());
         /* creator */
-        assertNotNull(response.getCreator());
-        assertEquals(USER_1_ID, response.getCreator().getId());
-        assertEquals(USER_1_USERNAME, response.getCreator().getUsername());
-        assertEquals(USER_1_EMAIL, response.getCreator().getEmail());
-        assertEquals(USER_1_THEME, response.getCreator().getTheme());
-        assertEquals(USER_1_LANGUAGE, response.getCreator().getLanguage());
-        assertNotNull(response.getCreator().getAccesses());
+        assertNotNull(response.getOwner());
+        assertEquals(USER_1_ID, response.getOwner().getId());
+        assertEquals(USER_1_USERNAME, response.getOwner().getUsername());
+        assertEquals(USER_1_EMAIL, response.getOwner().getEmail());
+        assertEquals(USER_1_THEME, response.getOwner().getTheme());
+        assertEquals(USER_1_LANGUAGE, response.getOwner().getLanguage());
+        assertNotNull(response.getOwner().getAccesses());
     }
 
 }
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
index 8f37dde792c63c54334682e8d830761459fb235b..b0919f816a0b3aa0cbaad90aa62093987c54eabd 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceUnitTest.java
@@ -158,7 +158,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
             SearchServiceConnectionException {
 
         /* test */
-        generic_modifyVisibility(DATABASE_1, true);
+        generic_modifyVisibility(DATABASE_1, true, true);
     }
 
     @Test
@@ -172,7 +172,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(SearchServiceException.class, () -> {
-            generic_modifyVisibility(DATABASE_1, true);
+            generic_modifyVisibility(DATABASE_1, true, true);
         });
     }
 
@@ -187,7 +187,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(DatabaseNotFoundException.class, () -> {
-            generic_modifyVisibility(DATABASE_1, true);
+            generic_modifyVisibility(DATABASE_1, true, true);
         });
     }
 
@@ -202,7 +202,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
 
         /* test */
         assertThrows(SearchServiceConnectionException.class, () -> {
-            generic_modifyVisibility(DATABASE_1, true);
+            generic_modifyVisibility(DATABASE_1, true, true);
         });
     }
 
@@ -285,12 +285,10 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         assertNotNull(response.getViews());
         assertNotNull(response.getAccesses());
         assertNotNull(response.getIdentifiers());
-        assertNotNull(response.getCreatedBy());
-        assertNotNull(response.getCreator());
+        assertNotNull(response.getOwnedBy());
+        assertNotNull(response.getOwner());
         assertNotNull(response.getContactPerson());
         assertNotNull(response.getContact());
-        assertNotNull(response.getCreatedBy());
-        assertNotNull(response.getOwner());
         assertNotNull(response.getImage());
         assertNotNull(response.getExchangeName());
         return response;
@@ -309,8 +307,8 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         return response;
     }
 
-    protected Database generic_modifyVisibility(Database database, Boolean isPublic) throws DatabaseNotFoundException,
-            SearchServiceException, SearchServiceConnectionException {
+    protected Database generic_modifyVisibility(Database database, Boolean isPublic, Boolean isSchemaPublic)
+            throws DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException {
 
         /* mock */
         when(databaseRepository.save(any(Database.class)))
@@ -319,6 +317,7 @@ public class DatabaseServiceUnitTest extends AbstractUnitTest {
         /* test */
         final Database response = databaseService.modifyVisibility(database, DatabaseModifyVisibilityDto.builder()
                 .isPublic(isPublic)
+                .isSchemaPublic(isSchemaPublic)
                 .build());
         assertNotNull(response);
         return response;
diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
index 246ae7de1a4beb7a55f4cadf13f142b48ef995fd..48da5206bbd8ddeb4125605891a7b4bef1e0f1f6 100644
--- a/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
+++ b/dbrepo-metadata-service/rest-service/src/test/java/at/tuwien/service/IdentifierServicePersistenceTest.java
@@ -487,7 +487,7 @@ public class IdentifierServicePersistenceTest extends AbstractUnitTest {
         /* test */
         final Identifier response = identifierService.create(DATABASE_1, USER_1, IDENTIFIER_1_CREATE_WITH_DOI_DTO);
         assertEquals(8L, response.getId());
-        assertEquals(IDENTIFIER_1_DOI_NOT_NULL, response.getDoi());
+        assertEquals(IDENTIFIER_1_DOI, response.getDoi());
     }
 
     @Test
diff --git a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json
index 3d557e3201e6a9bd8cbcb5fee0946110331b390e..250db21b8f997330463558b8540a23d2f4521778 100644
--- a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json
+++ b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata0.json
@@ -22,7 +22,5 @@
       "name_identifier": "00000-00000-00000",
       "name_identifier_scheme": "ORCID"
     }
-  ],
-  "created": "2022-01-07T20:45:52.000+00:00",
-  "last_modified": "2018-11-07T10:59:12.000+00:00"
+  ]
 }
\ No newline at end of file
diff --git a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json
index 63b43d09f57d426fcc02c15ce1af032a69760a18..2a0da11e13c832bb1c9578e6982733fb2eb51c3f 100644
--- a/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json
+++ b/dbrepo-metadata-service/rest-service/src/test/resources/json/metadata1.json
@@ -2,6 +2,7 @@
   "id": 1,
   "query_id": 1,
   "type": "subset",
+  "doi": "10.12345/183",
   "titles": [
     {
       "id": 1,
@@ -24,7 +25,6 @@
   ],
   "query": "SELECT `id` FROM `foobar`",
   "query_normalized": "SELECT `id` FROM `foobar`",
-  "doi": null,
   "query_hash": "abc",
   "execution": "2018-11-07T10:59:12.000+00:00",
   "result_hash": "def",
@@ -51,7 +51,5 @@
     }
   ],
   "publication_month": 5,
-  "publication_year": 2022,
-  "created": "2022-01-07T20:45:52.000+00:00",
-  "last_modified": "2018-11-07T10:59:12.000+00:00"
+  "publication_year": 2022
 }
\ No newline at end of file
diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml
index d98e575eb94e6893b67125b2898fcca4a097a151..bb101e9af6539a35e1c761f708392057e48afeea 100644
--- a/dbrepo-metadata-service/services/pom.xml
+++ b/dbrepo-metadata-service/services/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <artifactId>dbrepo-metadata-service</artifactId>
         <groupId>at.tuwien</groupId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-services</artifactId>
     <name>dbrepo-metadata-service-services</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java
index 91fb96e5f93ca5f4fd17c120d2f8f00703f3a3e3..621ee53dfefdf7668c2c18ee45866c50202697ee 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/DataServiceGateway.java
@@ -10,6 +10,7 @@ import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.database.table.TableStatisticDto;
+import at.tuwien.api.database.table.TableUpdateDto;
 import at.tuwien.api.user.internal.UpdateUserPasswordDto;
 import at.tuwien.exception.*;
 
@@ -75,6 +76,9 @@ public interface DataServiceGateway {
     void updateDatabase(Long databaseId, UpdateUserPasswordDto data) throws DataServiceConnectionException,
             DataServiceException, DatabaseNotFoundException;
 
+    void updateTable(Long databaseId, Long tableId, TableUpdateDto data) throws DataServiceConnectionException,
+            DataServiceException, DatabaseNotFoundException;
+
     /**
      * Creates a table in a given database.
      * @param databaseId The database id.
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java
index 709537862a77b5bb6bccb5be4cae5d26f5622121..09ad1e55da73ed27c0d79b4ed8eae550532ae9ac 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/DataServiceGatewayImpl.java
@@ -7,6 +7,7 @@ import at.tuwien.api.database.query.QueryDto;
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.TableDto;
 import at.tuwien.api.database.table.TableStatisticDto;
+import at.tuwien.api.database.table.TableUpdateDto;
 import at.tuwien.api.user.internal.UpdateUserPasswordDto;
 import at.tuwien.config.GatewayConfig;
 import at.tuwien.exception.*;
@@ -159,6 +160,30 @@ public class DataServiceGatewayImpl implements DataServiceGateway {
         }
     }
 
+    @Override
+    public void updateTable(Long databaseId, Long tableId, TableUpdateDto data) throws DataServiceConnectionException,
+            DataServiceException, DatabaseNotFoundException {
+        final ResponseEntity<Void> response;
+        final String path = "/api/database/" + databaseId + "/table/" + tableId;
+        log.trace("update table at endpoint {} with path {}", gatewayConfig.getDataEndpoint(), path);
+        try {
+            response = restTemplate.exchange(path, HttpMethod.PUT, new HttpEntity<>(data), Void.class);
+        } catch (HttpServerErrorException e) {
+            log.error("Failed to update table in database: {}", e.getMessage());
+            throw new DataServiceConnectionException("Failed to update table in database: " + e.getMessage(), e);
+        } catch (HttpClientErrorException.NotFound e) {
+            log.error("Failed to update table in database: not found: {}", e.getMessage());
+            throw new DatabaseNotFoundException("Failed to update table in database: not found: " + e.getMessage(), e);
+        } catch (HttpClientErrorException.BadRequest | HttpClientErrorException.Unauthorized e) {
+            log.error("Failed to update table in database: {}", e.getMessage());
+            throw new DataServiceException("Failed to update table in database: " + e.getMessage(), e);
+        }
+        if (!response.getStatusCode().equals(HttpStatus.ACCEPTED)) {
+            log.error("Failed to update table in database: wrong http code: {}", response.getStatusCode());
+            throw new DataServiceException("Failed to update table in database: wrong http code: " + response.getStatusCode());
+        }
+    }
+
     @Override
     public void createTable(Long databaseId, TableCreateDto data) throws DataServiceConnectionException, DataServiceException,
             DatabaseNotFoundException, TableExistsException {
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
index d97483beb1cac9e590b43a2cdf409067f8eb4d74..0f14b8d34826fe94829146f53a0cc22fb9e97333 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/gateway/impl/SearchServiceGatewayImpl.java
@@ -3,7 +3,9 @@ package at.tuwien.gateway.impl;
 import at.tuwien.api.database.DatabaseDto;
 import at.tuwien.config.GatewayConfig;
 import at.tuwien.entities.database.Database;
-import at.tuwien.exception.*;
+import at.tuwien.exception.DatabaseNotFoundException;
+import at.tuwien.exception.SearchServiceConnectionException;
+import at.tuwien.exception.SearchServiceException;
 import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import lombok.extern.log4j.Log4j2;
@@ -42,7 +44,7 @@ public class SearchServiceGatewayImpl implements SearchServiceGateway {
         log.trace("update database at endpoint {} with path {}", gatewayConfig.getSearchEndpoint(), path);
         try {
             response = restTemplate.exchange(path, HttpMethod.PUT, new HttpEntity<>(
-                    metadataMapper.customDatabaseToDatabaseDto(database), headers), DatabaseDto.class);
+                    metadataMapper.databaseToPrivilegedDatabaseDto(database), headers), DatabaseDto.class);
         } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable |
                  HttpServerErrorException.InternalServerError e) {
             log.error("Failed to update database: {}", e.getMessage());
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java
index e4767219063b8e9ee504a404be0bbfcf806270d9..9a5c395c72abd23198c1e8d59daf346e42916fb0 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/TableService.java
@@ -1,11 +1,13 @@
 package at.tuwien.service;
 
 import at.tuwien.api.database.table.TableCreateDto;
+import at.tuwien.api.database.table.TableUpdateDto;
 import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.database.table.columns.TableColumn;
 import at.tuwien.exception.*;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.security.Principal;
 
@@ -49,6 +51,10 @@ public interface TableService {
      */
     void deleteTable(Table table) throws DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException, SearchServiceConnectionException;
 
+    Table updateTable(Table table, TableUpdateDto data) throws DataServiceException,
+            DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException,
+            SearchServiceConnectionException;
+
     TableColumn update(TableColumn column, ColumnSemanticsUpdateDto updateDto) throws DataServiceException,
             DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, MalformedException, OntologyNotFoundException, SemanticEntityNotFoundException;
 
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java
index a090ece3cb1182f23e37fcf3ba6821ab6254bd02..9ec30b74f2efd58886269f8e8994f4852ead827e 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/ViewService.java
@@ -1,10 +1,12 @@
 package at.tuwien.service;
 
 import at.tuwien.api.database.ViewCreateDto;
+import at.tuwien.api.database.ViewUpdateDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
 import at.tuwien.entities.user.User;
 import at.tuwien.exception.*;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -43,7 +45,29 @@ public interface ViewService {
      * @param user     The user.
      * @param data     The given query.
      * @return The view that was created.
+     * @throws MalformedException
+     * @throws DataServiceException
+     * @throws DataServiceConnectionException
+     * @throws DatabaseNotFoundException
+     * @throws SearchServiceException
+     * @throws SearchServiceConnectionException
+     * @throws ViewNotFoundException
      */
     View create(Database database, User user, ViewCreateDto data) throws MalformedException, DataServiceException,
-            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException;
+            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException,
+            SearchServiceConnectionException;
+
+    /**
+     * @param database
+     * @param view
+     * @param data
+     * @return
+     * @throws DataServiceConnectionException
+     * @throws DatabaseNotFoundException
+     * @throws SearchServiceException
+     * @throws SearchServiceConnectionException
+     * @throws ViewNotFoundException
+     */
+    View update(Database database, View view, ViewUpdateDto data) throws DataServiceConnectionException,
+            DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, ViewNotFoundException;
 }
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
index b6af9018118f0e502feb1452b8a4838e9baadb34..b3f98b01bbb2d406738d314fd15333727aaf4885 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/AccessServiceImpl.java
@@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.security.Principal;
 import java.util.List;
 import java.util.Optional;
 
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
index 330d4518dedba7e1e5e78f25a7433c18762fd579..9ffa720d4d94acc38ebe1652624aa8956f80ae83 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceImpl.java
@@ -11,7 +11,6 @@ import at.tuwien.entities.container.Container;
 import at.tuwien.entities.database.*;
 import at.tuwien.entities.database.table.Table;
 import at.tuwien.entities.database.table.columns.TableColumn;
-import at.tuwien.entities.database.table.constraints.Constraints;
 import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKey;
 import at.tuwien.entities.database.table.constraints.foreignKey.ForeignKeyReference;
 import at.tuwien.entities.database.table.constraints.primaryKey.PrimaryKey;
@@ -22,14 +21,17 @@ import at.tuwien.gateway.DataServiceGateway;
 import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.DatabaseRepository;
-import at.tuwien.service.*;
+import at.tuwien.service.DatabaseService;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.*;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+import java.util.UUID;
 
 @Log4j2
 @Service
@@ -88,14 +90,13 @@ public class DatabaseServiceImpl implements DatabaseService {
             SearchServiceException, SearchServiceConnectionException {
         Database database = Database.builder()
                 .isPublic(data.getIsPublic())
+                .isSchemaPublic(data.getIsSchemaPublic())
                 .name(data.getName())
                 .internalName(metadataMapper.nameToInternalName(data.getName()) + "_" + RandomStringUtils.randomAlphabetic(4).toLowerCase())
                 .cid(data.getCid())
                 .container(container)
                 .ownedBy(user.getId())
                 .owner(user)
-                .createdBy(user.getId())
-                .creator(user)
                 .contactPerson(user.getId())
                 .contact(user)
                 .tables(new LinkedList<>())
@@ -155,6 +156,10 @@ public class DatabaseServiceImpl implements DatabaseService {
             throws DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException {
         /* update in metadata database */
         database.setIsPublic(data.getIsPublic());
+        database.setIsSchemaPublic(data.getIsSchemaPublic());
+        log.debug("visibility change affects {} table(s)", database.getTables().stream().filter(t -> !t.getIsSchemaPublic().equals(data.getIsSchemaPublic())).count());
+        database.getTables()
+                .forEach(table -> table.setIsSchemaPublic(data.getIsSchemaPublic()));
         database = databaseRepository.save(database);
         /* update in open search service */
         searchServiceGateway.update(database);
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java
index df0f895f5d2d3512444b2d3e10e28e14a70e2c45..0682225e8ad28c1ea0e2fd93c9b6efd9c1366d26 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/IdentifierServiceImpl.java
@@ -2,7 +2,10 @@ package at.tuwien.service.impl;
 
 import at.tuwien.ExportResourceDto;
 import at.tuwien.api.database.query.QueryDto;
-import at.tuwien.api.identifier.*;
+import at.tuwien.api.identifier.BibliographyTypeDto;
+import at.tuwien.api.identifier.IdentifierCreateDto;
+import at.tuwien.api.identifier.IdentifierSaveDto;
+import at.tuwien.api.identifier.IdentifierTypeDto;
 import at.tuwien.config.MetadataConfig;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.LanguageType;
@@ -16,7 +19,8 @@ import at.tuwien.gateway.DataServiceGateway;
 import at.tuwien.gateway.SearchServiceGateway;
 import at.tuwien.mapper.MetadataMapper;
 import at.tuwien.repository.IdentifierRepository;
-import at.tuwien.service.*;
+import at.tuwien.service.IdentifierService;
+import at.tuwien.service.ViewService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.springframework.core.io.InputStreamResource;
@@ -27,7 +31,10 @@ import org.thymeleaf.context.Context;
 import org.thymeleaf.exceptions.TemplateInputException;
 
 import java.nio.charset.Charset;
-import java.util.*;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Stream;
 
 @Slf4j
@@ -159,8 +166,8 @@ public class IdentifierServiceImpl implements IdentifierService {
             SearchServiceConnectionException, IdentifierNotFoundException, ViewNotFoundException {
         final Identifier identifier = find(data.getId());
         identifier.setDatabase(database);
-        identifier.setCreatedBy(user.getId());
-        identifier.setCreator(user);
+        identifier.setOwnedBy(user.getId());
+        identifier.setOwner(user);
         identifier.setStatus(IdentifierStatusType.DRAFT);
         /* set from data */
         identifier.setTableId(data.getTableId());
@@ -227,8 +234,8 @@ public class IdentifierServiceImpl implements IdentifierService {
             SearchServiceConnectionException, IdentifierNotFoundException, ViewNotFoundException {
         final Identifier identifier = metadataMapper.identifierCreateDtoToIdentifier(data);
         identifier.setDatabase(database);
-        identifier.setCreatedBy(user.getId());
-        identifier.setCreator(user);
+        identifier.setOwnedBy(user.getId());
+        identifier.setOwner(user);
         identifier.setStatus(IdentifierStatusType.DRAFT);
         /* create in metadata database */
         if (data.getCreators() != null) {
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 4866fea2c10b8afa3bb4f93f2eedb3d2aa8f1ad7..4a4a9ccaca7dedfc88f15db944c474cc5882e400 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
@@ -2,6 +2,7 @@ package at.tuwien.service.impl;
 
 import at.tuwien.api.database.table.TableCreateDto;
 import at.tuwien.api.database.table.TableStatisticDto;
+import at.tuwien.api.database.table.TableUpdateDto;
 import at.tuwien.api.database.table.columns.ColumnCreateDto;
 import at.tuwien.api.database.table.columns.ColumnStatisticDto;
 import at.tuwien.api.database.table.columns.concepts.ColumnSemanticsUpdateDto;
@@ -109,12 +110,12 @@ public class TableServiceImpl implements TableService {
                 .queueName(rabbitConfig.getQueueName())
                 .tdbid(database.getId())
                 .database(database)
-                .createdBy(owner.getId())
-                .creator(owner)
                 .ownedBy(owner.getId())
                 .owner(owner)
                 .numRows(0L)
                 .dataLength(0L)
+                .isPublic(data.getIsPublic())
+                .isSchemaPublic(data.getIsSchemaPublic())
                 .identifiers(new LinkedList<>())
                 .columns(new LinkedList<>())
                 .build();
@@ -200,6 +201,34 @@ public class TableServiceImpl implements TableService {
         log.info("Deleted table with id {}", table.getId());
     }
 
+    @Transactional
+    @Override
+    public Table updateTable(Table table, TableUpdateDto data) throws DataServiceException,
+            DataServiceConnectionException, DatabaseNotFoundException, TableNotFoundException, SearchServiceException,
+            SearchServiceConnectionException {
+        /* update at data service */
+        dataServiceGateway.updateTable(table.getDatabase().getId(), table.getId(), data);
+        /* update in metadata database */
+        final Optional<Table> optional = table.getDatabase()
+                .getTables()
+                .stream()
+                .filter(t -> t.getId().equals(table.getId()))
+                .findFirst();
+        if (optional.isEmpty()) {
+            log.error("Failed to find table with id {}", table.getId());
+            throw new TableNotFoundException("Failed to find table with id " + table.getId());
+        }
+        final Table tableEntity = optional.get();
+        tableEntity.setIsPublic(data.getIsPublic());
+        tableEntity.setDescription(data.getDescription());
+        tableEntity.setIsSchemaPublic(data.getIsSchemaPublic());
+        final Database database = databaseRepository.save(table.getDatabase());
+        /* update in search service */
+        searchServiceGateway.update(database);
+        log.info("Updated table with id {}", table.getId());
+        return tableEntity;
+    }
+
     @Override
     @Transactional
     public TableColumn update(TableColumn column, ColumnSemanticsUpdateDto data) throws DataServiceException,
diff --git a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
index 17a2c26d8929e6e89d220427100e1124c75b92b8..b0a8f017962ccc808d8f3d1a37ae584fb1106316 100644
--- a/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
+++ b/dbrepo-metadata-service/services/src/main/java/at/tuwien/service/impl/ViewServiceImpl.java
@@ -2,6 +2,7 @@ package at.tuwien.service.impl;
 
 import at.tuwien.api.database.ViewCreateDto;
 import at.tuwien.api.database.ViewDto;
+import at.tuwien.api.database.ViewUpdateDto;
 import at.tuwien.entities.database.Database;
 import at.tuwien.entities.database.View;
 import at.tuwien.entities.user.User;
@@ -64,7 +65,7 @@ public class ViewServiceImpl implements ViewService {
         }
         return database.getViews()
                 .stream()
-                .filter(v -> v.getIsPublic() || v.getCreatedBy().equals(user.getId()))
+                .filter(v -> v.getIsPublic() || v.getOwnedBy().equals(user.getId()))
                 .toList();
     }
 
@@ -86,16 +87,17 @@ public class ViewServiceImpl implements ViewService {
 
     @Override
     @Transactional
-    public View create(Database database, User creator, ViewCreateDto data) throws MalformedException, DataServiceException,
-            DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException {
+    public View create(Database database, User creator, ViewCreateDto data) throws MalformedException,
+            DataServiceException, DataServiceConnectionException, DatabaseNotFoundException, SearchServiceException,
+            SearchServiceConnectionException {
         /* create in metadata database */
         final View view = View.builder()
                 .vdbid(database.getId())
                 .database(database)
                 .name(data.getName())
                 .internalName(metadataMapper.nameToInternalName(data.getName()))
-                .createdBy(creator.getId())
-                .creator(creator)
+                .ownedBy(creator.getId())
+                .owner(creator)
                 .identifiers(new LinkedList<>())
                 .query(data.getQuery())
                 .queryHash(Hashing.sha256()
@@ -103,6 +105,7 @@ public class ViewServiceImpl implements ViewService {
                         .toString())
                 .columns(new LinkedList<>())
                 .isInitialView(false)
+                .isSchemaPublic(data.getIsSchemaPublic())
                 .isPublic(data.getIsPublic())
                 .build();
         /* create in data service */
@@ -131,4 +134,26 @@ public class ViewServiceImpl implements ViewService {
         return optional.get();
     }
 
+    @Override
+    @Transactional
+    public View update(Database database, View view, ViewUpdateDto data) throws DataServiceConnectionException,
+            DatabaseNotFoundException, SearchServiceException, SearchServiceConnectionException, ViewNotFoundException {
+        final Optional<View> optional = database.getViews()
+                .stream()
+                .filter(v -> v.getInternalName().equals(view.getInternalName()))
+                .findFirst();
+        if (optional.isEmpty()) {
+            log.error("Failed to find view");
+            throw new ViewNotFoundException("Failed to find view");
+        }
+        final View tmpView = optional.get();
+        tmpView.setIsPublic(data.getIsPublic());
+        tmpView.setIsSchemaPublic(data.getIsSchemaPublic());
+        database = databaseRepository.save(database);
+        /* update in search service */
+        searchServiceGateway.update(database);
+        log.info("Updated view with id {}", tmpView.getId());
+        return optional.get();
+    }
+
 }
diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml
index dcccbef8f8083ac032d5f4c14618e3661e4efb86..cdb1783c840fcf2e088e5a7d8f29bc67a3d5693d 100644
--- a/dbrepo-metadata-service/test/pom.xml
+++ b/dbrepo-metadata-service/test/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>at.tuwien</groupId>
         <artifactId>dbrepo-metadata-service</artifactId>
-        <version>1.5.2</version>
+        <version>1.6.0</version>
     </parent>
 
     <artifactId>dbrepo-metadata-service-test</artifactId>
     <name>dbrepo-metadata-service-test</name>
-    <version>1.5.2</version>
+    <version>1.6.0</version>
 
     <dependencies>
         <dependency>
diff --git a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
index 8e613cfa7cad69c2de42d96ccacee6957e5f7939..b8c66fa6b75b9041dc61b1d6bebd0f67345f6042 100644
--- a/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
+++ b/dbrepo-metadata-service/test/src/main/java/at/tuwien/test/AbstractUnitTest.java
@@ -9,11 +9,13 @@ import java.util.List;
 public abstract class AbstractUnitTest extends BaseTest {
 
     public void genesis() {
+        CONTAINER_1_PRIVILEGED_DTO.setImage(IMAGE_1_DTO);
         IMAGE_1.setOperators(new LinkedList<>(IMAGE_1_OPERATORS));
         CONTAINER_1.setDatabases(new LinkedList<>(List.of(DATABASE_1, DATABASE_2, DATABASE_3)));
         CONTAINER_4.setDatabases(new LinkedList<>(List.of(DATABASE_4)));
         /* USER_1 */
         USER_1.setAccesses(new LinkedList<>());
+        USER_1.setTheme(USER_1_THEME);
         /* USER_2 */
         USER_2.setAccesses(new LinkedList<>());
         /* USER_3 */
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 4586f68d4f9c2d809bb568c0c5e878e86ca345d8..b0fcead7ed246f2e78afd6adfa4635ac2e59dfdf 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
@@ -107,7 +107,7 @@ import static java.time.temporal.ChronoUnit.HOURS;
 import static java.time.temporal.ChronoUnit.MINUTES;
 
 /**
- * Database 1 (Private, User 1) -> Container 1
+ * Database 1 (Private Data, Private Schema, User 1) -> Container 1
  * <ul>
  * <li>Table 1</li>
  * <li>Table 2</li>
@@ -123,7 +123,7 @@ import static java.time.temporal.ChronoUnit.MINUTES;
  * <li>Identifier 4 (Title=en, Description=en, type=table, tableId=1)</li>
  * </ul>
  * <p>
- * Database 2 (Private, User 2) -> Container 1
+ * Database 2 (Private Data, Public Schema, User 2) -> Container 1
  * <ul>
  * <li>Table 5</li>
  * <li>Table 6</li>
@@ -134,7 +134,7 @@ import static java.time.temporal.ChronoUnit.MINUTES;
  * <li>Identifier 5 (Title=de, Description=de)</li>
  * </ul>
  * <p>
- * Database 3 (Public, User 3) -> Container 1
+ * Database 3 (Public Data, Private Schema, User 3) -> Container 1
  * <ul>
  * <li>Table 8</li>
  * <li>Query 3</li>
@@ -144,7 +144,7 @@ import static java.time.temporal.ChronoUnit.MINUTES;
  * <li>Identifier 6 (Title=en, Description=en, Query=3)</li>
  * </ul>
  * <p>
- * Database 4 (Public, User 4) -> Container 4
+ * Database 4 (Public Data, Public Schema, User 4) -> Container 4
  * <li>Identifier 7 (Database=4)</li>
  * <ul>
  * </ul>
@@ -160,6 +160,9 @@ public abstract class BaseTest {
     public final static String[] DEFAULT_SEMANTICS_HANDLING = new String[]{"default-semantics-handling",
             "create-semantic-unit", "execute-semantic-query", "table-semantic-analyse", "create-semantic-concept"};
 
+    public final static String[] DEFAULT_VIEW_HANDLING = new String[]{"update-database-view", "create-database-view",
+            "delete-database-view", "list-database-views", "modify-view-visibility", "find-database-view"};
+
     public final static String[] ESCALATED_SEMANTICS_HANDLING = new String[]{"escalated-semantics-handling",
             "update-semantic-concept", "modify-foreign-table-column-semantics", "delete-ontology", "list-ontologies",
             "update-semantic-unit", "create-ontology", "update-ontology"};
@@ -193,7 +196,7 @@ public abstract class BaseTest {
 
     public final static String[] DEFAULT_TABLE_HANDLING = new String[]{"default-table-handling",
             "list-tables", "create-table", "modify-table-column-semantics", "find-table", "delete-table",
-            "update-table-statistic"};
+            "update-table-statistic", "update-table"};
 
     public final static String[] ESCALATED_TABLE_HANDLING = new String[]{"escalated-table-handling",
             "delete-foreign-table"};
@@ -205,16 +208,16 @@ public abstract class BaseTest {
 
     public final static String[] DEFAULT_RESEARCHER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-researcher-roles"},
             DEFAULT_CONTAINER_HANDLING, DEFAULT_DATABASE_HANDLING, DEFAULT_IDENTIFIER_HANDLING, DEFAULT_QUERY_HANDLING,
-            DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, DEFAULT_SEMANTICS_HANDLING));
+            DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, DEFAULT_SEMANTICS_HANDLING, DEFAULT_VIEW_HANDLING));
 
     public final static String[] DEFAULT_DEVELOPER_ROLES = ArrayUtils.merge(List.of(new String[]{"default-developer-roles"},
             DEFAULT_CONTAINER_HANDLING, DEFAULT_DATABASE_HANDLING, DEFAULT_IDENTIFIER_HANDLING, DEFAULT_QUERY_HANDLING,
             DEFAULT_TABLE_HANDLING, DEFAULT_USER_HANDLING, ESCALATED_USER_HANDLING, ESCALATED_CONTAINER_HANDLING,
             ESCALATED_DATABASE_HANDLING, ESCALATED_IDENTIFIER_HANDLING, ESCALATED_QUERY_HANDLING,
-            ESCALATED_TABLE_HANDLING));
+            ESCALATED_TABLE_HANDLING, DEFAULT_VIEW_HANDLING));
 
     public final static String[] DEFAULT_DATA_STEWARD_ROLES = ArrayUtils.merge(List.of(new String[]{"default-data-steward-roles"},
-            ESCALATED_IDENTIFIER_HANDLING, DEFAULT_SEMANTICS_HANDLING, ESCALATED_SEMANTICS_HANDLING));
+            ESCALATED_IDENTIFIER_HANDLING, DEFAULT_SEMANTICS_HANDLING, ESCALATED_SEMANTICS_HANDLING, DEFAULT_VIEW_HANDLING));
 
     public final static String[] DEFAULT_LOCAL_ADMIN_ROLES = new String[]{"admin"};
 
@@ -393,6 +396,9 @@ public abstract class BaseTest {
     public final static UUID USER_LOCAL_ADMIN_ID = UUID.fromString("a54dcb2e-a644-4e82-87e7-05a96413983d");
     public final static String USER_LOCAL_ADMIN_USERNAME = "admin";
     public final static String USER_LOCAL_ADMIN_PASSWORD = "admin";
+    public final static String USER_LOCAL_ADMIN_THEME = "dark";
+    public final static String USER_LOCAL_ADMIN_EMAIL = "admin@local";
+    public final static String USER_LOCAL_ADMIN_MARIADB_PASSWORD = "*440BA4FD1A87A0999647DB67C0EE258198B247BA";
 
     public final static UserDetails USER_LOCAL_ADMIN_DETAILS = UserDetailsDto.builder()
             .username(USER_LOCAL_ADMIN_USERNAME)
@@ -400,6 +406,14 @@ public abstract class BaseTest {
             .authorities(AUTHORITY_DEFAULT_LOCAL_ADMIN_AUTHORITIES)
             .build();
 
+    public final static User USER_LOCAL = User.builder()
+            .id(USER_LOCAL_ADMIN_ID)
+            .username(USER_LOCAL_ADMIN_USERNAME)
+            .email(USER_LOCAL_ADMIN_EMAIL)
+            .mariadbPassword(USER_LOCAL_ADMIN_MARIADB_PASSWORD)
+            .theme(USER_LOCAL_ADMIN_THEME)
+            .build();
+
     public final static Principal USER_LOCAL_ADMIN_PRINCIPAL = new UsernamePasswordAuthenticationToken(USER_LOCAL_ADMIN_DETAILS,
             USER_LOCAL_ADMIN_PASSWORD, USER_LOCAL_ADMIN_DETAILS.getAuthorities());
 
@@ -529,6 +543,7 @@ public abstract class BaseTest {
             .firstname(USER_1_FIRSTNAME)
             .lastname(USER_1_LASTNAME)
             .name(USER_1_NAME)
+            .qualifiedName(USER_1_QUALIFIED_NAME)
             .build();
 
     public final static UserDetails USER_1_DETAILS = UserDetailsDto.builder()
@@ -611,6 +626,7 @@ public abstract class BaseTest {
             .firstname(USER_2_FIRSTNAME)
             .lastname(USER_2_LASTNAME)
             .name(USER_2_NAME)
+            .qualifiedName(USER_2_QUALIFIED_NAME)
             .build();
 
     public final static SignupRequestDto USER_2_SIGNUP_REQUEST_DTO = SignupRequestDto.builder()
@@ -839,6 +855,13 @@ public abstract class BaseTest {
             .lastname(USER_5_LASTNAME)
             .build();
 
+    public final static UserBriefDto USER_5_BRIEF_DTO = UserBriefDto.builder()
+            .id(USER_5_ID)
+            .username(USER_5_USERNAME)
+            .firstname(USER_5_FIRSTNAME)
+            .lastname(USER_5_LASTNAME)
+            .build();
+
     public final static UserDetails USER_5_DETAILS = UserDetailsDto.builder()
             .id(USER_5_ID.toString())
             .username(USER_5_USERNAME)
@@ -952,6 +975,7 @@ public abstract class BaseTest {
             .name(IMAGE_1_NAME)
             .version(IMAGE_1_VERSION)
             .isDefault(IMAGE_1_IS_DEFAULT)
+            .jdbcMethod(IMAGE_1_JDBC)
             .build();
 
     public final static List<Operator> IMAGE_1_OPERATORS = List.of(
@@ -1001,18 +1025,17 @@ public abstract class BaseTest {
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
             .image(CONTAINER_1_IMAGE_DTO)
-            .created(CONTAINER_1_CREATED)
             .host(CONTAINER_1_HOST)
             .port(CONTAINER_1_PORT)
             .build();
 
-    public final static ContainerBriefDto CONTAINER_1_DTO_BRIEF = ContainerBriefDto.builder()
+    public final static ContainerBriefDto CONTAINER_1_BRIEF_DTO = ContainerBriefDto.builder()
             .id(CONTAINER_1_ID)
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
-            .created(CONTAINER_1_CREATED)
             .quota(CONTAINER_1_QUOTA)
             .count(CONTAINER_1_COUNT)
+            .image(IMAGE_1_BRIEF_DTO)
             .build();
 
     public final static PrivilegedContainerDto CONTAINER_1_PRIVILEGED_DTO = PrivilegedContainerDto.builder()
@@ -1020,7 +1043,6 @@ public abstract class BaseTest {
             .name(CONTAINER_1_NAME)
             .internalName(CONTAINER_1_INTERNALNAME)
             .image(CONTAINER_1_IMAGE_DTO)
-            .created(CONTAINER_1_CREATED)
             .host(CONTAINER_1_HOST)
             .port(CONTAINER_1_PORT)
             .username(CONTAINER_1_PRIVILEGED_USERNAME)
@@ -1060,7 +1082,6 @@ public abstract class BaseTest {
             .name(CONTAINER_2_NAME)
             .internalName(CONTAINER_2_INTERNALNAME)
             .image(CONTAINER_2_IMAGE_DTO)
-            .created(CONTAINER_2_CREATED)
             .host(CONTAINER_2_HOST)
             .port(CONTAINER_2_PORT)
             .build();
@@ -1069,7 +1090,6 @@ public abstract class BaseTest {
             .id(CONTAINER_2_ID)
             .name(CONTAINER_2_NAME)
             .internalName(CONTAINER_2_INTERNALNAME)
-            .created(CONTAINER_2_CREATED)
             .quota(CONTAINER_2_QUOTA)
             .build();
 
@@ -1145,6 +1165,7 @@ public abstract class BaseTest {
     public final static String DATABASE_1_DESCRIPTION = "Weather in Australia";
     public final static String DATABASE_1_INTERNALNAME = "weather";
     public final static Boolean DATABASE_1_PUBLIC = false;
+    public final static Boolean DATABASE_1_SCHEMA_PUBLIC = false;
     public final static String DATABASE_1_EXCHANGE = "dbrepo";
     public final static Instant DATABASE_1_CREATED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */;
     public final static Instant DATABASE_1_LAST_MODIFIED = Instant.ofEpochSecond(1677399741L) /* 2023-02-26 08:22:21 (UTC) */;
@@ -1174,6 +1195,7 @@ public abstract class BaseTest {
     public final static String DATABASE_2_DESCRIPTION = "Zoo data";
     public final static String DATABASE_2_INTERNALNAME = "zoo";
     public final static Boolean DATABASE_2_PUBLIC = false;
+    public final static Boolean DATABASE_2_SCHEMA_PUBLIC = true;
     public final static String DATABASE_2_EXCHANGE = "dbrepo";
     public final static Instant DATABASE_2_CREATED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */;
     public final static Instant DATABASE_2_LAST_MODIFIED = Instant.ofEpochSecond(1677399772L) /* 2023-02-26 08:22:52 (UTC) */;
@@ -1191,6 +1213,7 @@ public abstract class BaseTest {
     public final static String DATABASE_3_DESCRIPTION = "Musicology data";
     public final static String DATABASE_3_INTERNALNAME = "musicology";
     public final static Boolean DATABASE_3_PUBLIC = true;
+    public final static Boolean DATABASE_3_SCHEMA_PUBLIC = false;
     public final static String DATABASE_3_EXCHANGE = "dbrepo";
     public final static Instant DATABASE_3_CREATED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */;
     public final static Instant DATABASE_3_LAST_MODIFIED = Instant.ofEpochSecond(1677399792L) /* 2023-02-26 08:23:12 (UTC) */;
@@ -1202,10 +1225,9 @@ public abstract class BaseTest {
 
     public final static DatabaseDto DATABASE_3_DTO = DatabaseDto.builder()
             .id(DATABASE_3_ID)
-            .created(DATABASE_3_CREATED)
             .isPublic(DATABASE_3_PUBLIC)
             .name(DATABASE_3_NAME)
-            .container(CONTAINER_1_DTO)
+            .container(CONTAINER_1_BRIEF_DTO)
             .internalName(DATABASE_3_INTERNALNAME)
             .exchangeName(DATABASE_3_EXCHANGE)
             .tables(new LinkedList<>()) /* TABLE_3, TABLE_3, TABLE_3 */
@@ -1223,6 +1245,7 @@ public abstract class BaseTest {
     public final static String DATABASE_4_NAME = "Weather AT";
     public final static String DATABASE_4_DESCRIPTION = "Weather data";
     public final static Boolean DATABASE_4_PUBLIC = true;
+    public final static Boolean DATABASE_4_SCHEMA_PUBLIC = true;
     public final static String DATABASE_4_INTERNALNAME = "weather_at";
     public final static String DATABASE_4_EXCHANGE = "dbrepo";
     public final static Instant DATABASE_4_CREATED = Instant.ofEpochSecond(1677399813L) /* 2023-02-26 08:23:33 (UTC) */;
@@ -1232,15 +1255,13 @@ public abstract class BaseTest {
 
     public final static DatabaseDto DATABASE_4_DTO = DatabaseDto.builder()
             .id(DATABASE_4_ID)
-            .created(Instant.now().minus(4, HOURS))
             .isPublic(DATABASE_4_PUBLIC)
+            .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC)
             .name(DATABASE_4_NAME)
             .description(DATABASE_4_DESCRIPTION)
             .internalName(DATABASE_4_INTERNALNAME)
             .exchangeName(DATABASE_4_EXCHANGE)
-            .created(DATABASE_4_CREATED)
-            .creator(USER_4_DTO)
-            .owner(USER_4_DTO)
+            .owner(USER_4_BRIEF_DTO)
             .tables(new LinkedList<>())
             .views(new LinkedList<>())
             .identifiers(new LinkedList<>())
@@ -1419,6 +1440,8 @@ public abstract class BaseTest {
     public final static String TABLE_1_NAME = "Weather AUS";
     public final static String TABLE_1_INTERNALNAME = "weather_aus";
     public final static Boolean TABLE_1_VERSIONED = true;
+    public final static Boolean TABLE_1_IS_PUBLIC = false;
+    public final static Boolean TABLE_1_SCHEMA_PUBLIC = false;
     public final static Boolean TABLE_1_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_1_DESCRIPTION = "Weather in Australia";
     public final static String TABLE_1_QUEUE_NAME = TABLE_1_INTERNALNAME;
@@ -1435,9 +1458,9 @@ public abstract class BaseTest {
             .id(TABLE_1_ID)
             .tdbid(DATABASE_1_ID)
             .database(null) /* DATABASE_1_PRIVILEGED_DTO */
-            .created(TABLE_1_CREATED)
             .internalName(TABLE_1_INTERNALNAME)
             .isVersioned(TABLE_1_VERSIONED)
+            .isPublic(TABLE_1_SCHEMA_PUBLIC)
             .description(TABLE_1_DESCRIPTION)
             .name(TABLE_1_NAME)
             .queueName(TABLE_1_QUEUE_NAME)
@@ -1445,8 +1468,7 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>())
             .columns(new LinkedList<>() /* TABLE_1_COLUMNS_DTO */)
             .constraints(null) /* TABLE_1_CONSTRAINTS_DTO */
-            .createdBy(USER_1_ID)
-            .owner(USER_1_DTO)
+            .owner(USER_1_BRIEF_DTO)
             .isPublic(DATABASE_1_PUBLIC)
             .avgRowLength(TABLE_1_AVG_ROW_LENGTH)
             .numRows(TABLE_1_NUM_ROWS)
@@ -1461,14 +1483,14 @@ public abstract class BaseTest {
             .created(TABLE_1_CREATED)
             .internalName(TABLE_1_INTERNALNAME)
             .isVersioned(TABLE_1_VERSIONED)
+            .isPublic(TABLE_1_IS_PUBLIC)
+            .isSchemaPublic(TABLE_1_SCHEMA_PUBLIC)
             .description(TABLE_1_DESCRIPTION)
             .name(TABLE_1_NAME)
             .queueName(TABLE_1_QUEUE_NAME)
             .identifiers(new LinkedList<>())
             .columns(new LinkedList<>() /* TABLE_1_COLUMNS */)
             .constraints(null) /* TABLE_1_CONSTRAINTS */
-            .createdBy(USER_1_ID)
-            .creator(USER_1)
             .ownedBy(USER_1_ID)
             .owner(USER_1)
             .lastModified(TABLE_1_LAST_MODIFIED)
@@ -1481,9 +1503,10 @@ public abstract class BaseTest {
     public final static TableDto TABLE_1_DTO = TableDto.builder()
             .id(TABLE_1_ID)
             .tdbid(DATABASE_1_ID)
-            .created(TABLE_1_CREATED)
             .internalName(TABLE_1_INTERNALNAME)
             .isVersioned(TABLE_1_VERSIONED)
+            .isPublic(TABLE_1_IS_PUBLIC)
+            .isSchemaPublic(TABLE_1_SCHEMA_PUBLIC)
             .description(TABLE_1_DESCRIPTION)
             .name(TABLE_1_NAME)
             .queueName(TABLE_1_QUEUE_NAME)
@@ -1491,8 +1514,7 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>())
             .columns(new LinkedList<>() /* TABLE_1_COLUMNS_DTO */)
             .constraints(null) /* TABLE_1_CONSTRAINT_DTO */
-            .createdBy(USER_1_ID)
-            .owner(USER_1_DTO)
+            .owner(USER_1_BRIEF_DTO)
             .avgRowLength(TABLE_1_AVG_ROW_LENGTH)
             .numRows(TABLE_1_NUM_ROWS)
             .dataLength(TABLE_1_DATA_LENGTH)
@@ -1576,9 +1598,11 @@ public abstract class BaseTest {
             .id(TABLE_1_ID)
             .internalName(TABLE_1_INTERNALNAME)
             .isVersioned(TABLE_1_VERSIONED)
+            .isPublic(TABLE_1_IS_PUBLIC)
+            .isSchemaPublic(TABLE_1_SCHEMA_PUBLIC)
             .description(TABLE_1_DESCRIPTION)
             .name(TABLE_1_NAME)
-            .owner(USER_1_BRIEF_DTO)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static Long TABLE_1_DATA_COUNT = 3L;
@@ -1619,6 +1643,8 @@ public abstract class BaseTest {
     public final static String TABLE_2_NAME = "Weather Location";
     public final static String TABLE_2_INTERNALNAME = "weather_location";
     public final static Boolean TABLE_2_VERSIONED = true;
+    public final static Boolean TABLE_2_IS_PUBLIC = false;
+    public final static Boolean TABLE_2_SCHEMA_PUBLIC = false;
     public final static Boolean TABLE_2_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_2_DESCRIPTION = "Weather location";
     public final static String TABLE_2_QUEUE_NAME = TABLE_2_INTERNALNAME;
@@ -1637,14 +1663,14 @@ public abstract class BaseTest {
             .created(TABLE_2_CREATED)
             .internalName(TABLE_2_INTERNALNAME)
             .isVersioned(TABLE_2_VERSIONED)
+            .isPublic(TABLE_2_IS_PUBLIC)
+            .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC)
             .description(TABLE_2_DESCRIPTION)
             .name(TABLE_2_NAME)
             .lastModified(TABLE_2_LAST_MODIFIED)
             .queueName(TABLE_2_QUEUE_NAME)
             .columns(new LinkedList<>() /* TABLE_2_COLUMNS */)
             .constraints(null) /* TABLE_2_CONSTRAINTS */
-            .creator(USER_2)
-            .createdBy(USER_2_ID)
             .owner(USER_2)
             .ownedBy(USER_2_ID)
             .avgRowLength(TABLE_2_AVG_ROW_LENGTH)
@@ -1657,9 +1683,10 @@ public abstract class BaseTest {
             .id(TABLE_2_ID)
             .tdbid(DATABASE_1_ID)
             .database(null) /* DATABASE_1_PRIVILEGED_DTO */
-            .created(TABLE_2_CREATED)
             .internalName(TABLE_2_INTERNALNAME)
             .isVersioned(TABLE_2_VERSIONED)
+            .isPublic(TABLE_2_IS_PUBLIC)
+            .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC)
             .description(TABLE_2_DESCRIPTION)
             .name(TABLE_2_NAME)
             .queueName(TABLE_2_QUEUE_NAME)
@@ -1667,9 +1694,7 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>())
             .columns(new LinkedList<>() /* TABLE_2_COLUMNS_DTO */)
             .constraints(null) /* TABLE_2_CONSTRAINTS_DTO */
-            .creator(USER_2_DTO)
-            .createdBy(USER_2_ID)
-            .owner(USER_2_DTO)
+            .owner(USER_2_BRIEF_DTO)
             .avgRowLength(TABLE_2_AVG_ROW_LENGTH)
             .numRows(TABLE_2_NUM_ROWS)
             .dataLength(TABLE_2_DATA_LENGTH)
@@ -1679,18 +1704,17 @@ public abstract class BaseTest {
     public final static TableDto TABLE_2_DTO = TableDto.builder()
             .id(TABLE_2_ID)
             .tdbid(DATABASE_1_ID)
-            .created(TABLE_2_CREATED)
             .internalName(TABLE_2_INTERNALNAME)
             .isVersioned(TABLE_2_VERSIONED)
+            .isPublic(TABLE_2_IS_PUBLIC)
+            .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC)
             .description(TABLE_2_DESCRIPTION)
             .name(TABLE_2_NAME)
             .queueName(TABLE_2_QUEUE_NAME)
             .routingKey(TABLE_2_ROUTING_KEY)
             .columns(new LinkedList<>() /* TABLE_2_COLUMNS_DTO */)
             .constraints(null) /* TABLE_2_CONSTRAINTS_DTO */
-            .creator(USER_2_DTO)
-            .createdBy(USER_2_ID)
-            .owner(USER_2_DTO)
+            .owner(USER_2_BRIEF_DTO)
             .avgRowLength(TABLE_2_AVG_ROW_LENGTH)
             .numRows(TABLE_2_NUM_ROWS)
             .dataLength(TABLE_2_DATA_LENGTH)
@@ -1701,15 +1725,19 @@ public abstract class BaseTest {
             .id(TABLE_2_ID)
             .internalName(TABLE_2_INTERNALNAME)
             .isVersioned(TABLE_2_VERSIONED)
+            .isPublic(TABLE_2_IS_PUBLIC)
+            .isSchemaPublic(TABLE_2_SCHEMA_PUBLIC)
             .description(TABLE_2_DESCRIPTION)
             .name(TABLE_2_NAME)
-            .owner(USER_2_BRIEF_DTO)
+            .ownedBy(USER_2_ID)
             .build();
 
     public final static Long TABLE_3_ID = 3L;
     public final static String TABLE_3_NAME = "Sensor";
     public final static String TABLE_3_INTERNALNAME = "sensor";
     public final static Boolean TABLE_3_VERSIONED = true;
+    public final static Boolean TABLE_3_IS_PUBLIC = false;
+    public final static Boolean TABLE_3_SCHEMA_PUBLIC = false;
     public final static Boolean TABLE_3_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_3_DESCRIPTION = "Some sensor data";
     public final static String TABLE_3_QUEUE_NAME = TABLE_3_INTERNALNAME;
@@ -1728,14 +1756,14 @@ public abstract class BaseTest {
             .created(TABLE_3_CREATED)
             .internalName(TABLE_3_INTERNALNAME)
             .isVersioned(TABLE_3_VERSIONED)
+            .isPublic(TABLE_3_IS_PUBLIC)
+            .isSchemaPublic(TABLE_3_SCHEMA_PUBLIC)
             .description(TABLE_3_DESCRIPTION)
             .name(TABLE_3_NAME)
             .lastModified(TABLE_3_LAST_MODIFIED)
             .queueName(TABLE_3_QUEUE_NAME)
             .columns(new LinkedList<>() /* TABLE_3_COLUMNS */)
             .constraints(null) /* TABLE_3_CONSTRAINTS */
-            .creator(USER_3)
-            .createdBy(USER_3_ID)
             .owner(USER_3)
             .ownedBy(USER_3_ID)
             .avgRowLength(TABLE_3_AVG_ROW_LENGTH)
@@ -1747,18 +1775,17 @@ public abstract class BaseTest {
     public final static TableDto TABLE_3_DTO = TableDto.builder()
             .id(TABLE_3_ID)
             .tdbid(DATABASE_1_ID)
-            .created(TABLE_3_CREATED)
             .internalName(TABLE_3_INTERNALNAME)
             .isVersioned(TABLE_3_VERSIONED)
+            .isPublic(TABLE_3_IS_PUBLIC)
+            .isSchemaPublic(TABLE_3_SCHEMA_PUBLIC)
             .description(TABLE_3_DESCRIPTION)
             .name(TABLE_3_NAME)
             .queueName(TABLE_3_QUEUE_NAME)
             .routingKey(TABLE_3_ROUTING_KEY)
             .columns(new LinkedList<>() /* TABLE_3_COLUMNS_DTO */)
             .constraints(null) /* TABLE_3_CONSTRAINTS_DTO */
-            .creator(USER_3_DTO)
-            .createdBy(USER_3_ID)
-            .owner(USER_3_DTO)
+            .owner(USER_3_BRIEF_DTO)
             .avgRowLength(TABLE_3_AVG_ROW_LENGTH)
             .numRows(TABLE_3_NUM_ROWS)
             .dataLength(TABLE_3_DATA_LENGTH)
@@ -1769,9 +1796,11 @@ public abstract class BaseTest {
             .id(TABLE_3_ID)
             .internalName(TABLE_3_INTERNALNAME)
             .isVersioned(TABLE_3_VERSIONED)
+            .isPublic(TABLE_3_IS_PUBLIC)
+            .isSchemaPublic(TABLE_3_SCHEMA_PUBLIC)
             .description(TABLE_3_DESCRIPTION)
             .name(TABLE_3_NAME)
-            .owner(USER_3_BRIEF_DTO)
+            .ownedBy(USER_3_ID)
             .build();
 
     public final static ConstraintsCreateDto TABLE_3_CONSTRAINTS_CREATE_DTO = ConstraintsCreateDto.builder()
@@ -1809,6 +1838,8 @@ public abstract class BaseTest {
     public final static String TABLE_5_NAME = "zoo";
     public final static String TABLE_5_INTERNALNAME = "zoo";
     public final static Boolean TABLE_5_VERSIONED = true;
+    public final static Boolean TABLE_5_IS_PUBLIC = true;
+    public final static Boolean TABLE_5_SCHEMA_PUBLIC = true;
     public final static Boolean TABLE_5_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_5_DESCRIPTION = "Some Kaggle dataset";
     public final static String TABLE_5_QUEUE_NAME = TABLE_5_INTERNALNAME;
@@ -1826,13 +1857,14 @@ public abstract class BaseTest {
             .created(Instant.now())
             .internalName(TABLE_5_INTERNALNAME)
             .isVersioned(TABLE_5_VERSIONED)
+            .isPublic(TABLE_5_IS_PUBLIC)
+            .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC)
             .description(TABLE_5_DESCRIPTION)
             .name(TABLE_5_NAME)
             .lastModified(TABLE_5_LAST_MODIFIED)
             .queueName(TABLE_5_QUEUE_NAME)
             .columns(new LinkedList<>()) /* TABLE_5_COLUMNS */
             .constraints(null) /* TABLE_5_CONSTRAINTS */
-            .createdBy(USER_1_ID)
             .ownedBy(USER_1_ID)
             .owner(USER_1)
             .build();
@@ -1840,26 +1872,27 @@ public abstract class BaseTest {
     public final static TableDto TABLE_5_DTO = TableDto.builder()
             .id(TABLE_5_ID)
             .tdbid(DATABASE_2_ID)
-            .created(Instant.now())
             .internalName(TABLE_5_INTERNALNAME)
             .isVersioned(TABLE_5_VERSIONED)
+            .isPublic(TABLE_5_IS_PUBLIC)
+            .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC)
             .description(TABLE_5_DESCRIPTION)
             .name(TABLE_5_NAME)
             .queueName(TABLE_5_QUEUE_NAME)
             .routingKey(TABLE_5_ROUTING_KEY)
             .columns(new LinkedList<>()) /* TABLE_5_COLUMNS_DTO */
             .constraints(null) /* TABLE_5_CONSTRAINTS_DTO */
-            .createdBy(USER_1_ID)
-            .owner(USER_1_DTO)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static PrivilegedTableDto TABLE_5_PRIVILEGED_DTO = PrivilegedTableDto.builder()
             .id(TABLE_5_ID)
             .tdbid(DATABASE_2_ID)
             .database(null) /* DATABASE_2_PRIVILEGED_DTO */
-            .created(TABLE_5_CREATED)
             .internalName(TABLE_5_INTERNALNAME)
             .isVersioned(TABLE_5_VERSIONED)
+            .isPublic(TABLE_5_IS_PUBLIC)
+            .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC)
             .description(TABLE_5_DESCRIPTION)
             .name(TABLE_5_NAME)
             .queueName(TABLE_5_QUEUE_NAME)
@@ -1867,8 +1900,7 @@ public abstract class BaseTest {
             .identifiers(new LinkedList<>())
             .columns(new LinkedList<>() /* TABLE_5_COLUMNS_DTO */)
             .constraints(null) /* TABLE_5_CONSTRAINTS_DTO */
-            .createdBy(USER_5_ID)
-            .owner(USER_5_DTO)
+            .owner(USER_5_BRIEF_DTO)
             .isPublic(DATABASE_2_PUBLIC)
             .avgRowLength(TABLE_5_AVG_ROW_LENGTH)
             .numRows(TABLE_5_NUM_ROWS)
@@ -1880,15 +1912,19 @@ public abstract class BaseTest {
             .id(TABLE_5_ID)
             .internalName(TABLE_5_INTERNALNAME)
             .isVersioned(TABLE_5_VERSIONED)
+            .isPublic(TABLE_5_IS_PUBLIC)
+            .isSchemaPublic(TABLE_5_SCHEMA_PUBLIC)
             .description(TABLE_5_DESCRIPTION)
             .name(TABLE_5_NAME)
-            .owner(USER_1_BRIEF_DTO)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static Long TABLE_6_ID = 6L;
     public final static String TABLE_6_NAME = "names";
     public final static String TABLE_6_INTERNALNAME = "names";
     public final static Boolean TABLE_6_VERSIONED = true;
+    public final static Boolean TABLE_6_IS_PUBLIC = true;
+    public final static Boolean TABLE_6_SCHEMA_PUBLIC = true;
     public final static Boolean TABLE_6_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_6_DESCRIPTION = "Some names dataset";
     public final static String TABLE_6_QUEUE_NAME = TABLE_6_INTERNALNAME;
@@ -1902,13 +1938,14 @@ public abstract class BaseTest {
             .created(TABLE_6_CREATED)
             .internalName(TABLE_6_INTERNALNAME)
             .isVersioned(TABLE_6_VERSIONED)
+            .isPublic(TABLE_6_IS_PUBLIC)
+            .isSchemaPublic(TABLE_6_SCHEMA_PUBLIC)
             .description(TABLE_6_DESCRIPTION)
             .name(TABLE_6_NAME)
             .lastModified(TABLE_6_LAST_MODIFIED)
             .queueName(TABLE_6_QUEUE_NAME)
             .columns(new LinkedList<>()) /* TABLE_6_COLUMNS */
             .constraints(null) /* TABLE_6_CONSTRAINTS */
-            .createdBy(USER_1_ID)
             .ownedBy(USER_1_ID)
             .owner(USER_1)
             .created(TABLE_6_CREATED)
@@ -1917,33 +1954,36 @@ public abstract class BaseTest {
     public final static TableDto TABLE_6_DTO = TableDto.builder()
             .id(TABLE_6_ID)
             .tdbid(DATABASE_2_ID)
-            .created(TABLE_6_CREATED)
             .internalName(TABLE_6_INTERNALNAME)
             .isVersioned(TABLE_6_VERSIONED)
+            .isPublic(TABLE_6_IS_PUBLIC)
+            .isSchemaPublic(TABLE_6_SCHEMA_PUBLIC)
             .description(TABLE_6_DESCRIPTION)
             .name(TABLE_6_NAME)
             .queueName(TABLE_6_QUEUE_NAME)
             .routingKey(TABLE_6_ROUTING_KEY)
             .columns(new LinkedList<>()) /* TABLE_6_COLUMNS_DTO */
             .constraints(null) /* TABLE_6_CONSTRAINTS_DTO */
-            .createdBy(USER_1_ID)
-            .owner(USER_1_DTO)
-            .created(TABLE_6_CREATED)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static TableBriefDto TABLE_6_BRIEF_DTO = TableBriefDto.builder()
             .id(TABLE_6_ID)
             .internalName(TABLE_6_INTERNALNAME)
             .isVersioned(TABLE_6_VERSIONED)
+            .isPublic(TABLE_6_IS_PUBLIC)
+            .isSchemaPublic(TABLE_6_SCHEMA_PUBLIC)
             .description(TABLE_6_DESCRIPTION)
             .name(TABLE_6_NAME)
-            .owner(USER_1_BRIEF_DTO)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static Long TABLE_7_ID = 7L;
     public final static String TABLE_7_NAME = "likes";
     public final static String TABLE_7_INTERNAL_NAME = "likes";
     public final static Boolean TABLE_7_VERSIONED = true;
+    public final static Boolean TABLE_7_IS_PUBLIC = true;
+    public final static Boolean TABLE_7_SCHEMA_PUBLIC = true;
     public final static Boolean TABLE_7_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_7_DESCRIPTION = "Some likes dataset";
     public final static String TABLE_7_QUEUE_NAME = TABLE_7_INTERNAL_NAME;
@@ -1957,13 +1997,14 @@ public abstract class BaseTest {
             .created(TABLE_7_CREATED)
             .internalName(TABLE_7_INTERNAL_NAME)
             .isVersioned(TABLE_7_VERSIONED)
+            .isPublic(TABLE_7_IS_PUBLIC)
+            .isSchemaPublic(TABLE_7_SCHEMA_PUBLIC)
             .description(TABLE_7_DESCRIPTION)
             .name(TABLE_7_NAME)
             .lastModified(TABLE_7_LAST_MODIFIED)
             .queueName(TABLE_7_QUEUE_NAME)
             .columns(new LinkedList<>()) /* TABLE_7_COLUMNS */
             .constraints(null) /* TABLE_7_CONSTRAINTS */
-            .createdBy(USER_1_ID)
             .ownedBy(USER_1_ID)
             .owner(USER_1)
             .created(TABLE_7_CREATED)
@@ -1972,33 +2013,36 @@ public abstract class BaseTest {
     public final static TableDto TABLE_7_DTO = TableDto.builder()
             .id(TABLE_7_ID)
             .tdbid(DATABASE_2_ID)
-            .created(TABLE_7_CREATED)
             .internalName(TABLE_7_INTERNAL_NAME)
             .isVersioned(TABLE_7_VERSIONED)
+            .isPublic(TABLE_7_IS_PUBLIC)
+            .isSchemaPublic(TABLE_7_SCHEMA_PUBLIC)
             .description(TABLE_7_DESCRIPTION)
             .name(TABLE_7_NAME)
             .queueName(TABLE_7_QUEUE_NAME)
             .routingKey(TABLE_7_ROUTING_KEY)
             .columns(new LinkedList<>()) /* TABLE_7_COLUMNS_DTO */
             .constraints(null) /* TABLE_7_CONSTRAINTS_DTO */
-            .createdBy(USER_1_ID)
-            .owner(USER_1_DTO)
-            .created(TABLE_7_CREATED)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static TableBriefDto TABLE_7_BRIEF_DTO = TableBriefDto.builder()
             .id(TABLE_7_ID)
             .internalName(TABLE_7_INTERNAL_NAME)
             .isVersioned(TABLE_7_VERSIONED)
+            .isPublic(TABLE_7_IS_PUBLIC)
+            .isSchemaPublic(TABLE_7_SCHEMA_PUBLIC)
             .description(TABLE_7_DESCRIPTION)
             .name(TABLE_7_NAME)
-            .owner(USER_1_BRIEF_DTO)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static Long TABLE_4_ID = 4L;
     public final static String TABLE_4_NAME = "Sensor 2";
     public final static String TABLE_4_INTERNALNAME = "sensor_2";
     public final static Boolean TABLE_4_VERSIONED = true;
+    public final static Boolean TABLE_4_IS_PUBLIC = false;
+    public final static Boolean TABLE_4_SCHEMA_PUBLIC = false;
     public final static Boolean TABLE_4_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_4_DESCRIPTION = "Hello sensor";
     public final static String TABLE_4_QUEUE_NAME = TABLE_4_INTERNALNAME;
@@ -2021,8 +2065,8 @@ public abstract class BaseTest {
             .columns(new LinkedList<>()) /* TABLE_4_COLUMNS */
             .constraints(null) /* TABLE_4_CONSTRAINTS */
             .isVersioned(TABLE_4_VERSIONED)
-            .creator(USER_1)
-            .createdBy(USER_1_ID)
+            .isPublic(TABLE_4_IS_PUBLIC)
+            .isSchemaPublic(TABLE_4_SCHEMA_PUBLIC)
             .owner(USER_1)
             .ownedBy(USER_1_ID)
             .created(TABLE_4_CREATED)
@@ -2044,10 +2088,9 @@ public abstract class BaseTest {
             .columns(new LinkedList<>()) /* TABLE_4_COLUMNS_DTO */
             .constraints(null) /* TABLE_4_CONSTRAINTS_DTO */
             .isVersioned(TABLE_4_VERSIONED)
-            .creator(USER_1_DTO)
-            .createdBy(USER_1_ID)
-            .owner(USER_1_DTO)
-            .created(TABLE_4_CREATED)
+            .isPublic(TABLE_4_IS_PUBLIC)
+            .isSchemaPublic(TABLE_4_SCHEMA_PUBLIC)
+            .owner(USER_1_BRIEF_DTO)
             .avgRowLength(TABLE_4_AVG_ROW_LENGTH)
             .numRows(TABLE_4_NUM_ROWS)
             .dataLength(TABLE_4_DATA_LENGTH)
@@ -2060,7 +2103,9 @@ public abstract class BaseTest {
             .description(TABLE_4_DESCRIPTION)
             .name(TABLE_4_NAME)
             .isVersioned(TABLE_4_VERSIONED)
-            .owner(USER_1_BRIEF_DTO)
+            .isPublic(TABLE_4_IS_PUBLIC)
+            .isSchemaPublic(TABLE_4_SCHEMA_PUBLIC)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static ColumnBriefDto TABLE_4_COLUMNS_BRIEF_0_DTO = ColumnBriefDto.builder()
@@ -2151,6 +2196,8 @@ public abstract class BaseTest {
     public final static String TABLE_8_NAME = "mfcc";
     public final static String TABLE_8_INTERNAL_NAME = "mfcc";
     public final static Boolean TABLE_8_VERSIONED = true;
+    public final static Boolean TABLE_8_IS_PUBLIC = false;
+    public final static Boolean TABLE_8_SCHEMA_PUBLIC = false;
     public final static Boolean TABLE_8_PROCESSED_CONSTRAINTS = true;
     public final static String TABLE_8_DESCRIPTION = "Hello mfcc";
     public final static String TABLE_8_QUEUE_NAME = TABLE_8_INTERNAL_NAME;
@@ -2164,12 +2211,13 @@ public abstract class BaseTest {
             .internalName(TABLE_8_INTERNAL_NAME)
             .description(TABLE_8_DESCRIPTION)
             .isVersioned(TABLE_8_VERSIONED)
+            .isPublic(TABLE_8_IS_PUBLIC)
+            .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC)
             .database(null /* DATABASE_1 */)
             .name(TABLE_8_NAME)
             .queueName(TABLE_8_QUEUE_NAME)
             .columns(new LinkedList<>()) /* TABLE_8_COLUMNS */
             .constraints(null) /* TABLE_8_CONSTRAINTS */
-            .createdBy(USER_1_ID)
             .ownedBy(USER_1_ID)
             .owner(USER_1)
             .created(TABLE_8_CREATED)
@@ -2182,14 +2230,13 @@ public abstract class BaseTest {
             .internalName(TABLE_8_INTERNAL_NAME)
             .description(TABLE_8_DESCRIPTION)
             .isVersioned(TABLE_8_VERSIONED)
+            .isPublic(TABLE_8_IS_PUBLIC)
+            .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC)
             .name(TABLE_8_NAME)
             .queueName(TABLE_8_QUEUE_NAME)
             .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */
             .constraints(null) /* TABLE_8_CONSTRAINTS_DTO */
-            .createdBy(USER_1_ID)
-            .creator(USER_1_DTO)
-            .owner(USER_1_DTO)
-            .created(TABLE_8_CREATED)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static TableBriefDto TABLE_8_BRIEF_DTO = TableBriefDto.builder()
@@ -2197,8 +2244,10 @@ public abstract class BaseTest {
             .internalName(TABLE_8_INTERNAL_NAME)
             .description(TABLE_8_DESCRIPTION)
             .isVersioned(TABLE_8_VERSIONED)
+            .isPublic(TABLE_8_IS_PUBLIC)
+            .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC)
             .name(TABLE_8_NAME)
-            .owner(USER_1_BRIEF_DTO)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static PrivilegedTableDto TABLE_8_PRIVILEGED_DTO = PrivilegedTableDto.builder()
@@ -2207,13 +2256,12 @@ public abstract class BaseTest {
             .internalName(TABLE_8_INTERNAL_NAME)
             .description(TABLE_8_DESCRIPTION)
             .isVersioned(TABLE_8_VERSIONED)
+            .isPublic(TABLE_8_IS_PUBLIC)
+            .isSchemaPublic(TABLE_8_SCHEMA_PUBLIC)
             .name(TABLE_8_NAME)
             .queueName(TABLE_8_QUEUE_NAME)
             .columns(new LinkedList<>()) /* TABLE_8_COLUMNS_DTO */
-            .createdBy(USER_1_ID)
-            .creator(USER_1_DTO)
-            .owner(USER_1_DTO)
-            .created(TABLE_8_CREATED)
+            .owner(USER_1_BRIEF_DTO)
             .isPublic(DATABASE_3_PUBLIC)
             .build();
 
@@ -2494,8 +2542,6 @@ public abstract class BaseTest {
     public final static Instant QUERY_1_CREATED = Instant.ofEpochSecond(1677648377L);
     public final static Instant QUERY_1_EXECUTION = Instant.now();
     public final static Boolean QUERY_1_PERSISTED = true;
-    public final static UserDto QUERY_1_CREATOR = USER_1_DTO;
-    public final static UUID QUERY_1_CREATED_BY = USER_1_ID;
 
     public final static QueryDto QUERY_1_DTO = QueryDto.builder()
             .id(QUERY_1_ID)
@@ -2503,10 +2549,8 @@ public abstract class BaseTest {
             .query(QUERY_1_STATEMENT)
             .queryHash(QUERY_1_QUERY_HASH)
             .resultHash(QUERY_1_RESULT_HASH)
-            .created(QUERY_1_CREATED)
             .execution(QUERY_1_EXECUTION)
-            .creator(QUERY_1_CREATOR)
-            .createdBy(QUERY_1_CREATED_BY)
+            .owner(USER_1_BRIEF_DTO)
             .isPersisted(QUERY_1_PERSISTED)
             .resultNumber(3L)
             .build();
@@ -2517,10 +2561,8 @@ public abstract class BaseTest {
             .query(QUERY_1_STATEMENT)
             .queryHash(QUERY_1_QUERY_HASH)
             .resultHash(QUERY_1_RESULT_HASH)
-            .created(QUERY_1_CREATED)
             .execution(QUERY_1_EXECUTION)
-            .createdBy(USER_1_ID)
-            .creator(USER_1_DTO)
+            .owner(USER_1_BRIEF_DTO)
             .isPersisted(QUERY_1_PERSISTED)
             .resultNumber(3L)
             .build();
@@ -2534,8 +2576,6 @@ public abstract class BaseTest {
     public final static Instant QUERY_2_EXECUTION = Instant.now().minus(1, MINUTES);
     public final static Instant QUERY_2_LAST_MODIFIED = Instant.ofEpochSecond(1541588352L);
     public final static Boolean QUERY_2_PERSISTED = false;
-    public final static UserDto QUERY_2_CREATOR = USER_1_DTO;
-    public final static UUID QUERY_2_CREATED_BY = USER_1_ID;
 
     public final static QueryDto QUERY_2_DTO = QueryDto.builder()
             .id(QUERY_2_ID)
@@ -2544,10 +2584,7 @@ public abstract class BaseTest {
             .queryNormalized(QUERY_2_STATEMENT)
             .resultNumber(QUERY_2_RESULT_NUMBER)
             .resultHash(QUERY_2_RESULT_HASH)
-            .lastModified(QUERY_2_LAST_MODIFIED)
-            .created(QUERY_2_CREATED)
-            .creator(QUERY_2_CREATOR)
-            .createdBy(QUERY_2_CREATED_BY)
+            .owner(USER_1_BRIEF_DTO)
             .queryHash(QUERY_2_QUERY_HASH)
             .execution(QUERY_2_EXECUTION)
             .isPersisted(QUERY_2_PERSISTED)
@@ -2565,8 +2602,6 @@ public abstract class BaseTest {
     public final static Instant QUERY_3_LAST_MODIFIED = Instant.ofEpochSecond(1541588353L);
     public final static Long QUERY_3_RESULT_NUMBER = 2L;
     public final static Boolean QUERY_3_PERSISTED = true;
-    public final static UserDto QUERY_3_CREATOR = USER_1_DTO;
-    public final static UUID QUERY_3_CREATED_BY = USER_1_ID;
 
     public final static QueryDto QUERY_3_DTO = QueryDto.builder()
             .id(QUERY_3_ID)
@@ -2575,10 +2610,7 @@ public abstract class BaseTest {
             .queryNormalized(QUERY_3_STATEMENT)
             .resultNumber(QUERY_3_RESULT_NUMBER)
             .resultHash(QUERY_3_RESULT_HASH)
-            .lastModified(QUERY_3_LAST_MODIFIED)
-            .created(QUERY_3_CREATED)
-            .creator(QUERY_3_CREATOR)
-            .createdBy(QUERY_3_CREATED_BY)
+            .owner(USER_1_BRIEF_DTO)
             .queryHash(QUERY_3_QUERY_HASH)
             .execution(QUERY_3_EXECUTION)
             .isPersisted(QUERY_3_PERSISTED)
@@ -2599,20 +2631,16 @@ public abstract class BaseTest {
     public final static Long QUERY_4_RESULT_NUMBER = 6L;
     public final static Long QUERY_4_RESULT_ID = 4L;
     public final static Boolean QUERY_4_PERSISTED = false;
-    public final static UserDto QUERY_4_CREATOR = USER_1_DTO;
-    public final static UUID QUERY_4_CREATED_BY = USER_1_ID;
 
     public final static QueryDto QUERY_4 = QueryDto.builder()
             .id(QUERY_4_ID)
             .query(QUERY_4_STATEMENT)
             .queryHash(QUERY_4_QUERY_HASH)
             .resultHash(QUERY_4_RESULT_HASH)
-            .created(QUERY_4_CREATED)
             .execution(QUERY_4_EXECUTION)
             .isPersisted(QUERY_4_PERSISTED)
             .resultNumber(QUERY_4_RESULT_NUMBER)
-            .creator(QUERY_4_CREATOR)
-            .createdBy(QUERY_4_CREATED_BY)
+            .owner(USER_3_BRIEF_DTO)
             .isPersisted(QUERY_4_PERSISTED)
             .build();
 
@@ -2649,12 +2677,10 @@ public abstract class BaseTest {
             .queryNormalized(QUERY_4_STATEMENT)
             .resultNumber(QUERY_4_RESULT_NUMBER)
             .resultHash(QUERY_4_RESULT_HASH)
-            .lastModified(QUERY_4_LAST_MODIFIED)
-            .created(QUERY_4_CREATED)
-            .createdBy(USER_1_ID)
             .queryHash(QUERY_4_QUERY_HASH)
             .execution(QUERY_4_EXECUTION)
             .isPersisted(QUERY_4_PERSISTED)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static Long QUERY_5_ID = 5L;
@@ -2668,8 +2694,6 @@ public abstract class BaseTest {
     public final static Instant QUERY_5_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L);
     public final static Long QUERY_5_RESULT_NUMBER = 6L;
     public final static Boolean QUERY_5_PERSISTED = true;
-    public final static UserDto QUERY_5_CREATOR = USER_1_DTO;
-    public final static UUID QUERY_5_CREATED_BY = USER_1_ID;
 
     public final static QueryDto QUERY_5_DTO = QueryDto.builder()
             .id(QUERY_5_ID)
@@ -2678,13 +2702,10 @@ public abstract class BaseTest {
             .queryNormalized(QUERY_5_STATEMENT)
             .resultNumber(QUERY_5_RESULT_NUMBER)
             .resultHash(QUERY_5_RESULT_HASH)
-            .lastModified(QUERY_5_LAST_MODIFIED)
-            .created(QUERY_5_CREATED)
             .queryHash(QUERY_5_QUERY_HASH)
             .execution(QUERY_5_EXECUTION)
             .isPersisted(QUERY_5_PERSISTED)
-            .creator(QUERY_5_CREATOR)
-            .createdBy(QUERY_5_CREATED_BY)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static QueryResultDto QUERY_5_RESULT_DTO = QueryResultDto.builder()
@@ -2711,8 +2732,6 @@ public abstract class BaseTest {
     public final static Instant QUERY_6_LAST_MODIFIED = Instant.ofEpochSecond(1551588555L);
     public final static Long QUERY_6_RESULT_NUMBER = 1L;
     public final static Boolean QUERY_6_PERSISTED = true;
-    public final static UserDto QUERY_6_CREATOR = USER_1_DTO;
-    public final static UUID QUERY_6_CREATED_BY = USER_1_ID;
 
     public final static QueryDto QUERY_6_DTO = QueryDto.builder()
             .id(QUERY_6_ID)
@@ -2721,10 +2740,7 @@ public abstract class BaseTest {
             .queryNormalized(QUERY_6_STATEMENT)
             .resultNumber(QUERY_6_RESULT_NUMBER)
             .resultHash(QUERY_6_RESULT_HASH)
-            .lastModified(QUERY_6_LAST_MODIFIED)
-            .created(QUERY_6_CREATED)
-            .creator(QUERY_6_CREATOR)
-            .createdBy(QUERY_6_CREATED_BY)
+            .owner(USER_1_BRIEF_DTO)
             .queryHash(QUERY_6_QUERY_HASH)
             .execution(QUERY_6_EXECUTION)
             .isPersisted(QUERY_6_PERSISTED)
@@ -4672,6 +4688,7 @@ public abstract class BaseTest {
     public final static Long VIEW_1_CONTAINER_ID = CONTAINER_1_ID;
     public final static Long VIEW_1_DATABASE_ID = DATABASE_1_ID;
     public final static Boolean VIEW_1_PUBLIC = true;
+    public final static Boolean VIEW_1_SCHEMA_PUBLIC = true;
     public final static String VIEW_1_QUERY = "select `location`, `lat`, `lng` from `weather_location`";
     public final static String VIEW_1_QUERY_HASH = "dc81a6877c7c51a6a6f406e1fc2a255e44a0d49a20548596e0d583c3eb849c23";
 
@@ -4714,9 +4731,11 @@ public abstract class BaseTest {
             .internalName(VIEW_1_INTERNAL_NAME)
             .vdbid(VIEW_1_DATABASE_ID)
             .isPublic(VIEW_1_PUBLIC)
+            .isSchemaPublic(VIEW_1_SCHEMA_PUBLIC)
             .query(VIEW_1_QUERY)
             .queryHash(VIEW_1_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
+            .owner(USER_1)
             .columns(null) /* VIEW_1_COLUMNS */
             .build();
 
@@ -4791,7 +4810,8 @@ public abstract class BaseTest {
             .internalName(VIEW_1_INTERNAL_NAME)
             .vdbid(VIEW_1_DATABASE_ID)
             .isPublic(VIEW_1_PUBLIC)
-            .createdBy(USER_1_ID)
+            .isSchemaPublic(VIEW_1_SCHEMA_PUBLIC)
+            .owner(USER_1_BRIEF_DTO)
             .query(VIEW_1_QUERY)
             .queryHash(VIEW_1_QUERY_HASH)
             .columns(VIEW_1_COLUMNS_DTO)
@@ -4806,7 +4826,7 @@ public abstract class BaseTest {
             .internalName(VIEW_1_INTERNAL_NAME)
             .vdbid(VIEW_1_DATABASE_ID)
             .isPublic(VIEW_1_PUBLIC)
-            .createdBy(USER_1_ID)
+            .owner(USER_1_BRIEF_DTO)
             .query(VIEW_1_QUERY)
             .queryHash(VIEW_1_QUERY_HASH)
             .columns(VIEW_1_COLUMNS_DTO)
@@ -4819,7 +4839,8 @@ public abstract class BaseTest {
             .internalName(VIEW_1_INTERNAL_NAME)
             .vdbid(VIEW_1_DATABASE_ID)
             .isPublic(VIEW_1_PUBLIC)
-            .createdBy(USER_1_ID)
+            .isSchemaPublic(VIEW_1_SCHEMA_PUBLIC)
+            .ownedBy(USER_1_ID)
             .query(VIEW_1_QUERY)
             .queryHash(VIEW_1_QUERY_HASH)
             .build();
@@ -4837,6 +4858,7 @@ public abstract class BaseTest {
     public final static Long VIEW_2_CONTAINER_ID = CONTAINER_1_ID;
     public final static Long VIEW_2_DATABASE_ID = DATABASE_1_ID;
     public final static Boolean VIEW_2_PUBLIC = true;
+    public final static Boolean VIEW_2_SCHEMA_PUBLIC = true;
     public final static String VIEW_2_QUERY = "select `date`, `location` as loc, `mintemp`, `rainfall` from `weather_aus` where `location` = 'Albury'";
     public final static String VIEW_2_QUERY_HASH = "987fc946772ffb6d85060262dcb5df419692a1f6772ea995e3dedb53c191e984";
 
@@ -4887,10 +4909,12 @@ public abstract class BaseTest {
             .internalName(VIEW_2_INTERNAL_NAME)
             .vdbid(VIEW_2_DATABASE_ID)
             .isPublic(VIEW_2_PUBLIC)
+            .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC)
             .columns(null)  /* VIEW_2_COLUMNS */
             .query(VIEW_2_QUERY)
             .queryHash(VIEW_2_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
+            .owner(USER_1)
             .build();
 
     public final static List<ViewColumn> VIEW_2_COLUMNS = List.of(
@@ -4944,10 +4968,11 @@ public abstract class BaseTest {
             .internalName(VIEW_2_INTERNAL_NAME)
             .vdbid(VIEW_2_DATABASE_ID)
             .isPublic(VIEW_2_PUBLIC)
+            .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC)
             .columns(VIEW_2_COLUMNS_DTO)
             .query(VIEW_2_QUERY)
             .queryHash(VIEW_2_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static PrivilegedViewDto VIEW_2_PRIVILEGED_DTO = PrivilegedViewDto.builder()
@@ -4958,7 +4983,8 @@ public abstract class BaseTest {
             .internalName(VIEW_2_INTERNAL_NAME)
             .vdbid(VIEW_2_DATABASE_ID)
             .isPublic(VIEW_2_PUBLIC)
-            .createdBy(USER_2_ID)
+            .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC)
+            .owner(USER_2_BRIEF_DTO)
             .query(VIEW_2_QUERY)
             .queryHash(VIEW_2_QUERY_HASH)
             .columns(VIEW_2_COLUMNS_DTO)
@@ -4971,9 +4997,10 @@ public abstract class BaseTest {
             .internalName(VIEW_2_INTERNAL_NAME)
             .vdbid(VIEW_2_DATABASE_ID)
             .isPublic(VIEW_2_PUBLIC)
+            .isSchemaPublic(VIEW_2_SCHEMA_PUBLIC)
             .query(VIEW_2_QUERY)
             .queryHash(VIEW_2_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static Long VIEW_3_ID = 3L;
@@ -4983,6 +5010,7 @@ public abstract class BaseTest {
     public final static Long VIEW_3_CONTAINER_ID = CONTAINER_1_ID;
     public final static Long VIEW_3_DATABASE_ID = DATABASE_1_ID;
     public final static Boolean VIEW_3_PUBLIC = false;
+    public final static Boolean VIEW_3_SCHEMA_PUBLIC = false;
     public final static String VIEW_3_QUERY = "select w.`mintemp`, w.`rainfall`, w.`location`, m.`date` from `weather_aus` w join `junit2` m on m.`location` = w.`location` and m.`date` = w.`date`";
     public final static String VIEW_3_QUERY_HASH = "bbbaa56a5206b3dc3e6cf9301b0db9344eb6f19b100c7b88550ffb597a0bd255";
 
@@ -5037,10 +5065,12 @@ public abstract class BaseTest {
             .internalName(VIEW_3_INTERNAL_NAME)
             .vdbid(VIEW_3_DATABASE_ID)
             .isPublic(VIEW_3_PUBLIC)
+            .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC)
             .columns(null)  /* VIEW_3_COLUMNS */
             .query(VIEW_3_QUERY)
             .queryHash(VIEW_3_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
+            .owner(USER_1)
             .build();
 
     public final static PrivilegedViewDto VIEW_3_PRIVILEGED_DTO = PrivilegedViewDto.builder()
@@ -5051,7 +5081,8 @@ public abstract class BaseTest {
             .internalName(VIEW_3_INTERNAL_NAME)
             .vdbid(VIEW_3_DATABASE_ID)
             .isPublic(VIEW_3_PUBLIC)
-            .createdBy(USER_1_ID)
+            .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC)
+            .owner(USER_1_BRIEF_DTO)
             .query(VIEW_3_QUERY)
             .queryHash(VIEW_3_QUERY_HASH)
             .columns(VIEW_3_COLUMNS_DTO)
@@ -5108,10 +5139,11 @@ public abstract class BaseTest {
             .internalName(VIEW_3_INTERNAL_NAME)
             .vdbid(VIEW_3_DATABASE_ID)
             .isPublic(VIEW_3_PUBLIC)
+            .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC)
             .columns(VIEW_3_COLUMNS_DTO)
             .query(VIEW_3_QUERY)
             .queryHash(VIEW_3_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static ViewBriefDto VIEW_3_BRIEF_DTO = ViewBriefDto.builder()
@@ -5121,9 +5153,10 @@ public abstract class BaseTest {
             .internalName(VIEW_3_INTERNAL_NAME)
             .vdbid(VIEW_3_DATABASE_ID)
             .isPublic(VIEW_3_PUBLIC)
+            .isSchemaPublic(VIEW_3_SCHEMA_PUBLIC)
             .query(VIEW_3_QUERY)
             .queryHash(VIEW_3_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
             .build();
 
     public final static Long VIEW_4_ID = 4L;
@@ -5135,6 +5168,7 @@ public abstract class BaseTest {
     public final static Long VIEW_4_TABLE_ID = TABLE_5_ID;
     public final static Table VIEW_4_TABLE = TABLE_5;
     public final static Boolean VIEW_4_PUBLIC = true;
+    public final static Boolean VIEW_4_SCHEMA_PUBLIC = true;
     public final static String VIEW_4_QUERY = "SELECT `animal_name`, `hair`, `feathers`, `eggs`, `milk`, `airborne`, `aquatic`, `predator`, `backbone`, `breathes`, `venomous`, `fins`, `legs`, `tail`, `domestic`, `catsize`, `class_type` FROM `zoo` WHERE `class_type` = 1";
     public final static String VIEW_4_QUERY_HASH = "3561cd0bb0b0e94d6f15ae602134252a5760d09d660a71a4fb015b6991c8ba0b";
 
@@ -5283,9 +5317,11 @@ public abstract class BaseTest {
             .internalName(VIEW_4_INTERNAL_NAME)
             .vdbid(VIEW_4_DATABASE_ID)
             .isPublic(VIEW_4_PUBLIC)
+            .isSchemaPublic(VIEW_4_SCHEMA_PUBLIC)
             .query(VIEW_4_QUERY)
             .queryHash(VIEW_4_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
+            .owner(USER_1)
             .columns(null) /* VIEW_4_COLUMNS */
             .build();
 
@@ -5296,12 +5332,26 @@ public abstract class BaseTest {
             .internalName(VIEW_4_INTERNAL_NAME)
             .vdbid(VIEW_4_DATABASE_ID)
             .isPublic(VIEW_4_PUBLIC)
+            .isSchemaPublic(VIEW_4_SCHEMA_PUBLIC)
             .query(VIEW_4_QUERY)
             .queryHash(VIEW_4_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .owner(USER_1_BRIEF_DTO)
             .columns(VIEW_4_COLUMNS_DTO)
             .build();
 
+    public final static ViewBriefDto VIEW_4_BRIEF_DTO = ViewBriefDto.builder()
+            .id(VIEW_4_ID)
+            .isInitialView(VIEW_4_INITIAL_VIEW)
+            .name(VIEW_4_NAME)
+            .internalName(VIEW_4_INTERNAL_NAME)
+            .vdbid(VIEW_4_DATABASE_ID)
+            .isPublic(VIEW_4_PUBLIC)
+            .isSchemaPublic(VIEW_4_SCHEMA_PUBLIC)
+            .query(VIEW_4_QUERY)
+            .queryHash(VIEW_4_QUERY_HASH)
+            .ownedBy(USER_1_ID)
+            .build();
+
     public final static List<ViewColumn> VIEW_4_COLUMNS = List.of(
             ViewColumn.builder()
                     .id(12L)
@@ -5464,6 +5514,7 @@ public abstract class BaseTest {
     public final static Long VIEW_5_CONTAINER_ID = CONTAINER_2_ID;
     public final static Long VIEW_5_DATABASE_ID = DATABASE_3_ID;
     public final static Boolean VIEW_5_PUBLIC = true;
+    public final static Boolean VIEW_5_SCHEMA_PUBLIC = true;
     public final static String VIEW_5_QUERY = "SELECT `location`, `lat`, `lng` FROM `weather_location` WHERE `location` = 'Albury'";
     public final static String VIEW_5_QUERY_HASH = "120f32478aaff874c25ab32eceb9f00b64cc9d422831046f2f5d43953aca01e7";
 
@@ -5474,9 +5525,11 @@ public abstract class BaseTest {
             .internalName(VIEW_5_INTERNAL_NAME)
             .vdbid(VIEW_5_DATABASE_ID)
             .isPublic(VIEW_5_PUBLIC)
+            .isSchemaPublic(VIEW_5_SCHEMA_PUBLIC)
             .query(VIEW_5_QUERY)
             .queryHash(VIEW_5_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .ownedBy(USER_1_ID)
+            .owner(USER_1)
             .columns(null)
             .build();
 
@@ -5487,12 +5540,25 @@ public abstract class BaseTest {
             .internalName(VIEW_5_INTERNAL_NAME)
             .vdbid(VIEW_5_DATABASE_ID)
             .isPublic(VIEW_5_PUBLIC)
+            .isSchemaPublic(VIEW_5_SCHEMA_PUBLIC)
             .query(VIEW_5_QUERY)
             .queryHash(VIEW_5_QUERY_HASH)
-            .createdBy(USER_1_ID)
+            .owner(USER_1_BRIEF_DTO)
             .columns(null)
             .build();
 
+    public final static ViewBriefDto VIEW_5_BRIEF_DTO = ViewBriefDto.builder()
+            .id(VIEW_5_ID)
+            .isInitialView(VIEW_5_INITIAL_VIEW)
+            .name(VIEW_5_NAME)
+            .internalName(VIEW_5_INTERNAL_NAME)
+            .vdbid(VIEW_5_DATABASE_ID)
+            .isPublic(VIEW_5_PUBLIC)
+            .isSchemaPublic(VIEW_5_SCHEMA_PUBLIC)
+            .query(VIEW_5_QUERY)
+            .queryHash(VIEW_5_QUERY_HASH)
+            .build();
+
     public final static List<ViewColumn> VIEW_5_COLUMNS = List.of(
             ViewColumn.builder()
                     .id(29L)
@@ -5644,8 +5710,7 @@ public abstract class BaseTest {
     public final static Long IDENTIFIER_1_QUERY_ID = null;
     public final static Long IDENTIFIER_1_CONTAINER_ID = CONTAINER_1_ID;
     public final static Long IDENTIFIER_1_DATABASE_ID = DATABASE_1_ID;
-    public final static String IDENTIFIER_1_DOI = null;
-    public final static String IDENTIFIER_1_DOI_NOT_NULL = "10.12345/183";
+    public final static String IDENTIFIER_1_DOI = "10.12345/183";
     public final static Instant IDENTIFIER_1_CREATED = Instant.ofEpochSecond(1641588352L) /* 2022-01-07 20:45:52 */;
     public final static Instant IDENTIFIER_1_MODIFIED = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */;
     public final static Instant IDENTIFIER_1_EXECUTION = Instant.ofEpochSecond(1541588352L) /* 2022-01-07 20:45:52 */;
@@ -5660,7 +5725,6 @@ public abstract class BaseTest {
     public final static String IDENTIFIER_1_PUBLISHER = "Austrian Government";
     public final static IdentifierType IDENTIFIER_1_TYPE = IdentifierType.DATABASE;
     public final static IdentifierTypeDto IDENTIFIER_1_TYPE_DTO = IdentifierTypeDto.DATABASE;
-    public final static UUID IDENTIFIER_1_CREATED_BY = USER_1_ID;
     public final static IdentifierStatusType IDENTIFIER_1_STATUS_TYPE = IdentifierStatusType.PUBLISHED;
     public final static IdentifierStatusTypeDto IDENTIFIER_1_STATUS_TYPE_DTO = IdentifierStatusTypeDto.PUBLISHED;
 
@@ -5871,7 +5935,7 @@ public abstract class BaseTest {
             .data(DataCiteData.<DataCiteDoi>builder()
                     .type("dois")
                     .attributes(DataCiteDoi.builder()
-                            .doi(IDENTIFIER_1_DOI_NOT_NULL)
+                            .doi(IDENTIFIER_1_DOI)
                             .build())
                     .build())
             .build();
@@ -5895,8 +5959,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_1_RESULT_NUMBER)
             .publisher(IDENTIFIER_1_PUBLISHER)
             .type(IDENTIFIER_1_TYPE)
-            .createdBy(USER_1_ID)
-            .creator(USER_1)
+            .owner(USER_1)
+            .ownedBy(USER_1_ID)
             .licenses(new LinkedList<>(List.of(LICENSE_1)))
             .creators(new LinkedList<>(List.of(IDENTIFIER_1_CREATOR_1)))
             .funders(new LinkedList<>(List.of(IDENTIFIER_1_FUNDER_1)))
@@ -5908,7 +5972,7 @@ public abstract class BaseTest {
             .queryId(IDENTIFIER_1_QUERY_ID)
             .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1))
             .titles(List.of(IDENTIFIER_1_TITLE_1, IDENTIFIER_1_TITLE_2))
-            .doi(IDENTIFIER_1_DOI_NOT_NULL)
+            .doi(IDENTIFIER_1_DOI)
             .database(null /* for jpa */)
             .created(IDENTIFIER_1_CREATED)
             .lastModified(IDENTIFIER_1_MODIFIED)
@@ -5922,7 +5986,7 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_1_RESULT_NUMBER)
             .publisher(IDENTIFIER_1_PUBLISHER)
             .type(IDENTIFIER_1_TYPE)
-            .createdBy(USER_1_ID)
+            .owner(USER_1)
             .licenses(List.of(LICENSE_1))
             .creators(List.of(IDENTIFIER_1_CREATOR_1))
             .funders(List.of(IDENTIFIER_1_FUNDER_1))
@@ -5936,8 +6000,6 @@ public abstract class BaseTest {
             .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_DTO))
             .titles(List.of(IDENTIFIER_1_TITLE_1_DTO, IDENTIFIER_1_TITLE_2_DTO))
             .doi(IDENTIFIER_1_DOI)
-            .created(IDENTIFIER_1_CREATED)
-            .lastModified(IDENTIFIER_1_MODIFIED)
             .execution(IDENTIFIER_1_EXECUTION)
             .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR)
             .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH)
@@ -5948,53 +6010,22 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_1_RESULT_NUMBER)
             .publisher(IDENTIFIER_1_PUBLISHER)
             .type(IDENTIFIER_1_TYPE_DTO)
-            .creator(USER_1_DTO)
+            .owner(USER_1_DTO)
             .licenses(List.of(LICENSE_1_DTO))
             .creators(List.of(IDENTIFIER_1_CREATOR_1_DTO))
             .funders(List.of(IDENTIFIER_1_FUNDER_1_DTO))
             .status(IDENTIFIER_1_STATUS_TYPE_DTO)
             .build();
 
-    public final static IdentifierDto IDENTIFIER_1_WITH_DOI_DTO = IdentifierDto.builder()
+    public final static IdentifierBriefDto IDENTIFIER_1_BRIEF_DTO = IdentifierBriefDto.builder()
             .id(IDENTIFIER_1_ID)
             .databaseId(DATABASE_1_ID)
             .queryId(IDENTIFIER_1_QUERY_ID)
-            .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_DTO))
             .titles(List.of(IDENTIFIER_1_TITLE_1_DTO, IDENTIFIER_1_TITLE_2_DTO))
-            .doi(IDENTIFIER_1_DOI_NOT_NULL)
-            .created(IDENTIFIER_1_CREATED)
-            .lastModified(IDENTIFIER_1_MODIFIED)
-            .execution(IDENTIFIER_1_EXECUTION)
-            .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR)
-            .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH)
-            .queryHash(IDENTIFIER_1_QUERY_HASH)
-            .resultHash(IDENTIFIER_1_RESULT_HASH)
-            .query(IDENTIFIER_1_QUERY)
-            .queryNormalized(IDENTIFIER_1_NORMALIZED)
-            .resultNumber(IDENTIFIER_1_RESULT_NUMBER)
-            .publisher(IDENTIFIER_1_PUBLISHER)
-            .type(IDENTIFIER_1_TYPE_DTO)
-            .creator(USER_1_DTO)
-            .licenses(List.of(LICENSE_1_DTO))
-            .creators(List.of(IDENTIFIER_1_CREATOR_1_DTO))
-            .funders(List.of(IDENTIFIER_1_FUNDER_1_DTO))
-            .status(IDENTIFIER_1_STATUS_TYPE_DTO)
-            .build();
-
-    public final static IdentifierDto IDENTIFIER_1_MODIFY_DTO = IdentifierDto.builder()
-            .id(IDENTIFIER_1_ID)
-            .databaseId(DATABASE_2_ID)
-            .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_DTO_MODIFY))
-            .titles(List.of(IDENTIFIER_1_TITLE_1_DTO_MODIFY, IDENTIFIER_1_TITLE_2_DTO))
             .doi(IDENTIFIER_1_DOI)
-            .publisher(IDENTIFIER_1_PUBLISHER)
             .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR)
-            .publicationMonth(IDENTIFIER_1_PUBLICATION_MONTH)
+            .publisher(IDENTIFIER_1_PUBLISHER)
             .type(IDENTIFIER_1_TYPE_DTO)
-            .created(IDENTIFIER_1_CREATED)
-            .lastModified(IDENTIFIER_1_MODIFIED)
-            .licenses(List.of(LICENSE_1_DTO))
-            .creators(List.of(IDENTIFIER_1_CREATOR_1_DTO))
             .status(IDENTIFIER_1_STATUS_TYPE_DTO)
             .build();
 
@@ -6018,7 +6049,7 @@ public abstract class BaseTest {
     public final static IdentifierCreateDto IDENTIFIER_1_CREATE_WITH_DOI_DTO = IdentifierCreateDto.builder()
             .databaseId(IDENTIFIER_1_DATABASE_ID)
             .type(IDENTIFIER_1_TYPE_DTO)
-            .doi(IDENTIFIER_1_DOI_NOT_NULL)
+            .doi(IDENTIFIER_1_DOI)
             .publicationYear(IDENTIFIER_1_PUBLICATION_YEAR)
             .publisher(IDENTIFIER_1_PUBLISHER)
             .descriptions(List.of(IDENTIFIER_1_DESCRIPTION_1_CREATE_DTO))
@@ -6244,8 +6275,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_5_RESULT_NUMBER)
             .publisher(IDENTIFIER_5_PUBLISHER)
             .type(IDENTIFIER_5_TYPE)
-            .createdBy(USER_2_ID)
-            .creator(USER_2)
+            .owner(USER_2)
+            .ownedBy(USER_2_ID)
             .creators(new LinkedList<>(List.of(IDENTIFIER_5_CREATOR_1, IDENTIFIER_5_CREATOR_2)))
             .status(IDENTIFIER_5_STATUS_TYPE)
             .build();
@@ -6257,8 +6288,6 @@ public abstract class BaseTest {
             .descriptions(List.of(IDENTIFIER_5_DESCRIPTION_1_DTO))
             .titles(List.of(IDENTIFIER_5_TITLE_1_DTO))
             .doi(IDENTIFIER_5_DOI)
-            .created(IDENTIFIER_5_CREATED)
-            .lastModified(IDENTIFIER_5_MODIFIED)
             .execution(IDENTIFIER_5_EXECUTION)
             .publicationDay(IDENTIFIER_5_PUBLICATION_DAY)
             .publicationMonth(IDENTIFIER_5_PUBLICATION_MONTH)
@@ -6270,10 +6299,21 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_5_RESULT_NUMBER)
             .publisher(IDENTIFIER_5_PUBLISHER)
             .type(IDENTIFIER_5_TYPE_DTO)
-            .creator(USER_2_DTO)
+            .owner(USER_2_DTO)
             .creators(List.of(IDENTIFIER_5_CREATOR_1_DTO, IDENTIFIER_5_CREATOR_2_DTO))
             .build();
 
+    public final static IdentifierBriefDto IDENTIFIER_5_BRIEF_DTO = IdentifierBriefDto.builder()
+            .id(IDENTIFIER_5_ID)
+            .databaseId(DATABASE_2_ID)
+            .queryId(IDENTIFIER_5_QUERY_ID)
+            .titles(List.of(IDENTIFIER_5_TITLE_1_DTO))
+            .doi(IDENTIFIER_5_DOI)
+            .publicationYear(IDENTIFIER_5_PUBLICATION_YEAR)
+            .publisher(IDENTIFIER_5_PUBLISHER)
+            .type(IDENTIFIER_5_TYPE_DTO)
+            .build();
+
     public final static Long RELATED_IDENTIFIER_5_ID = 1L;
     public final static Long RELATED_IDENTIFIER_5_IDENTIFIER_ID = 2L;
     public final static String RELATED_IDENTIFIER_5_VALUE = "10.5281/zenodo.6637333";
@@ -6514,8 +6554,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_6_RESULT_NUMBER)
             .publisher(IDENTIFIER_6_PUBLISHER)
             .type(IDENTIFIER_6_TYPE)
-            .createdBy(USER_3_ID)
-            .creator(USER_3)
+            .owner(USER_3)
+            .ownedBy(USER_3_ID)
             .licenses(new LinkedList<>(List.of(LICENSE_1)))
             .creators(new LinkedList<>(List.of(IDENTIFIER_6_CREATOR_1, IDENTIFIER_6_CREATOR_2, IDENTIFIER_6_CREATOR_3)))
             .status(IDENTIFIER_6_STATUS_TYPE)
@@ -6528,8 +6568,6 @@ public abstract class BaseTest {
             .descriptions(List.of(IDENTIFIER_6_DESCRIPTION_1_DTO))
             .titles(List.of(IDENTIFIER_6_TITLE_1_DTO))
             .doi(IDENTIFIER_6_DOI)
-            .created(IDENTIFIER_6_CREATED)
-            .lastModified(IDENTIFIER_6_MODIFIED)
             .execution(IDENTIFIER_6_EXECUTION)
             .publicationDay(IDENTIFIER_6_PUBLICATION_DAY)
             .publicationMonth(IDENTIFIER_6_PUBLICATION_MONTH)
@@ -6541,12 +6579,25 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_6_RESULT_NUMBER)
             .publisher(IDENTIFIER_6_PUBLISHER)
             .type(IDENTIFIER_6_TYPE_DTO)
-            .creator(USER_3_DTO)
+            .owner(USER_3_DTO)
             .licenses(new LinkedList<>(List.of(LICENSE_1_DTO)))
             .creators(new LinkedList<>(List.of(IDENTIFIER_6_CREATOR_1_DTO, IDENTIFIER_6_CREATOR_2_DTO, IDENTIFIER_6_CREATOR_3_DTO)))
             .status(IDENTIFIER_6_STATUS_TYPE_DTO)
             .build();
 
+
+    public final static IdentifierBriefDto IDENTIFIER_6_BRIEF_DTO = IdentifierBriefDto.builder()
+            .id(IDENTIFIER_6_ID)
+            .databaseId(DATABASE_3_ID)
+            .queryId(IDENTIFIER_6_QUERY_ID)
+            .titles(List.of(IDENTIFIER_6_TITLE_1_DTO))
+            .doi(IDENTIFIER_6_DOI)
+            .publicationYear(IDENTIFIER_6_PUBLICATION_YEAR)
+            .publisher(IDENTIFIER_6_PUBLISHER)
+            .type(IDENTIFIER_6_TYPE_DTO)
+            .status(IDENTIFIER_6_STATUS_TYPE_DTO)
+            .build();
+
     public final static IdentifierCreateDto IDENTIFIER_6_CREATE_DTO = IdentifierCreateDto.builder()
             .databaseId(IDENTIFIER_6_DATABASE_ID)
             .publicationYear(IDENTIFIER_6_PUBLICATION_YEAR)
@@ -6627,8 +6678,6 @@ public abstract class BaseTest {
             .descriptions(new LinkedList<>())
             .titles(new LinkedList<>())
             .doi(IDENTIFIER_7_DOI)
-            .created(IDENTIFIER_7_CREATED)
-            .lastModified(IDENTIFIER_7_MODIFIED)
             .execution(IDENTIFIER_7_EXECUTION)
             .publicationDay(IDENTIFIER_7_PUBLICATION_DAY)
             .publicationMonth(IDENTIFIER_7_PUBLICATION_MONTH)
@@ -6636,7 +6685,7 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_7_RESULT_NUMBER)
             .publisher(IDENTIFIER_7_PUBLISHER)
             .type(IDENTIFIER_7_TYPE_DTO)
-            .creator(USER_4_DTO)
+            .owner(USER_4_DTO)
             .licenses(new LinkedList<>())
             .funders(new LinkedList<>())
             .creators(new LinkedList<>())
@@ -6724,8 +6773,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_2_RESULT_NUMBER)
             .publisher(IDENTIFIER_2_PUBLISHER)
             .type(IDENTIFIER_2_TYPE)
-            .createdBy(USER_1_ID)
-            .creator(USER_1)
+            .owner(USER_1)
+            .ownedBy(USER_1_ID)
             .licenses(new LinkedList<>(List.of(LICENSE_1)))
             .creators(new LinkedList<>())
             .status(IDENTIFIER_2_STATUS_TYPE)
@@ -6738,8 +6787,6 @@ public abstract class BaseTest {
             .descriptions(new LinkedList<>())
             .titles(new LinkedList<>())
             .doi(IDENTIFIER_2_DOI)
-            .created(IDENTIFIER_2_CREATED)
-            .lastModified(IDENTIFIER_2_MODIFIED)
             .execution(IDENTIFIER_2_EXECUTION)
             .publicationDay(IDENTIFIER_2_PUBLICATION_DAY)
             .publicationMonth(IDENTIFIER_2_PUBLICATION_MONTH)
@@ -6751,12 +6798,24 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_2_RESULT_NUMBER)
             .publisher(IDENTIFIER_2_PUBLISHER)
             .type(IDENTIFIER_2_TYPE_DTO)
-            .creator(USER_1_DTO)
+            .owner(USER_1_DTO)
             .licenses(new LinkedList<>(List.of(LICENSE_1_DTO)))
             .creators(new LinkedList<>())
             .status(IDENTIFIER_2_STATUS_TYPE_DTO)
             .build();
 
+    public final static IdentifierBriefDto IDENTIFIER_2_BRIEF_DTO = IdentifierBriefDto.builder()
+            .id(IDENTIFIER_2_ID)
+            .queryId(IDENTIFIER_2_QUERY_ID)
+            .databaseId(IDENTIFIER_2_DATABASE_ID)
+            .titles(new LinkedList<>())
+            .doi(IDENTIFIER_2_DOI)
+            .publicationYear(IDENTIFIER_2_PUBLICATION_YEAR)
+            .publisher(IDENTIFIER_2_PUBLISHER)
+            .type(IDENTIFIER_2_TYPE_DTO)
+            .status(IDENTIFIER_2_STATUS_TYPE_DTO)
+            .build();
+
     public final static IdentifierSaveDto IDENTIFIER_2_SAVE_DTO = IdentifierSaveDto.builder()
             .id(IDENTIFIER_2_ID)
             .databaseId(IDENTIFIER_2_DATABASE_ID)
@@ -6815,8 +6874,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_3_RESULT_NUMBER)
             .publisher(IDENTIFIER_3_PUBLISHER)
             .type(IDENTIFIER_3_TYPE)
-            .createdBy(USER_1_ID)
-            .creator(USER_1)
+            .owner(USER_1)
+            .ownedBy(USER_1_ID)
             .licenses(new LinkedList<>(List.of(LICENSE_1)))
             .creators(new LinkedList<>())
             .status(IDENTIFIER_3_STATUS_TYPE)
@@ -6829,8 +6888,6 @@ public abstract class BaseTest {
             .descriptions(new LinkedList<>())
             .titles(new LinkedList<>())
             .doi(IDENTIFIER_3_DOI)
-            .created(IDENTIFIER_3_CREATED)
-            .lastModified(IDENTIFIER_3_MODIFIED)
             .execution(IDENTIFIER_3_EXECUTION)
             .publicationDay(IDENTIFIER_3_PUBLICATION_DAY)
             .publicationMonth(IDENTIFIER_3_PUBLICATION_MONTH)
@@ -6842,12 +6899,24 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_3_RESULT_NUMBER)
             .publisher(IDENTIFIER_3_PUBLISHER)
             .type(IDENTIFIER_3_TYPE_DTO)
-            .creator(USER_1_DTO)
+            .owner(USER_1_DTO)
             .licenses(new LinkedList<>(List.of(LICENSE_1_DTO)))
             .creators(new LinkedList<>())
             .status(IDENTIFIER_3_STATUS_TYPE_DTO)
             .build();
 
+    public final static IdentifierBriefDto IDENTIFIER_3_BRIEF_DTO = IdentifierBriefDto.builder()
+            .id(IDENTIFIER_3_ID)
+            .databaseId(IDENTIFIER_3_DATABASE_ID)
+            .viewId(IDENTIFIER_3_VIEW_ID)
+            .titles(new LinkedList<>())
+            .doi(IDENTIFIER_3_DOI)
+            .publicationYear(IDENTIFIER_3_PUBLICATION_YEAR)
+            .publisher(IDENTIFIER_3_PUBLISHER)
+            .type(IDENTIFIER_3_TYPE_DTO)
+            .status(IDENTIFIER_3_STATUS_TYPE_DTO)
+            .build();
+
     public final static IdentifierCreateDto IDENTIFIER_3_CREATE_DTO = IdentifierCreateDto.builder()
             .databaseId(IDENTIFIER_3_DATABASE_ID)
             .viewId(IDENTIFIER_3_VIEW_ID)
@@ -6907,8 +6976,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_4_RESULT_NUMBER)
             .publisher(IDENTIFIER_4_PUBLISHER)
             .type(IDENTIFIER_4_TYPE)
-            .createdBy(USER_1_ID)
-            .creator(USER_1)
+            .owner(USER_1)
+            .ownedBy(USER_1_ID)
             .licenses(new LinkedList<>(List.of(LICENSE_1)))
             .creators(new LinkedList<>())
             .status(IDENTIFIER_4_STATUS_TYPE)
@@ -6921,8 +6990,6 @@ public abstract class BaseTest {
             .descriptions(new LinkedList<>())
             .titles(new LinkedList<>())
             .doi(IDENTIFIER_4_DOI)
-            .created(IDENTIFIER_4_CREATED)
-            .lastModified(IDENTIFIER_4_MODIFIED)
             .execution(IDENTIFIER_4_EXECUTION)
             .publicationDay(IDENTIFIER_4_PUBLICATION_DAY)
             .publicationMonth(IDENTIFIER_4_PUBLICATION_MONTH)
@@ -6931,12 +6998,24 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_4_RESULT_NUMBER)
             .publisher(IDENTIFIER_4_PUBLISHER)
             .type(IDENTIFIER_4_TYPE_DTO)
-            .creator(USER_1_DTO)
+            .owner(USER_1_DTO)
             .licenses(new LinkedList<>(List.of(LICENSE_1_DTO)))
             .creators(new LinkedList<>())
             .status(IDENTIFIER_4_STATUS_TYPE_DTO)
             .build();
 
+    public final static IdentifierBriefDto IDENTIFIER_4_BRIEF_DTO = IdentifierBriefDto.builder()
+            .id(IDENTIFIER_4_ID)
+            .databaseId(IDENTIFIER_4_DATABASE_ID)
+            .tableId(IDENTIFIER_4_TABLE_ID)
+            .titles(new LinkedList<>())
+            .doi(IDENTIFIER_4_DOI)
+            .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR)
+            .publisher(IDENTIFIER_4_PUBLISHER)
+            .type(IDENTIFIER_4_TYPE_DTO)
+            .status(IDENTIFIER_4_STATUS_TYPE_DTO)
+            .build();
+
     public final static IdentifierCreateDto IDENTIFIER_4_CREATE_DTO = IdentifierCreateDto.builder()
             .databaseId(IDENTIFIER_4_DATABASE_ID)
             .publicationYear(IDENTIFIER_4_PUBLICATION_YEAR)
@@ -7036,6 +7115,7 @@ public abstract class BaseTest {
             .created(Instant.now().minus(1, HOURS))
             .lastModified(Instant.now())
             .isPublic(DATABASE_1_PUBLIC)
+            .isSchemaPublic(DATABASE_1_SCHEMA_PUBLIC)
             .name(DATABASE_1_NAME)
             .description(DATABASE_1_DESCRIPTION)
             .identifiers(List.of(IDENTIFIER_1, IDENTIFIER_2, IDENTIFIER_3, IDENTIFIER_4))
@@ -7045,8 +7125,8 @@ public abstract class BaseTest {
             .exchangeName(DATABASE_1_EXCHANGE)
             .created(DATABASE_1_CREATED)
             .lastModified(DATABASE_1_LAST_MODIFIED)
-            .createdBy(DATABASE_1_CREATED_BY)
-            .creator(USER_1)
+            .ownedBy(DATABASE_1_CREATED_BY)
+            .owner(USER_1)
             .ownedBy(DATABASE_1_OWNER)
             .owner(USER_1)
             .image(new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
@@ -7061,20 +7141,18 @@ public abstract class BaseTest {
 
     public final static DatabaseDto DATABASE_1_DTO = DatabaseDto.builder()
             .id(DATABASE_1_ID)
-            .created(Instant.now().minus(1, HOURS))
             .isPublic(DATABASE_1_PUBLIC)
             .name(DATABASE_1_NAME)
-            .container(CONTAINER_1_DTO)
+            .container(CONTAINER_1_BRIEF_DTO)
             .internalName(DATABASE_1_INTERNALNAME)
             .exchangeName(DATABASE_1_EXCHANGE)
-            .identifiers(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO))
-            .tables(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO))
-            .views(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO))
+            .identifiers(List.of(IDENTIFIER_1_BRIEF_DTO, IDENTIFIER_2_BRIEF_DTO, IDENTIFIER_3_BRIEF_DTO, IDENTIFIER_4_BRIEF_DTO))
+            .tables(List.of(TABLE_1_BRIEF_DTO, TABLE_2_BRIEF_DTO, TABLE_3_BRIEF_DTO, TABLE_4_BRIEF_DTO))
+            .views(List.of(VIEW_1_BRIEF_DTO, VIEW_2_BRIEF_DTO, VIEW_3_BRIEF_DTO))
             .build();
 
     public final static PrivilegedDatabaseDto DATABASE_1_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
             .id(DATABASE_1_ID)
-            .created(Instant.now().minus(1, HOURS))
             .isPublic(DATABASE_1_PUBLIC)
             .name(DATABASE_1_NAME)
             .container(CONTAINER_1_PRIVILEGED_DTO)
@@ -7083,9 +7161,7 @@ public abstract class BaseTest {
             .identifiers(List.of(IDENTIFIER_1_DTO, IDENTIFIER_2_DTO, IDENTIFIER_3_DTO, IDENTIFIER_4_DTO))
             .tables(List.of(TABLE_1_DTO, TABLE_2_DTO, TABLE_3_DTO, TABLE_4_DTO))
             .views(List.of(VIEW_1_DTO, VIEW_2_DTO, VIEW_3_DTO))
-            .created(DATABASE_1_CREATED)
-            .creator(DATABASE_1_CREATOR_DTO)
-            .owner(DATABASE_1_OWNER_DTO)
+            .owner(USER_1_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_1_USER_1_READ_ACCESS = DatabaseAccess.builder()
@@ -7100,7 +7176,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.READ)
             .hdbid(DATABASE_1_ID)
             .huserid(USER_1_ID)
-            .user(USER_1_DTO)
+            .user(USER_1_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_1_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder()
@@ -7131,7 +7207,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.READ)
             .hdbid(DATABASE_1_ID)
             .huserid(USER_2_ID)
-            .user(USER_2_DTO)
+            .user(USER_2_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_1_USER_2_WRITE_OWN_ACCESS = DatabaseAccess.builder()
@@ -7146,7 +7222,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_OWN)
             .hdbid(DATABASE_1_ID)
             .huserid(USER_2_ID)
-            .user(USER_2_DTO)
+            .user(USER_2_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_1_USER_2_WRITE_ALL_ACCESS = DatabaseAccess.builder()
@@ -7161,7 +7237,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_ALL)
             .hdbid(DATABASE_1_ID)
             .huserid(USER_2_ID)
-            .user(USER_2_DTO)
+            .user(USER_2_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_1_USER_3_READ_ACCESS = DatabaseAccess.builder()
@@ -7192,7 +7268,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_ALL)
             .hdbid(DATABASE_1_ID)
             .huserid(USER_3_ID)
-            .user(USER_3_DTO)
+            .user(USER_3_BRIEF_DTO)
             .build();
 
     public final static Database DATABASE_2 = Database.builder()
@@ -7200,6 +7276,7 @@ public abstract class BaseTest {
             .created(DATABASE_2_CREATED)
             .lastModified(Instant.now())
             .isPublic(DATABASE_2_PUBLIC)
+            .isSchemaPublic(DATABASE_2_SCHEMA_PUBLIC)
             .name(DATABASE_2_NAME)
             .description(DATABASE_2_DESCRIPTION)
             .cid(CONTAINER_1_ID)
@@ -7208,8 +7285,6 @@ public abstract class BaseTest {
             .exchangeName(DATABASE_2_EXCHANGE)
             .created(DATABASE_2_CREATED)
             .lastModified(DATABASE_2_LAST_MODIFIED)
-            .createdBy(DATABASE_2_CREATOR)
-            .creator(USER_2)
             .ownedBy(DATABASE_2_OWNER)
             .owner(USER_2)
             .contactPerson(USER_2_ID)
@@ -7222,7 +7297,6 @@ public abstract class BaseTest {
 
     public final static PrivilegedDatabaseDto DATABASE_2_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
             .id(DATABASE_2_ID)
-            .created(Instant.now().minus(1, HOURS))
             .isPublic(DATABASE_2_PUBLIC)
             .name(DATABASE_2_NAME)
             .container(CONTAINER_1_PRIVILEGED_DTO)
@@ -7231,23 +7305,21 @@ public abstract class BaseTest {
             .identifiers(List.of(IDENTIFIER_5_DTO))
             .tables(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO))
             .views(List.of(VIEW_4_DTO))
-            .created(DATABASE_2_CREATED)
-            .creator(USER_2_DTO)
-            .owner(USER_2_DTO)
+            .owner(USER_2_BRIEF_DTO)
             .build();
 
     public final static DatabaseDto DATABASE_2_DTO = DatabaseDto.builder()
             .id(DATABASE_2_ID)
-            .created(DATABASE_2_CREATED)
             .isPublic(DATABASE_2_PUBLIC)
             .name(DATABASE_2_NAME)
-            .container(CONTAINER_1_DTO)
+            .container(CONTAINER_1_BRIEF_DTO)
             .internalName(DATABASE_2_INTERNALNAME)
             .exchangeName(DATABASE_2_EXCHANGE)
-            .identifiers(List.of(IDENTIFIER_5_DTO))
-            .tables(List.of(TABLE_5_DTO, TABLE_6_DTO, TABLE_7_DTO))
-            .views(List.of(VIEW_4_DTO))
+            .identifiers(List.of(IDENTIFIER_5_BRIEF_DTO))
+            .tables(List.of(TABLE_5_BRIEF_DTO, TABLE_6_BRIEF_DTO, TABLE_7_BRIEF_DTO))
+            .views(List.of(VIEW_4_BRIEF_DTO))
             .identifiers(new LinkedList<>())
+            .owner(USER_2_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_2_USER_1_READ_ACCESS = DatabaseAccess.builder()
@@ -7302,7 +7374,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_ALL)
             .hdbid(DATABASE_2_ID)
             .huserid(USER_2_ID)
-            .user(USER_2_DTO)
+            .user(USER_2_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_2_USER_3_READ_ACCESS = DatabaseAccess.builder()
@@ -7317,7 +7389,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.READ)
             .hdbid(DATABASE_2_ID)
             .huserid(USER_3_ID)
-            .user(USER_3_DTO)
+            .user(USER_3_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_2_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder()
@@ -7341,6 +7413,7 @@ public abstract class BaseTest {
             .created(Instant.now().minus(1, HOURS))
             .lastModified(Instant.now())
             .isPublic(DATABASE_3_PUBLIC)
+            .isSchemaPublic(DATABASE_3_SCHEMA_PUBLIC)
             .name(DATABASE_3_NAME)
             .description(DATABASE_3_DESCRIPTION)
             .cid(CONTAINER_1_ID)
@@ -7349,8 +7422,6 @@ public abstract class BaseTest {
             .exchangeName(DATABASE_3_EXCHANGE)
             .created(DATABASE_3_CREATED)
             .lastModified(DATABASE_3_LAST_MODIFIED)
-            .createdBy(DATABASE_3_CREATOR_ID)
-            .creator(USER_3)
             .ownedBy(DATABASE_3_OWNER)
             .owner(USER_3)
             .contactPerson(USER_3_ID)
@@ -7373,7 +7444,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.READ)
             .hdbid(DATABASE_3_ID)
             .huserid(USER_1_ID)
-            .user(USER_1_DTO)
+            .user(USER_1_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_3_USER_1_WRITE_OWN_ACCESS = DatabaseAccess.builder()
@@ -7388,7 +7459,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_OWN)
             .hdbid(DATABASE_3_ID)
             .huserid(USER_1_ID)
-            .user(USER_1_DTO)
+            .user(USER_1_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_3_USER_1_WRITE_ALL_ACCESS = DatabaseAccess.builder()
@@ -7435,7 +7506,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.READ)
             .hdbid(DATABASE_3_ID)
             .huserid(USER_3_ID)
-            .user(USER_3_DTO)
+            .user(USER_3_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_3_USER_3_WRITE_OWN_ACCESS = DatabaseAccess.builder()
@@ -7450,7 +7521,7 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_OWN)
             .hdbid(DATABASE_3_ID)
             .huserid(USER_3_ID)
-            .user(USER_3_DTO)
+            .user(USER_3_BRIEF_DTO)
             .build();
 
     public final static DatabaseAccess DATABASE_3_USER_3_WRITE_ALL_ACCESS = DatabaseAccess.builder()
@@ -7465,12 +7536,11 @@ public abstract class BaseTest {
             .type(AccessTypeDto.WRITE_ALL)
             .hdbid(DATABASE_3_ID)
             .huserid(USER_3_ID)
-            .user(USER_3_DTO)
+            .user(USER_3_BRIEF_DTO)
             .build();
 
     public final static PrivilegedDatabaseDto DATABASE_3_PRIVILEGED_DTO = PrivilegedDatabaseDto.builder()
             .id(DATABASE_3_ID)
-            .created(Instant.now().minus(1, HOURS))
             .isPublic(DATABASE_3_PUBLIC)
             .name(DATABASE_3_NAME)
             .container(CONTAINER_1_PRIVILEGED_DTO)
@@ -7479,9 +7549,7 @@ public abstract class BaseTest {
             .identifiers(List.of(IDENTIFIER_6_DTO))
             .tables(List.of(TABLE_8_DTO))
             .views(List.of(VIEW_5_DTO))
-            .created(DATABASE_3_CREATED)
-            .creator(DATABASE_3_CREATOR_DTO)
-            .owner(DATABASE_3_OWNER_DTO)
+            .owner(USER_3_BRIEF_DTO)
             .build();
 
     public final static Identifier IDENTIFIER_7 = Identifier.builder()
@@ -7498,8 +7566,8 @@ public abstract class BaseTest {
             .resultNumber(IDENTIFIER_7_RESULT_NUMBER)
             .publisher(IDENTIFIER_7_PUBLISHER)
             .type(IDENTIFIER_7_TYPE)
-            .createdBy(USER_4_ID)
-            .creator(USER_4)
+            .owner(USER_4)
+            .ownedBy(USER_4_ID)
             .licenses(new LinkedList<>())
             .creators(new LinkedList<>(List.of(IDENTIFIER_7_CREATOR_1)))
             .relatedIdentifiers(new LinkedList<>())
@@ -7512,6 +7580,7 @@ public abstract class BaseTest {
             .created(Instant.now().minus(4, HOURS))
             .lastModified(Instant.now())
             .isPublic(DATABASE_4_PUBLIC)
+            .isSchemaPublic(DATABASE_4_SCHEMA_PUBLIC)
             .name(DATABASE_4_NAME)
             .description(DATABASE_4_DESCRIPTION)
             .cid(CONTAINER_4_ID)
@@ -7520,8 +7589,6 @@ public abstract class BaseTest {
             .exchangeName(DATABASE_4_EXCHANGE)
             .created(DATABASE_4_CREATED)
             .lastModified(DATABASE_4_LAST_MODIFIED)
-            .createdBy(DATABASE_4_CREATOR)
-            .creator(USER_4)
             .ownedBy(DATABASE_4_OWNER)
             .owner(USER_4)
             .contactPerson(USER_4_ID)
diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile
index e081ac7bb356a4097aab28b71e44ac86d03e01e0..287670f8ddac63952943a27dcdddbe08e78289bc 100644
--- a/dbrepo-search-service/Pipfile
+++ b/dbrepo-search-service/Pipfile
@@ -18,7 +18,7 @@ jwt = "~=1.3"
 testcontainers-opensearch = "*"
 pytest = "*"
 rdflib = "*"
-dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"}
+dbrepo = {path = "./lib/dbrepo-1.6.0.tar.gz"}
 gunicorn = "*"
 
 [dev-packages]
diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock
index 9ccdcd7ec5ff19ad05b520e1a9665847497e0dc7..a9fc61d4e84d9456bf374cb703af1906dc6485b8 100644
--- a/dbrepo-search-service/Pipfile.lock
+++ b/dbrepo-search-service/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "5f8f989adc3210e3d07474d3a6c1d5a8bc7352195b75ef07feaf135d9388c60c"
+            "sha256": "ed3c0ae802499c4020eea0c4d2e62f57a0a642cc0ebe9698f228cd8fd8f42ccb"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -26,85 +26,85 @@
         },
         "aiohttp": {
             "hashes": [
-                "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7",
-                "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361",
-                "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c",
-                "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6",
-                "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550",
-                "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c",
-                "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b",
-                "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5",
-                "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530",
-                "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180",
-                "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46",
-                "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066",
-                "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66",
-                "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0",
-                "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409",
-                "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3",
-                "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd",
-                "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60",
-                "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a",
-                "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b",
-                "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe",
-                "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502",
-                "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697",
-                "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c",
-                "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72",
-                "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771",
-                "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b",
-                "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a",
-                "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08",
-                "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae",
-                "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1",
-                "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe",
-                "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5",
-                "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d",
-                "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838",
-                "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f",
-                "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51",
-                "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2",
-                "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff",
-                "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130",
-                "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba",
-                "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e",
-                "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d",
-                "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87",
-                "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411",
-                "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2",
-                "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39",
-                "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c",
-                "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa",
-                "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3",
-                "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810",
-                "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9",
-                "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42",
-                "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9",
-                "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a",
-                "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0",
-                "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14",
-                "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269",
-                "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0",
-                "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44",
-                "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e",
-                "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938",
-                "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7",
-                "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82",
-                "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043",
-                "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7",
-                "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0",
-                "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313",
-                "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494",
-                "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e",
-                "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf",
-                "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868",
-                "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa",
-                "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941",
-                "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf",
-                "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b"
+                "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0",
+                "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769",
+                "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5",
+                "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59",
+                "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf",
+                "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985",
+                "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50",
+                "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299",
+                "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d",
+                "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab",
+                "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542",
+                "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b",
+                "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b",
+                "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838",
+                "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683",
+                "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df",
+                "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d",
+                "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91",
+                "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9",
+                "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be",
+                "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c",
+                "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219",
+                "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4",
+                "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf",
+                "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f",
+                "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199",
+                "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1",
+                "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60",
+                "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77",
+                "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf",
+                "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079",
+                "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4",
+                "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46",
+                "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8",
+                "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c",
+                "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d",
+                "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33",
+                "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34",
+                "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82",
+                "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b",
+                "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c",
+                "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836",
+                "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69",
+                "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39",
+                "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f",
+                "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32",
+                "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc",
+                "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52",
+                "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816",
+                "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1",
+                "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec",
+                "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487",
+                "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0",
+                "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767",
+                "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5",
+                "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6",
+                "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9",
+                "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f",
+                "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138",
+                "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e",
+                "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf",
+                "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109",
+                "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408",
+                "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6",
+                "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d",
+                "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99",
+                "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4",
+                "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74",
+                "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc",
+                "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d",
+                "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5",
+                "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a",
+                "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01",
+                "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f",
+                "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e",
+                "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"
             ],
             "markers": "python_version >= '3.9'",
-            "version": "==3.11.9"
+            "version": "==3.11.10"
         },
         "aiosignal": {
             "hashes": [
@@ -375,9 +375,9 @@
         },
         "dbrepo": {
             "hashes": [
-                "sha256:292c2631816ca3dbdbd243e4c006c4bd39d512f5ae7e4b10070102c85ec58a10"
+                "sha256:7164b09a9f578998b3adc1d51d16e4d77404c84ed9a6194ea4b6f07a6b69c27b"
             ],
-            "path": "./lib/dbrepo-1.5.2.tar.gz"
+            "path": "./lib/dbrepo-1.6.0.tar.gz"
         },
         "docker": {
             "hashes": [
@@ -860,64 +860,64 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe",
-                "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0",
-                "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48",
-                "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a",
-                "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564",
-                "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958",
-                "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17",
-                "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0",
-                "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee",
-                "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b",
-                "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4",
-                "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4",
-                "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6",
-                "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4",
-                "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d",
-                "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f",
-                "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f",
-                "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f",
-                "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56",
-                "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9",
-                "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd",
-                "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23",
-                "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed",
-                "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a",
-                "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098",
-                "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1",
-                "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512",
-                "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f",
-                "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09",
-                "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f",
-                "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc",
-                "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8",
-                "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0",
-                "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761",
-                "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef",
-                "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5",
-                "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e",
-                "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b",
-                "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d",
-                "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43",
-                "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c",
-                "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41",
-                "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff",
-                "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408",
-                "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2",
-                "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9",
-                "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57",
-                "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb",
-                "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9",
-                "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3",
-                "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a",
-                "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0",
-                "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e",
-                "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598",
-                "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"
+                "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608",
+                "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef",
+                "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90",
+                "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae",
+                "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83",
+                "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0",
+                "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73",
+                "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671",
+                "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69",
+                "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa",
+                "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066",
+                "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da",
+                "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9",
+                "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e",
+                "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3",
+                "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a",
+                "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74",
+                "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3",
+                "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410",
+                "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72",
+                "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d",
+                "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4",
+                "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038",
+                "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e",
+                "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13",
+                "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d",
+                "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95",
+                "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31",
+                "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3",
+                "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03",
+                "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6",
+                "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2",
+                "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b",
+                "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7",
+                "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab",
+                "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219",
+                "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571",
+                "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d",
+                "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1",
+                "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca",
+                "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661",
+                "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e",
+                "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e",
+                "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e",
+                "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a",
+                "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3",
+                "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881",
+                "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221",
+                "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742",
+                "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773",
+                "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e",
+                "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529",
+                "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67",
+                "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c",
+                "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"
             ],
             "markers": "python_version == '3.11'",
-            "version": "==2.1.3"
+            "version": "==2.2.0"
         },
         "opensearch-py": {
             "hashes": [
@@ -1361,120 +1361,120 @@
         },
         "rpds-py": {
             "hashes": [
-                "sha256:0545928bdf53dfdfcab284468212efefb8a6608ca3b6910c7fb2e5ed8bdc2dc0",
-                "sha256:05fdeae9010533e47715c37df83264df0122584e40d691d50cf3607c060952a3",
-                "sha256:09a1f000c5f6e08b298275bae00921e9fbbf2a35dae0a86db2821c058c2201a9",
-                "sha256:0a53592cdf98cec3dfcdb24ffec8a4797e7656b65700099af43ec7df023b6de4",
-                "sha256:0f057a0c546c42964836b209d8de9ea1a4f4b0432006c6343cbe633d8ca14571",
-                "sha256:0f9eb37d3a60b262a98ab51ee899cac039de9ca0ce68dcf1a6518a09719020b0",
-                "sha256:102be79c4cc47a4aeb5912401185c404cd2601c15a7163bbecff7f1bfe20b669",
-                "sha256:128cbaed7ba26116820bcb992405d6a13ea18c8fca1b8c4f59906d858e91e979",
-                "sha256:149b4d875ef9b12a8f5e303e86a32a58f8ef627e57ec97a7d0e4be819069d141",
-                "sha256:153248f48d6f90a295a502f53ec544a3ffbd21b0bb32f5dca39c4b93a764d6a2",
-                "sha256:157a023bded0618a1eea54979fe2e0f9309e9ddc818ef4b8fc3b884ff38fedd5",
-                "sha256:15fa4ca658f8ad22645d3531682b17e5580832efbfa87304c3e62214c79c1e8a",
-                "sha256:198067aa6f3d942ff5d0d655bb1e91b59ae85279d47590682cba2834ac1b97d2",
-                "sha256:1c40e02cc4f3e18fd39344edb10eebe04bd11cfd13119606b5771e5ea51630d3",
-                "sha256:1ded65691a1d3fd7d2aa89d2c91aa51f941601bb2ce099739909034d957fef4b",
-                "sha256:201650b309c419143775c15209c620627de3c09a27c7fb58375325aec5cce260",
-                "sha256:2143c3aed85992604d758bbe67da839fb4aab3dd2e1c6dddab5b3ca7162b34a2",
-                "sha256:2177e59c033bf0d1bf7de1ced561205963583caf3242c6c700a723034bfb5f8e",
-                "sha256:2ea23f1525d4f64286dbe0947c929d45c3ffe963b2dbed1d3844a2e4938bda42",
-                "sha256:31264187fc934ff1024a4f56775f33c9252d3f4f3e27ec07d1995a26b52702c3",
-                "sha256:36ce951800ed2acc6772fd9f42150f29d567f0423989748052fdb39d9e2b5795",
-                "sha256:3aaa22487477de9618ce3b37f99fbe81219ba96f3c2ca84f576f0ab451b83aba",
-                "sha256:3e7e99e2af59c56c59b6c964d612511b8203480d39d1ef83edc56f2cb42a3f5d",
-                "sha256:413a30a99d8683dace3765885920ed27ab662efbb6c98d81db76c397ad1ffd71",
-                "sha256:447ae1104fb32197b9262f772d565d38e834cc2e9edd89350b37b88fed636e70",
-                "sha256:4659b2e4a5008715099e216050f5c6976e5a4329482664411789968b82e3f17d",
-                "sha256:48ee97c7c6027fd423058675b5a39d0b5f7a1648250b671563d5c9f74ff13ff0",
-                "sha256:4ba6c66fbc6015b2f99e7176fec41793cecb00c4cc357cad038dff85e6ac42ab",
-                "sha256:4c8dc7331e8cbb1c0ea2bcb550adb1777365944ffd125c69aa1117fdef4887f5",
-                "sha256:50e4b5d291105f7063259fe0125b1af902fb34499444d7c5c521dd8328b00939",
-                "sha256:542eb246d5be31b5e0a9c8ddb9539416f9b31f58f75bd4ee328bff2b5c58d6fd",
-                "sha256:55d371b9d8b0c2a68a50413a8cb01c3c3ce1ea4f768bf77b66669a9a486e101e",
-                "sha256:580ccbf11f02f948add4cb641843030a89f1463d7c0740cbfc9aca91e9dc34b3",
-                "sha256:5dbff9402c2bdf00bf0df9905694b3c292a3847c725651938a72f554351a5fcb",
-                "sha256:5f941fb86195f97be7f6efe04a21b223f05dfe4d1dfb159999e2f8d101e44cc4",
-                "sha256:608c84699b2db09c6a8743845b1a3dad36fae53eaaecb241d45b13dff74405fb",
-                "sha256:626b9feb01bff049a5aec4804f0c58db12585778b4902e5376a95b01f80a7a16",
-                "sha256:66f4f48a89cdd30ab3a47335df81c76e9a63799d0d84b29c0618371c66fa37b0",
-                "sha256:6c8e97e19aa7b0b0d801a159f932ce4435f1049c8c38e2bb372bb5bee559ce50",
-                "sha256:72407065ad459db9f3d052ea8c51e02534f02533fc61e51cbab3bd94166f086c",
-                "sha256:734783dd7da58f76222f458346ddebdb3621686a1a2a667db5049caf0c9956b9",
-                "sha256:76eaa4c087a061a2c8a0a92536405069878a8f530c00e84a9eaf332e70f5561f",
-                "sha256:776a06cb5720556a549829896a49acebb5bdd96c7bba100191a994053546975a",
-                "sha256:7839b7528faa4d134c183b1f2dd1ee4dc2ca2f899f4f0cfdf00fc04c255262a7",
-                "sha256:8080467df22feca0fc9c46567001777c6fbc2b4a2683a7137420896051874ca1",
-                "sha256:85060e96953647871957d41707adb8d7bff4e977042fd0deb4fc1881b98dd2fe",
-                "sha256:8954b9ffe60f479a0c0ba40987db2546c735ab02a725ea7fd89342152d4d821d",
-                "sha256:8a603155db408f773637f9e3a712c6e3cbc521aaa8fa2b99f9ba6106c59a2496",
-                "sha256:8bd9ec1db79a664f4cbb12878693b73416f4d2cb425d3e27eccc1bdfbdc826ef",
-                "sha256:8c0c324879d483504b07f7b18eb1b50567c434263bbe4866ecce33056162668a",
-                "sha256:8ce729f1dc8a4a190c34b69f75377bddc004079b2963ab722ab91fafe040be6d",
-                "sha256:8ec41049c90d204a6561238a9ad6c7263ebb7009d9759c98b58078d9d2fec9ba",
-                "sha256:959ae04ed30cde606f3a0320f0a1f4167a107e685ef5209cce28c5080590bd31",
-                "sha256:96559e05bdf938b2048353e10a7920b98f853cefe4482c2064a718d7d0a50bd7",
-                "sha256:96b3759d8ab2323324e0a92b2f44834f9d88089b8d1ab6f533b61f4be3411cef",
-                "sha256:97c5ffe47ccf92d8b17e10f8a5ce28d015aa1196edc3359684cf31504eae6a14",
-                "sha256:9d5b925156a746dc1f5f52376fdd1fbdd3f6ffe1fcd6f5e06f77ca79abb940a3",
-                "sha256:9dae4eb9b5534e09ba6c6ab496a757e5e394b7e7b08767d25ca37e8d36491114",
-                "sha256:a083221b6a4ecdef38a60c95d8d3223d99449cb4da2544e9644958dc16664eb9",
-                "sha256:a0ed14a4162c2c2b21a162c9fcf90057e3e7da18cd171ab344c1e1664f75090e",
-                "sha256:a18aedc032d6468b73ebbe4437129cb30d54fe543cde2f23671ecad76c3aea24",
-                "sha256:a451dba533be77454ebcffc85189108fc05f279100835ac76e7989edacb89156",
-                "sha256:aa2ba0176037c915d8660a4e46581d645e2c22b5373e466bc8640a794d45861a",
-                "sha256:ab27dd4edd84b13309f268ffcdfc07aef8339135ffab7b6d43f16884307a2a48",
-                "sha256:ab784621d3e2a41916e21f13a483602cc989fd45fff637634b9231ba43d4383b",
-                "sha256:b07fa9e634234e84096adfa4be3828c8f26e238679c122824b2b3d7131bec578",
-                "sha256:b09209cdfcacf5eba9cf80367130532e6c02e695252e1f64d3cfcc2356e6e19f",
-                "sha256:babec324e8654a59122aaa66936a9a483faa03276db9792f51332475c2dddc4a",
-                "sha256:bca4428c4a957b78ded3e6e62884ab03f029dce8fa8d34818da0f80f61332b49",
-                "sha256:c0467838c90435b80793cde486a318fc916ee57f2af54e4b10c72b20cbdcbaa9",
-                "sha256:c2a214bf5b79bd39a9de1c991353aaaacafda83ba1374178309e92be8e67d411",
-                "sha256:c3029f481b31f329b1fdb4ec4b56935d82210ddd9c6f86ea5a87c06f1e97b161",
-                "sha256:c6f3fd617db422c9d4e12cb8d84c984fe07d6d9cb0950cbf117f3bccc6268d05",
-                "sha256:c783e4ed68200f4e03c125690d23158b1c49c4b186d458a18debc109bbdc3c2e",
-                "sha256:c8502a02ae3ae67084f5a0bf5a8253b19fa7a887f824e41e016cdb0ac532a06f",
-                "sha256:c88535f83f7391cf3a45af990237e3939a6fdfbedaed2571633bfdd0bceb36b0",
-                "sha256:c9ce6b83597d45bec44a2690857ede62fc98223772135f8a7fa90884eb726501",
-                "sha256:ca4657e9fd0b1b5376942d403d634ce188f79064f0873aa853ab05b10185ceec",
-                "sha256:d0ff8d5b13ce2357fa8b33a0a2e3775aa71df5bf7c8ba060634c9d15ab12f357",
-                "sha256:d280b4bf09f719b89fd9aab3b71067acc0d0449b7d1eba99a2ade4939cef8296",
-                "sha256:d3777c446bb1c5fcd82dc3f8776e1a146cd91e80cc1892f8634575ace438d22f",
-                "sha256:d7833ef6f5d6cb634f296abfd93452fb3eb44c4e9a6ae95c1021eab704c1cee2",
-                "sha256:d8306f27418361b788e3fca9f47dec125457f80122e7e31ba7ff5cdba98343f8",
-                "sha256:d962e2e89b3a95e3597a34b8c93ced1e98958502c5b8096c9fd69deff279f561",
-                "sha256:dbe428d0ac6eacaf05402adbaf137f59ad6063848182d1ff294f95ce0f24005b",
-                "sha256:e4f91d702b9ce1388660b3d4a28aa552614a1399e93f718ed0dacd68f23b3d32",
-                "sha256:e69acdbc132c9592c8dc393af85e38e206ca847c7019a953ff625191c3a12312",
-                "sha256:e8056adcefa2dcb67e8bc91ea5eee26df66e8b297a8cd6ff0903f85c70908fa0",
-                "sha256:e9ac7280bd045f472b50306d7efeee051b69e3a2dd1b90f46bd7e86e63b1efa2",
-                "sha256:eb013aa01b404219f28dc973d9e6310fd4db216d7299253dd355629952e0564e",
-                "sha256:ec1ccc2a9f764cd632fb8ab28fdde166250df54fc8d97315a4a6948dc5367639",
-                "sha256:ef7282d8a14b60dd515e47060638687710b1d518f4b5e961caad43fb3a3606f9",
-                "sha256:ef92b1fbe6aa2e7885eb90853cc016b1fc95439a8cc8da6d526880e9e2148695",
-                "sha256:efb2ad60ca8637d5f9f653f9a9a8d73964059972b6b95036be77e028bffc68a3",
-                "sha256:effcae2152afe7937a28376dbabb25c770ef99ed4e16a4ffeb8e6a4f7c4f06aa",
-                "sha256:f2d1b58a0c3a73f0361759642e80260a6d28eee6501b40fe25b82af33ef83f21",
-                "sha256:f57e2d0f8022783426121b586d7c842ea40ea832a29e28ca36c881b54c74fb28",
-                "sha256:f5cae9b415ea8a6a563566dbf46650222eccc5971c7daa16fbee63aef92ae543",
-                "sha256:f76c6f319e57007ad52e671ec741d801324760a377e3d4992c9bb8200333ebac",
-                "sha256:f91bfc39f7a64168e08ab831fa497ec5438c1d6c6e2f9e12848d95ad11ac8523",
-                "sha256:fdaee3947eaaa52dae3ceb9d9f66329e13d8bae35682b1e5dd54612938693934",
-                "sha256:fe3f245c2f39a5692d9123c174bc48f6f9fe3e96407e67c6d04541a767d99e72",
-                "sha256:ffae97d28ea4f2c613a751d087b75a97fb78311b38cc2e9a2f4587e473ace167"
+                "sha256:009de23c9c9ee54bf11303a966edf4d9087cd43a6003672e6aa7def643d06518",
+                "sha256:02fbb9c288ae08bcb34fb41d516d5eeb0455ac35b5512d03181d755d80810059",
+                "sha256:0a0461200769ab3b9ab7e513f6013b7a97fdeee41c29b9db343f3c5a8e2b9e61",
+                "sha256:0b09865a9abc0ddff4e50b5ef65467cd94176bf1e0004184eb915cbc10fc05c5",
+                "sha256:0b8db6b5b2d4491ad5b6bdc2bc7c017eec108acbf4e6785f42a9eb0ba234f4c9",
+                "sha256:0c150c7a61ed4a4f4955a96626574e9baf1adf772c2fb61ef6a5027e52803543",
+                "sha256:0f3cec041684de9a4684b1572fe28c7267410e02450f4561700ca5a3bc6695a2",
+                "sha256:1352ae4f7c717ae8cba93421a63373e582d19d55d2ee2cbb184344c82d2ae55a",
+                "sha256:177c7c0fce2855833819c98e43c262007f42ce86651ffbb84f37883308cb0e7d",
+                "sha256:1978d0021e943aae58b9b0b196fb4895a25cc53d3956b8e35e0b7682eefb6d56",
+                "sha256:1a60bce91f81ddaac922a40bbb571a12c1070cb20ebd6d49c48e0b101d87300d",
+                "sha256:1aef18820ef3e4587ebe8b3bc9ba6e55892a6d7b93bac6d29d9f631a3b4befbd",
+                "sha256:1e9663daaf7a63ceccbbb8e3808fe90415b0757e2abddbfc2e06c857bf8c5e2b",
+                "sha256:20070c65396f7373f5df4005862fa162db5d25d56150bddd0b3e8214e8ef45b4",
+                "sha256:214b7a953d73b5e87f0ebece4a32a5bd83c60a3ecc9d4ec8f1dca968a2d91e99",
+                "sha256:22bebe05a9ffc70ebfa127efbc429bc26ec9e9b4ee4d15a740033efda515cf3d",
+                "sha256:24e8abb5878e250f2eb0d7859a8e561846f98910326d06c0d51381fed59357bd",
+                "sha256:26fd7cac7dd51011a245f29a2cc6489c4608b5a8ce8d75661bb4a1066c52dfbe",
+                "sha256:27b1d3b3915a99208fee9ab092b8184c420f2905b7d7feb4aeb5e4a9c509b8a1",
+                "sha256:27e98004595899949bd7a7b34e91fa7c44d7a97c40fcaf1d874168bb652ec67e",
+                "sha256:2b8f60e1b739a74bab7e01fcbe3dddd4657ec685caa04681df9d562ef15b625f",
+                "sha256:2de29005e11637e7a2361fa151f780ff8eb2543a0da1413bb951e9f14b699ef3",
+                "sha256:2e8b55d8517a2fda8d95cb45d62a5a8bbf9dd0ad39c5b25c8833efea07b880ca",
+                "sha256:2fa4331c200c2521512595253f5bb70858b90f750d39b8cbfd67465f8d1b596d",
+                "sha256:3445e07bf2e8ecfeef6ef67ac83de670358abf2996916039b16a218e3d95e97e",
+                "sha256:3453e8d41fe5f17d1f8e9c383a7473cd46a63661628ec58e07777c2fff7196dc",
+                "sha256:378753b4a4de2a7b34063d6f95ae81bfa7b15f2c1a04a9518e8644e81807ebea",
+                "sha256:3af6e48651c4e0d2d166dc1b033b7042ea3f871504b6805ba5f4fe31581d8d38",
+                "sha256:3dfcbc95bd7992b16f3f7ba05af8a64ca694331bd24f9157b49dadeeb287493b",
+                "sha256:3f21f0495edea7fdbaaa87e633a8689cd285f8f4af5c869f27bc8074638ad69c",
+                "sha256:4041711832360a9b75cfb11b25a6a97c8fb49c07b8bd43d0d02b45d0b499a4ff",
+                "sha256:44d61b4b7d0c2c9ac019c314e52d7cbda0ae31078aabd0f22e583af3e0d79723",
+                "sha256:4617e1915a539a0d9a9567795023de41a87106522ff83fbfaf1f6baf8e85437e",
+                "sha256:4b232061ca880db21fa14defe219840ad9b74b6158adb52ddf0e87bead9e8493",
+                "sha256:5246b14ca64a8675e0a7161f7af68fe3e910e6b90542b4bfb5439ba752191df6",
+                "sha256:5725dd9cc02068996d4438d397e255dcb1df776b7ceea3b9cb972bdb11260a83",
+                "sha256:583f6a1993ca3369e0f80ba99d796d8e6b1a3a2a442dd4e1a79e652116413091",
+                "sha256:59259dc58e57b10e7e18ce02c311804c10c5a793e6568f8af4dead03264584d1",
+                "sha256:593eba61ba0c3baae5bc9be2f5232430453fb4432048de28399ca7376de9c627",
+                "sha256:59f4a79c19232a5774aee369a0c296712ad0e77f24e62cad53160312b1c1eaa1",
+                "sha256:5f0e260eaf54380380ac3808aa4ebe2d8ca28b9087cf411649f96bad6900c728",
+                "sha256:62d9cfcf4948683a18a9aff0ab7e1474d407b7bab2ca03116109f8464698ab16",
+                "sha256:64607d4cbf1b7e3c3c8a14948b99345eda0e161b852e122c6bb71aab6d1d798c",
+                "sha256:655ca44a831ecb238d124e0402d98f6212ac527a0ba6c55ca26f616604e60a45",
+                "sha256:666ecce376999bf619756a24ce15bb14c5bfaf04bf00abc7e663ce17c3f34fe7",
+                "sha256:68049202f67380ff9aa52f12e92b1c30115f32e6895cd7198fa2a7961621fc5a",
+                "sha256:69803198097467ee7282750acb507fba35ca22cc3b85f16cf45fb01cb9097730",
+                "sha256:6c7b99ca52c2c1752b544e310101b98a659b720b21db00e65edca34483259967",
+                "sha256:6dd9412824c4ce1aca56c47b0991e65bebb7ac3f4edccfd3f156150c96a7bf25",
+                "sha256:70eb60b3ae9245ddea20f8a4190bd79c705a22f8028aaf8bbdebe4716c3fab24",
+                "sha256:70fb28128acbfd264eda9bf47015537ba3fe86e40d046eb2963d75024be4d055",
+                "sha256:7b2513ba235829860b13faa931f3b6846548021846ac808455301c23a101689d",
+                "sha256:7ef9d9da710be50ff6809fed8f1963fecdfecc8b86656cadfca3bc24289414b0",
+                "sha256:81e69b0a0e2537f26d73b4e43ad7bc8c8efb39621639b4434b76a3de50c6966e",
+                "sha256:8633e471c6207a039eff6aa116e35f69f3156b3989ea3e2d755f7bc41754a4a7",
+                "sha256:8bd7c8cfc0b8247c8799080fbff54e0b9619e17cdfeb0478ba7295d43f635d7c",
+                "sha256:9253fc214112405f0afa7db88739294295f0e08466987f1d70e29930262b4c8f",
+                "sha256:99b37292234e61325e7a5bb9689e55e48c3f5f603af88b1642666277a81f1fbd",
+                "sha256:9bd7228827ec7bb817089e2eb301d907c0d9827a9e558f22f762bb690b131652",
+                "sha256:9beeb01d8c190d7581a4d59522cd3d4b6887040dcfc744af99aa59fef3e041a8",
+                "sha256:a63cbdd98acef6570c62b92a1e43266f9e8b21e699c363c0fef13bd530799c11",
+                "sha256:a76e42402542b1fae59798fab64432b2d015ab9d0c8c47ba7addddbaf7952333",
+                "sha256:ac0a03221cdb5058ce0167ecc92a8c89e8d0decdc9e99a2ec23380793c4dcb96",
+                "sha256:b0b4136a252cadfa1adb705bb81524eee47d9f6aab4f2ee4fa1e9d3cd4581f64",
+                "sha256:b25bc607423935079e05619d7de556c91fb6adeae9d5f80868dde3468657994b",
+                "sha256:b3d504047aba448d70cf6fa22e06cb09f7cbd761939fdd47604f5e007675c24e",
+                "sha256:bb47271f60660803ad11f4c61b42242b8c1312a31c98c578f79ef9387bbde21c",
+                "sha256:bbb232860e3d03d544bc03ac57855cd82ddf19c7a07651a7c0fdb95e9efea8b9",
+                "sha256:bc27863442d388870c1809a87507727b799c8460573cfbb6dc0eeaef5a11b5ec",
+                "sha256:bc51abd01f08117283c5ebf64844a35144a0843ff7b2983e0648e4d3d9f10dbb",
+                "sha256:be2eb3f2495ba669d2a985f9b426c1797b7d48d6963899276d22f23e33d47e37",
+                "sha256:bf9db5488121b596dbfc6718c76092fda77b703c1f7533a226a5a9f65248f8ad",
+                "sha256:c58e2339def52ef6b71b8f36d13c3688ea23fa093353f3a4fee2556e62086ec9",
+                "sha256:cfbc454a2880389dbb9b5b398e50d439e2e58669160f27b60e5eca11f68ae17c",
+                "sha256:cff63a0272fcd259dcc3be1657b07c929c466b067ceb1c20060e8d10af56f5bf",
+                "sha256:d115bffdd417c6d806ea9069237a4ae02f513b778e3789a359bc5856e0404cc4",
+                "sha256:d20cfb4e099748ea39e6f7b16c91ab057989712d31761d3300d43134e26e165f",
+                "sha256:d48424e39c2611ee1b84ad0f44fb3b2b53d473e65de061e3f460fc0be5f1939d",
+                "sha256:e0fa2d4ec53dc51cf7d3bb22e0aa0143966119f42a0c3e4998293a3dd2856b09",
+                "sha256:e32fee8ab45d3c2db6da19a5323bc3362237c8b653c70194414b892fd06a080d",
+                "sha256:e35ba67d65d49080e8e5a1dd40101fccdd9798adb9b050ff670b7d74fa41c566",
+                "sha256:e3fb866d9932a3d7d0c82da76d816996d1667c44891bd861a0f97ba27e84fc74",
+                "sha256:e61b02c3f7a1e0b75e20c3978f7135fd13cb6cf551bf4a6d29b999a88830a338",
+                "sha256:e67ba3c290821343c192f7eae1d8fd5999ca2dc99994114643e2f2d3e6138b15",
+                "sha256:e79dd39f1e8c3504be0607e5fc6e86bb60fe3584bec8b782578c3b0fde8d932c",
+                "sha256:e89391e6d60251560f0a8f4bd32137b077a80d9b7dbe6d5cab1cd80d2746f648",
+                "sha256:ea7433ce7e4bfc3a85654aeb6747babe3f66eaf9a1d0c1e7a4435bbdf27fea84",
+                "sha256:eaf16ae9ae519a0e237a0f528fd9f0197b9bb70f40263ee57ae53c2b8d48aeb3",
+                "sha256:eb0c341fa71df5a4595f9501df4ac5abfb5a09580081dffbd1ddd4654e6e9123",
+                "sha256:f276b245347e6e36526cbd4a266a417796fc531ddf391e43574cf6466c492520",
+                "sha256:f47ad3d5f3258bd7058d2d506852217865afefe6153a36eb4b6928758041d831",
+                "sha256:f56a6b404f74ab372da986d240e2e002769a7d7102cc73eb238a4f72eec5284e",
+                "sha256:f5cf2a0c2bdadf3791b5c205d55a37a54025c6e18a71c71f82bb536cf9a454bf",
+                "sha256:f5d36399a1b96e1a5fdc91e0522544580dbebeb1f77f27b2b0ab25559e103b8b",
+                "sha256:f60bd8423be1d9d833f230fdbccf8f57af322d96bcad6599e5a771b151398eb2",
+                "sha256:f612463ac081803f243ff13cccc648578e2279295048f2a8d5eb430af2bae6e3",
+                "sha256:f73d3fef726b3243a811121de45193c0ca75f6407fe66f3f4e183c983573e130",
+                "sha256:f82a116a1d03628a8ace4859556fb39fd1424c933341a08ea3ed6de1edb0283b",
+                "sha256:fb0ba113b4983beac1a2eb16faffd76cb41e176bf58c4afe3e14b9c681f702de",
+                "sha256:fb4f868f712b2dd4bcc538b0a0c1f63a2b1d584c925e69a224d759e7070a12d5",
+                "sha256:fb6116dfb8d1925cbdb52595560584db42a7f664617a1f7d7f6e32f138cdf37d",
+                "sha256:fda7cb070f442bf80b642cd56483b5548e43d366fe3f39b98e67cce780cded00",
+                "sha256:feea821ee2a9273771bae61194004ee2fc33f8ec7db08117ef9147d4bbcbca8e"
             ],
             "markers": "python_version >= '3.9'",
-            "version": "==0.22.1"
+            "version": "==0.22.3"
         },
         "six": {
             "hashes": [
-                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
-                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+                "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
+                "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==1.16.0"
+            "version": "==1.17.0"
         },
         "sqlalchemy": {
             "hashes": [
@@ -1893,72 +1893,72 @@
         },
         "coverage": {
             "hashes": [
-                "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5",
-                "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf",
-                "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb",
-                "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638",
-                "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4",
-                "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc",
-                "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed",
-                "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a",
-                "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d",
-                "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649",
-                "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c",
-                "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b",
-                "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4",
-                "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443",
-                "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83",
-                "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee",
-                "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e",
-                "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e",
-                "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3",
-                "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0",
-                "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb",
-                "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076",
-                "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb",
-                "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787",
-                "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1",
-                "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e",
-                "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce",
-                "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801",
-                "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764",
-                "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365",
-                "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf",
-                "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6",
-                "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71",
-                "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002",
-                "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4",
-                "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c",
-                "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8",
-                "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4",
-                "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146",
-                "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc",
-                "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea",
-                "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4",
-                "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad",
-                "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28",
-                "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451",
-                "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50",
-                "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779",
-                "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63",
-                "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e",
-                "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc",
-                "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022",
-                "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d",
-                "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94",
-                "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b",
-                "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d",
-                "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331",
-                "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a",
-                "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0",
-                "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee",
-                "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92",
-                "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a",
-                "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"
+                "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4",
+                "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c",
+                "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f",
+                "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b",
+                "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6",
+                "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae",
+                "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692",
+                "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4",
+                "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4",
+                "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717",
+                "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d",
+                "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198",
+                "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1",
+                "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3",
+                "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb",
+                "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d",
+                "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08",
+                "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf",
+                "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b",
+                "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710",
+                "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c",
+                "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae",
+                "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077",
+                "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00",
+                "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb",
+                "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664",
+                "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014",
+                "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9",
+                "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6",
+                "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e",
+                "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9",
+                "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa",
+                "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611",
+                "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b",
+                "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a",
+                "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8",
+                "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030",
+                "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678",
+                "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015",
+                "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902",
+                "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97",
+                "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845",
+                "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419",
+                "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464",
+                "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be",
+                "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9",
+                "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7",
+                "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be",
+                "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1",
+                "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba",
+                "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5",
+                "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073",
+                "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4",
+                "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a",
+                "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a",
+                "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3",
+                "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599",
+                "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0",
+                "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b",
+                "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec",
+                "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1",
+                "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"
             ],
             "index": "pypi",
             "markers": "python_version >= '3.9'",
-            "version": "==7.6.8"
+            "version": "==7.6.9"
         },
         "idna": {
             "hashes": [
diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock
index c08493b2f96cd43463da5e7886036514911b5ad1..9f92191fbaffa2a291ee912f33ad482124a68fa2 100644
--- a/dbrepo-search-service/init/Pipfile.lock
+++ b/dbrepo-search-service/init/Pipfile.lock
@@ -26,85 +26,85 @@
         },
         "aiohttp": {
             "hashes": [
-                "sha256:0411777249f25d11bd2964a230b3ffafcbed6cd65d0f2b132bc2b8f5b8c347c7",
-                "sha256:0a97d657f6cf8782a830bb476c13f7d777cfcab8428ac49dde15c22babceb361",
-                "sha256:0b5a5009b0159a8f707879dc102b139466d8ec6db05103ec1520394fdd8ea02c",
-                "sha256:0bcb7f6976dc0b6b56efde13294862adf68dd48854111b422a336fa729a82ea6",
-                "sha256:14624d96f0d69cf451deed3173079a68c322279be6030208b045ab77e1e8d550",
-                "sha256:15c4e489942d987d5dac0ba39e5772dcbed4cc9ae3710d1025d5ba95e4a5349c",
-                "sha256:176f8bb8931da0613bb0ed16326d01330066bb1e172dd97e1e02b1c27383277b",
-                "sha256:17af09d963fa1acd7e4c280e9354aeafd9e3d47eaa4a6bfbd2171ad7da49f0c5",
-                "sha256:1a8b13b9950d8b2f8f58b6e5842c4b842b5887e2c32e3f4644d6642f1659a530",
-                "sha256:202f40fb686e5f93908eee0c75d1e6fbe50a43e9bd4909bf3bf4a56b560ca180",
-                "sha256:21cbe97839b009826a61b143d3ca4964c8590d7aed33d6118125e5b71691ca46",
-                "sha256:27935716f8d62c1c73010428db310fd10136002cfc6d52b0ba7bdfa752d26066",
-                "sha256:282e0a7ddd36ebc411f156aeaa0491e8fe7f030e2a95da532cf0c84b0b70bc66",
-                "sha256:28f29bce89c3b401a53d6fd4bee401ee943083bf2bdc12ef297c1d63155070b0",
-                "sha256:2ac9fd83096df36728da8e2f4488ac3b5602238f602706606f3702f07a13a409",
-                "sha256:30f9f89ae625d412043f12ca3771b2ccec227cc93b93bb1f994db6e1af40a7d3",
-                "sha256:317251b9c9a2f1a9ff9cd093775b34c6861d1d7df9439ce3d32a88c275c995cd",
-                "sha256:31de2f10f63f96cc19e04bd2df9549559beadd0b2ee2da24a17e7ed877ca8c60",
-                "sha256:36df00e0541f264ce42d62280281541a47474dfda500bc5b7f24f70a7f87be7a",
-                "sha256:39625703540feb50b6b7f938b3856d1f4886d2e585d88274e62b1bd273fae09b",
-                "sha256:3f5461c77649358610fb9694e790956b4238ac5d9e697a17f63619c096469afe",
-                "sha256:4313f3bc901255b22f01663eeeae167468264fdae0d32c25fc631d5d6e15b502",
-                "sha256:442356e8924fe1a121f8c87866b0ecdc785757fd28924b17c20493961b3d6697",
-                "sha256:44cb1a1326a0264480a789e6100dc3e07122eb8cd1ad6b784a3d47d13ed1d89c",
-                "sha256:44d323aa80a867cb6db6bebb4bbec677c6478e38128847f2c6b0f70eae984d72",
-                "sha256:499368eb904566fbdf1a3836a1532000ef1308f34a1bcbf36e6351904cced771",
-                "sha256:4b01d9cfcb616eeb6d40f02e66bebfe7b06d9f2ef81641fdd50b8dd981166e0b",
-                "sha256:5720ebbc7a1b46c33a42d489d25d36c64c419f52159485e55589fbec648ea49a",
-                "sha256:5cc5e0d069c56645446c45a4b5010d4b33ac6c5ebfd369a791b5f097e46a3c08",
-                "sha256:618b18c3a2360ac940a5503da14fa4f880c5b9bc315ec20a830357bcc62e6bae",
-                "sha256:6435a66957cdba1a0b16f368bde03ce9c79c57306b39510da6ae5312a1a5b2c1",
-                "sha256:647ec5bee7e4ec9f1034ab48173b5fa970d9a991e565549b965e93331f1328fe",
-                "sha256:6e1e9e447856e9b7b3d38e1316ae9a8c92e7536ef48373de758ea055edfd5db5",
-                "sha256:6ef1550bb5f55f71b97a6a395286db07f7f2c01c8890e613556df9a51da91e8d",
-                "sha256:6ffa45cc55b18d4ac1396d1ddb029f139b1d3480f1594130e62bceadf2e1a838",
-                "sha256:77f31cebd8c27a36af6c7346055ac564946e562080ee1a838da724585c67474f",
-                "sha256:7a3b5b2c012d70c63d9d13c57ed1603709a4d9d7d473e4a9dfece0e4ea3d5f51",
-                "sha256:7a7ddf981a0b953ade1c2379052d47ccda2f58ab678fca0671c7c7ca2f67aac2",
-                "sha256:84de955314aa5e8d469b00b14d6d714b008087a0222b0f743e7ffac34ef56aff",
-                "sha256:8dcfd14c712aa9dd18049280bfb2f95700ff6a8bde645e09f17c3ed3f05a0130",
-                "sha256:928f92f80e2e8d6567b87d3316c1fd9860ccfe36e87a9a7f5237d4cda8baa1ba",
-                "sha256:9384b07cfd3045b37b05ed002d1c255db02fb96506ad65f0f9b776b762a7572e",
-                "sha256:96726839a42429318017e67a42cca75d4f0d5248a809b3cc2e125445edd7d50d",
-                "sha256:96bbec47beb131bbf4bae05d8ef99ad9e5738f12717cfbbf16648b78b0232e87",
-                "sha256:9bcf97b971289be69638d8b1b616f7e557e1342debc7fc86cf89d3f08960e411",
-                "sha256:a0cf4d814689e58f57ecd5d8c523e6538417ca2e72ff52c007c64065cef50fb2",
-                "sha256:a7c6147c6306f537cff59409609508a1d2eff81199f0302dd456bb9e7ea50c39",
-                "sha256:a9266644064779840feec0e34f10a89b3ff1d2d6b751fe90017abcad1864fa7c",
-                "sha256:afbe85b50ade42ddff5669947afde9e8a610e64d2c80be046d67ec4368e555fa",
-                "sha256:afcda759a69c6a8be3aae764ec6733155aa4a5ad9aad4f398b52ba4037942fe3",
-                "sha256:b2fab23003c4bb2249729a7290a76c1dda38c438300fdf97d4e42bf78b19c810",
-                "sha256:bd3f711f4c99da0091ced41dccdc1bcf8be0281dc314d6d9c6b6cf5df66f37a9",
-                "sha256:be0c7c98e38a1e3ad7a6ff64af8b6d6db34bf5a41b1478e24c3c74d9e7f8ed42",
-                "sha256:c1f2d7fd583fc79c240094b3e7237d88493814d4b300d013a42726c35a734bc9",
-                "sha256:c5bba6b83fde4ca233cfda04cbd4685ab88696b0c8eaf76f7148969eab5e248a",
-                "sha256:c6beeac698671baa558e82fa160be9761cf0eb25861943f4689ecf9000f8ebd0",
-                "sha256:c7333e7239415076d1418dbfb7fa4df48f3a5b00f8fdf854fca549080455bc14",
-                "sha256:c8a02f74ae419e3955af60f570d83187423e42e672a6433c5e292f1d23619269",
-                "sha256:c9c23e62f3545c2216100603614f9e019e41b9403c47dd85b8e7e5015bf1bde0",
-                "sha256:cca505829cdab58c2495ff418c96092d225a1bbd486f79017f6de915580d3c44",
-                "sha256:d3108f0ad5c6b6d78eec5273219a5bbd884b4aacec17883ceefaac988850ce6e",
-                "sha256:d4b8a1b6c7a68c73191f2ebd3bf66f7ce02f9c374e309bdb68ba886bbbf1b938",
-                "sha256:d6e274661c74195708fc4380a4ef64298926c5a50bb10fbae3d01627d7a075b7",
-                "sha256:db2914de2559809fdbcf3e48f41b17a493b58cb7988d3e211f6b63126c55fe82",
-                "sha256:e738aabff3586091221044b7a584865ddc4d6120346d12e28e788307cd731043",
-                "sha256:e7f6173302f8a329ca5d1ee592af9e628d3ade87816e9958dcf7cdae2841def7",
-                "sha256:e9d036a9a41fc78e8a3f10a86c2fc1098fca8fab8715ba9eb999ce4788d35df0",
-                "sha256:ea142255d4901b03f89cb6a94411ecec117786a76fc9ab043af8f51dd50b5313",
-                "sha256:ebd3e6b0c7d4954cca59d241970011f8d3327633d555051c430bd09ff49dc494",
-                "sha256:ec656680fc53a13f849c71afd0c84a55c536206d524cbc831cde80abbe80489e",
-                "sha256:ec8df0ff5a911c6d21957a9182402aad7bf060eaeffd77c9ea1c16aecab5adbf",
-                "sha256:ed95d66745f53e129e935ad726167d3a6cb18c5d33df3165974d54742c373868",
-                "sha256:ef2c9499b7bd1e24e473dc1a85de55d72fd084eea3d8bdeec7ee0720decb54fa",
-                "sha256:f5252ba8b43906f206048fa569debf2cd0da0316e8d5b4d25abe53307f573941",
-                "sha256:f737fef6e117856400afee4f17774cdea392b28ecf058833f5eca368a18cf1bf",
-                "sha256:fc726c3fa8f606d07bd2b500e5dc4c0fd664c59be7788a16b9e34352c50b6b6b"
+                "sha256:012f176945af138abc10c4a48743327a92b4ca9adc7a0e078077cdb5dbab7be0",
+                "sha256:02c13415b5732fb6ee7ff64583a5e6ed1c57aa68f17d2bda79c04888dfdc2769",
+                "sha256:03b6002e20938fc6ee0918c81d9e776bebccc84690e2b03ed132331cca065ee5",
+                "sha256:04814571cb72d65a6899db6099e377ed00710bf2e3eafd2985166f2918beaf59",
+                "sha256:0580f2e12de2138f34debcd5d88894786453a76e98febaf3e8fe5db62d01c9bf",
+                "sha256:06a8e2ee1cbac16fe61e51e0b0c269400e781b13bcfc33f5425912391a542985",
+                "sha256:076bc454a7e6fd646bc82ea7f98296be0b1219b5e3ef8a488afbdd8e81fbac50",
+                "sha256:0c9527819b29cd2b9f52033e7fb9ff08073df49b4799c89cb5754624ecd98299",
+                "sha256:0dc49f42422163efb7e6f1df2636fe3db72713f6cd94688e339dbe33fe06d61d",
+                "sha256:14cdb5a9570be5a04eec2ace174a48ae85833c2aadc86de68f55541f66ce42ab",
+                "sha256:15fccaf62a4889527539ecb86834084ecf6e9ea70588efde86e8bc775e0e7542",
+                "sha256:24213ba85a419103e641e55c27dc7ff03536c4873470c2478cce3311ba1eee7b",
+                "sha256:31d5093d3acd02b31c649d3a69bb072d539d4c7659b87caa4f6d2bcf57c2fa2b",
+                "sha256:3691ed7726fef54e928fe26344d930c0c8575bc968c3e239c2e1a04bd8cf7838",
+                "sha256:386fbe79863eb564e9f3615b959e28b222259da0c48fd1be5929ac838bc65683",
+                "sha256:3bbbfff4c679c64e6e23cb213f57cc2c9165c9a65d63717108a644eb5a7398df",
+                "sha256:3de34936eb1a647aa919655ff8d38b618e9f6b7f250cc19a57a4bf7fd2062b6d",
+                "sha256:40d1c7a7f750b5648642586ba7206999650208dbe5afbcc5284bcec6579c9b91",
+                "sha256:44224d815853962f48fe124748227773acd9686eba6dc102578defd6fc99e8d9",
+                "sha256:47ad15a65fb41c570cd0ad9a9ff8012489e68176e7207ec7b82a0940dddfd8be",
+                "sha256:482cafb7dc886bebeb6c9ba7925e03591a62ab34298ee70d3dd47ba966370d2c",
+                "sha256:49c7dbbc1a559ae14fc48387a115b7d4bbc84b4a2c3b9299c31696953c2a5219",
+                "sha256:4b2c7ac59c5698a7a8207ba72d9e9c15b0fc484a560be0788b31312c2c5504e4",
+                "sha256:4cca22a61b7fe45da8fc73c3443150c3608750bbe27641fc7558ec5117b27fdf",
+                "sha256:4cfce37f31f20800a6a6620ce2cdd6737b82e42e06e6e9bd1b36f546feb3c44f",
+                "sha256:502a1464ccbc800b4b1995b302efaf426e8763fadf185e933c2931df7db9a199",
+                "sha256:53bf2097e05c2accc166c142a2090e4c6fd86581bde3fd9b2d3f9e93dda66ac1",
+                "sha256:593c114a2221444f30749cc5e5f4012488f56bd14de2af44fe23e1e9894a9c60",
+                "sha256:5d6958671b296febe7f5f859bea581a21c1d05430d1bbdcf2b393599b1cdce77",
+                "sha256:5ef359ebc6949e3a34c65ce20230fae70920714367c63afd80ea0c2702902ccf",
+                "sha256:613e5169f8ae77b1933e42e418a95931fb4867b2991fc311430b15901ed67079",
+                "sha256:61b9bae80ed1f338c42f57c16918853dc51775fb5cb61da70d590de14d8b5fb4",
+                "sha256:6362cc6c23c08d18ddbf0e8c4d5159b5df74fea1a5278ff4f2c79aed3f4e9f46",
+                "sha256:65a96e3e03300b41f261bbfd40dfdbf1c301e87eab7cd61c054b1f2e7c89b9e8",
+                "sha256:65e55ca7debae8faaffee0ebb4b47a51b4075f01e9b641c31e554fd376595c6c",
+                "sha256:68386d78743e6570f054fe7949d6cb37ef2b672b4d3405ce91fafa996f7d9b4d",
+                "sha256:68ff6f48b51bd78ea92b31079817aff539f6c8fc80b6b8d6ca347d7c02384e33",
+                "sha256:6ab29b8a0beb6f8eaf1e5049252cfe74adbaafd39ba91e10f18caeb0e99ffb34",
+                "sha256:77ae58586930ee6b2b6f696c82cf8e78c8016ec4795c53e36718365f6959dc82",
+                "sha256:77c4aa15a89847b9891abf97f3d4048f3c2d667e00f8a623c89ad2dccee6771b",
+                "sha256:78153314f26d5abef3239b4a9af20c229c6f3ecb97d4c1c01b22c4f87669820c",
+                "sha256:7852bbcb4d0d2f0c4d583f40c3bc750ee033265d80598d0f9cb6f372baa6b836",
+                "sha256:7e97d622cb083e86f18317282084bc9fbf261801b0192c34fe4b1febd9f7ae69",
+                "sha256:7f3dc0e330575f5b134918976a645e79adf333c0a1439dcf6899a80776c9ab39",
+                "sha256:80886dac673ceaef499de2f393fc80bb4481a129e6cb29e624a12e3296cc088f",
+                "sha256:811f23b3351ca532af598405db1093f018edf81368e689d1b508c57dcc6b6a32",
+                "sha256:86a5dfcc39309470bd7b68c591d84056d195428d5d2e0b5ccadfbaf25b026ebc",
+                "sha256:8b3cf2dc0f0690a33f2d2b2cb15db87a65f1c609f53c37e226f84edb08d10f52",
+                "sha256:8cc5203b817b748adccb07f36390feb730b1bc5f56683445bfe924fc270b8816",
+                "sha256:909af95a72cedbefe5596f0bdf3055740f96c1a4baa0dd11fd74ca4de0b4e3f1",
+                "sha256:974d3a2cce5fcfa32f06b13ccc8f20c6ad9c51802bb7f829eae8a1845c4019ec",
+                "sha256:98283b94cc0e11c73acaf1c9698dea80c830ca476492c0fe2622bd931f34b487",
+                "sha256:98f5635f7b74bcd4f6f72fcd85bea2154b323a9f05226a80bc7398d0c90763b0",
+                "sha256:99b7920e7165be5a9e9a3a7f1b680f06f68ff0d0328ff4079e5163990d046767",
+                "sha256:9bca390cb247dbfaec3c664326e034ef23882c3f3bfa5fbf0b56cad0320aaca5",
+                "sha256:9e2e576caec5c6a6b93f41626c9c02fc87cd91538b81a3670b2e04452a63def6",
+                "sha256:9ef405356ba989fb57f84cac66f7b0260772836191ccefbb987f414bcd2979d9",
+                "sha256:a55d2ad345684e7c3dd2c20d2f9572e9e1d5446d57200ff630e6ede7612e307f",
+                "sha256:ab7485222db0959a87fbe8125e233b5a6f01f4400785b36e8a7878170d8c3138",
+                "sha256:b1fc6b45010a8d0ff9e88f9f2418c6fd408c99c211257334aff41597ebece42e",
+                "sha256:b78f053a7ecfc35f0451d961dacdc671f4bcbc2f58241a7c820e9d82559844cf",
+                "sha256:b99acd4730ad1b196bfb03ee0803e4adac371ae8efa7e1cbc820200fc5ded109",
+                "sha256:be2b516f56ea883a3e14dda17059716593526e10fb6303189aaf5503937db408",
+                "sha256:beb39a6d60a709ae3fb3516a1581777e7e8b76933bb88c8f4420d875bb0267c6",
+                "sha256:bf3d1a519a324af764a46da4115bdbd566b3c73fb793ffb97f9111dbc684fc4d",
+                "sha256:c49a76c1038c2dd116fa443eba26bbb8e6c37e924e2513574856de3b6516be99",
+                "sha256:c5532f0441fc09c119e1dca18fbc0687e64fbeb45aa4d6a87211ceaee50a74c4",
+                "sha256:c6b9e6d7e41656d78e37ce754813fa44b455c3d0d0dced2a047def7dc5570b74",
+                "sha256:c87bf31b7fdab94ae3adbe4a48e711bfc5f89d21cf4c197e75561def39e223bc",
+                "sha256:cbad88a61fa743c5d283ad501b01c153820734118b65aee2bd7dbb735475ce0d",
+                "sha256:cf14627232dfa8730453752e9cdc210966490992234d77ff90bc8dc0dce361d5",
+                "sha256:db1d0b28fcb7f1d35600150c3e4b490775251dea70f894bf15c678fdd84eda6a",
+                "sha256:ddf5f7d877615f6a1e75971bfa5ac88609af3b74796ff3e06879e8422729fd01",
+                "sha256:e44a9a3c053b90c6f09b1bb4edd880959f5328cf63052503f892c41ea786d99f",
+                "sha256:efb15a17a12497685304b2d976cb4939e55137df7b09fa53f1b6a023f01fcb4e",
+                "sha256:fbbaea811a2bba171197b08eea288b9402faa2bab2ba0858eecdd0a4105753a3"
             ],
             "markers": "python_version >= '3.9'",
-            "version": "==3.11.9"
+            "version": "==3.11.10"
         },
         "aiosignal": {
             "hashes": [
@@ -593,64 +593,64 @@
         },
         "numpy": {
             "hashes": [
-                "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe",
-                "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0",
-                "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48",
-                "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a",
-                "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564",
-                "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958",
-                "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17",
-                "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0",
-                "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee",
-                "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b",
-                "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4",
-                "sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4",
-                "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6",
-                "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4",
-                "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d",
-                "sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f",
-                "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f",
-                "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f",
-                "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56",
-                "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9",
-                "sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd",
-                "sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23",
-                "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed",
-                "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a",
-                "sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098",
-                "sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1",
-                "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512",
-                "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f",
-                "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09",
-                "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f",
-                "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc",
-                "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8",
-                "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0",
-                "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761",
-                "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef",
-                "sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5",
-                "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e",
-                "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b",
-                "sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d",
-                "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43",
-                "sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c",
-                "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41",
-                "sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff",
-                "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408",
-                "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2",
-                "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9",
-                "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57",
-                "sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb",
-                "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9",
-                "sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3",
-                "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a",
-                "sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0",
-                "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e",
-                "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598",
-                "sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4"
+                "sha256:0557eebc699c1c34cccdd8c3778c9294e8196df27d713706895edc6f57d29608",
+                "sha256:0798b138c291d792f8ea40fe3768610f3c7dd2574389e37c3f26573757c8f7ef",
+                "sha256:0da8495970f6b101ddd0c38ace92edea30e7e12b9a926b57f5fabb1ecc25bb90",
+                "sha256:0f0986e917aca18f7a567b812ef7ca9391288e2acb7a4308aa9d265bd724bdae",
+                "sha256:122fd2fcfafdefc889c64ad99c228d5a1f9692c3a83f56c292618a59aa60ae83",
+                "sha256:140dd80ff8981a583a60980be1a655068f8adebf7a45a06a6858c873fcdcd4a0",
+                "sha256:16757cf28621e43e252c560d25b15f18a2f11da94fea344bf26c599b9cf54b73",
+                "sha256:18142b497d70a34b01642b9feabb70156311b326fdddd875a9981f34a369b671",
+                "sha256:1c92113619f7b272838b8d6702a7f8ebe5edea0df48166c47929611d0b4dea69",
+                "sha256:1e25507d85da11ff5066269d0bd25d06e0a0f2e908415534f3e603d2a78e4ffa",
+                "sha256:30bf971c12e4365153afb31fc73f441d4da157153f3400b82db32d04de1e4066",
+                "sha256:3579eaeb5e07f3ded59298ce22b65f877a86ba8e9fe701f5576c99bb17c283da",
+                "sha256:36b2b43146f646642b425dd2027730f99bac962618ec2052932157e213a040e9",
+                "sha256:3905a5fffcc23e597ee4d9fb3fcd209bd658c352657548db7316e810ca80458e",
+                "sha256:3a4199f519e57d517ebd48cb76b36c82da0360781c6a0353e64c0cac30ecaad3",
+                "sha256:3f2f5cddeaa4424a0a118924b988746db6ffa8565e5829b1841a8a3bd73eb59a",
+                "sha256:40deb10198bbaa531509aad0cd2f9fadb26c8b94070831e2208e7df543562b74",
+                "sha256:440cfb3db4c5029775803794f8638fbdbf71ec702caf32735f53b008e1eaece3",
+                "sha256:4723a50e1523e1de4fccd1b9a6dcea750c2102461e9a02b2ac55ffeae09a4410",
+                "sha256:4bddbaa30d78c86329b26bd6aaaea06b1e47444da99eddac7bf1e2fab717bd72",
+                "sha256:4e58666988605e251d42c2818c7d3d8991555381be26399303053b58a5bbf30d",
+                "sha256:54dc1d6d66f8d37843ed281773c7174f03bf7ad826523f73435deb88ba60d2d4",
+                "sha256:57fcc997ffc0bef234b8875a54d4058afa92b0b0c4223fc1f62f24b3b5e86038",
+                "sha256:58b92a5828bd4d9aa0952492b7de803135038de47343b2aa3cc23f3b71a3dc4e",
+                "sha256:5a145e956b374e72ad1dff82779177d4a3c62bc8248f41b80cb5122e68f22d13",
+                "sha256:6ab153263a7c5ccaf6dfe7e53447b74f77789f28ecb278c3b5d49db7ece10d6d",
+                "sha256:7832f9e8eb00be32f15fdfb9a981d6955ea9adc8574c521d48710171b6c55e95",
+                "sha256:7fe4bb0695fe986a9e4deec3b6857003b4cfe5c5e4aac0b95f6a658c14635e31",
+                "sha256:7fe8f3583e0607ad4e43a954e35c1748b553bfe9fdac8635c02058023277d1b3",
+                "sha256:85ad7d11b309bd132d74397fcf2920933c9d1dc865487128f5c03d580f2c3d03",
+                "sha256:9874bc2ff574c40ab7a5cbb7464bf9b045d617e36754a7bc93f933d52bd9ffc6",
+                "sha256:a184288538e6ad699cbe6b24859206e38ce5fba28f3bcfa51c90d0502c1582b2",
+                "sha256:a222d764352c773aa5ebde02dd84dba3279c81c6db2e482d62a3fa54e5ece69b",
+                "sha256:a50aeff71d0f97b6450d33940c7181b08be1441c6c193e678211bff11aa725e7",
+                "sha256:a55dc7a7f0b6198b07ec0cd445fbb98b05234e8b00c5ac4874a63372ba98d4ab",
+                "sha256:a62eb442011776e4036af5c8b1a00b706c5bc02dc15eb5344b0c750428c94219",
+                "sha256:a7d41d1612c1a82b64697e894b75db6758d4f21c3ec069d841e60ebe54b5b571",
+                "sha256:a98f6f20465e7618c83252c02041517bd2f7ea29be5378f09667a8f654a5918d",
+                "sha256:afe8fb968743d40435c3827632fd36c5fbde633b0423da7692e426529b1759b1",
+                "sha256:b0b227dcff8cdc3efbce66d4e50891f04d0a387cce282fe1e66199146a6a8fca",
+                "sha256:b30042fe92dbd79f1ba7f6898fada10bdaad1847c44f2dff9a16147e00a93661",
+                "sha256:b606b1aaf802e6468c2608c65ff7ece53eae1a6874b3765f69b8ceb20c5fa78e",
+                "sha256:b6207dc8fb3c8cb5668e885cef9ec7f70189bec4e276f0ff70d5aa078d32c88e",
+                "sha256:c2aed8fcf8abc3020d6a9ccb31dbc9e7d7819c56a348cc88fd44be269b37427e",
+                "sha256:cb24cca1968b21355cc6f3da1a20cd1cebd8a023e3c5b09b432444617949085a",
+                "sha256:cff210198bb4cae3f3c100444c5eaa573a823f05c253e7188e1362a5555235b3",
+                "sha256:d35717333b39d1b6bb8433fa758a55f1081543de527171543a2b710551d40881",
+                "sha256:df12a1f99b99f569a7c2ae59aa2d31724e8d835fc7f33e14f4792e3071d11221",
+                "sha256:e09d40edfdb4e260cb1567d8ae770ccf3b8b7e9f0d9b5c2a9992696b30ce2742",
+                "sha256:e12c6c1ce84628c52d6367863773f7c8c8241be554e8b79686e91a43f1733773",
+                "sha256:e2b8cd48a9942ed3f85b95ca4105c45758438c7ed28fff1e4ce3e57c3b589d8e",
+                "sha256:e500aba968a48e9019e42c0c199b7ec0696a97fa69037bea163b55398e390529",
+                "sha256:ebe5e59545401fbb1b24da76f006ab19734ae71e703cdb4a8b347e84a0cece67",
+                "sha256:f0dd071b95bbca244f4cb7f70b77d2ff3aaaba7fa16dc41f58d14854a6204e6c",
+                "sha256:f8c8b141ef9699ae777c6278b52c706b653bf15d135d302754f6b2e90eb30367"
             ],
             "markers": "python_version == '3.11'",
-            "version": "==2.1.3"
+            "version": "==2.2.0"
         },
         "opensearch-py": {
             "hashes": [
@@ -995,11 +995,11 @@
         },
         "six": {
             "hashes": [
-                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
-                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
+                "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274",
+                "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'",
-            "version": "==1.16.0"
+            "version": "==1.17.0"
         },
         "testcontainers-core": {
             "hashes": [
@@ -1227,72 +1227,72 @@
     "develop": {
         "coverage": {
             "hashes": [
-                "sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5",
-                "sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf",
-                "sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb",
-                "sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638",
-                "sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4",
-                "sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc",
-                "sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed",
-                "sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a",
-                "sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d",
-                "sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649",
-                "sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c",
-                "sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b",
-                "sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4",
-                "sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443",
-                "sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83",
-                "sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee",
-                "sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e",
-                "sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e",
-                "sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3",
-                "sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0",
-                "sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb",
-                "sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076",
-                "sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb",
-                "sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787",
-                "sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1",
-                "sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e",
-                "sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce",
-                "sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801",
-                "sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764",
-                "sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365",
-                "sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf",
-                "sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6",
-                "sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71",
-                "sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002",
-                "sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4",
-                "sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c",
-                "sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8",
-                "sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4",
-                "sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146",
-                "sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc",
-                "sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea",
-                "sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4",
-                "sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad",
-                "sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28",
-                "sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451",
-                "sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50",
-                "sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779",
-                "sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63",
-                "sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e",
-                "sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc",
-                "sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022",
-                "sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d",
-                "sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94",
-                "sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b",
-                "sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d",
-                "sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331",
-                "sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a",
-                "sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0",
-                "sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee",
-                "sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92",
-                "sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a",
-                "sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"
+                "sha256:0824a28ec542a0be22f60c6ac36d679e0e262e5353203bea81d44ee81fe9c6d4",
+                "sha256:085161be5f3b30fd9b3e7b9a8c301f935c8313dcf928a07b116324abea2c1c2c",
+                "sha256:0ae1387db4aecb1f485fb70a6c0148c6cdaebb6038f1d40089b1fc84a5db556f",
+                "sha256:0d59fd927b1f04de57a2ba0137166d31c1a6dd9e764ad4af552912d70428c92b",
+                "sha256:0f957943bc718b87144ecaee70762bc2bc3f1a7a53c7b861103546d3a403f0a6",
+                "sha256:13a9e2d3ee855db3dd6ea1ba5203316a1b1fd8eaeffc37c5b54987e61e4194ae",
+                "sha256:1a330812d9cc7ac2182586f6d41b4d0fadf9be9049f350e0efb275c8ee8eb692",
+                "sha256:22be16571504c9ccea919fcedb459d5ab20d41172056206eb2994e2ff06118a4",
+                "sha256:2d10e07aa2b91835d6abec555ec8b2733347956991901eea6ffac295f83a30e4",
+                "sha256:35371f8438028fdccfaf3570b31d98e8d9eda8bb1d6ab9473f5a390969e98717",
+                "sha256:3c026eb44f744acaa2bda7493dad903aa5bf5fc4f2554293a798d5606710055d",
+                "sha256:41ff7b0da5af71a51b53f501a3bac65fb0ec311ebed1632e58fc6107f03b9198",
+                "sha256:4401ae5fc52ad8d26d2a5d8a7428b0f0c72431683f8e63e42e70606374c311a1",
+                "sha256:44349150f6811b44b25574839b39ae35291f6496eb795b7366fef3bd3cf112d3",
+                "sha256:447af20e25fdbe16f26e84eb714ba21d98868705cb138252d28bc400381f6ffb",
+                "sha256:4a8d8977b0c6ef5aeadcb644da9e69ae0dcfe66ec7f368c89c72e058bd71164d",
+                "sha256:4e12ae8cc979cf83d258acb5e1f1cf2f3f83524d1564a49d20b8bec14b637f08",
+                "sha256:592ac539812e9b46046620341498caf09ca21023c41c893e1eb9dbda00a70cbf",
+                "sha256:5e6b86b5847a016d0fbd31ffe1001b63355ed309651851295315031ea7eb5a9b",
+                "sha256:608a7fd78c67bee8936378299a6cb9f5149bb80238c7a566fc3e6717a4e68710",
+                "sha256:61f70dc68bd36810972e55bbbe83674ea073dd1dcc121040a08cdf3416c5349c",
+                "sha256:65dad5a248823a4996724a88eb51d4b31587aa7aa428562dbe459c684e5787ae",
+                "sha256:777abfab476cf83b5177b84d7486497e034eb9eaea0d746ce0c1268c71652077",
+                "sha256:7e216d8044a356fc0337c7a2a0536d6de07888d7bcda76febcb8adc50bdbbd00",
+                "sha256:85d9636f72e8991a1706b2b55b06c27545448baf9f6dbf51c4004609aacd7dcb",
+                "sha256:899b8cd4781c400454f2f64f7776a5d87bbd7b3e7f7bda0cb18f857bb1334664",
+                "sha256:8a289d23d4c46f1a82d5db4abeb40b9b5be91731ee19a379d15790e53031c014",
+                "sha256:8d2dfa71665a29b153a9681edb1c8d9c1ea50dfc2375fb4dac99ea7e21a0bcd9",
+                "sha256:8e3c3e38930cfb729cb8137d7f055e5a473ddaf1217966aa6238c88bd9fd50e6",
+                "sha256:8f8770dfc6e2c6a2d4569f411015c8d751c980d17a14b0530da2d7f27ffdd88e",
+                "sha256:932fc826442132dde42ee52cf66d941f581c685a6313feebed358411238f60f9",
+                "sha256:96d636c77af18b5cb664ddf12dab9b15a0cfe9c0bde715da38698c8cea748bfa",
+                "sha256:97ddc94d46088304772d21b060041c97fc16bdda13c6c7f9d8fcd8d5ae0d8611",
+                "sha256:98caba4476a6c8d59ec1eb00c7dd862ba9beca34085642d46ed503cc2d440d4b",
+                "sha256:9901d36492009a0a9b94b20e52ebfc8453bf49bb2b27bca2c9706f8b4f5a554a",
+                "sha256:99e266ae0b5d15f1ca8d278a668df6f51cc4b854513daab5cae695ed7b721cf8",
+                "sha256:9c38bf15a40ccf5619fa2fe8f26106c7e8e080d7760aeccb3722664c8656b030",
+                "sha256:a27801adef24cc30871da98a105f77995e13a25a505a0161911f6aafbd66e678",
+                "sha256:abd3e72dd5b97e3af4246cdada7738ef0e608168de952b837b8dd7e90341f015",
+                "sha256:adb697c0bd35100dc690de83154627fbab1f4f3c0386df266dded865fc50a902",
+                "sha256:b12c6b18269ca471eedd41c1b6a1065b2f7827508edb9a7ed5555e9a56dcfc97",
+                "sha256:b9389a429e0e5142e69d5bf4a435dd688c14478a19bb901735cdf75e57b13845",
+                "sha256:ba9e7484d286cd5a43744e5f47b0b3fb457865baf07bafc6bee91896364e1419",
+                "sha256:bb5555cff66c4d3d6213a296b360f9e1a8e323e74e0426b6c10ed7f4d021e464",
+                "sha256:be57b6d56e49c2739cdf776839a92330e933dd5e5d929966fbbd380c77f060be",
+                "sha256:c69e42c892c018cd3c8d90da61d845f50a8243062b19d228189b0224150018a9",
+                "sha256:ccc660a77e1c2bf24ddbce969af9447a9474790160cfb23de6be4fa88e3951c7",
+                "sha256:d5275455b3e4627c8e7154feaf7ee0743c2e7af82f6e3b561967b1cca755a0be",
+                "sha256:d75cded8a3cff93da9edc31446872d2997e327921d8eed86641efafd350e1df1",
+                "sha256:d872ec5aeb086cbea771c573600d47944eea2dcba8be5f3ee649bfe3cb8dc9ba",
+                "sha256:d891c136b5b310d0e702e186d70cd16d1119ea8927347045124cb286b29297e5",
+                "sha256:db1dab894cc139f67822a92910466531de5ea6034ddfd2b11c0d4c6257168073",
+                "sha256:e28bf44afa2b187cc9f41749138a64435bf340adfcacb5b2290c070ce99839d4",
+                "sha256:e5ea1cf0872ee455c03e5674b5bca5e3e68e159379c1af0903e89f5eba9ccc3a",
+                "sha256:e77363e8425325384f9d49272c54045bbed2f478e9dd698dbc65dbc37860eb0a",
+                "sha256:ee5defd1733fd6ec08b168bd4f5387d5b322f45ca9e0e6c817ea6c4cd36313e3",
+                "sha256:f1592791f8204ae9166de22ba7e6705fa4ebd02936c09436a1bb85aabca3e599",
+                "sha256:f2d1ec60d6d256bdf298cb86b78dd715980828f50c46701abc3b0a2b3f8a0dc0",
+                "sha256:f3ca78518bc6bc92828cd11867b121891d75cae4ea9e908d72030609b996db1b",
+                "sha256:f7b15f589593110ae767ce997775d645b47e5cbbf54fd322f8ebea6277466cec",
+                "sha256:fd1213c86e48dfdc5a0cc676551db467495a95a662d2396ecd58e719191446e1",
+                "sha256:ff74026a461eb0660366fb01c650c1d00f833a086b336bdad7ab00cc952072b3"
             ],
             "index": "pypi",
             "markers": "python_version >= '3.9'",
-            "version": "==7.6.8"
+            "version": "==7.6.9"
         },
         "iniconfig": {
             "hashes": [
diff --git a/dbrepo-search-service/init/database.json b/dbrepo-search-service/init/database.json
index 1e6bdd0c4c4d3f2302bafc4c7a79bed2ec84224d..fb175700c614599daab44fa0fb77e51a05151b62 100644
--- a/dbrepo-search-service/init/database.json
+++ b/dbrepo-search-service/init/database.json
@@ -18,20 +18,16 @@
           },
           "user": {
             "properties": {
-              "attributes": {
-                "properties": {
-                  "theme": {
-                    "type": "text",
-                    "fields": {
-                      "keyword": {
-                        "type": "keyword",
-                        "ignore_above": 256
-                      }
-                    }
+              "id": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
                   }
                 }
               },
-              "id": {
+              "qualified_name": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -40,7 +36,7 @@
                   }
                 }
               },
-              "qualified_name": {
+              "name": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -49,7 +45,7 @@
                   }
                 }
               },
-              "username": {
+              "orcid": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -57,16 +53,8 @@
                     "ignore_above": 256
                   }
                 }
-              }
-            }
-          }
-        }
-      },
-      "contact": {
-        "properties": {
-          "attributes": {
-            "properties": {
-              "theme": {
+              },
+              "username": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -76,7 +64,11 @@
                 }
               }
             }
-          },
+          }
+        }
+      },
+      "contact": {
+        "properties": {
           "id": {
             "type": "text",
             "fields": {
@@ -95,6 +87,24 @@
               }
             }
           },
+          "name": {
+            "type": "text",
+            "fields": {
+              "keyword": {
+                "type": "keyword",
+                "ignore_above": 256
+              }
+            }
+          },
+          "orcid": {
+            "type": "text",
+            "fields": {
+              "keyword": {
+                "type": "keyword",
+                "ignore_above": 256
+              }
+            }
+          },
           "username": {
             "type": "text",
             "fields": {
@@ -236,20 +246,16 @@
       },
       "creator": {
         "properties": {
-          "attributes": {
-            "properties": {
-              "theme": {
-                "type": "text",
-                "fields": {
-                  "keyword": {
-                    "type": "keyword",
-                    "ignore_above": 256
-                  }
-                }
+          "id": {
+            "type": "text",
+            "fields": {
+              "keyword": {
+                "type": "keyword",
+                "ignore_above": 256
               }
             }
           },
-          "id": {
+          "qualified_name": {
             "type": "text",
             "fields": {
               "keyword": {
@@ -258,7 +264,16 @@
               }
             }
           },
-          "qualified_name": {
+          "name": {
+            "type": "text",
+            "fields": {
+              "keyword": {
+                "type": "keyword",
+                "ignore_above": 256
+              }
+            }
+          },
+          "orcid": {
             "type": "text",
             "fields": {
               "keyword": {
@@ -315,6 +330,24 @@
                   }
                 }
               },
+              "name": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
+                  }
+                }
+              },
+              "orcid": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
+                  }
+                }
+              },
               "username": {
                 "type": "text",
                 "fields": {
@@ -400,9 +433,6 @@
           "id": {
             "type": "long"
           },
-          "last_modified": {
-            "type": "date"
-          },
           "licenses": {
             "properties": {
               "description": {
@@ -530,6 +560,9 @@
       "is_public": {
         "type": "boolean"
       },
+      "is_schema_public": {
+        "type": "boolean"
+      },
       "name": {
         "type": "text",
         "fields": {
@@ -541,19 +574,6 @@
       },
       "owner": {
         "properties": {
-          "attributes": {
-            "properties": {
-              "theme": {
-                "type": "text",
-                "fields": {
-                  "keyword": {
-                    "type": "keyword",
-                    "ignore_above": 256
-                  }
-                }
-              }
-            }
-          },
           "id": {
             "type": "text",
             "fields": {
@@ -713,31 +733,18 @@
           "created": {
             "type": "date"
           },
-          "created_by": {
-            "type": "text",
-            "fields": {
-              "keyword": {
-                "type": "keyword",
-                "ignore_above": 256
-              }
-            }
-          },
           "creator": {
             "properties": {
-              "attributes": {
-                "properties": {
-                  "theme": {
-                    "type": "text",
-                    "fields": {
-                      "keyword": {
-                        "type": "keyword",
-                        "ignore_above": 256
-                      }
-                    }
+              "id": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
                   }
                 }
               },
-              "id": {
+              "qualified_name": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -746,7 +753,16 @@
                   }
                 }
               },
-              "qualified_name": {
+              "name": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
+                  }
+                }
+              },
+              "orcid": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -796,6 +812,9 @@
           "is_public": {
             "type": "boolean"
           },
+          "is_schema_public": {
+            "type": "boolean"
+          },
           "is_versioned": {
             "type": "boolean"
           },
@@ -813,20 +832,16 @@
           },
           "owner": {
             "properties": {
-              "attributes": {
-                "properties": {
-                  "theme": {
-                    "type": "text",
-                    "fields": {
-                      "keyword": {
-                        "type": "keyword",
-                        "ignore_above": 256
-                      }
-                    }
+              "id": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
                   }
                 }
               },
-              "id": {
+              "qualified_name": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -835,7 +850,16 @@
                   }
                 }
               },
-              "qualified_name": {
+              "name": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
+                  }
+                }
+              },
+              "orcid": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -928,20 +952,16 @@
           },
           "creator": {
             "properties": {
-              "attributes": {
-                "properties": {
-                  "theme": {
-                    "type": "text",
-                    "fields": {
-                      "keyword": {
-                        "type": "keyword",
-                        "ignore_above": 256
-                      }
-                    }
+              "id": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
                   }
                 }
               },
-              "id": {
+              "qualified_name": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -950,7 +970,16 @@
                   }
                 }
               },
-              "qualified_name": {
+              "name": {
+                "type": "text",
+                "fields": {
+                  "keyword": {
+                    "type": "keyword",
+                    "ignore_above": 256
+                  }
+                }
+              },
+              "orcid": {
                 "type": "text",
                 "fields": {
                   "keyword": {
@@ -1001,6 +1030,24 @@
                       }
                     }
                   },
+                  "name": {
+                    "type": "text",
+                    "fields": {
+                      "keyword": {
+                        "type": "keyword",
+                        "ignore_above": 256
+                      }
+                    }
+                  },
+                  "orcid": {
+                    "type": "text",
+                    "fields": {
+                      "keyword": {
+                        "type": "keyword",
+                        "ignore_above": 256
+                      }
+                    }
+                  },
                   "username": {
                     "type": "text",
                     "fields": {
@@ -1086,9 +1133,6 @@
               "id": {
                 "type": "long"
               },
-              "last_modified": {
-                "type": "date"
-              },
               "licenses": {
                 "properties": {
                   "description": {
@@ -1210,8 +1254,8 @@
           "is_public": {
             "type": "boolean"
           },
-          "last_modified": {
-            "type": "date"
+          "is_schema_public": {
+            "type": "boolean"
           },
           "name": {
             "type": "text",
diff --git a/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..db73c1e06cf41cf64b5e409a536527ecebe1694f
Binary files /dev/null and b/dbrepo-search-service/init/lib/dbrepo-1.6.0.tar.gz differ
diff --git a/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz b/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..db73c1e06cf41cf64b5e409a536527ecebe1694f
Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.6.0.tar.gz differ
diff --git a/dbrepo-search-service/test.sh b/dbrepo-search-service/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..40328cd5dd490542e351668c7e59b33d0bba4965
--- /dev/null
+++ b/dbrepo-search-service/test.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+PIPENV_PIPFILE=./dbrepo-search-service/Pipfile
+source ./dbrepo-search-service/venv/bin/activate
+pip install pipenv
+pipenv install gunicorn && pipenv install --dev --system --deploy
+cd ./dbrepo-search-service/ && coverage run -m pytest test/test_app.py test/test_jwt.py test/test_opensearch_client.py test/test_keycloak_client.py --junitxml=report.xml && coverage html && coverage report > ./coverage.txt
+cat ./coverage.txt | grep -o 'TOTAL[^%]*%'
\ No newline at end of file
diff --git a/dbrepo-search-service/test/test_app.py b/dbrepo-search-service/test/test_app.py
index 1b1af020987175fcd8894e61fd2e85519f42c998..8621f6a0a42f744b2dba09dbc3ef4c0f3afe73cc 100644
--- a/dbrepo-search-service/test/test_app.py
+++ b/dbrepo-search-service/test/test_app.py
@@ -1,35 +1,26 @@
 import json
 import time
 import unittest
-import datetime
 
 import jwt
-from dbrepo.api.dto import Database, User, UserAttributes, Container, Image, Table, Constraints, Column, ColumnType, \
-    Concept, Unit
+from dbrepo.api.dto import Database, User, Container, Image, Table, Constraints, Column, ColumnType, Concept, Unit, \
+    UserBrief
 
 from app import app
 
 req = Database(id=1,
                name="Test",
                internal_name="test_tuw1",
-               creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                            username="foo",
-                            attributes=UserAttributes(theme="dark")),
-               owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                          username="foo",
-                          attributes=UserAttributes(theme="dark")),
-               contact=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                            username="foo",
-                            attributes=UserAttributes(theme="dark")),
-               created=datetime.datetime(2024, 3, 25, 16, tzinfo=datetime.timezone.utc),
+               owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
+               contact=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
                exchange_name="dbrepo",
                is_public=True,
+               is_schema_public=True,
                container=Container(id=1,
                                    name="MariaDB",
                                    internal_name="mariadb",
                                    host="data-db",
                                    port="3306",
-                                   created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc),
                                    sidecar_host="data-db-sidecar",
                                    sidecar_port=3305,
                                    image=Image(id=1,
@@ -41,29 +32,19 @@ req = Database(id=1,
                                                jdbc_method="mariadb",
                                                default_port=3306)),
                tables=[Table(id=1, database_id=1, name="Data", internal_name="data",
-                             creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                          username="foo",
-                                          attributes=UserAttributes(theme="dark")),
-                             owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                        username="foo",
-                                        attributes=UserAttributes(theme="dark")),
-                             created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc),
+                             owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
                              constraints=Constraints(uniques=[], foreign_keys=[], checks=[], primary_key=[]),
                              is_versioned=False,
-                             created_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
                              queue_name="dbrepo",
                              routing_key="dbrepo.1.1",
                              is_public=True,
+                             is_schema_public=True,
                              columns=[Column(id=1, database_id=1, table_id=1, name="ID", internal_name="id",
                                              column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False,
                                              size=20, d=0,
-                                             concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906",
-                                                             created=datetime.datetime(2024, 3, 1, 10,
-                                                                                       tzinfo=datetime.timezone.utc)),
+                                             concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906"),
                                              unit=Unit(id=1,
-                                                       uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius",
-                                                       created=datetime.datetime(2024, 3, 1, 10,
-                                                                                 tzinfo=datetime.timezone.utc)),
+                                                       uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"),
                                              val_min=0,
                                              val_max=10)]
                              )])
diff --git a/dbrepo-search-service/test/test_opensearch_client.py b/dbrepo-search-service/test/test_opensearch_client.py
index 581e5f8c5d94435c4344b4e8478ec09b116fd735..dc17c01d3ba8d8de82ce6ec339a463c45584caa4 100644
--- a/dbrepo-search-service/test/test_opensearch_client.py
+++ b/dbrepo-search-service/test/test_opensearch_client.py
@@ -2,35 +2,26 @@ import datetime
 import unittest
 
 import opensearchpy
-from dbrepo.api.dto import Database, User, UserAttributes, Container, Image, Table, Column, ColumnType, Constraints, \
-    PrimaryKey, TableMinimal, ColumnMinimal, Concept, Unit
+from dbrepo.api.dto import Database, Container, Image, Table, Column, ColumnType, Constraints, PrimaryKey, \
+  TableMinimal, ColumnMinimal, Concept, Unit, UserBrief
 from opensearchpy import NotFoundError
 
 from app import app
-
 from init.clients.opensearch_client import OpenSearchClient
 
 req = Database(id=1,
                name="Test",
                internal_name="test_tuw1",
-               creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                            username="foo",
-                            attributes=UserAttributes(theme="dark")),
-               owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                          username="foo",
-                          attributes=UserAttributes(theme="dark")),
-               contact=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                            username="foo",
-                            attributes=UserAttributes(theme="dark")),
-               created=datetime.datetime(2024, 3, 25, 16, tzinfo=datetime.timezone.utc),
+               owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
+               contact=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
                exchange_name="dbrepo",
                is_public=True,
+               is_schema_public=True,
                container=Container(id=1,
                                    name="MariaDB",
                                    internal_name="mariadb",
                                    host="data-db",
                                    port="3306",
-                                   created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc),
                                    sidecar_host="data-db-sidecar",
                                    sidecar_port=3305,
                                    image=Image(id=1,
@@ -41,30 +32,23 @@ req = Database(id=1,
                                                driver_class="org.mariadb.jdbc.Driver",
                                                jdbc_method="mariadb",
                                                default_port=3306)),
-               tables=[Table(id=1, database_id=1, name="Data", internal_name="data",
-                             creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                          username="foo",
-                                          attributes=UserAttributes(theme="dark")),
-                             owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                        username="foo",
-                                        attributes=UserAttributes(theme="dark")),
-                             created=datetime.datetime(2024, 3, 1, 10, tzinfo=datetime.timezone.utc),
+               tables=[Table(id=1,
+                             database_id=1,
+                             name="Data",
+                             internal_name="data",
+                             owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
                              constraints=Constraints(uniques=[], foreign_keys=[], checks=[], primary_key=[]),
                              is_versioned=False,
-                             created_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
                              queue_name="dbrepo",
                              routing_key="dbrepo.1.1",
                              is_public=True,
+                             is_schema_public=True,
                              columns=[Column(id=1, database_id=1, table_id=1, name="ID", internal_name="id",
                                              column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False,
                                              size=20, d=0,
-                                             concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906",
-                                                             created=datetime.datetime(2024, 3, 1, 10,
-                                                                                       tzinfo=datetime.timezone.utc)),
+                                             concept=Concept(id=1, uri="http://www.wikidata.org/entity/Q2221906"),
                                              unit=Unit(id=1,
-                                                       uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius",
-                                                       created=datetime.datetime(2024, 3, 1, 10,
-                                                                                 tzinfo=datetime.timezone.utc)),
+                                                       uri="http://www.ontology-of-units-of-measure.org/resource/om-2/degreeCelsius"),
                                              val_min=0,
                                              val_max=10)]
                              )])
@@ -84,6 +68,7 @@ class OpenSearchClientTest(unittest.TestCase):
                                 queue_name="dbrepo",
                                 routing_key="dbrepo.test_tuw1.test_table",
                                 is_public=True,
+                                is_schema_public=True,
                                 database_id=req.id,
                                 constraints=Constraints(uniques=[], foreign_keys=[], checks=[],
                                                         primary_key=[PrimaryKey(id=1,
@@ -92,14 +77,7 @@ class OpenSearchClientTest(unittest.TestCase):
                                                                                 column=ColumnMinimal(id=1, table_id=1,
                                                                                                      database_id=req.id))]),
                                 is_versioned=True,
-                                created_by="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                creator=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                             username="foo",
-                                             attributes=UserAttributes(theme="dark")),
-                                owner=User(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502",
-                                           username="foo",
-                                           attributes=UserAttributes(theme="dark")),
-                                created=datetime.datetime(2024, 4, 25, 17, 44, tzinfo=datetime.timezone.utc),
+                                owner=UserBrief(id="c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", username="foo"),
                                 columns=[Column(id=1,
                                                 name="ID",
                                                 internal_name="id",
@@ -112,16 +90,10 @@ class OpenSearchClientTest(unittest.TestCase):
             self.assertEqual(1, database.id)
             self.assertEqual("Test", database.name)
             self.assertEqual("test_tuw1", database.internal_name)
-            self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.creator.id)
-            self.assertEqual("foo", database.creator.username)
-            self.assertEqual("dark", database.creator.attributes.theme)
             self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id)
             self.assertEqual("foo", database.owner.username)
-            self.assertEqual("dark", database.owner.attributes.theme)
             self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id)
             self.assertEqual("foo", database.contact.username)
-            self.assertEqual("dark", database.contact.attributes.theme)
-            self.assertEqual(datetime.datetime(2024, 3, 25, 16, tzinfo=datetime.timezone.utc), database.created)
             self.assertEqual("dbrepo", database.exchange_name)
             self.assertEqual(True, database.is_public)
             self.assertEqual(1, database.container.id)
@@ -137,15 +109,8 @@ class OpenSearchClientTest(unittest.TestCase):
             self.assertEqual(True, database.tables[0].is_public)
             self.assertEqual(1, database.tables[0].database_id)
             self.assertEqual(True, database.tables[0].is_versioned)
-            self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].created_by)
-            self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].creator.id)
-            self.assertEqual("foo", database.tables[0].creator.username)
-            self.assertEqual("dark", database.tables[0].creator.attributes.theme)
             self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.tables[0].owner.id)
             self.assertEqual("foo", database.tables[0].owner.username)
-            self.assertEqual("dark", database.tables[0].owner.attributes.theme)
-            self.assertEqual(datetime.datetime(2024, 4, 25, 17, 44, tzinfo=datetime.timezone.utc),
-                             database.tables[0].created)
             self.assertEqual(1, len(database.tables[0].columns))
             self.assertEqual(1, database.tables[0].columns[0].id)
             self.assertEqual("ID", database.tables[0].columns[0].name)
@@ -163,16 +128,10 @@ class OpenSearchClientTest(unittest.TestCase):
             self.assertEqual(1, database.id)
             self.assertEqual("Test", database.name)
             self.assertEqual("test_tuw1", database.internal_name)
-            self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.creator.id)
-            self.assertEqual("foo", database.creator.username)
-            self.assertEqual("dark", database.creator.attributes.theme)
             self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.owner.id)
             self.assertEqual("foo", database.owner.username)
-            self.assertEqual("dark", database.owner.attributes.theme)
             self.assertEqual("c6b71ef5-2d2f-48b2-9d79-b8f23a3a0502", database.contact.id)
             self.assertEqual("foo", database.contact.username)
-            self.assertEqual("dark", database.contact.attributes.theme)
-            self.assertEqual(datetime.datetime(2024, 3, 25, 16, 0, tzinfo=datetime.timezone.utc), database.created)
             self.assertEqual("dbrepo", database.exchange_name)
             self.assertEqual(True, database.is_public)
             self.assertEqual(1, database.container.id)
diff --git a/dbrepo-ui/components/TimeDrift.vue b/dbrepo-ui/components/TimeDrift.vue
index 362fa28aaf445bc93c2f2b91e6cf6ffcd4676645..2f2555f9f84f107dff1ffd12ad75533d388c1f62 100644
--- a/dbrepo-ui/components/TimeDrift.vue
+++ b/dbrepo-ui/components/TimeDrift.vue
@@ -4,7 +4,6 @@
     v-if="timestamp && offSeconds > 3"
     class="banner"
     border="start"
-    tile
     type="warning">
     {{ $t('error.data.drift') + ' ' + offSeconds + 's' }}
   </v-alert>
diff --git a/dbrepo-ui/components/database/DatabaseCreate.vue b/dbrepo-ui/components/database/DatabaseCreate.vue
index 5da87cebbda9731ae842636654a40ce6fdea14a8..cd854897905dff7165fdadb10ff44b46d41c6479 100644
--- a/dbrepo-ui/components/database/DatabaseCreate.vue
+++ b/dbrepo-ui/components/database/DatabaseCreate.vue
@@ -17,7 +17,7 @@
           <v-row dense>
             <v-col>
               <v-text-field
-                v-model="createDatabaseDto.name"
+                v-model="payload.name"
                 name="database"
                 :variant="inputVariant"
                 :label="$t('pages.database.subpages.create.name.label')"
@@ -45,10 +45,6 @@
                 :rules="[v => !!v || $t('validation.required')]"
                 return-object
                 required>
-                <template
-                  v-slot:selection>
-                  <span>{{ engine.name }}</span>
-                </template>
                 <template
                   v-if="engine"
                   v-slot:details>
@@ -57,6 +53,42 @@
               </v-select>
             </v-col>
           </v-row>
+          <v-row>
+            <v-col
+              md="6">
+              <v-select
+                v-model="payload.is_public"
+                name="public"
+                :label="$t('pages.database.subpages.create.data.label')"
+                :hint="$t('pages.database.subpages.create.data.hint')"
+                persistent-hint
+                :variant="inputVariant"
+                :items="visibilityOptions"
+                item-title="name"
+                item-value="value"
+                :rules="[v => !!v || $t('validation.required')]"
+                return-object
+                required>
+              </v-select>
+            </v-col>
+            <v-col
+              md="6">
+              <v-select
+                v-model="payload.is_schema_public"
+                name="schema-public"
+                :label="$t('pages.database.subpages.create.schema.label')"
+                :hint="$t('pages.database.subpages.create.schema.hint')"
+                persistent-hint
+                :variant="inputVariant"
+                :items="visibilityOptions"
+                item-title="name"
+                item-value="value"
+                :rules="[v => !!v || $t('validation.required')]"
+                return-object
+                required>
+              </v-select>
+            </v-col>
+          </v-row>
         </v-card-text>
         <v-card-actions>
           <v-spacer />
@@ -91,9 +123,20 @@ export default {
       loadingContainers: false,
       engine: null,
       engines: [],
-      createDatabaseDto: {
+      visibilityOptions: [
+        {
+          name: this.$t('toolbars.database.public'),
+          value: true
+        },
+        {
+          name: this.$t('toolbars.database.private'),
+          value: false
+        }
+      ],
+      payload: {
         name: null,
-        is_public: true
+        is_public: true,
+        is_schema_public: true,
       }
     }
   },
@@ -137,17 +180,14 @@ export default {
         .catch(({code}) => {
           this.loadingContainers = false
           const toast = useToastInstance()
-          if (typeof code !== 'string') {
-            return
-          }
           toast.error(this.$t(code))
         })
     },
     create () {
-      const payload = { container_id: this.engine.id, name: this.createDatabaseDto.name, is_public: true }
-      const databaseService = useDatabaseService()
       this.loading = true
-      databaseService.create(payload)
+      this.payload.container_id = this.engine.id
+      const databaseService = useDatabaseService()
+      databaseService.create(this.payload)
         .then(async (database) => {
           await this.$router.push(`/database/${database.id}/info`)
           this.loading = false
diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue
index 5f3c8c83989bd20fa67f6f327fdc9676767acbb4..65363c3467067aa4dd3eca9e2d5595a913723684 100644
--- a/dbrepo-ui/components/database/DatabaseToolbar.vue
+++ b/dbrepo-ui/components/database/DatabaseToolbar.vue
@@ -118,6 +118,12 @@ export default {
     roles () {
       return this.userStore.getRoles
     },
+    isContrastTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast')
+    },
+    isDarkTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark')
+    },
     colorVariant () {
       return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary')
     },
diff --git a/dbrepo-ui/components/dialogs/Semantics.vue b/dbrepo-ui/components/dialogs/Semantics.vue
index 8d3c573f7b205368fd354372a9e166f2ee81a14f..12fffce66cd5b4647be1ae5b56c5e10be5facac4 100644
--- a/dbrepo-ui/components/dialogs/Semantics.vue
+++ b/dbrepo-ui/components/dialogs/Semantics.vue
@@ -234,7 +234,7 @@ export default {
       }
       this.loadingSave = true
       const tableService = useTableService()
-      tableService.update(this.database.id, this.tableId, this.column.id, payload)
+      tableService.updateSemantics(this.database.id, this.tableId, this.column.id, payload)
         .then(() => {
           this.recommendation = null
           this.$refs.form.reset()
diff --git a/dbrepo-ui/components/dialogs/UpdateTable.vue b/dbrepo-ui/components/dialogs/UpdateTable.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6e4e07182c12c480b1f4c5d4da3756d3e111164a
--- /dev/null
+++ b/dbrepo-ui/components/dialogs/UpdateTable.vue
@@ -0,0 +1,167 @@
+<template>
+  <div>
+    <v-form
+      ref="form"
+      v-model="valid"
+      autocomplete="off"
+      @submit.prevent="submit">
+      <v-card
+        :title="$t('pages.view.visibility.title')">
+        <v-card-text>
+          <v-row>
+            <v-col>
+              <v-textarea
+                v-model="modify.description"
+                rows="2"
+                :rules="[
+                  v => (!!v || v.length <= 180) || ($t('validation.max-length') + 180),
+                ]"
+                clearable
+                counter="180"
+                persistent-counter
+                persistent-hint
+                :variant="inputVariant"
+                :hint="$t('pages.table.subpages.import.description.hint')"
+                :label="$t('pages.table.subpages.import.description.label')"/>
+            </v-col>
+          </v-row>
+          <v-row
+            dense>
+            <v-col
+              md="6">
+              <v-select
+                v-model="modify.is_public"
+                :items="visibilities"
+                persistent-hint
+                :variant="inputVariant"
+                required
+                :rules="[
+                  v => v !== null || $t('validation.required')
+                ]"
+                :label="$t('pages.database.subpages.create.data.label')"
+                :hint="$t('pages.database.subpages.create.data.hint')" />
+            </v-col>
+            <v-col
+              md="6">
+              <v-select
+                v-model="modify.is_schema_public"
+                :items="visibilities"
+                persistent-hint
+                :variant="inputVariant"
+                required
+                :rules="[
+                  v => v !== null || $t('validation.required')
+                ]"
+                :label="$t('pages.database.subpages.create.schema.label')"
+                :hint="$t('pages.database.subpages.create.schema.hint')" />
+            </v-col>
+          </v-row>
+        </v-card-text>
+        <v-card-actions>
+          <v-spacer />
+          <v-btn
+            :variant="buttonVariant"
+            :text="$t('navigation.cancel')"
+            @click="cancel" />
+          <v-btn
+            id="database"
+            variant="flat"
+            :disabled="!valid || !isChange"
+            :color="buttonColor"
+            :loading="loading"
+            type="submit"
+            :text="$t('navigation.modify')"
+            @click="update" />
+        </v-card-actions>
+      </v-card>
+    </v-form>
+  </div>
+</template>
+
+<script>
+import { useCacheStore } from '@/stores/cache'
+
+export default {
+  props: {
+    table: {
+      type: Object,
+      default () {
+        return {
+          is_public: true,
+          is_schema_public: true,
+          description: null
+        }
+      }
+    },
+  },
+  data () {
+    return {
+      valid: false,
+      loading: false,
+      visibilities: [
+        { title: this.$t('toolbars.database.public'), value: true },
+        { title: this.$t('toolbars.database.private'), value: false },
+      ],
+      modify: {
+        description: this.table.description,
+        is_public: this.table.is_public,
+        is_schema_public: this.table.is_schema_public
+      },
+      cacheStore: useCacheStore()
+    }
+  },
+  computed: {
+    database () {
+      return this.cacheStore.getDatabase
+    },
+    inputVariant () {
+      const runtimeConfig = useRuntimeConfig()
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal
+    },
+    buttonVariant () {
+      const runtimeConfig = useRuntimeConfig()
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
+    },
+    isChange () {
+      if (this.table.description !== this.modify.description) {
+        return true
+      }
+      if (this.table.is_public !== this.modify.is_public) {
+        return true
+      }
+      return this.table.is_schema_public !== this.modify.is_schema_public
+    },
+    buttonColor () {
+      return !this.isChange ? null : 'warning'
+    }
+  },
+  methods: {
+    submit () {
+      this.$refs.form.validate()
+    },
+    cancel () {
+      this.$emit('close', { success: false })
+    },
+    update () {
+      this.loading = true
+      const tableService = useTableService()
+      tableService.update(this.$route.params.database_id, this.$route.params.table_id, this.modify)
+        .then(() => {
+          this.loading = false
+          const toast = useToastInstance()
+          toast.success(this.$t('success.table.updated'))
+          this.$emit('close', { success: true })
+          this.cacheStore.reloadTable()
+        })
+        .catch(({code}) => {
+          this.loading = false
+          const toast = useToastInstance()
+          toast.error(this.$t(code))
+        })
+        .finally(() => {
+          this.loading = false
+        })
+    }
+  }
+}
+</script>
diff --git a/dbrepo-ui/components/dialogs/ViewVisibility.vue b/dbrepo-ui/components/dialogs/ViewVisibility.vue
new file mode 100644
index 0000000000000000000000000000000000000000..226772edd922a9d71e40a312d461c666c50e8893
--- /dev/null
+++ b/dbrepo-ui/components/dialogs/ViewVisibility.vue
@@ -0,0 +1,146 @@
+<template>
+  <div>
+    <v-form
+      ref="form"
+      v-model="valid"
+      autocomplete="off"
+      @submit.prevent="submit">
+      <v-card
+        :title="$t('pages.view.visibility.title')">
+        <v-card-text>
+          <v-row
+            dense>
+            <v-col
+              md="6">
+              <v-select
+                v-model="modify.is_public"
+                :items="visibilities"
+                persistent-hint
+                :variant="inputVariant"
+                required
+                :rules="[
+                  v => v !== null || $t('validation.required')
+                ]"
+                :label="$t('pages.database.subpages.create.data.label')"
+                :hint="$t('pages.database.subpages.create.data.hint')" />
+            </v-col>
+            <v-col
+              md="6">
+              <v-select
+                v-model="modify.is_schema_public"
+                :items="visibilities"
+                persistent-hint
+                :variant="inputVariant"
+                required
+                :rules="[
+                  v => v !== null || $t('validation.required')
+                ]"
+                :label="$t('pages.database.subpages.create.schema.label')"
+                :hint="$t('pages.database.subpages.create.schema.hint')" />
+            </v-col>
+          </v-row>
+        </v-card-text>
+        <v-card-actions>
+          <v-spacer />
+          <v-btn
+            :variant="buttonVariant"
+            :text="$t('navigation.cancel')"
+            @click="cancel" />
+          <v-btn
+            id="database"
+            variant="flat"
+            :disabled="!valid || !isChange"
+            :color="buttonColor"
+            type="submit"
+            :text="$t('navigation.modify')"
+            @click="updateVisibility" />
+        </v-card-actions>
+      </v-card>
+    </v-form>
+  </div>
+</template>
+
+<script>
+import { useCacheStore } from '@/stores/cache'
+
+export default {
+  props: {
+    view: {
+      type: Object,
+      default () {
+        return {
+          is_public: true,
+          is_schema_public: true
+        }
+      }
+    },
+  },
+  data () {
+    return {
+      valid: false,
+      loading: false,
+      loadingUsers: false,
+      users: [],
+      error: false,
+      visibilities: [
+        { title: this.$t('toolbars.database.public'), value: true },
+        { title: this.$t('toolbars.database.private'), value: false },
+      ],
+      modify: {
+        is_public: this.view.is_public,
+        is_schema_public: this.view.is_schema_public
+      },
+      cacheStore: useCacheStore()
+    }
+  },
+  computed: {
+    database () {
+      return this.cacheStore.getDatabase
+    },
+    inputVariant () {
+      const runtimeConfig = useRuntimeConfig()
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal
+    },
+    buttonVariant () {
+      const runtimeConfig = useRuntimeConfig()
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
+    },
+    isChange () {
+      if (this.view.is_public !== this.modify.is_public) {
+        return true
+      }
+      return  this.view.is_schema_public !== this.modify.is_schema_public
+    },
+    buttonColor () {
+      return !this.isChange ? null : 'warning'
+    }
+  },
+  methods: {
+    submit () {
+      this.$refs.form.validate()
+    },
+    cancel () {
+      this.$emit('close', { success: false })
+    },
+    updateVisibility () {
+      this.loading = true
+      const viewService = useViewService()
+      viewService.update(this.$route.params.database_id, this.$route.params.view_id, this.modify)
+        .then(() => {
+          this.loading = false
+          const toast = useToastInstance()
+          toast.success(this.$t('success.view.modified'))
+          this.$emit('close', { success: true })
+        })
+        .catch(({code, message}) => {
+          this.loading = false
+          const toast = useToastInstance()
+          toast.error(message)
+        })
+        .finally(() => {
+          this.loading = false
+        })
+    }
+  }
+}
+</script>
diff --git a/dbrepo-ui/components/identifier/Persist.vue b/dbrepo-ui/components/identifier/Persist.vue
index 1795d058660ff08288b9054435e44362d84cf0e7..5c6d7c62892c7427086b45f6916327d542289dc8 100644
--- a/dbrepo-ui/components/identifier/Persist.vue
+++ b/dbrepo-ui/components/identifier/Persist.vue
@@ -1176,6 +1176,7 @@ export default {
     this.addDescription()
     this.fetchLicenses()
     this.fetchIdentifier()
+    this.$refs.form.validate()
   },
   methods: {
     cancel () {
diff --git a/dbrepo-ui/components/subset/Builder.vue b/dbrepo-ui/components/subset/Builder.vue
index 3a3cd3a142dce81172d23d1ee979515514c0326a..2a14b8f474a8f7a3cc0e38302e3ebad0e0df5a7d 100644
--- a/dbrepo-ui/components/subset/Builder.vue
+++ b/dbrepo-ui/components/subset/Builder.vue
@@ -61,20 +61,11 @@
                 :hint="$t('pages.view.subpages.create.name.hint')" />
             </v-col>
           </v-row>
-          <v-row
-            v-if="isView && !view.is_public"
-            dense>
-            <v-col>
-              <v-alert
-                :text="$t('pages.view.subpages.create.visibility.warn')"
-                border="start"
-                color="warning" />
-            </v-col>
-          </v-row>
           <v-row
             v-if="isView"
             dense>
-            <v-col lg="8">
+            <v-col
+              md="4">
               <v-select
                 v-model="view.is_public"
                 :items="visibilities"
@@ -85,8 +76,23 @@
                 :rules="[
                   v => !!v || $t('validation.required')
                 ]"
-                :label="$t('pages.view.subpages.create.visibility.label')"
-                :hint="$t('pages.view.subpages.create.visibility.hint')" />
+                :label="$t('pages.database.subpages.create.data.label')"
+                :hint="$t('pages.database.subpages.create.data.hint')" />
+            </v-col>
+            <v-col
+              md="4">
+              <v-select
+                v-model="view.is_schema_public"
+                :items="visibilities"
+                persistent-hint
+                :variant="inputVariant"
+                required
+                clearable
+                :rules="[
+                  v => !!v || $t('validation.required')
+                ]"
+                :label="$t('pages.database.subpages.create.schema.label')"
+                :hint="$t('pages.database.subpages.create.schema.hint')" />
             </v-col>
           </v-row>
           <v-window
@@ -121,6 +127,7 @@
                     :label="$t('pages.view.subpages.create.columns.label')"
                     :hint="$t('pages.view.subpages.create.columns.hint')"
                     :rules="[v => !!v || $t('validation.required')]"
+                    :loading="loadingColumns"
                     return-object
                     multiple
                     @update:model-value="buildQuery">
@@ -322,6 +329,7 @@ export default {
     return {
       table: null,
       views: [],
+      columns: [],
       timestamp: null,
       executeDifferentTimestamp: false,
       visibilities: [
@@ -338,6 +346,7 @@ export default {
       },
       view: {
         is_public: true,
+        is_schema_public: true,
         name: null,
         query: null
       },
@@ -345,6 +354,7 @@ export default {
       clauses: [],
       tabs: 0,
       loadingQuery: false,
+      loadingColumns: false,
       cacheStore: useCacheStore(),
       userStore: useUserStore()
     }
@@ -359,12 +369,6 @@ export default {
       }
       return this.database.container.image.operators
     },
-    columns () {
-      if (!this.table) {
-        return []
-      }
-      return this.table.columns
-    },
     tables () {
       if (!this.database) {
         return []
@@ -462,12 +466,30 @@ export default {
     },
     table () {
       this.select = []
+      if (!this.table) {
+        return
+      }
+      this.fetchTableColumns(this.table.id)
     }
   },
   mounted () {
     this.selectTable()
   },
   methods: {
+    fetchTableColumns (tableId) {
+      this.loadingColumns = true
+      const tableService = useTableService()
+      tableService.findOne(this.$route.params.database_id, tableId)
+        .then((table) => {
+          this.columns = table.columns
+          this.loadingColumns = false
+        })
+        .catch(({code}) => {
+          const toast = useToastInstance()
+          toast.error(this.$t(code))
+          this.loadingColumns = false
+        })
+    },
     validViewName (name) {
       if (!name) {
         return false
diff --git a/dbrepo-ui/components/table/TableImport.vue b/dbrepo-ui/components/table/TableImport.vue
index 14d4dae70a45f07fe716335edaff597ed2bbc79a..c0e4d6f9348d1cebe920fcd1e55f64e504cada16 100644
--- a/dbrepo-ui/components/table/TableImport.vue
+++ b/dbrepo-ui/components/table/TableImport.vue
@@ -98,13 +98,13 @@
           v-if="$route.query.location"
           dense>
           <v-col>
-            <p>
-              {{ $t('pages.table.subpages.import.storage.text') }}
-            </p>
             <v-chip
-              prepend-icon="mdi-cloud-upload"
+              prepend-icon="mdi-database-check-outline"
+              size="large"
+              variant="flat"
+              color="tertiary"
               label>
-              {{ $route.query.location }}
+              {{ $t('pages.table.subpages.import.storage.text') }}
             </v-chip>
           </v-col>
         </v-row>
diff --git a/dbrepo-ui/components/table/TableList.vue b/dbrepo-ui/components/table/TableList.vue
index 2fc2c7d791b5ce5f84614bc9e2266d99c4c49e9b..8bb77b2b5a8971e3a0d8dbe557e9d5d849f492c1 100644
--- a/dbrepo-ui/components/table/TableList.vue
+++ b/dbrepo-ui/components/table/TableList.vue
@@ -19,6 +19,21 @@
           :subtitle="table.description ? table.description : ''"
           :to="`/database/${$route.params.database_id}/table/${table.id}/info`">
           <template v-slot:append>
+            <v-chip
+              v-if="table && table.is_public"
+              size="small"
+              class="ml-2"
+              color="success"
+              :text="$t('toolbars.database.public')"
+              variant="outlined" />
+            <v-chip
+              v-if="table && !table.is_public"
+              size="small"
+              class="ml-2"
+              :color="colorVariant"
+              variant="outlined"
+              :text="$t('toolbars.database.private')"
+              flat />
             <v-tooltip
               v-if="hasPublishedIdentifier(table)"
               :text="$t('pages.identifier.pid.title')"
@@ -91,14 +106,18 @@ export default {
         return []
       }
       return this.database.tables
+    },
+    isContrastTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast')
+    },
+    isDarkTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark')
+    },
+    colorVariant () {
+      return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary')
     }
   },
   methods: {
-    pick (item, mode) {
-      this.column = item
-      this.mode = mode
-      this.dialogSemantic = true
-    },
     closed (data) {
       console.debug('closed dialog', data)
       this.dialogSemantic = false
diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue
index cc3a5e687d8dd9f895e91bc5acd746aeecffd130..e9cb03c6173f334866a95e18bec220c64258fbe9 100644
--- a/dbrepo-ui/components/table/TableSchema.vue
+++ b/dbrepo-ui/components/table/TableSchema.vue
@@ -228,7 +228,9 @@ export default {
   data () {
     return {
       valid: false,
+      columnTypes: [],
       loadColumn: false,
+      loadingColumnTypes: false,
       tableColumns: [],
       cacheStore: useCacheStore()
     }
@@ -237,22 +239,6 @@ export default {
     database () {
       return this.cacheStore.getDatabase
     },
-    columnTypes () {
-      if (!this.database) {
-        return []
-      }
-      const types = this.database.container.image.data_types
-      if (this.columns.filter(c => c.type === 'serial').length > 0) {
-        return types.filter(t => t.value !== 'serial')
-      }
-      return types
-    },
-    dateFormats () {
-      if (!this.database || !('container' in this.database) || !('image' in this.database.container) || !('date_formats' in this.database.container.image)) {
-        return []
-      }
-      return this.database.container.image.date_formats
-    },
     inputVariant () {
       const runtimeConfig = useRuntimeConfig()
       return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal
@@ -272,7 +258,32 @@ export default {
       }
     }
   },
+  mounted () {
+    this.fetchColumnTypes()
+  },
   methods: {
+    fetchColumnTypes () {
+      if (!this.database) {
+        return
+      }
+      this.loadingColumnTypes = true
+      const imageService = useImageService()
+      imageService.findById(this.database.container.id)
+        .then((image) => {
+          const types = image.data_types
+          if (this.columns.filter(c => c.type === 'serial').length > 0) {
+            this.columnTypes = types.filter(t => t.value !== 'serial')
+          } else {
+            this.columnTypes = types
+          }
+          this.loadingColumnTypes = false
+        })
+        .catch(({code}) => {
+          this.loadingColumnTypes = false
+          const toast = useToastInstance()
+          toast.error(this.$t(code))
+        })
+    },
     shift (column) {
       if (!this.columns || this.columns.length === 0) {
         return false
diff --git a/dbrepo-ui/components/table/TableToolbar.vue b/dbrepo-ui/components/table/TableToolbar.vue
index 1c222cc7c61bd4229c3a8b8e3dd7560a1228eea5..b7d358d2492bd01aa8eddc479405c660784f66c6 100644
--- a/dbrepo-ui/components/table/TableToolbar.vue
+++ b/dbrepo-ui/components/table/TableToolbar.vue
@@ -6,7 +6,8 @@
         size="small"
         icon="mdi-arrow-left"
         :to="`/database/${$route.params.database_id}/table`" />
-      <v-toolbar-title>
+      <v-toolbar-title
+        v-if="table">
         <v-skeleton-loader
           v-if="!table && $vuetify.display.lgAndUp"
           type="subtitle"
@@ -15,6 +16,21 @@
           v-if="table && $vuetify.display.lgAndUp">
           {{ table.name }}
         </span>
+        <v-chip
+          v-if="table && table.is_public"
+          size="small"
+          class="ml-2"
+          color="success"
+          :text="$t('toolbars.database.public')"
+          variant="outlined" />
+        <v-chip
+          v-if="table && !table.is_public"
+          size="small"
+          class="ml-2"
+          :color="colorVariant"
+          variant="outlined"
+          :text="$t('toolbars.database.private')"
+          flat />
       </v-toolbar-title>
       <v-spacer />
       <v-btn
@@ -41,6 +57,14 @@
         :text="($vuetify.display.lgAndUp ? $t('toolbars.database.create-view.xl') + ' ' : '') + $t('toolbars.database.create-view.permanent')"
         class="mr-2"
         :to="`/database/${$route.params.database_id}/view/create?tid=${$route.params.table_id}`" />
+      <v-btn
+        v-if="canUpdateTable"
+        class="mr-2"
+        variant="flat"
+        :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-table-edit' : null"
+        color="warning"
+        :text="($vuetify.display.lgAndUp ? $t('toolbars.database.update-table.xl') + ' ' : '') + $t('toolbars.database.update-table.permanent')"
+        @click="updateTableDialog = true" />
       <v-btn
         v-if="canDropTable"
         :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-delete' : null"
@@ -63,10 +87,11 @@
             :text="$t('navigation.info')"
             :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/info`" />
           <v-tab
-            v-if="canViewTableData"
+            v-if="canViewData"
             :text="$t('navigation.data')"
             :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/data`" />
           <v-tab
+            v-if="canViewSchema"
             :text="$t('navigation.schema')"
             :to="`/database/${$route.params.database_id}/table/${$route.params.table_id}/schema`" />
         </v-tabs>
@@ -75,7 +100,15 @@
     <v-dialog
       v-model="dropTableDialog"
       max-width="640">
-      <DropTable @close="closed" />
+      <DropTable
+        @close="closeDelete" />
+    </v-dialog>
+    <v-dialog
+      v-model="updateTableDialog"
+      max-width="640">
+      <UpdateTable
+        :table="table"
+        @close="closeUpdate" />
     </v-dialog>
   </div>
 </template>
@@ -83,13 +116,15 @@
 <script>
 import EditTuple from '@/components/dialogs/EditTuple.vue'
 import DropTable from '@/components/dialogs/DropTable.vue'
+import UpdateTable from '@/components/dialogs/UpdateTable.vue'
 import { useCacheStore } from '@/stores/cache'
 import { useUserStore } from '@/stores/user'
 
 export default {
   components: {
     EditTuple,
-    DropTable
+    DropTable,
+    UpdateTable
   },
   data () {
     return {
@@ -98,6 +133,7 @@ export default {
       error: false,
       edit: false,
       dropTableDialog: false,
+      updateTableDialog: false,
       cacheStore: useCacheStore(),
       userStore: useUserStore()
     }
@@ -112,12 +148,24 @@ export default {
     access () {
       return this.userStore.getAccess
     },
+    hasReadAccess () {
+      if (!this.access) {
+        return false
+      }
+      return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own'
+    },
     user () {
       return this.userStore.getUser
     },
     roles () {
       return this.userStore.getRoles
     },
+    canUpdateTable () {
+      if (!this.roles || !this.user || !this.table) {
+        return false
+      }
+      return this.roles.includes('update-table') && this.table.owner.id === this.user.id
+    },
     canExecuteQuery () {
       if (!this.roles || !this.table || !this.user) {
         return false
@@ -142,18 +190,29 @@ export default {
       const databaseService = useDatabaseService()
       return databaseService.isOwner(this.database, this.user) && this.roles.includes('create-database-view')
     },
-    canViewTableData () {
-      /* view when database is public or when private: 1) view-table-data role present 2) access is at least read */
-      if (!this.database) {
+    canViewData () {
+      if (!this.table) {
         return false
       }
-      if (this.database.is_public) {
+      if (this.table.is_public) {
         return true
       }
-      if (!this.roles || !this.table || !this.user || !this.roles.includes('view-table-data') || !this.access) {
+      if (!this.user) {
         return false
       }
-      return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all'
+      return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id
+    },
+    canViewSchema () {
+      if (!this.table) {
+        return false
+      }
+      if (this.table.is_schema_public) {
+        return true
+      }
+      if (!this.user) {
+        return false
+      }
+      return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id
     },
     canImportCsv () {
       if (!this.roles || !this.table || !this.user) {
@@ -170,16 +229,27 @@ export default {
     buttonVariant () {
       const runtimeConfig = useRuntimeConfig()
       return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
-    }
+    },
+    isContrastTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast')
+    },
+    isDarkTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark')
+    },
+    colorVariant () {
+      return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary')
+    },
   },
   methods: {
-    closed (event) {
-      const { success } = event
+    closeDelete ({success}) {
       this.dropTableDialog = false
       if (success) {
         this.cacheStore.reloadDatabase()
         this.$router.push(`/database/${this.$route.params.database_id}/table`)
       }
+    },
+    closeUpdate () {
+      this.updateTableDialog = false
     }
   }
 }
diff --git a/dbrepo-ui/components/user/UserBadge.vue b/dbrepo-ui/components/user/UserBadge.vue
index 71da03d9290ba16928411adda02f3f9eb99aec16..f7bd18c60fcd64ff65538ed075d483c7a1e61b9e 100644
--- a/dbrepo-ui/components/user/UserBadge.vue
+++ b/dbrepo-ui/components/user/UserBadge.vue
@@ -33,7 +33,6 @@ export default {
   computed: {
     hasOrcid () {
       return !(!this.user || !this.user.attributes || !this.user.attributes.orcid);
-
     },
     orcid () {
       if (!this.hasOrcid) {
@@ -46,7 +45,7 @@ export default {
       return userService.userToFullName(this.user)
     },
     isSelf () {
-      if (!this.otherUser) {
+      if (!this.otherUser || !this.user) {
         return false
       }
       return this.user.id === this.otherUser.id
diff --git a/dbrepo-ui/components/view/ViewList.vue b/dbrepo-ui/components/view/ViewList.vue
index ea2dc0946cb3088e9042045a197e7aa35bc8da76..6fe84519032aee28de5b02b62289195328cbaa1a 100644
--- a/dbrepo-ui/components/view/ViewList.vue
+++ b/dbrepo-ui/components/view/ViewList.vue
@@ -14,6 +14,21 @@
           :class="clazz(view)"
           :to="`/database/${$route.params.database_id}/view/${view.id}/info`">
           <template v-slot:append>
+            <v-chip
+              v-if="view && view.is_public"
+              size="small"
+              class="ml-2"
+              color="success"
+              :text="$t('toolbars.database.public')"
+              variant="outlined" />
+            <v-chip
+              v-if="view && !view.is_public"
+              size="small"
+              class="ml-2"
+              :color="colorVariant"
+              variant="outlined"
+              :text="$t('toolbars.database.private')"
+              flat />
             <v-tooltip
               v-if="hasPublishedIdentifier(view)"
               :text="$t('pages.identifier.pid.title')"
@@ -60,6 +75,15 @@ export default {
         return []
       }
       return this.database.views
+    },
+    isContrastTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast')
+    },
+    isDarkTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark')
+    },
+    colorVariant () {
+      return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary')
     }
   },
   methods: {
diff --git a/dbrepo-ui/components/view/ViewToolbar.vue b/dbrepo-ui/components/view/ViewToolbar.vue
index c43b730397a977559f85b55f92e62b486b15aa6f..e3ba6807bc979638a4152d1e33cc291a0478333f 100644
--- a/dbrepo-ui/components/view/ViewToolbar.vue
+++ b/dbrepo-ui/components/view/ViewToolbar.vue
@@ -6,8 +6,27 @@
       icon="mdi-arrow-left"
       :to="`/database/${$route.params.database_id}/view`" />
     <v-toolbar-title
-      v-if="view"
-      :text="title" />
+      v-if="cachedView">
+      <span
+        v-if="$vuetify.display.lgAndUp">
+        {{ title }}
+      </span>
+      <v-chip
+        v-if="cachedView.is_public"
+        size="small"
+        class="ml-2"
+        color="success"
+        :text="$t('toolbars.database.public')"
+        variant="outlined" />
+      <v-chip
+        v-if="!cachedView.is_public"
+        size="small"
+        class="ml-2"
+        :color="colorVariant"
+        variant="outlined"
+        :text="$t('toolbars.database.private')"
+        flat />
+    </v-toolbar-title>
     <v-spacer />
     <v-btn
       v-if="canDeleteView"
@@ -18,6 +37,14 @@
       color="error"
       :text="$t('navigation.delete')"
       @click="deleteView" />
+    <v-btn
+      v-if="canUpdateVisibility"
+      class="mr-2"
+      variant="flat"
+      :prepend-icon="$vuetify.display.lgAndUp ? 'mdi-eye' : null"
+      color="warning"
+      :text="$t('navigation.visibility')"
+      @click="updateViewDialog = true" />
     <v-btn
       v-if="canCreatePid"
       class="mr-2"
@@ -26,6 +53,14 @@
       color="primary"
       :text="($vuetify.display.lgAndUp ? $t('toolbars.view.pid.xl') + ' ' : '') + $t('toolbars.view.pid.permanent')"
       :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/persist`" />
+    <v-dialog
+      v-model="updateViewDialog"
+      persistent
+      max-width="640">
+      <ViewVisibility
+        :view="cachedView"
+        @close="close" />
+    </v-dialog>
     <template v-slot:extension>
       <v-tabs
         v-model="tab"
@@ -34,8 +69,13 @@
           :text="$t('navigation.info')"
           :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/info`" />
         <v-tab
+          v-if="canViewData"
           :text="$t('navigation.data')"
           :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/data`" />
+        <v-tab
+          v-if="canViewSchema"
+          :text="$t('navigation.schema')"
+          :to="`/database/${$route.params.database_id}/view/${$route.params.view_id}/schema`" />
       </v-tabs>
     </template>
   </v-toolbar>
@@ -44,15 +84,20 @@
 <script>
 import { useUserStore } from '@/stores/user'
 import { useCacheStore } from '@/stores/cache'
+import CreateOntology from "@/components/dialogs/CreateOntology.vue"
+import ViewVisibility from "@/components/dialogs/ViewVisibility.vue"
 
 export default {
   components: {
+    ViewVisibility,
+    CreateOntology
   },
   data () {
     return {
       tab: null,
       loading: false,
       loadingDelete: false,
+      updateViewDialog: false,
       userStore: useUserStore(),
       cacheStore: useCacheStore()
     }
@@ -68,20 +113,59 @@ export default {
       const runtimeConfig = useRuntimeConfig()
       return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
     },
-    view () {
+    cachedView () {
       if (!this.database) {
         return null
       }
       return this.database.views.filter(v => v.id === Number(this.$route.params.view_id))[0]
     },
+    canViewData () {
+      if (!this.cachedView) {
+        return false
+      }
+      if (this.cachedView.is_public) {
+        return true
+      }
+      if (!this.user) {
+        return false
+      }
+      return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id
+    },
+    canViewSchema () {
+      if (!this.cachedView) {
+        return false
+      }
+      if (this.cachedView.is_schema_public) {
+        return true
+      }
+      if (!this.user) {
+        return false
+      }
+      return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id
+    },
     canDeleteView () {
-      if (!this.roles || !this.user || !this.view || !this.view.creator) {
+      if (!this.roles || !this.user || !this.cachedView) {
         return false
       }
-      return this.roles.includes('delete-database-view') && this.view.creator.id === this.user.id
+      return this.roles.includes('delete-database-view') && this.cachedView.owned_by === this.user.id
+    },
+    canUpdateVisibility () {
+      if (!this.roles || !this.user || !this.cachedView) {
+        return false
+      }
+      return this.roles.includes('modify-view-visibility') && this.cachedView.owned_by === this.user.id
+    },
+    isContrastTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast')
+    },
+    isDarkTheme () {
+      return this.$vuetify.theme.global.name.toLowerCase().startsWith('dark')
+    },
+    colorVariant () {
+      return this.isContrastTheme ? '' : (this.isDarkTheme ? 'tertiary' : 'secondary')
     },
     canCreatePid () {
-      if (!this.roles || !this.user || !this.view) {
+      if (!this.roles || !this.user || !this.cachedView) {
         return false
       }
       const userService = useUserService()
@@ -90,6 +174,12 @@ export default {
     access () {
       return this.userStore.getAccess
     },
+    hasReadAccess () {
+      if (!this.access) {
+        return false
+      }
+      return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own'
+    },
     user () {
       return this.userStore.getUser
     },
@@ -97,10 +187,10 @@ export default {
       return this.userStore.getRoles
     },
     identifiers () {
-      if (!this.view) {
+      if (!this.cachedView) {
         return []
       }
-      return this.view.identifiers.filter(s => s.view_id === Number(this.$route.params.view_id))
+      return this.cachedView.identifiers.filter(s => s.view_id === Number(this.$route.params.view_id))
     },
     identifier () {
       /* mount pid */
@@ -115,10 +205,10 @@ export default {
       return this.identifiers[0]
     },
     title () {
-      if (!this.view) {
+      if (!this.cachedView) {
         return null
       }
-      return this.view.name
+      return this.cachedView.name
     }
   },
   methods: {
@@ -142,6 +232,12 @@ export default {
         .finally(() => {
           this.loadingDelete = false
         })
+    },
+    close ({success}) {
+      this.updateViewDialog = false
+      if (success) {
+        this.cacheStore.reloadDatabase()
+      }
     }
   }
 }
diff --git a/dbrepo-ui/composables/image-service.ts b/dbrepo-ui/composables/image-service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9af0304a1620bfda6aa801da61a7de9cb3cb647d
--- /dev/null
+++ b/dbrepo-ui/composables/image-service.ts
@@ -0,0 +1,21 @@
+import {axiosErrorToApiError} from '@/utils'
+
+export const useImageService = (): any => {
+  async function findById(id: number): Promise<ImageDto> {
+    const axios = useAxiosInstance();
+    console.debug('find image by id', id);
+    return new Promise<ImageDto>((resolve, reject) => {
+      axios.get<ImageDto>(`/api/image/${id}`)
+        .then((response) => {
+          console.info('Found image')
+          resolve(response.data)
+        })
+        .catch((error) => {
+          console.error('Failed to find image', error)
+          reject(axiosErrorToApiError(error))
+        })
+    })
+  }
+
+  return {findById}
+}
diff --git a/dbrepo-ui/composables/table-service.ts b/dbrepo-ui/composables/table-service.ts
index 3d87e68d4febed8b825a56b1aada946bd6b0f4d5..35c53edd03077e931b105afba02db404422b13ce 100644
--- a/dbrepo-ui/composables/table-service.ts
+++ b/dbrepo-ui/composables/table-service.ts
@@ -35,7 +35,7 @@ export const useTableService = (): any => {
     })
   }
 
-  async function update(databaseId: number, tableId: number, columnId: number, data: ColumnSemanticsUpdateDto): Promise<ColumnDto> {
+  async function updateSemantics(databaseId: number, tableId: number, columnId: number, data: ColumnSemanticsUpdateDto): Promise<ColumnDto> {
     const axios = useAxiosInstance()
     console.debug('update column with id', columnId, 'table with id', tableId, 'in database with id', databaseId);
     return new Promise<ColumnDto>((resolve, reject) => {
@@ -51,6 +51,22 @@ export const useTableService = (): any => {
     })
   }
 
+  async function update(databaseId: number, tableId: number, data: TableUpdateDto): Promise<TableDto> {
+    const axios = useAxiosInstance()
+    console.debug('update table with id', tableId, 'in database with id', databaseId);
+    return new Promise<TableDto>((resolve, reject) => {
+      axios.put<TableDto>(`/api/database/${databaseId}/table/${tableId}`, data)
+        .then((response) => {
+          console.info('Updated table with id', tableId, 'in database with id', databaseId);
+          resolve(response.data)
+        })
+        .catch((error) => {
+          console.error('Failed to update table', error)
+          reject(axiosErrorToApiError(error))
+        })
+    })
+  }
+
   async function importCsv(databaseId: number, tableId: number, data: ImportCsv): Promise<ImportDto> {
     const axios = useAxiosInstance()
     console.debug('import csv to table with id', tableId, 'in database with id', databaseId);
diff --git a/dbrepo-ui/composables/view-service.ts b/dbrepo-ui/composables/view-service.ts
index 5b3a25a149813ddf30f622fcb3d51fccb31f6730..9c9a6792d37dfb7bccd68f58f9640b1de4fddc11 100644
--- a/dbrepo-ui/composables/view-service.ts
+++ b/dbrepo-ui/composables/view-service.ts
@@ -18,6 +18,22 @@ export const useViewService = (): any => {
     })
   }
 
+  async function findOne(databaseId: number, viewId: number): Promise<ViewDto> {
+    const axios = useAxiosInstance()
+    console.debug('get view with id', viewId, 'in database with id', databaseId)
+    return new Promise<ViewDto>((resolve, reject) => {
+      axios.get<ViewDto>(`/api/database/${databaseId}/view/${viewId}`)
+        .then((response) => {
+          console.info('Deleted view with id', viewId, 'in database with id', databaseId)
+          resolve(response.data)
+        })
+        .catch((error) => {
+          console.error('Failed to delete view', error)
+          reject(axiosErrorToApiError(error))
+        })
+    })
+  }
+
   async function create(databaseId: number, payload: ViewCreateDto): Promise<ViewDto> {
     const axios = useAxiosInstance()
     console.debug('create view in database with id', databaseId)
@@ -34,11 +50,27 @@ export const useViewService = (): any => {
     })
   }
 
+  async function update(databaseId: number, viewId: number, payload: ViewUpdateDto): Promise<ViewDto> {
+    const axios = useAxiosInstance()
+    console.debug('update view with id', viewId)
+    return new Promise<ViewDto>((resolve, reject) => {
+      axios.put<ViewDto>(`/api/database/${databaseId}/view/${viewId}`, payload)
+        .then((response) => {
+          console.info('Update view with id', viewId)
+          resolve(response.data)
+        })
+        .catch((error) => {
+          console.error('Failed to update view', error)
+          reject(axiosErrorToApiError(error))
+        })
+    })
+  }
+
   async function reExecuteData(databaseId: number, viewId: number, page: number | null, size: number | null): Promise<QueryResultDto> {
     const axios = useAxiosInstance()
     console.debug('re-execute view with id', viewId, 'in database with id', databaseId)
     return new Promise<QueryResultDto>((resolve, reject) => {
-      axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, { params: {page, size} })
+      axios.get<QueryResultDto>(`/api/database/${databaseId}/view/${viewId}/data`, {params: {page, size}})
         .then((response) => {
           console.info('Re-executed view with id', viewId, 'in database with id', databaseId)
           resolve(response.data)
@@ -89,5 +121,5 @@ export const useViewService = (): any => {
     })
   }
 
-  return {remove, create, reExecuteData, reExecuteCount, exportData}
+  return {remove, findOne, create, update, reExecuteData, reExecuteCount, exportData}
 }
diff --git a/dbrepo-ui/dto/index.ts b/dbrepo-ui/dto/index.ts
index ba4c41304209a08200b99de17077eed49d63e357..b84c6c897d9b397c63eb3a4361135ea2714f7e39 100644
--- a/dbrepo-ui/dto/index.ts
+++ b/dbrepo-ui/dto/index.ts
@@ -93,10 +93,17 @@ interface TableBriefDto {
   id: number;
   name: string;
   description: string;
-  owner: UserBriefDto;
-  columns: ColumnBriefDto[];
   internal_name: string;
   is_versioned: boolean;
+  is_public: boolean;
+  is_schema_public: boolean;
+  owned_by: string;
+}
+
+interface TableUpdateDto {
+  description: string;
+  is_public: boolean;
+  is_schema_public: boolean;
 }
 
 interface ColumnBriefDto {
@@ -378,6 +385,7 @@ interface DatabaseModifyAccessDto {
 
 interface DatabaseModifyVisibilityDto {
   is_public: boolean;
+  is_schema_public: boolean;
 }
 
 interface DatabaseTransferDto {
@@ -394,6 +402,10 @@ interface ViewCreateDto {
   is_public: boolean;
 }
 
+interface ViewUpdateDto {
+  is_public: boolean;
+}
+
 interface QueryDto {
   id: number;
   creator: UserDto;
@@ -500,6 +512,20 @@ interface ImageBriefDto {
   jdbc_method: string;
 }
 
+interface ImageDto {
+  id: number;
+  registry: string;
+  name: string;
+  version: string;
+  driver_class: string;
+  dialect: string;
+  jdbc_method: string;
+  default: boolean;
+  default_port: number;
+  data_types: DataTypeDto[];
+  operators: OperatorDto[];
+}
+
 interface UserUpdateDto {
   firstname: string;
   lastname: string;
diff --git a/dbrepo-ui/locales/en-US.json b/dbrepo-ui/locales/en-US.json
index 8b6807bdbf24edd94b08087ef538d499e47784eb..185576248c411e6e0ff3cc5db2866d602f0bd96a 100644
--- a/dbrepo-ui/locales/en-US.json
+++ b/dbrepo-ui/locales/en-US.json
@@ -35,7 +35,9 @@
     "loading": "Loading",
     "view": "View",
     "modify": "Modify",
-    "help": "Help"
+    "help": "Help",
+    "visibility": "Visibility",
+    "update": "Update"
   },
   "pages": {
     "identifier": {
@@ -279,25 +281,32 @@
         "title": "ID"
       },
       "broker": {
-        "title": "Live Data"
+        "title": "Advanced Data Import Details"
       },
       "connection": {
-        "title": "Connection Details",
+        "title": "Connection(s)",
         "secure": "encrypted",
         "permissions": {
           "write": "You can write to this table",
           "read": "You can read all contents of this table"
         }
       },
+      "visibility": {
+        "title": "Visibility",
+        "open": "Open",
+        "data": "Data is public",
+        "schema": "Schema is public",
+        "closed": "Closed"
+      },
       "description": {
         "title": "Description",
         "empty": "(no description)"
       },
       "exchange": {
-        "title": "Exchange"
+        "title": "Exchange Name"
       },
       "queue": {
-        "title": "Queue"
+        "title": "Queue Name"
       },
       "routing-key": {
         "title": "Routing Key"
@@ -591,7 +600,11 @@
         "title": "Internal Name"
       },
       "visibility": {
-        "title": "Visibility"
+        "title": "Visibility",
+        "open": "Open",
+        "data": "Data is public",
+        "schema": "Schema is public",
+        "closed": "Closed"
       },
       "size": {
         "title": "Size"
@@ -640,6 +653,14 @@
             "label": "Engine",
             "hint": "Required"
           },
+          "data": {
+            "label": "Data Visibility",
+            "hint": "Required"
+          },
+          "schema": {
+            "label": "Schema Visibility",
+            "hint": "Required"
+          },
           "submit": {
             "text": "Create"
           },
@@ -696,10 +717,16 @@
           },
           "visibility": {
             "title": "Visibility",
-            "subtitle": "Private databases hide the data while metadata is still visible. Public databases are fully transparent",
-            "visibility": {
-              "label": "Database Visibility",
-              "hint": "Required"
+            "subtitle": "",
+            "data": {
+              "label": "Data Visibility",
+              "hint": "Required",
+              "help": "Public = visible to anyone, Private = visible only to designated users"
+            },
+            "schema": {
+              "label": "Schema Visibility",
+              "hint": "Required",
+              "help": "Public = visible to anyone, Private = visible only to designated users"
             },
             "submit": {
               "text": "Modify"
@@ -877,8 +904,8 @@
       "query": {
         "title": "Statement"
       },
-      "creator": {
-        "title": "Creator"
+      "owner": {
+        "title": "Owner"
       },
       "creation": {
         "title": "Creation"
@@ -900,11 +927,6 @@
           "columns": {
             "label": "Data Columns",
             "hint": "Required"
-          },
-          "visibility": {
-            "label": "Data Visibility",
-            "warn": "Only people with at least read access can view the data",
-            "hint": "Required. When private, the view metadata will still be public but the data will only be visible to people with at least read access to this database"
           }
         }
       }
@@ -1257,7 +1279,8 @@
     },
     "table": {
       "created": "Successfully created table",
-      "semantics": "Successfully assigned semantic instance"
+      "semantics": "Successfully assigned semantic instance",
+      "updated": "Successfully updated table"
     },
     "schema": {
       "tables": "Successfully refreshed database tables metadata.",
@@ -1287,7 +1310,8 @@
     },
     "view": {
       "create": "Successfully created view",
-      "delete": "Successfully deleted view"
+      "delete": "Successfully deleted view",
+      "modified": "Successfully modified view visibility"
     },
     "subset": {
       "create": "Successfully created subset"
@@ -1326,7 +1350,7 @@
       },
       "import-csv": {
         "permanent": "Import",
-        "xl": "CSV"
+        "xl": "Dataset"
       },
       "dashboard": {
         "permanent": "Visualize",
@@ -1340,6 +1364,10 @@
         "permanent": "View",
         "xl": "Create"
       },
+      "update-table": {
+        "permanent": "Table",
+        "xl": "Update"
+      },
       "create-table": {
         "permanent": "Table",
         "xl": "Create"
diff --git a/dbrepo-ui/pages/database/[database_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/info.vue
index d012f7ef3418b0235d04f46cf49ec138ed9634a2..5b739987fdcaa422d31e0fc2545bcdeacbdf38ad 100644
--- a/dbrepo-ui/pages/database/[database_id]/info.vue
+++ b/dbrepo-ui/pages/database/[database_id]/info.vue
@@ -60,9 +60,7 @@
               <v-list-item
                 :title="$t('pages.database.visibility.title')"
                 density="compact">
-                <div>
-                  {{ database.is_public ? 'Public' : 'Private' }}
-                </div>
+                {{ databaseVisibility }}
               </v-list-item>
               <v-list-item
                 :title="$t('pages.database.size.title')"
@@ -80,13 +78,6 @@
                     :other-user="user" />
                 </div>
               </v-list-item>
-              <v-list-item
-                :title="$t('pages.database.created.title')"
-                density="compact">
-                <div>
-                  {{ createdUTC }}
-                </div>
-              </v-list-item>
               <v-list-item
                 v-if="access && access.type"
                 :title="$t('pages.database.subpages.access.title')"
@@ -290,12 +281,6 @@ export default {
     pid () {
       return this.$route.query.pid
     },
-    createdUTC () {
-      if (!this.database) {
-        return
-      }
-      return formatTimestampUTCLabel(this.database.created)
-    },
     internal_name () {
       if (!this.database) {
         return
@@ -370,6 +355,18 @@ export default {
       this.database.tables.forEach((t) => { sum += t.data_length })
       return sizeToHumanLabel(sum)
     },
+    databaseVisibility () {
+      if (!this.database) {
+        return null
+      }
+      if (this.database.is_public && this.database.is_schema_public) {
+        return this.$t('pages.database.visibility.open')
+      }
+      if (!this.database.is_public && !this.database.is_schema_public) {
+        return this.$t('pages.database.visibility.closed')
+      }
+      return this.database.is_public ? this.$t('pages.database.visibility.data') : this.$t('pages.database.visibility.schema')
+    },
     previewImage () {
       if (!this.database) {
         return null
diff --git a/dbrepo-ui/pages/database/[database_id]/settings.vue b/dbrepo-ui/pages/database/[database_id]/settings.vue
index 65dd3b03bfc3ec57447ebbea6dcd24635f303693..b3d5b634613c358b01bc13d53f270fe7ef7e4d2a 100644
--- a/dbrepo-ui/pages/database/[database_id]/settings.vue
+++ b/dbrepo-ui/pages/database/[database_id]/settings.vue
@@ -138,10 +138,50 @@
                   v-model="modifyVisibility.is_public"
                   :items="visibility"
                   :variant="inputVariant"
-                  :label="$t('pages.database.subpages.settings.visibility.visibility.label')"
-                  :hint="$t('pages.database.subpages.settings.visibility.visibility.hint')"
+                  :label="$t('pages.database.subpages.settings.visibility.data.label')"
+                  :hint="$t('pages.database.subpages.settings.visibility.data.hint')"
                   persistent-hint
-                  name="visibility" />
+                  name="visibility">
+                  <template
+                    v-slot:append>
+                    <v-tooltip
+                      location="bottom">
+                      <template
+                        v-slot:activator="{ props }">
+                        <v-icon
+                          v-bind="props"
+                          icon="mdi-help-circle-outline" />
+                      </template>
+                      {{ $t('pages.database.subpages.settings.visibility.data.help') }}
+                    </v-tooltip>
+                  </template>
+                </v-select>
+              </v-col>
+            </v-row>
+            <v-row>
+              <v-col md="8">
+                <v-select
+                  v-model="modifyVisibility.is_schema_public"
+                  :items="visibility"
+                  :variant="inputVariant"
+                  :label="$t('pages.database.subpages.settings.visibility.schema.label')"
+                  :hint="$t('pages.database.subpages.settings.visibility.schema.hint')"
+                  persistent-hint
+                  name="schema-visibility">
+                  <template
+                    v-slot:append>
+                    <v-tooltip
+                      location="bottom">
+                      <template
+                        v-slot:activator="{ props }">
+                        <v-icon
+                          v-bind="props"
+                          icon="mdi-help-circle-outline" />
+                      </template>
+                      {{ $t('pages.database.subpages.settings.visibility.schema.help') }}
+                    </v-tooltip>
+                  </template>
+                </v-select>
               </v-col>
             </v-row>
             <v-row>
@@ -253,7 +293,8 @@ export default {
       editAccessDialog: false,
       editVisibilityDialog: false,
       modifyVisibility: {
-        is_public: null
+        is_public: null,
+        is_schema_public: null
       },
       modifyOwner: {
         id: null
@@ -349,7 +390,7 @@ export default {
       if (!this.modifyVisibility || !this.database) {
         return false
       }
-      return this.modifyVisibility.is_public === this.database.is_public
+      return this.modifyVisibility.is_public === this.database.is_public && this.modifyVisibility.is_schema_public === this.database.is_schema_public
     },
     canModifyVisibility () {
       if (!this.isOwner) {
@@ -434,6 +475,7 @@ export default {
       return
     }
     this.modifyVisibility.is_public = this.database.is_public
+    this.modifyVisibility.is_schema_public = this.database.is_schema_public
     this.modifyOwner.id = this.database.owner.id
   },
   methods: {
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue
index 1be05e4bf1e08a26d44ff833588b1a3cca9e85ac..08049eabe672ab1f9f4601a61ad9db7268ddc67e 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/data.vue
@@ -1,8 +1,8 @@
 <template>
-  <div>
+  <div
+    v-if="canViewTableData">
     <TableToolbar />
     <v-toolbar
-      v-if="canViewTableData"
       :color="versionColor"
       :title="title"
       flat>
@@ -142,6 +142,7 @@ export default {
       loadingData: false,
       loadingCount: false,
       loadingDelete: false,
+      loadingTable: false,
       addTupleDialog: false,
       editTupleDialog: false,
       total: 0,
@@ -153,6 +154,7 @@ export default {
       dateMenu: false,
       timeMenu: false,
       selection: [],
+      columns: [],
       pickVersionDialog: null,
       version: null,
       lastReload: new Date(),
@@ -212,14 +214,20 @@ export default {
     access () {
       return this.userStore.getAccess
     },
+    hasReadAccess () {
+      if (!this.access) {
+        return false
+      }
+      return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own'
+    },
     title () {
       return (this.version ? this.$t('toolbars.database.history') : this.$t('toolbars.database.current')) + ' ' + this.versionFormatted
     },
     blobColumns () {
-      if (!this.table || !this.table.columns) {
+      if (!this.columns) {
         return []
       }
-      return this.table.columns.filter(c => this.isFileField(c)).map(c => 'item.' + c.internal_name)
+      return this.columns.filter(c => this.isFileField(c)).map(c => 'item.' + c.internal_name)
     },
     versionColor () {
       return this.version ? 'primary' : 'secondary'
@@ -247,16 +255,16 @@ export default {
     },
     canViewTableData () {
       /* view when database is public or when private: 1) view-table-data role present 2) access is at least read */
-      if (!this.database) {
+      if (!this.table) {
         return false
       }
-      if (this.database.is_public) {
+      if (this.table.is_public) {
         return true
       }
-      if (!this.roles || !this.roles.includes('view-table-data') || !this.access) {
+      if (!this.roles || !this.roles.includes('view-table-data')) {
         return false
       }
-      return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all'
+      return this.hasReadAccess
     },
     canAddTuple () {
       if (!this.roles) {
@@ -284,21 +292,15 @@ export default {
     version () {
       this.loadCount()
       this.reload()
-    },
-    table (newTable, oldTable) {
-      if (newTable !== oldTable && oldTable === null) {
-        this.loadProperties()
-      }
     }
   },
   mounted () {
-    this.loadProperties()
     this.loadCount()
   },
   methods: {
     addTuple () {
       this.tuple = {}
-      this.table.columns.forEach((c) => {
+      this.columns.forEach((c) => {
         this.tuple[c.internal_name] = null
       })
       this.addTupleDialog = true
@@ -313,14 +315,14 @@ export default {
       for (const select of this.selection) {
         /* remove in container */
         const constraints = {}
-        this.table.columns
+        this.columns
           .filter(c => c.is_primary_key)
           .forEach((c) => {
             constraints[c.internal_name] = select[c.internal_name]
           })
         if (Object.keys(constraints).length === 0) {
           console.warn(`Table with id ${this.$route.params.table_id} does not have primary key(s): attempt to delete by values`)
-          this.table.columns
+          this.columns
             .forEach((c) => {
               constraints[c.internal_name] = select[c.internal_name]
             })
@@ -402,27 +404,6 @@ export default {
       }
       this.pickVersionDialog = false
     },
-    loadProperties () {
-      if (!this.table || this.headers.length > 0) {
-        return
-      }
-      try {
-        this.headers = []
-        this.table.columns.map((c) => {
-          return {
-            value: c.internal_name,
-            title: c.internal_name,
-            sortable: false
-          }
-        }).forEach(header => this.headers.push(header))
-        this.dateColumns = this.table.columns.filter(c => (c.column_type === 'date' || c.column_type === 'timestamp'))
-        console.debug('date columns are', this.dateColumns)
-      } catch ({code}) {
-        const toast = useToastInstance()
-        toast.error(this.$t(code))
-      }
-      this.loading = false
-    },
     reload () {
       this.lastReload = new Date()
       this.loadData({ page: this.options.page, itemsPerPage: this.options.itemsPerPage, sortBy: null})
@@ -450,7 +431,6 @@ export default {
         .then((data) => {
           this.rows = data.result.map((row) => {
             for (const col in row) {
-              const column = this.table.columns.filter(c => c.internal_name === col)[0]
               const columnDefinition = this.dateColumns.filter(c => c.internal_name === col)
               if (columnDefinition.length > 0) {
                 if (columnDefinition[0].column_type === 'date') {
@@ -462,6 +442,13 @@ export default {
             }
             return row
           })
+          this.headers = data.headers.map(h => {
+            return {
+              value: Object.keys(h)[0],
+              title: Object.keys(h)[0],
+              sortable: false
+            }
+          })
           this.loadingData = false
         })
         .catch(({code, message}) => {
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 e109a7db3e2bb35926c5a8f87d700185286d4d53..5baedc281c94951ae7072f287657c9ec4c5c3425 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
@@ -22,42 +22,45 @@
       :title="$t('pages.table.title')">
       <v-card-text>
         <v-skeleton-loader
-          v-if="!table"
+          v-if="!cachedTable"
           type="list-item-three-line"
           width="50%" />
         <v-list
-          v-if="table"
+          v-if="cachedTable"
           dense>
           <v-list-item
             :title="$t('pages.table.id.title')">
-            {{ table.id }}
+            {{ cachedTable.id }}
           </v-list-item>
           <v-list-item
             :title="$t('pages.table.name.title')">
-            {{ table.internal_name }}
+            {{ cachedTable.internal_name }}
           </v-list-item>
           <v-list-item
+            :title="$t('pages.table.visibility.title')">
+            {{ databaseVisibility }}
+          </v-list-item>
+          <v-list-item
+            v-if="table"
             :title="$t('pages.table.size.title')">
             {{ sizeToHumanLabel(table.data_length) }}
           </v-list-item>
           <v-list-item
+            v-if="table"
             :title="$t('pages.table.result-rows.title')">
             {{ table.num_rows }}
           </v-list-item>
           <v-list-item
             :title="$t('pages.table.description.title')">
-            {{ hasDescription ? table.description : $t('pages.table.description.empty') }}
+            {{ hasDescription ? cachedTable.description : $t('pages.table.description.empty') }}
           </v-list-item>
           <v-list-item
             :title="$t('pages.table.owner.title')">
             <UserBadge
-              :user="table.creator"
+              v-if="table"
+              :user="table.owner"
               :other-user="user" />
           </v-list-item>
-          <v-list-item
-            :title="$t('pages.table.creation.title')">
-            {{ createdUTC }}
-          </v-list-item>
           <v-list-item
             v-if="accessDescription"
             :title="$t('pages.database.subpages.access.title')">
@@ -73,13 +76,31 @@
               </v-badge>
               <span
                 v-else>
-                {{ accessDescription}}
+                {{ accessDescription }}
               </span>
             </span>
           </v-list-item>
         </v-list>
       </v-card-text>
     </v-card>
+    <v-divider />
+    <v-card
+      :title="$t('pages.database.title')"
+      variant="flat">
+      <v-card-text>
+        <v-list dense>
+          <v-list-item
+            v-if="database"
+            :title="$t('pages.database.name.title')">
+            <NuxtLink
+              class="text-primary"
+              :to="`/database/${$route.params.database_id}`">
+              {{ database.internal_name }}
+            </NuxtLink>
+          </v-list-item>
+        </v-list>
+      </v-card-text>
+    </v-card>
     <v-divider
       v-if="canWrite && canWriteQueues" />
     <v-card
@@ -125,29 +146,6 @@
         </v-list>
       </v-card-text>
     </v-card>
-    <v-divider />
-    <v-card
-      :title="$t('pages.database.title')"
-      variant="flat">
-      <v-card-text>
-        <v-list dense>
-          <v-list-item
-            v-if="database"
-            :title="$t('pages.database.visibility.title')">
-            {{ database.is_public ? $t('toolbars.database.public') : $t('toolbars.database.private') }}
-          </v-list-item>
-          <v-list-item
-            v-if="database"
-            :title="$t('pages.database.name.title')">
-            <NuxtLink
-              class="text-primary"
-              :to="`/database/${database.id}`">
-              {{ database.internal_name }}
-            </NuxtLink>
-          </v-list-item>
-        </v-list>
-      </v-card-text>
-    </v-card>
     <v-breadcrumbs :items="items" class="pa-0 mt-2" />
   </div>
 </template>
@@ -182,6 +180,7 @@ export default {
     return {
       selection: [],
       consumers: [],
+      table: null,
       items: [
         {
           title: this.$t('navigation.databases'),
@@ -207,9 +206,7 @@ export default {
       ],
       headers: [],
       dateColumns: [],
-      loadingConsumers: false,
-      loadingExchange: false,
-      loadingQueue: false,
+      loading: false,
       exchange: null,
       queue: null,
       userStore: useUserStore(),
@@ -226,7 +223,7 @@ export default {
     database () {
       return this.cacheStore.getDatabase
     },
-    table () {
+    cachedTable () {
       return this.cacheStore.getTable
     },
     roles () {
@@ -245,19 +242,13 @@ export default {
       if (!this.table || !this.user || !this.access) {
         return false
       }
-      return (this.access.type === 'write_own' && this.table.owner.id === this.user.id) || this.access.type === 'write_all'
-    },
-    createdUTC () {
-      if (this.table.created === undefined || this.table.created === null) {
-        return null
-      }
-      return formatTimestampUTCLabel(this.table.created)
+      return (this.access.type === 'write_own' && this.cachedTable.owned_by === this.user.id) || this.access.type === 'write_all'
     },
     access () {
       return this.userStore.getAccess
     },
     hasDescription () {
-      return this.table && this.table.description
+      return this.table && this.cachedTable.description
     },
     canWriteQueues () {
       if (!this.roles) {
@@ -278,7 +269,7 @@ export default {
       if (!this.user) {
         return this.identifiers.filter(i => i.status === 'published')
       }
-      return this.identifiers.filter(i => i.status === 'published' || i.creator.id === this.user.id)
+      return this.identifiers.filter(i => i.status === 'published' || i.owned_by === this.user.id)
     },
     identifier () {
       if (this.pid) {
@@ -321,6 +312,40 @@ export default {
       } else if (this.canRead) {
         return this.$t('pages.table.connection.permissions.read')
       }
+    },
+    databaseVisibility () {
+      if (!this.database) {
+        return null
+      }
+      if (this.database.is_public && this.cachedTable.is_schema_public) {
+        return this.$t('pages.table.visibility.open')
+      }
+      if (!this.database.is_public && !this.cachedTable.is_schema_public) {
+        return this.$t('pages.table.visibility.closed')
+      }
+      return this.database.is_public ? this.$t('pages.database.visibility.data') : this.$t('pages.database.visibility.schema')
+    }
+  },
+  mounted () {
+    this.fetchTable()
+  },
+  methods: {
+    fetchTable () {
+      this.loading = true
+      const tableService = useTableService()
+      tableService.findOne(this.$route.params.database_id, this.$route.params.table_id)
+        .then((table) => {
+          this.loading = false
+          this.table = table
+        })
+        .catch(({code}) => {
+          this.loading = false
+          const toast = useToastInstance()
+          toast.error(this.$t(code))
+        })
+        .finally(() => {
+          this.loading = false
+        })
     }
   }
 }
diff --git a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue
index 65b6034348399844ddc8f195da9f9cc828056efa..5364b6c8997e4e336852f02747f2b7bfc6b08ee7 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/[table_id]/schema.vue
@@ -1,5 +1,6 @@
 <template>
-  <div>
+  <div
+    v-if="canViewSchema">
     <TableToolbar
       :selection="selection" />
     <v-toolbar
@@ -184,9 +185,27 @@ export default {
     access () {
       return this.userStore.getAccess
     },
+    hasReadAccess () {
+      if (!this.access) {
+        return false
+      }
+      return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own'
+    },
     roles () {
       return this.userStore.getRoles
     },
+    canViewSchema () {
+      if (!this.table) {
+        return false
+      }
+      if (this.table.is_schema_public) {
+        return true
+      }
+      if (!this.user) {
+        return false
+      }
+      return this.hasReadAccess || this.table.owned_by === this.user.id || this.database.owner.id === this.user.id
+    },
     primaryKeysColumns () {
       return this.table.constraints.primary_key.map(pk => pk.column.internal_name).join(', ')
     },
diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue
index d77ea941349d44e419c055466055fe7c16a704ad..29773c24d98801f1c710a87e2cf513a842f562eb 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue
@@ -47,7 +47,8 @@
               :disabled="step > 4"
               @submit.prevent="submit">
               <v-container>
-                <v-row dense>
+                <v-row
+                  dense>
                   <v-col md="4">
                     <v-text-field
                       v-model="tableCreate.name"
@@ -80,7 +81,8 @@
                       :label="$t('pages.table.subpages.import.generated.label')"/>
                   </v-col>
                 </v-row>
-                <v-row dense>
+                <v-row
+                  dense>
                   <v-col md="8">
                     <v-textarea
                       v-model="tableCreate.description"
@@ -97,6 +99,41 @@
                       :label="$t('pages.table.subpages.import.description.label')"/>
                   </v-col>
                 </v-row>
+                <v-row
+                  dense>
+                  <v-col
+                    md="4">
+                    <v-select
+                      v-model="tableCreate.is_public"
+                      name="public"
+                      :label="$t('pages.database.subpages.create.data.label')"
+                      :hint="$t('pages.database.subpages.create.data.hint')"
+                      persistent-hint
+                      :variant="inputVariant"
+                      :items="visibilityOptions"
+                      item-title="name"
+                      item-value="value"
+                      :rules="[v => v !== null || $t('validation.required')]"
+                      required>
+                    </v-select>
+                  </v-col>
+                  <v-col
+                    md="4">
+                    <v-select
+                      v-model="tableCreate.is_schema_public"
+                      name="schema-public"
+                      :label="$t('pages.database.subpages.create.schema.label')"
+                      :hint="$t('pages.database.subpages.create.schema.hint')"
+                      persistent-hint
+                      :variant="inputVariant"
+                      :items="visibilityOptions"
+                      item-title="name"
+                      item-value="value"
+                      :rules="[v => v !== null || $t('validation.required')]"
+                      required>
+                    </v-select>
+                  </v-col>
+                </v-row>
               </v-container>
             </v-form>
           </v-stepper-window>
@@ -198,6 +235,16 @@ export default {
       loadingImport: false,
       fileModel: null,
       rowCount: null,
+      visibilityOptions: [
+        {
+          name: this.$t('toolbars.database.public'),
+          value: true
+        },
+        {
+          name: this.$t('toolbars.database.private'),
+          value: false
+        }
+      ],
       file: {
         filename: null,
         path: null
@@ -237,6 +284,8 @@ export default {
       tables: [],
       tableCreate: {
         name: null,
+        is_public: true,
+        is_schema_public: true,
         description: '',
         columns: []
       },
@@ -254,6 +303,13 @@ export default {
       cacheStore: useCacheStore()
     }
   },
+  mounted () {
+    if (!this.database) {
+      return
+    }
+    this.tableCreate.is_public = this.database.is_public
+    this.tableCreate.is_schema_public = this.database.is_schema_public
+  },
   computed: {
     user() {
       return this.userStore.getUser
diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue
index 57f943f22b36ee21f858f15120d5ca812b8b8bfc..458294d1c710c35b6ed2e6e8638ce8710996d890 100644
--- a/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue
+++ b/dbrepo-ui/pages/database/[database_id]/table/create/schema.vue
@@ -273,10 +273,7 @@ export default {
         .catch(({code, message}) => {
           this.loading = false
           const toast = useToastInstance()
-          if (typeof code !== 'string') {
-            return
-          }
-          toast.error(message)
+          toast.error(this.$t(`${code}: ${message}`))
         })
         .finally(() => {
           this.loading = false
diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue
index bc460da08bc4fe45d180fb81367e88f6eebf6b1f..11e91baabccca6b90241b56c75e396c380acba38 100644
--- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue
+++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/data.vue
@@ -1,7 +1,8 @@
 <template>
-  <div>
+  <div
+    v-if="canViewData">
     <ViewToolbar
-      v-if="view" />
+      v-if="cachedView" />
     <v-toolbar
       color="secondary"
       :title="$t('toolbars.database.current')"
@@ -69,14 +70,18 @@ export default {
           disabled: true
         }
       ],
-      cacheStore: useCacheStore()
+      cacheStore: useCacheStore(),
+      userStore: useUserStore()
     }
   },
   computed: {
+    user () {
+      return this.userStore.getUser
+    },
     database () {
       return this.cacheStore.getDatabase
     },
-    view () {
+    cachedView () {
       if (!this.database) {
         return null
       }
@@ -85,20 +90,41 @@ export default {
     access () {
       return this.userStore.getAccess
     },
+    hasReadAccess () {
+      if (!this.access) {
+        return false
+      }
+      return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own'
+    },
     canDownload () {
       if (!this.view) {
         return false
       }
-      if (this.view.is_public) {
+      if (this.cachedView.is_public) {
         return true
       }
       if (!this.access) {
         return false
       }
       return this.access.type === 'read' || this.access.type === 'write_own' || this.access.type === 'write_all'
-    }
+    },
+    canViewData () {
+      if (!this.cachedView) {
+        return false
+      }
+      if (this.cachedView.is_public) {
+        return true
+      }
+      if (!this.user) {
+        return false
+      }
+      return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id
+    },
   },
   mounted () {
+    if (!this.canViewData) {
+      return
+    }
     this.reload()
   },
   methods: {
diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue
index 064fa5f3f20f0c9e1be84fc010e215745834d278..364516f45f29209c56748add8bff0da310de7d75 100644
--- a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue
+++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/info.vue
@@ -4,7 +4,7 @@
     <v-window
       v-model="tab">
       <v-window-item
-        v-if="view">
+        v-if="cachedView">
         <v-card variant="flat">
           <Summary
             v-if="hasIdentifier"
@@ -23,30 +23,35 @@
           variant="flat">
           <v-card-text>
             <v-list
-              v-if="view"
+              v-if="cachedView"
               dense>
               <v-list-item
                 :title="$t('pages.view.name.title')">
-                {{ view.internal_name }}
+                {{ cachedView.internal_name }}
               </v-list-item>
               <v-list-item
                 :title="$t('pages.view.query.title')">
-                <pre>{{ view.query }}</pre>
+                <pre>{{ cachedView.query }}</pre>
               </v-list-item>
               <v-list-item
-                :title="$t('pages.view.creator.title')">
+                :title="$t('pages.view.owner.title')">
                 <UserBadge
-                  :user="view.creator"
+                  v-if="view"
+                  :user="view.owner"
                   :other-user="user" />
+                <v-skeleton-loader
+                  v-else
+                  type="subtitle"
+                  width="200" />
               </v-list-item>
               <v-list-item
-                v-if="view.created"
+                v-if="cachedView.created"
                 :title="$t('pages.view.creation.title')">
-                {{ formatUTC(view.created) }}
+                {{ formatUTC(cachedView.created) }}
               </v-list-item>
               <v-list-item
                 :title="$t('pages.view.visibility.title')">
-                {{ view.is_public ? $t('toolbars.database.public') : $t('toolbars.database.private') }}
+                {{ viewVisibility }}
               </v-list-item>
             </v-list>
           </v-card-text>
@@ -107,6 +112,8 @@ export default {
   data () {
     return {
       tab: 0,
+      loadingView: false,
+      view: null,
       items: [
         {
           title: this.$t('navigation.databases'),
@@ -145,7 +152,7 @@ export default {
     database () {
       return this.cacheStore.getDatabase
     },
-    view () {
+    cachedView () {
       if (!this.database) {
         return null
       }
@@ -196,11 +203,43 @@ export default {
       }
       const userService = useUserService()
       return userService.userToFullName(this.view.creator)
+    },
+    viewVisibility () {
+      if (!this.cachedView) {
+        return null
+      }
+      if (this.cachedView.is_public && this.cachedView.is_schema_public) {
+        return this.$t('pages.database.visibility.open')
+      }
+      if (!this.cachedView.is_public && !this.cachedView.is_schema_public) {
+        return this.$t('pages.database.visibility.closed')
+      }
+      return this.cachedView.is_public ? this.$t('pages.database.visibility.data') : this.$t('pages.database.visibility.schema')
     }
   },
+  mounted () {
+    this.fetchView()
+  },
   methods: {
     formatUTC (timestamp) {
       return formatTimestampUTCLabel(timestamp)
+    },
+    fetchView () {
+      this.loadingView = true
+      const viewService = useViewService()
+      viewService.findOne(this.$route.params.database_id, this.$route.params.view_id)
+        .then((view) => {
+          this.view = view
+          this.loadingView = false
+        })
+        .catch(({code}) => {
+          this.loadingView = false
+          const toast = useToastInstance()
+          toast.error(this.$t(code))
+        })
+        .finally(() => {
+          this.loadingView = false
+        })
     }
   }
 }
@@ -222,16 +261,4 @@ pre {
 #back-btn::before {
   opacity: 0;
 }
-.skeleton-large > div {
-  width: 400px !important;
-}
-.skeleton-medium > div {
-  width: 200px !important;
-}
-.skeleton-small > div {
-  width: 100px !important;
-}
-.skeleton-xsmall > div {
-  width: 50px !important;
-}
 </style>
diff --git a/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b3352010b26653c7b3cb766734b6eb0a2e64dc44
--- /dev/null
+++ b/dbrepo-ui/pages/database/[database_id]/view/[view_id]/schema.vue
@@ -0,0 +1,202 @@
+<template>
+  <div
+    v-if="canViewSchema">
+    <ViewToolbar />
+    <v-toolbar
+      color="secondary"
+      :title="$t('pages.table.subpages.schema.title')"
+      variant="flat" />
+    <v-card
+      variant="flat"
+      rounded="0"
+      tile>
+      <v-data-table
+        v-if="view"
+        class="full-width"
+        disable-sort
+        :loading="loading"
+        hide-default-footer
+        :items-per-page="-1"
+        :headers="headers"
+        :items="view.columns">
+        <template v-slot:item.is_null_allowed="{ item }">
+          <span
+            v-if="item.is_null_allowed">
+            {{ $t('pages.table.subpages.schema.bullet') }}
+          </span>
+          {{ item.is_null_allowed }}
+        </template>
+        <template v-slot:item.extra="{ item }">
+          <pre>{{ extra(item) }}</pre>
+        </template>
+        <template v-slot:item.column_concept="{ item }">
+          <a
+            v-if="hasConcept(item)"
+            :href="item.concept.uri">
+            {{ item.concept.name ? item.concept.name : item.concept.uri }}
+          </a>
+        </template>
+        <template v-slot:item.column_unit="{ item }">
+          <a
+            v-if="hasUnit(item)"
+            :href="item.unit.uri">
+            {{ item.unit.name ? item.unit.name : item.unit.uri }}
+          </a>
+        </template>
+      </v-data-table>
+    </v-card>
+    <v-breadcrumbs
+      :items="items"
+      class="pa-0 mt-2" />
+  </div>
+</template>
+
+<script>
+import TableToolbar from '@/components/table/TableToolbar.vue'
+import { useUserStore } from '@/stores/user'
+import { useCacheStore } from '@/stores/cache'
+
+export default {
+  components: {
+    TableToolbar
+  },
+  data () {
+    return {
+      loading: false,
+      view: null,
+      items: [
+        {
+          title: this.$t('navigation.databases'),
+          to: '/database'
+        },
+        {
+          title: `${this.$route.params.database_id}`,
+          to: `/database/${this.$route.params.database_id}/info`
+        },
+        {
+          title: this.$t('navigation.views'),
+          to: `/database/${this.$route.params.database_id}/view`
+        },
+        {
+          title: `${this.$route.params.view_id}`,
+          to: `/database/${this.$route.params.database_id}/view/${this.$route.params.view_id}`
+        },
+        {
+          title: this.$t('navigation.schema'),
+          to: `/database/${this.$route.params.database_id}/view/${this.$route.params.view_id}/schema`,
+          disabled: true
+        }
+      ],
+      headers: [
+        { value: 'internal_name', title: this.$t('pages.table.subpages.schema.internal-name.title') },
+        { value: 'column_type', title: this.$t('pages.table.subpages.schema.column-type.title') },
+        { value: 'extra', title: this.$t('pages.table.subpages.schema.extra.title') },
+        { value: 'column_concept', title: this.$t('pages.table.subpages.schema.concept.title') },
+        { value: 'column_unit', title: this.$t('pages.table.subpages.schema.unit.title') },
+        { value: 'is_null_allowed', title: this.$t('pages.table.subpages.schema.nullable.title') },
+        { value: 'description', title: this.$t('pages.table.subpages.schema.description.title') },
+      ],
+      userStore: useUserStore(),
+      cacheStore: useCacheStore()
+    }
+  },
+  mounted () {
+    this.fetchView()
+  },
+  computed: {
+    user () {
+      return this.userStore.getUser
+    },
+    database () {
+      return this.cacheStore.getDatabase
+    },
+    access () {
+      return this.userStore.getAccess
+    },
+    hasReadAccess () {
+      if (!this.access) {
+        return false
+      }
+      return this.access.type === 'read' || this.access.type === 'write_all' || this.access.type === 'write_own'
+    },
+    cachedView () {
+      if (!this.database) {
+        return null
+      }
+      return this.database.views.filter(v => v.id === Number(this.$route.params.view_id))[0]
+    },
+    canViewSchema () {
+      if (!this.cachedView) {
+        return false
+      }
+      if (this.cachedView.is_schema_public) {
+        return true
+      }
+      if (!this.user) {
+        return false
+      }
+      return this.hasReadAccess || this.cachedView.owned_by === this.user.id || this.database.owner.id === this.user.id
+    },
+    roles () {
+      return this.userStore.getRoles
+    },
+    inputVariant () {
+      const runtimeConfig = useRuntimeConfig()
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.input.contrast : runtimeConfig.public.variant.input.normal
+    },
+    buttonVariant () {
+      const runtimeConfig = useRuntimeConfig()
+      return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal
+    }
+  },
+  methods: {
+    extra (column) {
+      if (column.column_type === 'float') {
+        return `precision=${column.size}`
+      } else if (['decimal', 'double'].includes(column.column_type)) {
+        let extra = ''
+        if (column.size !== null) {
+          extra += `size=${column.size}`
+        }
+        if (column.d !== null) {
+          if (extra.length > 0) {
+            extra += ', '
+          }
+          extra += `d=${column.d}`
+        }
+        return extra
+      } else if (column.column_type === 'enum') {
+        return `(${column.enums.join(', ')})`
+      } else if (column.column_type === 'set') {
+        return `(${column.sets.join(', ')})`
+      } else if (['int', 'char', 'varchar', 'binary', 'varbinary', 'tinyint', 'size="small"int', 'mediumint', 'bigint'].includes(column.column_type)) {
+        return column.size !== null ? `size=${column.size}` : ''
+      }
+      return null
+    },
+    hasUnit (item) {
+      return item.unit && 'uri' in item.unit
+    },
+    hasConcept (item) {
+      return item.concept && 'uri' in item.concept
+    },
+    fetchView () {
+      this.loading = true
+      const viewService = useViewService()
+      viewService.findOne(this.$route.params.database_id, this.$route.params.view_id)
+        .then((view) => {
+          this.view = view
+          this.loading = false
+        })
+        .catch(({code}) => {
+          this.loading = false
+          const toast = useToastInstance()
+          toast.error(this.$t(code))
+        })
+        .finally(() => {
+          this.loading = false
+        })
+    }
+  }
+}
+</script>
diff --git a/dbrepo-ui/pages/signup.vue b/dbrepo-ui/pages/signup.vue
index 54c00602256c7815d8aff0b255214e66836bc727..2548a6dfa9b749853ca24b6784235fc14fcb1b78 100644
--- a/dbrepo-ui/pages/signup.vue
+++ b/dbrepo-ui/pages/signup.vue
@@ -130,9 +130,6 @@ export default {
         .catch(({code}) => {
           this.loading = false
           const toast = useToastInstance()
-          if (typeof code !== 'string') {
-            return
-          }
           toast.error(this.$t(code))
         })
         .finally(() => {
diff --git a/docker-compose.yml b/docker-compose.yml
index 30f42b197e1d5d29ce4af625b1ce381532ef7b9e..6e2957b195f292ab2c2ad68f523c7ab19041ade0 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -109,6 +109,26 @@ services:
     logging:
       driver: json-file
 
+  dbrepo-auth-service-init:
+    init: true
+    restart: "no"
+    image: dbrepo-auth-service-init:latest
+    build:
+      context: ./dbrepo-auth-service/init
+      network: host
+    environment:
+      AUTH_SERVICE_ADMIN: ${AUTH_SERVICE_ADMIN:-admin}
+      AUTH_SERVICE_ADMIN_PASSWORD: ${AUTH_SERVICE_ADMIN_PASSWORD:-admin}
+      AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080}
+      SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}"
+    depends_on:
+      dbrepo-auth-service:
+        condition: service_healthy
+      dbrepo-metadata-db:
+        condition: service_healthy
+    logging:
+      driver: json-file
+
   dbrepo-metadata-service:
     restart: "no"
     container_name: dbrepo-metadata-service
diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml
index abb0c1821abb5ac68d0a92bc6eb7913cf0b5a409..19585b20f9d8e41ccd9b2e9a08b41c699fe40663 100644
--- a/helm/dbrepo/Chart.yaml
+++ b/helm/dbrepo/Chart.yaml
@@ -7,8 +7,8 @@ description: Helm Chart for installing DBRepo
 sources:
   - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services
 type: application
-version: "1.5.2"
-appVersion: "1.5.2"
+version: "1.6.0"
+appVersion: "1.6.0"
 keywords:
   - dbrepo
 maintainers:
diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md
index 759e67bf4362bb0b53b49d3d24e24db396e37ad9..f8c6b12d75a6390324de7bd994e69a6b890825e7 100644
--- a/helm/dbrepo/README.md
+++ b/helm/dbrepo/README.md
@@ -11,7 +11,7 @@ sample [
 for your deployment and update the variables, especially `hostname`.
 
 ```bash
-helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.5.2"
+helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.6.0"
 ```
 
 ## Prerequisites
@@ -28,7 +28,7 @@ helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo"
 To install the chart with the release name `my-release`:
 
 ```bash
-helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.5.2"
+helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.6.0"
 ```
 
 The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the
diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml
index 1a122d2fe3c43f8455ca95565de0ef51946fc0fe..b4f253a1821ffd9bba732890e33930ad40e8bf26 100644
--- a/helm/dbrepo/values.yaml
+++ b/helm/dbrepo/values.yaml
@@ -369,7 +369,7 @@ analyseservice:
   enabled: true
   image:
     ## @skip analyseservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.5.2
+    name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.6.0
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context
@@ -430,7 +430,7 @@ metadataservice:
   enabled: true
   image:
     ## @skip metadataservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.5.2
+    name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.6.0
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context
@@ -527,7 +527,7 @@ dataservice:
   endpoint: http://data-service
   image:
     ## @skip dataservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.5.2
+    name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.6.0
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context
@@ -613,7 +613,7 @@ searchservice:
   endpoint: http://search-service
   image:
     ## @skip searchservice.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.5.2
+    name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.6.0
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context
@@ -660,7 +660,7 @@ searchservice:
   init:
     image:
       ## @skip searchservice.init.image.name
-      name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.5.2
+      name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.6.0
     ## @param searchservice.init.resourcesPreset The container resource preset
     resourcesPreset: "nano"
     ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
@@ -721,7 +721,7 @@ storageservice:
   init:
     image:
       ## @skip storageservice.init.image.name
-      name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.5.2
+      name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.6.0
     ## @param storageservice.init.resourcesPreset The container resource preset
     resourcesPreset: "nano"
     ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads)
@@ -827,7 +827,7 @@ ui:
   enabled: true
   image:
     ## @skip ui.image.name
-    name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.5.2
+    name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.6.0
   ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod
   podSecurityContext:
     ## @param ui.podSecurityContext.enabled Enable pods' Security Context
diff --git a/install.sh b/install.sh
index 12a20e9868dce4d841b4110d29ab84253e2321c1..1e7520e29bf7ed3ef1a5310a8c7027a47b1ec249 100644
--- a/install.sh
+++ b/install.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # preset
-VERSION="1.5.2"
+VERSION="1.6.0"
 MIN_CPU=8
 MIN_RAM=4
 MIN_MAP_COUNT=262144
diff --git a/lib/python/dbrepo/RestClient.py b/lib/python/dbrepo/RestClient.py
index b80daff7d0a7a1d2d92fcdd60e90fe3fa9b5d2da..6cc706d46cbe44d9b3835c8158bef9f2a29944cc 100644
--- a/lib/python/dbrepo/RestClient.py
+++ b/lib/python/dbrepo/RestClient.py
@@ -28,7 +28,7 @@ class RestClient:
     :param username: The REST API username. Optional.
     :param password: The REST API password. Optional.
     :param secure: When set to false, the requests library will not verify the authenticity of your TLS/SSL
-        certificates (i.e. when using self-signed certificates). Default: true.
+        certificates (i.e. when using self-signed certificates). Default: `True`.
     """
     endpoint: str = None
     username: str = None
@@ -79,22 +79,6 @@ class RestClient:
         return requests.request(method=method, url=url, auth=auth, verify=self.secure,
                                 json=payload, headers=headers, params=params, stream=stream)
 
-    def upload(self, file_path: str) -> str:
-        """
-        Uploads a file located at file_path to the Upload Service.
-
-        :param file_path: The location of the file on the local filesystem.
-
-        :returns: Filename on the S3 backend of the Upload Service, if successful.
-        """
-        my_client = TusClient(url=f'{self.endpoint}/api/upload/files/')
-        uploader = my_client.uploader(file_path=file_path)
-        uploader.upload()
-        filename = uploader.url[uploader.url.rfind('/') + 1:uploader.url.rfind('+')]
-        if filename is None or len(filename) == 0:
-            raise UploadError(f'Failed to upload the file to {self.endpoint}')
-        return filename
-
     def get_jwt_auth(self, username: str = None, password: str = None) -> JwtAuth:
         """
         Obtains a JWT auth object from the auth service containing e.g. the access token and refresh token.
@@ -147,7 +131,7 @@ class RestClient:
         :raises ResponseCodeError: If something went wrong with the authentication.
         """
         url = f'{self.endpoint}/api/user/token'
-        response = self._wrapper(method="put", url=url, payload={"refresh_token": refresh_token})
+        response = requests.put(url=url, json=dict({"refresh_token": refresh_token}))
         if response.status_code == 202:
             body = response.json()
             return JwtAuth.model_validate(body)
@@ -431,14 +415,15 @@ class RestClient:
         raise ResponseCodeError(f'Failed to find database: response code: {response.status_code} is not '
                                 f'200 (OK): {response.text}')
 
-    def create_database(self, name: str, container_id: int, is_public: bool) -> Database:
+    def create_database(self, name: str, container_id: int, is_public: bool = True,
+                        is_schema_public: bool = True) -> Database:
         """
         Create a databases in a container with given container id.
 
         :param name: The name of the database.
         :param container_id: The container id.
-        :param is_public: The visibility of the database. If set to true everything will be visible, otherwise only
-                the metadata (schema, identifiers) will be visible to the public.
+        :param is_public: The visibility of the data. If set to true the data will be publicly visible. Optional. Default: `True`.
+        :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible. Optional. Default: `True`.
 
         :returns: The database, if successful.
 
@@ -452,7 +437,8 @@ class RestClient:
         """
         url = f'/api/database'
         response = self._wrapper(method="post", url=url, force_auth=True,
-                                 payload=CreateDatabase(name=name, container_id=container_id, is_public=is_public))
+                                 payload=CreateDatabase(name=name, container_id=container_id, is_public=is_public,
+                                                        is_schema_public=is_schema_public))
         if response.status_code == 201:
             body = response.json()
             return Database.model_validate(body)
@@ -487,7 +473,7 @@ class RestClient:
         :param privileged_username: The container privileged user username.
         :param privileged_password: The container privileged user password.
         :param port: The container port bound to the host. Optional.
-        :param ui_host: The container hostname displayed in the user interface. Optional. Default: value of `host`
+        :param ui_host: The container hostname displayed in the user interface. Optional. Default: value of `host`.
         :param ui_port: The container port displayed in the user interface. Optional. Default: `default_port` of image.
 
         :returns: The container, if successful.
@@ -519,13 +505,13 @@ class RestClient:
         raise ResponseCodeError(f'Failed to create container: response code: {response.status_code} is not '
                                 f'201 (CREATED): {response.text}')
 
-    def update_database_visibility(self, database_id: int, is_public: bool) -> Database:
+    def update_database_visibility(self, database_id: int, is_public: bool, is_schema_public: bool) -> Database:
         """
         Updates the database visibility of a database with given database id.
 
         :param database_id: The database id.
-        :param is_public: The visibility of the database. If set to true everything will be visible, otherwise only
-                the metadata (schema, identifiers) will be visible to the public.
+        :param is_public: The visibility of the data. If set to true the data will be publicly visible.
+        :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible.
 
         :returns: The database, if successful.
 
@@ -537,7 +523,8 @@ class RestClient:
         :raises ResponseCodeError: If something went wrong with the update.
         """
         url = f'/api/database/{database_id}'
-        response = self._wrapper(method="put", url=url, force_auth=True, payload=ModifyVisibility(is_public=is_public))
+        response = self._wrapper(method="put", url=url, force_auth=True,
+                                 payload=ModifyVisibility(is_public=is_public, is_schema_public=is_schema_public))
         if response.status_code == 202:
             body = response.json()
             return Database.model_validate(body)
@@ -629,13 +616,16 @@ class RestClient:
         raise ResponseCodeError(
             f'Failed to update database schema: response code: {response.status_code} is not 200 (OK)')
 
-    def create_table(self, database_id: int, name: str, columns: List[CreateTableColumn],
-                     constraints: CreateTableConstraints, description: str = None) -> Table:
+    def create_table(self, database_id: int, name: str, is_public: bool, is_schema_public: bool,
+                     columns: List[CreateTableColumn], constraints: CreateTableConstraints,
+                     description: str = None) -> Table:
         """
         Updates the database owner of a database with given database id.
 
         :param database_id: The database id.
         :param name: The name of the created table.
+        :param is_public: The visibility of the data. If set to true the data will be publicly visible.
+        :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible.
         :param constraints: The constraints of the created table.
         :param columns: The columns of the created table.
         :param description: The description of the created table. Optional.
@@ -652,8 +642,8 @@ class RestClient:
         """
         url = f'/api/database/{database_id}/table'
         response = self._wrapper(method="post", url=url, force_auth=True,
-                                 payload=CreateTable(name=name, description=description,
-                                                     columns=columns, constraints=constraints))
+                                 payload=CreateTable(name=name, is_public=is_public, is_schema_public=is_schema_public,
+                                                     description=description, columns=columns, constraints=constraints))
         if response.status_code == 201:
             body = response.json()
             return Table.model_validate(body)
@@ -882,15 +872,41 @@ class RestClient:
         raise ResponseCodeError(f'Failed to find view: response code: {response.status_code} is not '
                                 f'200 (OK): {response.text}')
 
-    def create_view(self, database_id: int, name: str, query: str, is_public: bool) -> View:
+    def update_view(self, database_id: int, view_id: int, is_public: bool) -> View:
+        """
+        Get a view of a database with given database id and view id.
+
+        :param database_id: The database id.
+        :param view_id: The view id.
+        :param is_public: If set to `True`, the view is publicly visible.
+
+        :returns: The view, if successful.
+
+        :raises ForbiddenError: If something went wrong with the authorization.
+        :raises NotExistsError: If the container does not exist.
+        :raises ResponseCodeError: If something went wrong with the retrieval.
+        """
+        url = f'/api/database/{database_id}/view/{view_id}'
+        response = self._wrapper(method="put", url=url, payload=UpdateView(is_public=is_public))
+        if response.status_code == 202:
+            body = response.json()
+            return View.model_validate(body)
+        if response.status_code == 403:
+            raise ForbiddenError(f'Failed to update view: not allowed')
+        if response.status_code == 404:
+            raise NotExistsError(f'Failed to update view: not found')
+        raise ResponseCodeError(f'Failed to update view: response code: {response.status_code} is not '
+                                f'202 (ACCEPTED): {response.text}')
+
+    def create_view(self, database_id: int, name: str, query: str, is_public: bool, is_schema_public: bool) -> View:
         """
         Create a view in a database with given database id.
 
         :param database_id: The database id.
         :param name: The name of the created view.
         :param query: The query of the created view.
-        :param is_public: The visibility of the view. If set to true everything will be visible, otherwise only
-                the metadata (schema, identifiers) will be visible to the public.
+        :param is_public: The visibility of the data. If set to true the data will be publicly visible. Optional. Default: `True`.
+        :param is_schema_public: The visibility of the schema metadata. If set to true the schema metadata will be publicly visible. Optional. Default: `True`.
 
         :returns: The created view, if successful.
 
@@ -904,7 +920,8 @@ class RestClient:
         """
         url = f'/api/database/{database_id}/view'
         response = self._wrapper(method="post", url=url, force_auth=True,
-                                 payload=CreateView(name=name, query=query, is_public=is_public))
+                                 payload=CreateView(name=name, query=query, is_public=is_public,
+                                                    is_schema_public=is_schema_public))
         if response.status_code == 201:
             body = response.json()
             return View.model_validate(body)
@@ -1197,7 +1214,7 @@ class RestClient:
         :param file_path: The path of the file that is imported on the storage service.
         :param separator: The csv column separator.
         :param upload: If set to true, the file from file_path will be uploaded, otherwise no upload will be performed \
-            and the file_path will be treated as S3 filename and analysed instead. Optional. Default: true.
+            and the file_path will be treated as S3 filename and analysed instead. Optional. Default: `True`.
 
         :returns: The determined ranking of the primary key candidates, if successful.
 
@@ -1326,8 +1343,8 @@ class RestClient:
 
         :param database_id: The database id.
         :param table_id: The table id.
-        :param page: The result pagination number. Optional. Default: 0.
-        :param size: The result pagination size. Optional. Default: 10.
+        :param page: The result pagination number. Optional. Default: `0`.
+        :param size: The result pagination size. Optional. Default: `10`.
         :param timestamp: The query execution time. Optional.
 
         :returns: The result of the view query, if successful.
@@ -1559,10 +1576,10 @@ class RestClient:
 
         :param database_id: The database id.
         :param query: The query statement.
-        :param page: The result pagination number. Optional. Default: 0.
-        :param size: The result pagination size. Optional. Default: 10.
+        :param page: The result pagination number. Optional. Default: `0`.
+        :param size: The result pagination size. Optional. Default: `10`.
         :param timestamp: The timestamp at which the data validity is set. Optional. Default: <current timestamp>.
-        :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: False.
+        :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: `False`.
 
         :returns: The result set, if successful.
 
@@ -1612,10 +1629,10 @@ class RestClient:
 
         :param database_id: The database id.
         :param subset_id: The subset id.
-        :param page: The result pagination number. Optional. Default: 0.
-        :param size: The result pagination size. Optional. Default: 10.
-        :param size: The result pagination size. Optional. Default: 10.
-        :param df: If true, the result is returned as Pandas DataFrame. Optional. Default: False.
+        :param page: The result pagination number. Optional. Default: `0`.
+        :param size: The result pagination size. Optional. Default: `10`.
+        :param size: The result pagination size. Optional. Default: `10`.
+        :param df: If true, the result is returned as Pandas DataFrame. Optional.Optional. Default: `False`.
 
         :returns: The result set, if successful.
 
@@ -1653,8 +1670,8 @@ class RestClient:
 
         :param database_id: The database id.
         :param subset_id: The subset id.
-        :param page: The result pagination number. Optional. Default: 0.
-        :param size: The result pagination size. Optional. Default: 10.
+        :param page: The result pagination number. Optional. Default: `0`.
+        :param size: The result pagination size. Optional. Default: `10`.
 
         :returns: The result set, if successful.
 
diff --git a/lib/python/dbrepo/api/dto.py b/lib/python/dbrepo/api/dto.py
index 4de986e87080d207dbd68f8293f31be4004753d6..79c4279ed0124c251b6ce0442799100c5d5401a9 100644
--- a/lib/python/dbrepo/api/dto.py
+++ b/lib/python/dbrepo/api/dto.py
@@ -4,7 +4,7 @@ from dataclasses import field
 from enum import Enum
 import datetime
 from typing import List, Optional, Any, Annotated
-from pydantic import BaseModel, ConfigDict, PlainSerializer, Field
+from pydantic import BaseModel, PlainSerializer, Field
 
 Timestamp = Annotated[
     datetime.datetime, PlainSerializer(lambda v: v.strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z', return_type=str)
@@ -17,7 +17,7 @@ class JwtAuth(BaseModel):
     id_token: str
     expires_in: int
     refresh_expires_in: int
-    not_before_policy: int = Field(alias='not-before-policy')
+    not_before_policy: int
     scope: str
     session_state: str
     token_type: str
@@ -46,6 +46,11 @@ class CreateDatabase(BaseModel):
     name: str
     container_id: int
     is_public: bool
+    is_schema_public: bool
+
+
+class UpdateView(BaseModel):
+    is_public: bool
 
 
 class CreateContainer(BaseModel):
@@ -91,7 +96,6 @@ class Container(BaseModel):
     host: str
     port: int
     image: Image
-    created: Timestamp
     ui_host: Optional[str] = None
     ui_port: Optional[int] = None
 
@@ -100,7 +104,6 @@ class ContainerBrief(BaseModel):
     id: int
     name: str
     image: ImageBrief
-    created: Timestamp
     internal_name: str
     running: Optional[bool] = None
     hash: Optional[str] = None
@@ -123,7 +126,9 @@ class TableBrief(BaseModel):
     description: Optional[str]
     internal_name: str
     is_versioned: bool
-    owner: UserBrief
+    is_public: bool
+    is_schema_public: bool
+    owned_by: str
 
 
 class UserAttributes(BaseModel):
@@ -392,8 +397,7 @@ class Language(str, Enum):
 
 class DatabaseAccess(BaseModel):
     type: AccessType
-    user: User
-    created: Timestamp
+    user: UserBrief
 
 
 class CreateAccess(BaseModel):
@@ -486,6 +490,7 @@ class UpdateColumn(BaseModel):
 
 class ModifyVisibility(BaseModel):
     is_public: bool
+    is_schema_public: bool
 
 
 class ModifyOwner(BaseModel):
@@ -494,6 +499,8 @@ class ModifyOwner(BaseModel):
 
 class CreateTable(BaseModel):
     name: str
+    is_public: bool
+    is_schema_public: bool
     constraints: CreateTableConstraints
     columns: List[CreateTableColumn] = field(default_factory=list)
     description: Optional[str] = None
@@ -590,10 +597,8 @@ class Identifier(BaseModel):
     id: int
     database_id: int
     type: IdentifierType
-    creator: UserBrief
+    owner: UserBrief
     status: IdentifierStatusType
-    created: Timestamp
-    last_modified: Timestamp
     publication_year: int
     publisher: str
     creators: List[IdentifierCreator]
@@ -622,12 +627,10 @@ class View(BaseModel):
     name: str
     query: str
     query_hash: str
-    created: Timestamp
-    creator: User
+    owner: UserBrief
     internal_name: str
     is_public: bool
     initial_view: bool
-    last_modified: Timestamp
     columns: List[ViewColumn]
     identifiers: List[Identifier] = field(default_factory=list)
 
@@ -636,6 +639,7 @@ class CreateView(BaseModel):
     name: str
     query: str
     is_public: bool
+    is_schema_public: bool
 
 
 class Result(BaseModel):
@@ -648,21 +652,18 @@ class ViewBrief(BaseModel):
     id: int
     database_id: int
     name: str
-    identifier: List[Identifier]
-    query: str
-    query_hash: str
-    created: Timestamp
-    creator: User
     internal_name: str
     is_public: bool
+    is_schema_public: bool
     initial_view: bool
-    last_modified: Timestamp
+    query: str
+    query_hash: str
+    owned_by: str
 
 
 class Concept(BaseModel):
     id: int
     uri: str
-    created: Timestamp
     name: Optional[str] = None
     description: Optional[str] = None
 
@@ -698,7 +699,6 @@ class TableStatistics(BaseModel):
 class Unit(BaseModel):
     id: int
     uri: str
-    created: Timestamp
     name: Optional[str] = None
     description: Optional[str] = None
 
@@ -851,17 +851,15 @@ class IdentifierType(str, Enum):
 
 class Query(BaseModel):
     id: int
-    creator: User
+    owner: UserBrief
     execution: Timestamp
     query: str
     type: QueryType
-    created: Timestamp
     database_id: int
     query_hash: str
     is_persisted: bool
     result_hash: str
     query_normalized: str
-    last_modified: Timestamp
     result_number: Optional[int] = None
     identifiers: List[Identifier] = field(default_factory=list)
 
@@ -874,8 +872,8 @@ class DataType(BaseModel):
     display_name: str
     value: str
     documentation: str
-    is_quoted:  bool
-    is_buildable:  bool
+    is_quoted: bool
+    is_buildable: bool
     size_min: Optional[int] = None
     size_max: Optional[int] = None
     size_default: Optional[int] = None
@@ -884,8 +882,8 @@ class DataType(BaseModel):
     d_max: Optional[int] = None
     d_default: Optional[int] = None
     d_required: Optional[bool] = None
-    data_hint:  Optional[str] = None
-    type_hint:  Optional[str] = None
+    data_hint: Optional[str] = None
+    type_hint: Optional[str] = None
 
 
 class Column(BaseModel):
@@ -940,17 +938,15 @@ class Table(BaseModel):
     id: int
     database_id: int
     name: str
-    creator: User
-    owner: User
-    created: Timestamp
+    owner: UserBrief
     columns: List[Column]
     constraints: Constraints
     internal_name: str
     is_versioned: bool
-    created_by: str
     queue_name: str
     routing_key: str
     is_public: bool
+    is_schema_public: bool
     identifiers: Optional[List[Identifier]] = field(default_factory=list)
     description: Optional[str] = None
     queue_type: Optional[str] = None
@@ -974,10 +970,8 @@ class ColumnMinimal(BaseModel):
 class Database(BaseModel):
     id: int
     name: str
-    creator: User
-    owner: User
-    contact: User
-    created: Timestamp
+    owner: UserBrief
+    contact: UserBrief
     exchange_name: str
     internal_name: str
     is_public: bool
@@ -1001,7 +995,6 @@ class DatabaseBrief(BaseModel):
     identifiers: Optional[List[Identifier]] = field(default_factory=list)
     contact: UserBrief
     owner: UserBrief
-    created: Timestamp
 
 
 class Unique(BaseModel):
diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml
index e032c5edfe1310d307060efe6d178b4d4b29561c..d6c33c6d01e4a937d0f1fe36af12300ad7d441bc 100644
--- a/lib/python/pyproject.toml
+++ b/lib/python/pyproject.toml
@@ -1,6 +1,6 @@
 [project]
 name = "dbrepo"
-version = "1.5.2"
+version = "1.6.0"
 description = "DBRepo Python Library"
 keywords = [
     "DBRepo",
diff --git a/lib/python/setup.py b/lib/python/setup.py
index 50be6c428aa5d487060590272518f7a9f30177a8..fadd15e30eab6719c88027e3d107f137d5c32bd9 100644
--- a/lib/python/setup.py
+++ b/lib/python/setup.py
@@ -2,7 +2,7 @@
 from distutils.core import setup
 
 setup(name="dbrepo",
-      version="1.5.2",
+      version="1.6.0",
       description="A library for communicating with DBRepo",
       url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/",
       author="Martin Weise",
diff --git a/lib/python/tests/test_unit_container.py b/lib/python/tests/test_unit_container.py
index 0e1d93faa0e9b1c598afcede5ad71c7e08ef9767..b7a35e6a4a714f38d3cb06841541b182a0c769e2 100644
--- a/lib/python/tests/test_unit_container.py
+++ b/lib/python/tests/test_unit_container.py
@@ -25,7 +25,6 @@ class ContainerUnitTest(unittest.TestCase):
                                name="MariaDB 10.11.3",
                                internal_name="mariadb_10_11_3",
                                running=True,
-                               created=datetime.datetime(2024, 3, 26, 10, 11, 0, 0, datetime.timezone.utc),
                                image=ImageBrief(id=1,
                                                 name="mariadb",
                                                 version="10.11.3",
@@ -58,7 +57,6 @@ class ContainerUnitTest(unittest.TestCase):
                             port=12345,
                             sidecar_host="data-db-sidecar",
                             sidecar_port=3305,
-                            created=datetime.datetime(2024, 3, 26, 10, 11, 0, 0, datetime.timezone.utc),
                             image=Image(id=1,
                                         registry="docker.io",
                                         name="mariadb",
diff --git a/lib/python/tests/test_unit_database.py b/lib/python/tests/test_unit_database.py
index f72c80c93c0497eb0d2d6f68e2ab8029cccb2aec..c1f3014436320547849fa227c674926266a7d7fd 100644
--- a/lib/python/tests/test_unit_database.py
+++ b/lib/python/tests/test_unit_database.py
@@ -1,13 +1,11 @@
 import unittest
 
 import requests_mock
-import datetime
 
 from pydantic_core import ValidationError
 
 from dbrepo.RestClient import RestClient
-from dbrepo.api.dto import Database, User, Container, Image, UserAttributes, DatabaseAccess, AccessType, DatabaseBrief, \
-    UserBrief, DataType
+from dbrepo.api.dto import Database, Container, Image, DatabaseAccess, AccessType, DatabaseBrief, UserBrief, DataType
 from dbrepo.api.exceptions import ResponseCodeError, NotExistsError, ForbiddenError, MalformedError, AuthenticationError
 
 
@@ -28,7 +26,6 @@ class DatabaseUnitTest(unittest.TestCase):
                 name='test',
                 owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                 contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
-                created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                 internal_name='test_abcd',
                 is_public=True)
         ]
@@ -43,13 +40,8 @@ class DatabaseUnitTest(unittest.TestCase):
         exp = Database(
             id=1,
             name='test',
-            creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                       attributes=UserAttributes(theme='light')),
-            contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
+            owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
+            contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
             exchange_name='dbrepo',
             internal_name='test_abcd',
             is_public=True,
@@ -61,7 +53,6 @@ class DatabaseUnitTest(unittest.TestCase):
                 port=3306,
                 sidecar_host='data-db-sidecar',
                 sidecar_port=3305,
-                created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                 image=Image(
                     id=1,
                     registry='docker.io',
@@ -115,13 +106,8 @@ class DatabaseUnitTest(unittest.TestCase):
         exp = Database(
             id=1,
             name='test',
-            creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                       attributes=UserAttributes(theme='light')),
-            contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
+            owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
+            contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
             exchange_name='dbrepo',
             internal_name='test_abcd',
             is_public=True,
@@ -133,7 +119,6 @@ class DatabaseUnitTest(unittest.TestCase):
                 port=3306,
                 sidecar_host='data-db-sidecar',
                 sidecar_port=3305,
-                created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                 image=Image(
                     id=1,
                     registry='docker.io',
@@ -190,13 +175,8 @@ class DatabaseUnitTest(unittest.TestCase):
         exp = Database(
             id=1,
             name='test',
-            creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                       attributes=UserAttributes(theme='light')),
-            contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
+            owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
+            contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
             exchange_name='dbrepo',
             internal_name='test_abcd',
             is_public=True,
@@ -208,7 +188,6 @@ class DatabaseUnitTest(unittest.TestCase):
                 port=3306,
                 sidecar_host='data-db-sidecar',
                 sidecar_port=3305,
-                created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                 image=Image(
                     id=1,
                     registry='docker.io',
@@ -226,7 +205,7 @@ class DatabaseUnitTest(unittest.TestCase):
             mock.put('/api/database/1', json=exp.model_dump(), status_code=202)
             # test
             client = RestClient(username="a", password="b")
-            response = client.update_database_visibility(database_id=1, is_public=True)
+            response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True)
             self.assertEqual(response.is_public, True)
 
     def test_update_database_visibility_not_allowed_fails(self):
@@ -236,7 +215,7 @@ class DatabaseUnitTest(unittest.TestCase):
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.update_database_visibility(database_id=1, is_public=True)
+                response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True)
             except ForbiddenError:
                 pass
 
@@ -247,7 +226,7 @@ class DatabaseUnitTest(unittest.TestCase):
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.update_database_visibility(database_id=1, is_public=True)
+                response = client.update_database_visibility(database_id=1, is_public=True, is_schema_public=True)
             except NotExistsError:
                 pass
 
@@ -257,7 +236,7 @@ class DatabaseUnitTest(unittest.TestCase):
             mock.put('/api/database/1', status_code=404)
             # test
             try:
-                response = RestClient().update_database_visibility(database_id=1, is_public=True)
+                response = RestClient().update_database_visibility(database_id=1, is_public=True, is_schema_public=True)
             except AuthenticationError:
                 pass
 
@@ -265,13 +244,8 @@ class DatabaseUnitTest(unittest.TestCase):
         exp = Database(
             id=1,
             name='test',
-            creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            owner=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other',
-                       attributes=UserAttributes(theme='light')),
-            contact=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                         attributes=UserAttributes(theme='light')),
-            created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
+            owner=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other'),
+            contact=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
             exchange_name='dbrepo',
             internal_name='test_abcd',
             is_public=True,
@@ -283,7 +257,6 @@ class DatabaseUnitTest(unittest.TestCase):
                 port=3306,
                 sidecar_host='data-db-sidecar',
                 sidecar_port=3305,
-                created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                 image=Image(
                     id=1,
                     registry='docker.io',
@@ -341,9 +314,7 @@ class DatabaseUnitTest(unittest.TestCase):
 
     def test_get_database_access_succeeds(self):
         exp = DatabaseAccess(type=AccessType.READ,
-                             created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                             user=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other',
-                                       attributes=UserAttributes(theme='light')))
+                             user=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other'))
         with requests_mock.Mocker() as mock:
             # mock
             mock.get('/api/database/1/access', json=exp.model_dump())
@@ -373,9 +344,7 @@ class DatabaseUnitTest(unittest.TestCase):
 
     def test_create_database_access_succeeds(self):
         exp = DatabaseAccess(type=AccessType.READ,
-                             created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                             user=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other',
-                                       attributes=UserAttributes(theme='light')))
+                             user=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other'))
         with requests_mock.Mocker() as mock:
             # mock
             mock.post('/api/database/1/access/abdbf897-e599-4e5a-a3f0-7529884ea011', json=exp.model_dump(),
@@ -435,9 +404,7 @@ class DatabaseUnitTest(unittest.TestCase):
 
     def test_update_database_access_succeeds(self):
         exp = DatabaseAccess(type=AccessType.READ,
-                             created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                             user=User(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other',
-                                       attributes=UserAttributes(theme='light')))
+                             user=UserBrief(id='abdbf897-e599-4e5a-a3f0-7529884ea011', username='other'))
         with requests_mock.Mocker() as mock:
             # mock
             mock.put('/api/database/1/access/abdbf897-e599-4e5a-a3f0-7529884ea011', json=exp.model_dump(),
diff --git a/lib/python/tests/test_unit_identifier.py b/lib/python/tests/test_unit_identifier.py
index 2832f0e799afa66558f7aaf83f38252b81f484e3..45b0a919e74d79d2420669a7036fcc87ae02b92a 100644
--- a/lib/python/tests/test_unit_identifier.py
+++ b/lib/python/tests/test_unit_identifier.py
@@ -21,8 +21,6 @@ class IdentifierUnitTest(unittest.TestCase):
                              view_id=32,
                              publication_year=2024,
                              publisher='TU Wien',
-                             created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                             last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                              type=IdentifierType.VIEW,
                              language=Language.EN,
                              descriptions=[IdentifierDescription(id=2, description='Test Description')],
@@ -33,7 +31,7 @@ class IdentifierUnitTest(unittest.TestCase):
                                                    type=RelatedIdentifierType.DOI)],
                              creators=[IdentifierCreator(id=5, creator_name='Carberry, Josiah')],
                              status=IdentifierStatusType.PUBLISHED,
-                             creator=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))
+                             owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))
             # mock
             mock.post('/api/identifier', json=exp.model_dump(), status_code=201)
             # test
@@ -121,8 +119,6 @@ class IdentifierUnitTest(unittest.TestCase):
                               view_id=32,
                               publication_year=2024,
                               publisher='TU Wien',
-                              created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                              last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                               type=IdentifierType.VIEW,
                               language=Language.EN,
                               descriptions=[IdentifierDescription(id=2, description='Test Description')],
@@ -133,7 +129,7 @@ class IdentifierUnitTest(unittest.TestCase):
                                                                      type=RelatedIdentifierType.DOI)],
                               creators=[IdentifierCreator(id=5, creator_name='Carberry, Josiah')],
                               status=IdentifierStatusType.PUBLISHED,
-                              creator=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))]
+                              owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'))]
             # mock
             mock.get('/api/identifiers', json=[exp[0].model_dump()], headers={"Accept": "application/json"})
             # test
diff --git a/lib/python/tests/test_unit_jwt.py b/lib/python/tests/test_unit_jwt.py
new file mode 100644
index 0000000000000000000000000000000000000000..4a0748fe38d4799ff9e1bf3eda8d41ba6f48e39f
--- /dev/null
+++ b/lib/python/tests/test_unit_jwt.py
@@ -0,0 +1,65 @@
+import json
+from unittest import TestCase, main
+
+import requests_mock
+
+from dbrepo.RestClient import RestClient
+from dbrepo.api.dto import JwtAuth
+
+
+class DatabaseUnitTest(TestCase):
+
+    def test_get_jwt_auth_succeeds(self):
+        exp = JwtAuth(access_token='eyABC',
+                      refresh_token='ey123',
+                      id_token='eyXYZ',
+                      expires_in=3600,
+                      refresh_expires_in=36000,
+                      not_before_policy=0,
+                      scope='openid',
+                      session_state='4604e4b1-2163-42c3-806d-3be2e426c3a5',
+                      token_type='Bearer')
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post('/api/user/token', json=exp.model_dump(), status_code=202)
+            # test
+            response = RestClient().get_jwt_auth(username='foo', password='bar')
+            self.assertEqual(exp, response)
+
+    def test_get_jwt_auth_empty_succeeds(self):
+        exp = JwtAuth(access_token='eyABC',
+                      refresh_token='ey123',
+                      id_token='eyXYZ',
+                      expires_in=3600,
+                      refresh_expires_in=36000,
+                      not_before_policy=0,
+                      scope='openid',
+                      session_state='4604e4b1-2163-42c3-806d-3be2e426c3a5',
+                      token_type='Bearer')
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.post('/api/user/token', json=exp.model_dump(), status_code=202)
+            # test
+            response = RestClient().get_jwt_auth()
+            self.assertEqual(exp, response)
+
+    def test_refresh_jwt_auth_succeeds(self):
+        exp = JwtAuth(access_token='eyABC',
+                      refresh_token='ey123',
+                      id_token='eyXYZ',
+                      expires_in=3600,
+                      refresh_expires_in=36000,
+                      not_before_policy=0,
+                      scope='openid',
+                      session_state='4604e4b1-2163-42c3-806d-3be2e426c3a5',
+                      token_type='Bearer')
+        with requests_mock.Mocker() as mock:
+            # mock
+            mock.put('/api/user/token', json=exp.model_dump(), status_code=202)
+            # test
+            response = RestClient().refresh_jwt_auth(refresh_token='ey123')
+            self.assertEqual(exp, response)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/lib/python/tests/test_unit_query.py b/lib/python/tests/test_unit_query.py
index e1b326fa576b86519e6c059abd73f66dacbda2e5..bc1f7e481457629779f341de44b4673a007c7346 100644
--- a/lib/python/tests/test_unit_query.py
+++ b/lib/python/tests/test_unit_query.py
@@ -6,7 +6,7 @@ import datetime
 from dbrepo.RestClient import RestClient
 from pandas import DataFrame
 
-from dbrepo.api.dto import Result, Query, User, UserAttributes, QueryType
+from dbrepo.api.dto import Result, Query, User, UserAttributes, QueryType, UserBrief
 from dbrepo.api.exceptions import MalformedError, NotExistsError, ForbiddenError, QueryStoreError, \
     MetadataConsistencyError, AuthenticationError
 
@@ -79,11 +79,8 @@ class QueryUnitTest(unittest.TestCase):
     def test_find_query_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = Query(id=6,
-                        creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                     attributes=UserAttributes(theme='light')),
+                        owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                         execution=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                        created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                        last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                         query='SELECT id, username FROM some_table WHERE id IN (1,2)',
                         query_normalized='SELECT id, username FROM some_table WHERE id IN (1,2)',
                         type=QueryType.QUERY,
@@ -131,11 +128,8 @@ class QueryUnitTest(unittest.TestCase):
     def test_get_queries_succeeds(self):
         with requests_mock.Mocker() as mock:
             exp = [Query(id=6,
-                         creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                      attributes=UserAttributes(theme='light')),
+                         owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                          execution=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                         created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                         last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                          query='SELECT id, username FROM some_table WHERE id IN (1,2)',
                          query_normalized='SELECT id, username FROM some_table WHERE id IN (1,2)',
                          type=QueryType.QUERY,
diff --git a/lib/python/tests/test_unit_table.py b/lib/python/tests/test_unit_table.py
index 0be3a4a9fbaa47c129e7a937230d348e37a8eb17..f149b607818458ac82f15e9eeb8ea9ff1541c62b 100644
--- a/lib/python/tests/test_unit_table.py
+++ b/lib/python/tests/test_unit_table.py
@@ -1,5 +1,4 @@
 import unittest
-from json import dumps
 
 import requests_mock
 import datetime
@@ -7,9 +6,9 @@ import datetime
 from dbrepo.RestClient import RestClient
 from pandas import DataFrame
 
-from dbrepo.api.dto import Table, CreateTableConstraints, UserAttributes, User, Column, Constraints, ColumnType, Result, \
-    Concept, Unit, TableStatistics, ColumnStatistic, PrimaryKey, TableMinimal, ColumnMinimal, TableBrief, UserBrief
-from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, NameExistsError, QueryStoreError, \
+from dbrepo.api.dto import Table, CreateTableConstraints, Column, Constraints, ColumnType, Result, Concept, Unit, \
+    TableStatistics, ColumnStatistic, PrimaryKey, TableMinimal, ColumnMinimal, TableBrief, UserBrief
+from dbrepo.api.exceptions import MalformedError, ForbiddenError, NotExistsError, NameExistsError, \
     AuthenticationError, ExternalSystemError
 
 
@@ -21,16 +20,12 @@ class TableUnitTest(unittest.TestCase):
                     description="Test Table",
                     database_id=1,
                     internal_name="test",
-                    creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                 attributes=UserAttributes(theme='light')),
-                    owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                               attributes=UserAttributes(theme='light')),
-                    created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
+                    owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                     is_versioned=True,
-                    created_by='8638c043-5145-4be8-a3e4-4b79991b0a16',
                     queue_name='test',
                     routing_key='dbrepo.test_database_1234.test',
                     is_public=True,
+                    is_schema_public=True,
                     constraints=Constraints(uniques=[],
                                             foreign_keys=[],
                                             checks=[],
@@ -54,6 +49,7 @@ class TableUnitTest(unittest.TestCase):
             # test
             client = RestClient(username="a", password="b")
             response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[],
+                                           is_public=True, is_schema_public=True,
                                            constraints=CreateTableConstraints())
             self.assertEqual(exp, response)
 
@@ -65,6 +61,7 @@ class TableUnitTest(unittest.TestCase):
             try:
                 client = RestClient(username="a", password="b")
                 response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[],
+                                               is_public=True, is_schema_public=True,
                                                constraints=CreateTableConstraints())
             except MalformedError:
                 pass
@@ -77,6 +74,7 @@ class TableUnitTest(unittest.TestCase):
             try:
                 client = RestClient(username="a", password="b")
                 response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[],
+                                               is_public=True, is_schema_public=True,
                                                constraints=CreateTableConstraints())
             except ForbiddenError:
                 pass
@@ -89,6 +87,7 @@ class TableUnitTest(unittest.TestCase):
             try:
                 client = RestClient(username="a", password="b")
                 response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[],
+                                               is_public=True, is_schema_public=True,
                                                constraints=CreateTableConstraints())
             except NotExistsError:
                 pass
@@ -101,6 +100,7 @@ class TableUnitTest(unittest.TestCase):
             try:
                 client = RestClient(username="a", password="b")
                 response = client.create_table(database_id=1, name="Test", description="Test Table", columns=[],
+                                               is_public=True, is_schema_public=True,
                                                constraints=CreateTableConstraints())
             except NameExistsError:
                 pass
@@ -112,6 +112,7 @@ class TableUnitTest(unittest.TestCase):
             # test
             try:
                 response = RestClient().create_table(database_id=1, name="Test", description="Test Table", columns=[],
+                                                     is_public=True, is_schema_public=True,
                                                      constraints=CreateTableConstraints())
             except AuthenticationError:
                 pass
@@ -131,8 +132,9 @@ class TableUnitTest(unittest.TestCase):
                               description="Test Table",
                               database_id=1,
                               internal_name="test",
-                              owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                              attributes=UserAttributes(theme='light')),
+                              is_public=True,
+                              is_schema_public=True,
+                              owned_by='8638c043-5145-4be8-a3e4-4b79991b0a16',
                               is_versioned=True)]
             # mock
             mock.get('/api/database/1/table', json=[exp[0].model_dump()])
@@ -147,16 +149,12 @@ class TableUnitTest(unittest.TestCase):
                         description="Test Table",
                         database_id=1,
                         internal_name="test",
-                        creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                     attributes=UserAttributes(theme='light')),
-                        owner=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                   attributes=UserAttributes(theme='light')),
-                        created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
+                        owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                         is_versioned=True,
-                        created_by='8638c043-5145-4be8-a3e4-4b79991b0a16',
                         queue_name='test',
                         routing_key='dbrepo.test_database_1234.test',
                         is_public=True,
+                        is_schema_public=True,
                         constraints=Constraints(uniques=[],
                                                 foreign_keys=[],
                                                 checks=[],
@@ -501,11 +499,9 @@ class TableUnitTest(unittest.TestCase):
                          is_public=True,
                          concept=Concept(id=2,
                                          uri="http://dbpedia.org/page/Category:Precipitation",
-                                         created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                                          name="Precipitation"),
                          unit=Unit(id=2,
                                    uri="http://www.wikidata.org/entity/Q119856947",
-                                   created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                                    name="liters per square meter"),
                          is_null_allowed=False)
             # mock
diff --git a/lib/python/tests/test_unit_view.py b/lib/python/tests/test_unit_view.py
index 19a88be85a10dceef0eb8129dd65be733e3025e3..1bb46bc37c5b619eae1eadcc0818688d71edc735 100644
--- a/lib/python/tests/test_unit_view.py
+++ b/lib/python/tests/test_unit_view.py
@@ -1,13 +1,10 @@
 import unittest
-from json import dumps
 
 import requests_mock
-import datetime
-
-from dbrepo.RestClient import RestClient
 from pandas import DataFrame
 
-from dbrepo.api.dto import UserAttributes, User, View, Result, ViewColumn, ColumnType
+from dbrepo.RestClient import RestClient
+from dbrepo.api.dto import View, Result, ViewColumn, ColumnType, UserBrief
 from dbrepo.api.exceptions import ForbiddenError, NotExistsError, MalformedError, AuthenticationError
 
 
@@ -30,13 +27,11 @@ class ViewUnitTest(unittest.TestCase):
                         initial_view=False,
                         query="SELECT id FROM mytable WHERE deg > 0",
                         query_hash="94c74728b11a690e51d64719868824735f0817b7",
-                        creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                     attributes=UserAttributes(theme='light')),
+                        owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                         is_public=True,
+                        is_schema_public=True,
                         columns=[ViewColumn(id=1, name="id", internal_name="id", database_id=1, auto_generated=False,
                                             column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False)],
-                        created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                        last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                         identifiers=[])]
             # mock
             mock.get('/api/database/1/view', json=[exp[0].model_dump()])
@@ -63,13 +58,11 @@ class ViewUnitTest(unittest.TestCase):
                        initial_view=False,
                        query="SELECT id FROM mytable WHERE deg > 0",
                        query_hash="94c74728b11a690e51d64719868824735f0817b7",
-                       creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                    attributes=UserAttributes(theme='light')),
+                       owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                        is_public=True,
+                       is_schema_public=True,
                        columns=[ViewColumn(id=1, name="id", internal_name="id", database_id=1, auto_generated=False,
                                            column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False)],
-                       created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                       last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                        identifiers=[])
             # mock
             mock.get('/api/database/1/view/3', json=exp.model_dump())
@@ -106,19 +99,17 @@ class ViewUnitTest(unittest.TestCase):
                        initial_view=False,
                        query="SELECT id FROM mytable WHERE deg > 0",
                        query_hash="94c74728b11a690e51d64719868824735f0817b7",
-                       creator=User(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise',
-                                    attributes=UserAttributes(theme='light')),
+                       owner=UserBrief(id='8638c043-5145-4be8-a3e4-4b79991b0a16', username='mweise'),
                        is_public=True,
+                       is_schema_public=True,
                        columns=[ViewColumn(id=1, name="id", internal_name="id", database_id=1, auto_generated=False,
                                            column_type=ColumnType.BIGINT, is_public=True, is_null_allowed=False)],
-                       created=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
-                       last_modified=datetime.datetime(2024, 1, 1, 0, 0, 0, 0, datetime.timezone.utc),
                        identifiers=[])
             # mock
             mock.post('/api/database/1/view', json=exp.model_dump(), status_code=201)
             # test
             client = RestClient(username="a", password="b")
-            response = client.create_view(database_id=1, name="Data", is_public=True,
+            response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True,
                                           query="SELECT id FROM mytable WHERE deg > 0")
             self.assertEqual(exp, response)
 
@@ -129,7 +120,7 @@ class ViewUnitTest(unittest.TestCase):
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.create_view(database_id=1, name="Data", is_public=True,
+                response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True,
                                               query="SELECT id FROM mytable WHERE deg > 0")
             except MalformedError:
                 pass
@@ -141,7 +132,7 @@ class ViewUnitTest(unittest.TestCase):
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.create_view(database_id=1, name="Data", is_public=True,
+                response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True,
                                               query="SELECT id FROM mytable WHERE deg > 0")
             except ForbiddenError:
                 pass
@@ -153,7 +144,7 @@ class ViewUnitTest(unittest.TestCase):
             # test
             try:
                 client = RestClient(username="a", password="b")
-                response = client.create_view(database_id=1, name="Data", is_public=True,
+                response = client.create_view(database_id=1, name="Data", is_public=True, is_schema_public=True,
                                               query="SELECT id FROM mytable WHERE deg > 0")
             except NotExistsError:
                 pass
@@ -164,7 +155,7 @@ class ViewUnitTest(unittest.TestCase):
             mock.post('/api/database/1/view', status_code=404)
             # test
             try:
-                response = RestClient().create_view(database_id=1, name="Data", is_public=True,
+                response = RestClient().create_view(database_id=1, name="Data", is_public=True, is_schema_public=True,
                                                     query="SELECT id FROM mytable WHERE deg > 0")
             except AuthenticationError:
                 pass
diff --git a/sonar-project.properties b/sonar-project.properties
index 54228d8d4c7fd97d1c704f55cb9dc064d9bca2f8..fdbf030ef0e674288083ee1366822ea99d055e19 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -2,7 +2,7 @@
 sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77
 sonar.host.url=https://s39.datalab.tuwien.ac.at
 # project
-sonar.projectVersion=1.5.2
+sonar.projectVersion=1.6.0
 # general
 sonar.qualitygate.wait=true
 sonar.projectCreation.mainBranchName=master