diff --git a/ui-admin/index.html b/ui-admin/index.html
index 0aa3e2a03bb8502d15b0d16de856be2eb35f65b1..5250d61c8afa385c5a8ad3c48f35dd36cfa3af97 100644
--- a/ui-admin/index.html
+++ b/ui-admin/index.html
@@ -3,10 +3,10 @@
   <head>
     <title>openBIS Admin</title>
     <meta charset="utf-8" />
-    <link rel="apple-touch-icon" sizes="180x180" href="<%= require('@src/img/apple-touch-icon.png') %>">
-    <link rel="icon" type="image/png" sizes="32x32" href="<%= require('@src/img/favicon-32x32.png?url') %>">
-    <link rel="icon" type="image/png" sizes="16x16" href="<%= require('@src/img/favicon-16x16.png?url') %>">
-    <link rel="manifest" href="<%= require('@src/js/webmanifest.js').default %>">
+    <link rel="apple-touch-icon" sizes="180x180" href="<%= require('@src/resources/img/apple-touch-icon.png') %>">
+    <link rel="icon" type="image/png" sizes="32x32" href="<%= require('@src/resources/img/favicon-32x32.png') %>">
+    <link rel="icon" type="image/png" sizes="16x16" href="<%= require('@src/resources/img/favicon-16x16.png') %>">
+    <link rel="manifest" href="manifest/site.webmanifest">
 
     <style>
       html {
diff --git a/ui-admin/package.json b/ui-admin/package.json
index caed5e74b6a530a01a88042e92d92495b82dcd84..134257eaabd5fba3d3eb582ded04601b7de65780 100644
--- a/ui-admin/package.json
+++ b/ui-admin/package.json
@@ -41,6 +41,7 @@
     "babel-jest": "^29.3.1",
     "babel-loader": "^9.1.0",
     "babel-plugin-transform-amd-to-commonjs": "^1.6.0",
+    "copy-webpack-plugin": "^11.0.0",
     "css-loader": "^6.7.3",
     "enzyme": "^3.11.0",
     "enzyme-adapter-react-16": "^1.15.7",
diff --git a/ui-admin/src/js/components/login/Login.jsx b/ui-admin/src/js/components/login/Login.jsx
index d9c0b6a8ffadc1d70fb368e4e4a49a9cd2be1dac..46592d7ba87a4d6b6a8b4d38b41d8518521dddaf 100644
--- a/ui-admin/src/js/components/login/Login.jsx
+++ b/ui-admin/src/js/components/login/Login.jsx
@@ -18,7 +18,7 @@ import openbis from '@src/js/services/openbis.js'
 import messages from '@src/js/common/messages.js'
 import logger from '@src/js/common/logger.js'
 
-import Logo from '@src/img/openbis-logo-transparent.png'
+import Logo from '@src/resources/img/openbis-logo-transparent.png'
 
 const styles = theme => ({
   card: {
diff --git a/ui-admin/src/js/webmanifest.js b/ui-admin/src/js/webmanifest.js
deleted file mode 100644
index debc48bd7daabdad6e1013e15a05684654257df5..0000000000000000000000000000000000000000
--- a/ui-admin/src/js/webmanifest.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import AndroidChrome192 from '@src/img/android-chrome-192x192.png?url'
-import AndroidChrome512 from '@src/img/android-chrome-512x512.png?url'
-
-const config = {
-  name: 'openBIS Admin UI',
-  short_name: 'Admin UI',
-  icons: [
-    {
-      src: AndroidChrome192,
-      sizes: '192x192',
-      type: 'image/png'
-    },
-    {
-      src: AndroidChrome512,
-      sizes: '512x512',
-      type: 'image/png'
-    }
-  ],
-  theme_color: '#ffffff',
-  background_color: '#ffffff',
-  display: 'standalone'
-}
-
-export default 'data:application/manifest+json;base64,' +
-  Buffer.from(JSON.stringify(config)).toString('base64')
diff --git a/ui-admin/src/img/android-chrome-192x192.png b/ui-admin/src/resources/img/android-chrome-192x192.png
similarity index 100%
rename from ui-admin/src/img/android-chrome-192x192.png
rename to ui-admin/src/resources/img/android-chrome-192x192.png
diff --git a/ui-admin/src/img/android-chrome-512x512.png b/ui-admin/src/resources/img/android-chrome-512x512.png
similarity index 100%
rename from ui-admin/src/img/android-chrome-512x512.png
rename to ui-admin/src/resources/img/android-chrome-512x512.png
diff --git a/ui-admin/src/img/apple-touch-icon.png b/ui-admin/src/resources/img/apple-touch-icon.png
similarity index 100%
rename from ui-admin/src/img/apple-touch-icon.png
rename to ui-admin/src/resources/img/apple-touch-icon.png
diff --git a/ui-admin/src/img/favicon-16x16.png b/ui-admin/src/resources/img/favicon-16x16.png
similarity index 100%
rename from ui-admin/src/img/favicon-16x16.png
rename to ui-admin/src/resources/img/favicon-16x16.png
diff --git a/ui-admin/src/img/favicon-32x32.png b/ui-admin/src/resources/img/favicon-32x32.png
similarity index 100%
rename from ui-admin/src/img/favicon-32x32.png
rename to ui-admin/src/resources/img/favicon-32x32.png
diff --git a/ui-admin/src/img/favicon.ico b/ui-admin/src/resources/img/favicon.ico
similarity index 100%
rename from ui-admin/src/img/favicon.ico
rename to ui-admin/src/resources/img/favicon.ico
diff --git a/ui-admin/src/img/openbis-favicon-transparent.png b/ui-admin/src/resources/img/openbis-favicon-transparent.png
similarity index 100%
rename from ui-admin/src/img/openbis-favicon-transparent.png
rename to ui-admin/src/resources/img/openbis-favicon-transparent.png
diff --git a/ui-admin/src/img/openbis-logo-transparent.png b/ui-admin/src/resources/img/openbis-logo-transparent.png
similarity index 100%
rename from ui-admin/src/img/openbis-logo-transparent.png
rename to ui-admin/src/resources/img/openbis-logo-transparent.png
diff --git a/ui-admin/src/resources/manifest/site.webmanifest b/ui-admin/src/resources/manifest/site.webmanifest
new file mode 100644
index 0000000000000000000000000000000000000000..9641ebbd5eafb351406f92cf5e532cc6da5668eb
--- /dev/null
+++ b/ui-admin/src/resources/manifest/site.webmanifest
@@ -0,0 +1,19 @@
+{
+  "name": "openBIS Admin UI",
+  "short_name": "Admin UI",
+  "icons": [
+    {
+      "src": "img/android-chrome-192x192.png",
+      "sizes": "192x192",
+      "type": "image/png"
+    },
+    {
+      "src": "img/android-chrome-512x512.png",
+      "sizes": "512x512",
+      "type": "image/png"
+    }
+  ],
+  "theme_color": "#ffffff",
+  "background_color": "#ffffff",
+  "display": "standalone"
+}
diff --git a/ui-admin/webpack.config.dev.js b/ui-admin/webpack.config.dev.js
index 48b3422098fae704908ecca503a2db5e1b2f102e..ee809179fc3dd64e048f19c7b189500622b01a8f 100644
--- a/ui-admin/webpack.config.dev.js
+++ b/ui-admin/webpack.config.dev.js
@@ -1,6 +1,7 @@
 /* eslint-disable */
 const Webpack = require('webpack')
 const HtmlWebpackPlugin = require('html-webpack-plugin')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
 const path = require('path')
 
 module.exports = {
@@ -25,9 +26,12 @@ module.exports = {
     devMiddleware: {
       publicPath: '/admin/'
     },
-    static: {
-      directory: './src/js'
-    }
+    static: [
+      {
+        directory: './src/resources',
+        publicPath: '/admin'
+      }
+    ]
   },
 
   devtool: 'source-map',
@@ -47,14 +51,8 @@ module.exports = {
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
-        resourceQuery: { not: [/url/] },
         type: 'asset'
       },
-      {
-        test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
-        resourceQuery: /url/,
-        type: 'asset/resource'
-      },
       {
         test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
         loader: 'url-loader',
diff --git a/ui-admin/webpack.config.js b/ui-admin/webpack.config.js
index 249ba677fcf6d6311bf68556236506fd13da3975..9dfc3316f8eb7173af608b7359122f18176218c4 100644
--- a/ui-admin/webpack.config.js
+++ b/ui-admin/webpack.config.js
@@ -1,6 +1,7 @@
 /* eslint-disable */
 const Webpack = require('webpack')
 const HtmlWebpackPlugin = require('html-webpack-plugin')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
 const path = require('path')
 
 module.exports = {
@@ -26,14 +27,8 @@ module.exports = {
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
-        resourceQuery: { not: [/url/] },
         type: 'asset'
       },
-      {
-        test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
-        resourceQuery: /url/,
-        type: 'asset/resource'
-      },
       {
         test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
         loader: 'url-loader',
@@ -67,6 +62,9 @@ module.exports = {
     }),
     new Webpack.ProvidePlugin({
       process: 'process/browser'
+    }),
+    new CopyWebpackPlugin({
+      patterns: [{ from: 'src/resources' }]
     })
   ]
 }