diff --git a/ui-admin/index.html b/ui-admin/index.html
index 4d9ad717531a8c28974fa57279c42a3d0f66e2c7..0aa3e2a03bb8502d15b0d16de856be2eb35f65b1 100644
--- a/ui-admin/index.html
+++ b/ui-admin/index.html
@@ -3,7 +3,11 @@
   <head>
     <title>openBIS Admin</title>
     <meta charset="utf-8" />
-    <link rel="shortcut icon" href="<%= require('@src/img/favicon.ico') %>" />
+    <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 %>">
+
     <style>
       html {
         font-size: 16px;
diff --git a/ui-admin/src/img/android-chrome-192x192.png b/ui-admin/src/img/android-chrome-192x192.png
new file mode 100644
index 0000000000000000000000000000000000000000..9aef78560a168f796c5eab75b9c4ce90b3c1982a
Binary files /dev/null and b/ui-admin/src/img/android-chrome-192x192.png differ
diff --git a/ui-admin/src/img/android-chrome-512x512.png b/ui-admin/src/img/android-chrome-512x512.png
new file mode 100644
index 0000000000000000000000000000000000000000..0b3deb1eccccf2d2beb1f54c4cf08d5cc7b4a315
Binary files /dev/null and b/ui-admin/src/img/android-chrome-512x512.png differ
diff --git a/ui-admin/src/img/apple-touch-icon.png b/ui-admin/src/img/apple-touch-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..18b3c3910a9386af28f417ca7a49d01e2b61c084
Binary files /dev/null and b/ui-admin/src/img/apple-touch-icon.png differ
diff --git a/ui-admin/src/img/favicon-16x16.png b/ui-admin/src/img/favicon-16x16.png
new file mode 100644
index 0000000000000000000000000000000000000000..7eb83e01f159c0e9fe7461d29c7247434f09d173
Binary files /dev/null and b/ui-admin/src/img/favicon-16x16.png differ
diff --git a/ui-admin/src/img/favicon-32x32.png b/ui-admin/src/img/favicon-32x32.png
new file mode 100644
index 0000000000000000000000000000000000000000..5a491d52936732e7860c5f38cee403c7544e3231
Binary files /dev/null and b/ui-admin/src/img/favicon-32x32.png differ
diff --git a/ui-admin/src/img/favicon.ico b/ui-admin/src/img/favicon.ico
index 5d077385c909f1be1f4d7a98b193ed1c7bca72d1..ffcca176c4d277b422b5b684653f14121e10dbc8 100644
Binary files a/ui-admin/src/img/favicon.ico and b/ui-admin/src/img/favicon.ico differ
diff --git a/ui-admin/src/img/openbis-favicon-transparent.png b/ui-admin/src/img/openbis-favicon-transparent.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe713173d1119882ebdefe49cb1aae98396da327
Binary files /dev/null and b/ui-admin/src/img/openbis-favicon-transparent.png differ
diff --git a/ui-admin/src/img/openbis-logo-transparent.png b/ui-admin/src/img/openbis-logo-transparent.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef957be5357ad53a53ae26968538476337db7712
Binary files /dev/null and b/ui-admin/src/img/openbis-logo-transparent.png differ
diff --git a/ui-admin/src/js/components/login/Login.jsx b/ui-admin/src/js/components/login/Login.jsx
index eaf1888dd3d444ef6091ced57f9b01e17c9f6ba7..d9c0b6a8ffadc1d70fb368e4e4a49a9cd2be1dac 100644
--- a/ui-admin/src/js/components/login/Login.jsx
+++ b/ui-admin/src/js/components/login/Login.jsx
@@ -18,6 +18,8 @@ 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'
+
 const styles = theme => ({
   card: {
     marginTop: '10%',
@@ -25,6 +27,10 @@ const styles = theme => ({
     width: '30em',
     margin: '0 auto'
   },
+  logo: {
+    display: 'flex',
+    justifyContent: 'center'
+  },
   header: {
     marginBottom: theme.spacing(1)
   },
@@ -212,6 +218,9 @@ class WithLogin extends React.Component {
           <form>
             <Card classes={{ root: classes.card }}>
               <Container square={true}>
+                <div className={classes.logo}>
+                  <img src={Logo} height='90' />
+                </div>
                 <Typography variant='h6' classes={{ root: classes.header }}>
                   Login
                 </Typography>
diff --git a/ui-admin/src/js/webmanifest.js b/ui-admin/src/js/webmanifest.js
new file mode 100644
index 0000000000000000000000000000000000000000..debc48bd7daabdad6e1013e15a05684654257df5
--- /dev/null
+++ b/ui-admin/src/js/webmanifest.js
@@ -0,0 +1,25 @@
+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/webpack.config.dev.js b/ui-admin/webpack.config.dev.js
index e6b0fe40324cb5afeb1d13415fad33db011babb8..48b3422098fae704908ecca503a2db5e1b2f102e 100644
--- a/ui-admin/webpack.config.dev.js
+++ b/ui-admin/webpack.config.dev.js
@@ -47,7 +47,13 @@ module.exports = {
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
-        type: 'asset',
+        resourceQuery: { not: [/url/] },
+        type: 'asset'
+      },
+      {
+        test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
+        resourceQuery: /url/,
+        type: 'asset/resource'
       },
       {
         test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
diff --git a/ui-admin/webpack.config.js b/ui-admin/webpack.config.js
index 4529c14a4726edc1ec68470d91bc362ecd4d008b..249ba677fcf6d6311bf68556236506fd13da3975 100644
--- a/ui-admin/webpack.config.js
+++ b/ui-admin/webpack.config.js
@@ -26,7 +26,13 @@ module.exports = {
       },
       {
         test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
-        type: 'asset',
+        resourceQuery: { not: [/url/] },
+        type: 'asset'
+      },
+      {
+        test: /\.(png|svg|jpg|jpeg|gif|ico)$/i,
+        resourceQuery: /url/,
+        type: 'asset/resource'
       },
       {
         test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,