keycloak-memoizeit

Changes

admin-ui/pom.xml 32(+0 -32)

admin-ui/src/main/resources/META-INF/resources/admin/css/reset.css 71(+0 -71)

admin-ui/src/main/resources/META-INF/resources/admin/lib/patternfly/css/patternfly.min.css 4(+0 -4)

admin-ui/src/main/resources/META-INF/web-fragment.xml 5(+0 -5)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/css/patternfly.css 9168(+0 -9168)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-BoldItalic-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-BoldItalic-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-BoldItalic-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-BoldItalic-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Bold-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Bold-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Bold-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Bold-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBoldItalic-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBoldItalic-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBoldItalic-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBoldItalic-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBold-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBold-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBold-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-ExtraBold-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Italic-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Italic-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Italic-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Italic-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-LightItalic-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-LightItalic-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-LightItalic-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-LightItalic-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Light-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Light-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Light-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Light-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Regular-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Regular-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Regular-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Regular-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-SemiboldItalic-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-SemiboldItalic-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-SemiboldItalic-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-SemiboldItalic-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Semibold-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Semibold-webfont.svg 146(+0 -146)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Semibold-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/OpenSans-Semibold-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.eot 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.svg 34(+0 -34)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.ttf 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/fonts/PatternFlyIcons-webfont.woff 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/img/bg-login.jpg 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/img/brand.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/img/brand.svg 84(+0 -84)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/img/brand-lg.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/img/logo.png 0(+0 -0)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/img/logo.svg 22(+0 -22)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/js/patternfly.js 68(+0 -68)

forms/common-themes/src/main/resources/theme/common/patternfly/resources/lib/patternfly/js/patternfly.min.js 1(+0 -1)

pom.xml 1(+0 -1)

server/pom.xml 5(+0 -5)

services/src/main/java/org/keycloak/services/tmp/TmpAdminRedirectServlet.java 21(+0 -21)

Details

diff --git a/distribution/appliance-dist/assembly.xml b/distribution/appliance-dist/assembly.xml
index 1b81f38..957cc36 100755
--- a/distribution/appliance-dist/assembly.xml
+++ b/distribution/appliance-dist/assembly.xml
@@ -47,7 +47,7 @@
             <outputDirectory>keycloak</outputDirectory>
         </fileSet>
         <fileSet>
-            <directory>${project.build.directory}/unpacked/deployments/auth-server.war</directory>
+            <directory>src/main/welcome-content</directory>
             <outputDirectory>keycloak/welcome-content</outputDirectory>
             <includes>
                 <include>*.*</include>
diff --git a/distribution/appliance-dist/pom.xml b/distribution/appliance-dist/pom.xml
index c1a7bb4..e981729 100755
--- a/distribution/appliance-dist/pom.xml
+++ b/distribution/appliance-dist/pom.xml
@@ -84,6 +84,7 @@
                                     <outputDirectory>${project.build.directory}/unpacked/adapter</outputDirectory>
                                 </artifactItem>
                             </artifactItems>
+                            <excludes>**/welcome-content/*</excludes>
                         </configuration>
                     </execution>
                 </executions>
diff --git a/distribution/appliance-dist/src/main/welcome-content/index.html b/distribution/appliance-dist/src/main/welcome-content/index.html
new file mode 100644
index 0000000..ad7660e
--- /dev/null
+++ b/distribution/appliance-dist/src/main/welcome-content/index.html
@@ -0,0 +1,32 @@
+<!--
+  ~ JBoss, Home of Professional Open Source.
+  ~ Copyright (c) 2011, Red Hat, Inc., and individual contributors
+  ~ as indicated by the @author tags. See the copyright.txt file in the
+  ~ distribution for a full listing of individual contributors.
+  ~
+  ~ This is free software; you can redistribute it and/or modify it
+  ~ under the terms of the GNU Lesser General Public License as
+  ~ published by the Free Software Foundation; either version 2.1 of
+  ~ the License, or (at your option) any later version.
+  ~
+  ~ This software is distributed in the hope that it will be useful,
+  ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+  ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  ~ Lesser General Public License for more details.
+  ~
+  ~ You should have received a copy of the GNU Lesser General Public
+  ~ License along with this software; if not, write to the Free
+  ~ Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+  ~ 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+  -->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<html>
+<head>
+    <title>Welcome to Keycloak</title>
+    <meta http-equiv="refresh" content="0; url=/auth/" />
+</head>
+
+<body>
+</body>
+</html>
diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/Theme.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/Theme.java
index 265496c..dd02e62 100644
--- a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/Theme.java
+++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/Theme.java
@@ -10,7 +10,7 @@ import java.util.Properties;
  */
 public interface Theme {
 
-    public enum Type { LOGIN, ACCOUNT, COMMON };
+    public enum Type { LOGIN, ACCOUNT, ADMIN, COMMON };
 
     public String getName();
 
diff --git a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeLoader.java b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeLoader.java
index 5327979..c64bff6 100755
--- a/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeLoader.java
+++ b/forms/common-freemarker/src/main/java/org/keycloak/freemarker/ThemeLoader.java
@@ -48,6 +48,11 @@ public class ThemeLoader {
             for (String parentName = theme.getParentName(); parentName != null; parentName = theme.getParentName()) {
                 theme = findTheme(providers, parentName, type);
                 themes.add(theme);
+
+                if (theme.getImportName() != null) {
+                    String[] s = theme.getImportName().split("/");
+                    themes.add(findTheme(providers, s[1], Theme.Type.valueOf(s[0].toUpperCase())));
+                }
             }
 
             return new ExtendingTheme(themes);
diff --git a/forms/common-themes/src/main/java/org/keycloak/theme/FolderTheme.java b/forms/common-themes/src/main/java/org/keycloak/theme/FolderTheme.java
index 2427b65..aa2312e 100644
--- a/forms/common-themes/src/main/java/org/keycloak/theme/FolderTheme.java
+++ b/forms/common-themes/src/main/java/org/keycloak/theme/FolderTheme.java
@@ -29,7 +29,7 @@ public class FolderTheme implements Theme {
         if (propertiesFile .isFile()) {
             properties.load(new FileInputStream(propertiesFile));
             parentName = properties.getProperty("parent");
-            parentName = properties.getProperty("import");
+            importName = properties.getProperty("import");
         }
     }
 
diff --git a/forms/common-themes/src/main/resources/META-INF/services/org.keycloak.freemarker.ThemeProvider b/forms/common-themes/src/main/resources/META-INF/services/org.keycloak.freemarker.ThemeProvider
index 8a9390d..f9f661b 100644
--- a/forms/common-themes/src/main/resources/META-INF/services/org.keycloak.freemarker.ThemeProvider
+++ b/forms/common-themes/src/main/resources/META-INF/services/org.keycloak.freemarker.ThemeProvider
@@ -1,2 +1,2 @@
-org.keycloak.theme.DefaultLoginThemeProvider
+org.keycloak.theme.DefaultKeycloakThemeProvider
 org.keycloak.theme.FolderThemeProvider
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/account/keycloak/theme.properties b/forms/common-themes/src/main/resources/theme/account/keycloak/theme.properties
index b5952d5..611dff9 100644
--- a/forms/common-themes/src/main/resources/theme/account/keycloak/theme.properties
+++ b/forms/common-themes/src/main/resources/theme/account/keycloak/theme.properties
@@ -1,2 +1,4 @@
 parent=patternfly
+import=common/keycloak
+
 styles= ../patternfly/lib/patternfly/css/patternfly.css ../patternfly/css/account.css css/account.css
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/account/patternfly/theme.properties b/forms/common-themes/src/main/resources/theme/account/patternfly/theme.properties
index 8033479..971b6c0 100644
--- a/forms/common-themes/src/main/resources/theme/account/patternfly/theme.properties
+++ b/forms/common-themes/src/main/resources/theme/account/patternfly/theme.properties
@@ -1,4 +1,4 @@
 parent=base
-import=common/patternfly
+import=common/keycloak
 
 styles=lib/patternfly/css/patternfly.css css/account.css
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/admin/base/theme.properties b/forms/common-themes/src/main/resources/theme/admin/base/theme.properties
new file mode 100644
index 0000000..5eb8ef9
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/admin/base/theme.properties
@@ -0,0 +1 @@
+import=common/keycloak
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/styles.css b/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/styles.css
new file mode 100644
index 0000000..d5ca9aa
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/admin/keycloak/resources/css/styles.css
@@ -0,0 +1,34 @@
+@import url("../lib/patternfly/css/patternfly.css");
+@import url("../lib/select2-3.4.1/select2.css");
+
+@import url("admin-console.css");
+@import url("tables.css");
+@import url("sprites.css");
+
+.navbar-pf {
+    background-image: url('../img/header-bkgrnd.png');
+    border-top: 3px solid rgba(255, 255, 255, 0.15);
+}
+
+.navbar-pf .navbar-primary {
+    font-size: 13px;
+    background-image: -webkit-linear-gradient(top, rgba(0,0,0,0.1) 0%, rgba(0,0,0,.4) 100%);
+    background-image: linear-gradient(to bottom, rgba(0,0,0,.1) 0%, rgba(0,0,0,.4) 100%);
+}
+
+.navbar-pf .navbar-header {
+    border-bottom: 1px solid rgba(255,255,255,.15);
+}
+
+.navbar-pf .navbar-primary li.dropdown.context > a,
+.navbar-pf .navbar-primary li.dropdown.context > a:hover,
+.navbar-pf .navbar-primary li.dropdown.context.open > a,
+.navbar-pf .navbar-primary > .active > a,
+.navbar-pf .navbar-primary > .active > a:hover{
+    background-color: rgba(0,0,0,0.1);
+    background-image: -webkit-linear-gradient(top, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.1) 100%);
+    background-image: linear-gradient(to bottom, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.1) 100%);
+    border-bottom: none;
+    border-right-color: rgba(255,255,255,0.15);
+    border-top-color: rgba(255,255,255,0.05);
+}
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/admin/keycloak/theme.properties b/forms/common-themes/src/main/resources/theme/admin/keycloak/theme.properties
new file mode 100644
index 0000000..13a3608
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/admin/keycloak/theme.properties
@@ -0,0 +1,2 @@
+parent=patternfly
+import=common/keycloak
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/admin/patternfly/resources/css/styles.css b/forms/common-themes/src/main/resources/theme/admin/patternfly/resources/css/styles.css
new file mode 100644
index 0000000..726012a
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/admin/patternfly/resources/css/styles.css
@@ -0,0 +1,6 @@
+@import url("../lib/patternfly/css/patternfly.css");
+@import url("../lib/select2-3.4.1/select2.css");
+
+@import url("admin-console.css");
+@import url("tables.css");
+@import url("sprites.css");
diff --git a/forms/common-themes/src/main/resources/theme/admin/patternfly/theme.properties b/forms/common-themes/src/main/resources/theme/admin/patternfly/theme.properties
new file mode 100644
index 0000000..e67231f
--- /dev/null
+++ b/forms/common-themes/src/main/resources/theme/admin/patternfly/theme.properties
@@ -0,0 +1,2 @@
+parent=base
+import=common/keycloak
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/login/keycloak/theme.properties b/forms/common-themes/src/main/resources/theme/login/keycloak/theme.properties
index 54da766..599759a 100644
--- a/forms/common-themes/src/main/resources/theme/login/keycloak/theme.properties
+++ b/forms/common-themes/src/main/resources/theme/login/keycloak/theme.properties
@@ -1,2 +1,4 @@
 parent=patternfly
+import=common/keycloak
+
 styles= ../patternfly/lib/patternfly/css/patternfly.css ../patternfly/css/login.css ../patternfly/lib/zocial/zocial.css css/login.css
\ No newline at end of file
diff --git a/forms/common-themes/src/main/resources/theme/login/patternfly/theme.properties b/forms/common-themes/src/main/resources/theme/login/patternfly/theme.properties
index 6ac168b..c6ae402 100644
--- a/forms/common-themes/src/main/resources/theme/login/patternfly/theme.properties
+++ b/forms/common-themes/src/main/resources/theme/login/patternfly/theme.properties
@@ -1,5 +1,5 @@
 parent=base
-import=common/patternfly
+import=common/keycloak
 
 styles=lib/patternfly/css/patternfly.css lib/zocial/zocial.css css/login.css
 meta=viewport==width=device-width,initial-scale=1
diff --git a/model/api/src/main/java/org/keycloak/models/Config.java b/model/api/src/main/java/org/keycloak/models/Config.java
index 25f5332..d1ed6af 100644
--- a/model/api/src/main/java/org/keycloak/models/Config.java
+++ b/model/api/src/main/java/org/keycloak/models/Config.java
@@ -25,6 +25,9 @@ public class Config {
     public static final String THEME_DEFAULT_KEY = "keycloak.theme.default";
     public static final String THEME_DEFAULT_DEFAULT = "keycloak";
     public static final String THEME_DIR_KEY = "keycloak.theme.dir";
+    public static final String THEME_ADMIN_KEY = "keycloak.theme.admin";
+    public static final String THEME_ADMIN_DEFAULT  = "keycloak";
+
     public static final String JBOSS_SERVER_CONFIG_DIR_KEY = "jboss.server.config.dir";
 
     public static final String TIMER_PROVIDER_KEY = "keycloak.timer";
@@ -106,4 +109,12 @@ public class Config {
         System.setProperty(THEME_DEFAULT_KEY, defaultTheme);
     }
 
+    public static String getThemeAdmin() {
+        return System.getProperty(THEME_ADMIN_KEY, THEME_ADMIN_DEFAULT);
+    }
+
+    public static void setThemeAdmin(String adminTheme) {
+        System.setProperty(THEME_ADMIN_KEY, adminTheme);
+    }
+
 }

pom.xml 1(+0 -1)

diff --git a/pom.xml b/pom.xml
index 31ae93b..e62a6d4 100755
--- a/pom.xml
+++ b/pom.xml
@@ -97,7 +97,6 @@
         <module>services</module>
         <module>social</module>
         <module>forms</module>
-        <module>admin-ui</module>
         <module>examples</module>
         <module>testsuite</module>
         <module>server</module>

server/pom.xml 5(+0 -5)

diff --git a/server/pom.xml b/server/pom.xml
index a4313c2..fc93352 100755
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -133,11 +133,6 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-admin-ui</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-js-adapter</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/server/src/main/webapp/WEB-INF/web.xml b/server/src/main/webapp/WEB-INF/web.xml
index 626ec53..356425f 100755
--- a/server/src/main/webapp/WEB-INF/web.xml
+++ b/server/src/main/webapp/WEB-INF/web.xml
@@ -15,25 +15,16 @@
         </init-param>
         <init-param>
             <param-name>resteasy.servlet.mapping.prefix</param-name>
-            <param-value>/rest</param-value>
+            <param-value>/</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
         <async-supported>true</async-supported>
     </servlet>
 
-    <servlet>
-        <servlet-name>TmpAdminRedirectServlet</servlet-name>
-        <servlet-class>org.keycloak.services.tmp.TmpAdminRedirectServlet</servlet-class>
-    </servlet>
-
     <listener>
         <listener-class>org.keycloak.services.listeners.KeycloakSessionDestroyListener</listener-class>
     </listener>
 
-    <welcome-file-list>
-        <welcome-file>index.html</welcome-file>
-    </welcome-file-list>
-
     <filter>
         <filter-name>Keycloak Client Connection Filter</filter-name>
         <filter-class>org.keycloak.services.filters.ClientConnectionFilter</filter-class>
@@ -56,13 +47,7 @@
 
     <servlet-mapping>
         <servlet-name>Resteasy</servlet-name>
-        <url-pattern>/rest/*</url-pattern>
-    </servlet-mapping>
-
-    <servlet-mapping>
-        <servlet-name>TmpAdminRedirectServlet</servlet-name>
-        <url-pattern>/admin</url-pattern>
-        <url-pattern>/admin/</url-pattern>
+        <url-pattern>/*</url-pattern>
     </servlet-mapping>
 
     <!--
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminService.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminService.java
index 54c4da0..7be45c5 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminService.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminService.java
@@ -47,7 +47,7 @@ import java.util.Set;
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
-@Path("/admin")
+@Path("/rest/admin")
 public class AdminService {
     protected static final Logger logger = Logger.getLogger(AdminService.class);
 
@@ -74,7 +74,7 @@ public class AdminService {
     @Context
     protected ProviderSession providerSession;
 
-    protected String adminPath = "/admin/index.html";
+    protected String adminPath = "/admin/";
     protected AppAuthManager authManager;
     protected TokenManager tokenManager;
 
@@ -373,7 +373,7 @@ public class AdminService {
             logger.debug("loginRedirect SUCCESS");
             NewCookie cookie = authManager.createCookie(adminRealm, adminConsole, code, AdminService.saasCookiePath(uriInfo).build());
 
-            URI redirectUri = UriBuilder.fromUri(uriInfo.getBaseUri()).path("../").path(adminPath).build();
+            URI redirectUri = UriBuilder.fromUri(uriInfo.getBaseUri()).path(adminPath).build();
             if (path != null) {
                 redirectUri = redirectUri.resolve("#" + UriBuilder.fromPath(path).build().toString());
             }
diff --git a/services/src/main/java/org/keycloak/services/resources/AdminResource.java b/services/src/main/java/org/keycloak/services/resources/AdminResource.java
new file mode 100755
index 0000000..668ffa5
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/AdminResource.java
@@ -0,0 +1,60 @@
+package org.keycloak.services.resources;
+
+import org.jboss.resteasy.logging.Logger;
+import org.keycloak.models.Config;
+import org.keycloak.freemarker.Theme;
+import org.keycloak.freemarker.ThemeLoader;
+
+import javax.activation.FileTypeMap;
+import javax.activation.MimetypesFileTypeMap;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+@Path("/admin")
+public class AdminResource {
+
+    private static final Logger logger = Logger.getLogger(AdminResource.class);
+
+    private static FileTypeMap mimeTypes = MimetypesFileTypeMap.getDefaultFileTypeMap();
+
+    @Context
+    private UriInfo uriInfo;
+
+    @GET
+    public Response getResource() throws URISyntaxException {
+        String requestUri = uriInfo.getRequestUri().toString();
+        if (!requestUri.endsWith("/")) {
+            return Response.seeOther(new URI(requestUri + "/")).build();
+        } else {
+            return getResource("index.html");
+        }
+    }
+
+    @GET
+    @Path("/{path:.*}")
+    public Response getResource(@PathParam("path") String path) {
+        try {
+            Theme theme = ThemeLoader.createTheme(Config.getThemeAdmin(), Theme.Type.ADMIN);
+            InputStream resource = theme.getResourceAsStream(path);
+            if (resource != null) {
+                return Response.ok(resource).type(mimeTypes.getContentType(path)).build();
+            } else {
+                return Response.status(Response.Status.NOT_FOUND).build();
+            }
+        } catch (Exception e) {
+            logger.warn("Failed to get theme resource", e);
+            return Response.serverError().build();
+        }
+    }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/JsResource.java b/services/src/main/java/org/keycloak/services/resources/JsResource.java
new file mode 100644
index 0000000..c28d8bd
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/JsResource.java
@@ -0,0 +1,27 @@
+package org.keycloak.services.resources;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+@Path("/js")
+public class JsResource {
+
+    @GET
+    @Path("/keycloak.js")
+    @Produces("text/javascript")
+    public Response getJs() {
+        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("keycloak.js");
+        if (inputStream != null) {
+            return Response.ok(inputStream).build();
+        } else {
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+    }
+
+}
diff --git a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
index 7f49ff5..7c8371b 100755
--- a/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
+++ b/services/src/main/java/org/keycloak/services/resources/KeycloakApplication.java
@@ -78,7 +78,10 @@ public class KeycloakApplication extends Application {
         singletons.add(new SocialResource(tokenManager, socialRequestManager));
         classes.add(SkeletonKeyContextResolver.class);
         classes.add(QRCodeResource.class);
+        classes.add(AdminResource.class);
         classes.add(ThemeResource.class);
+        classes.add(JsResource.class);
+        classes.add(WelcomeResource.class);
 
         setupDefaultRealm(context.getContextPath());
 
diff --git a/services/src/main/java/org/keycloak/services/resources/QRCodeResource.java b/services/src/main/java/org/keycloak/services/resources/QRCodeResource.java
index 3ae4b67..b219613 100755
--- a/services/src/main/java/org/keycloak/services/resources/QRCodeResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/QRCodeResource.java
@@ -20,7 +20,7 @@ import java.io.OutputStream;
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
-@Path("/qrcode")
+@Path("/rest/qrcode")
 public class QRCodeResource {
 
     @GET
diff --git a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
index 0b8126c..daa8762 100755
--- a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
@@ -28,7 +28,7 @@ import javax.ws.rs.core.UriInfo;
  * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
  * @version $Revision: 1 $
  */
-@Path("/realms")
+@Path("/rest/realms")
 public class RealmsResource {
     protected static Logger logger = Logger.getLogger(RealmsResource.class);
 
diff --git a/services/src/main/java/org/keycloak/services/resources/SocialResource.java b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
index b59a28c..683a399 100755
--- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java
@@ -76,7 +76,7 @@ import java.util.Map.Entry;
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
-@Path("/social")
+@Path("/rest/social")
 public class SocialResource {
 
     protected static Logger logger = Logger.getLogger(SocialResource.class);
diff --git a/services/src/main/java/org/keycloak/services/resources/ThemeResource.java b/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
index 4d06466..8a2df04 100755
--- a/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/ThemeResource.java
@@ -16,7 +16,7 @@ import java.io.InputStream;
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
  */
-@Path("/theme")
+@Path("/rest/theme")
 public class ThemeResource {
 
     private static final Logger logger = Logger.getLogger(ThemeResource.class);
diff --git a/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java b/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java
new file mode 100644
index 0000000..6df21f2
--- /dev/null
+++ b/services/src/main/java/org/keycloak/services/resources/WelcomeResource.java
@@ -0,0 +1,46 @@
+package org.keycloak.services.resources;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.UriInfo;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
+ */
+@Path("/")
+public class WelcomeResource {
+
+    @Context
+    private UriInfo uriInfo;
+
+    @GET
+    @Produces("text/html")
+    public Response getWelcomePage() throws URISyntaxException {
+        String requestUri = uriInfo.getRequestUri().toString();
+        if (!requestUri.endsWith("/")) {
+            return Response.seeOther(new URI(requestUri + "/")).build();
+        } else {
+            return getResource("index.html");
+        }
+    }
+
+    @GET
+    @Path("/welcome-content/{name}")
+    @Produces("text/html")
+    public Response getResource(@PathParam("name") String name) {
+        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("welcome-content/" + name);
+        if (inputStream != null) {
+            return Response.ok(inputStream).build();
+        } else {
+            return Response.status(Response.Status.NOT_FOUND).build();
+        }
+    }
+
+}
diff --git a/services/src/main/resources/META-INF/mime.types b/services/src/main/resources/META-INF/mime.types
index 432f4c8..1f77e9d 100644
--- a/services/src/main/resources/META-INF/mime.types
+++ b/services/src/main/resources/META-INF/mime.types
@@ -1 +1,4 @@
-text/css css CSS
\ No newline at end of file
+text/css css CSS
+text/javascript js JS
+text/javascript js JS
+image/svg+xml svg SVG
\ No newline at end of file
diff --git a/services/src/main/resources/welcome-content/favicon.ico b/services/src/main/resources/welcome-content/favicon.ico
new file mode 100644
index 0000000..b30dce5
Binary files /dev/null and b/services/src/main/resources/welcome-content/favicon.ico differ
diff --git a/testsuite/integration/pom.xml b/testsuite/integration/pom.xml
index f2d9eb0..28fc5cb 100755
--- a/testsuite/integration/pom.xml
+++ b/testsuite/integration/pom.xml
@@ -87,11 +87,6 @@
         </dependency>
         <dependency>
             <groupId>org.keycloak</groupId>
-            <artifactId>keycloak-admin-ui</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.keycloak</groupId>
             <artifactId>keycloak-audit-api</artifactId>
             <version>${project.version}</version>
         </dependency>
diff --git a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
index 167bdd6..e8c4029 100755
--- a/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
+++ b/testsuite/integration/src/main/java/org/keycloak/testutils/KeycloakServer.java
@@ -23,42 +23,32 @@ package org.keycloak.testutils;
 
 import io.undertow.Undertow;
 import io.undertow.Undertow.Builder;
-import io.undertow.server.handlers.resource.FileResource;
-import io.undertow.server.handlers.resource.FileResourceManager;
-import io.undertow.server.handlers.resource.Resource;
-import io.undertow.server.handlers.resource.ResourceChangeListener;
-import io.undertow.server.handlers.resource.ResourceManager;
-import io.undertow.server.handlers.resource.URLResource;
 import io.undertow.servlet.Servlets;
 import io.undertow.servlet.api.DefaultServletConfig;
 import io.undertow.servlet.api.DeploymentInfo;
 import io.undertow.servlet.api.FilterInfo;
-import io.undertow.servlet.api.ServletInfo;
 import org.jboss.resteasy.logging.Logger;
 import org.jboss.resteasy.plugins.server.undertow.UndertowJaxrsServer;
 import org.jboss.resteasy.spi.ResteasyDeployment;
 import org.keycloak.models.Config;
-import org.keycloak.provider.ProviderSessionFactory;
-import org.keycloak.services.filters.ClientConnectionFilter;
-import org.keycloak.theme.DefaultLoginThemeProvider;
-import org.keycloak.services.tmp.TmpAdminRedirectServlet;
-import org.keycloak.util.JsonSerialization;
-import org.keycloak.models.Constants;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.KeycloakSessionFactory;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
+import org.keycloak.provider.ProviderSessionFactory;
 import org.keycloak.representations.idm.RealmRepresentation;
+import org.keycloak.services.filters.ClientConnectionFilter;
 import org.keycloak.services.filters.KeycloakSessionServletFilter;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.resources.KeycloakApplication;
+import org.keycloak.theme.DefaultKeycloakThemeProvider;
+import org.keycloak.util.JsonSerialization;
 
 import javax.servlet.DispatcherType;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.net.URL;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -135,12 +125,12 @@ public class KeycloakServer {
             }
 
             File dir = new File(resources).getAbsoluteFile();
-            if (!dir.isDirectory() || !new File(dir, "admin-ui").isDirectory()) {
+            if (!dir.isDirectory() || !new File(dir, "forms").isDirectory()) {
                 throw new RuntimeException("Invalid resources directory");
             }
 
             if (Config.getThemeDir() == null) {
-                System.setProperty(DefaultLoginThemeProvider.class.getName() + ".disabled", "");
+                System.setProperty(DefaultKeycloakThemeProvider.class.getName() + ".disabled", "");
                 Config.setThemeDir(file(dir.getAbsolutePath(), "forms", "common-themes", "src", "main", "resources", "theme").getAbsolutePath());
             }
 
@@ -258,26 +248,21 @@ public class KeycloakServer {
 
         server = new UndertowJaxrsServer().start(builder);
 
-        DeploymentInfo di = server.undertowDeployment(deployment, "rest");
+        DeploymentInfo di = server.undertowDeployment(deployment, "");
         di.setClassLoader(getClass().getClassLoader());
         di.setContextPath("/auth");
         di.setDeploymentName("Keycloak");
-        di.setResourceManager(new KeycloakResourceManager(config.getResourcesHome()));
 
         di.setDefaultServletConfig(new DefaultServletConfig(true));
-        di.addWelcomePage("index.html");
+        di.addWelcomePage("welcome-content/index.html");
 
         FilterInfo filter = Servlets.filter("SessionFilter", KeycloakSessionServletFilter.class);
         di.addFilter(filter);
-        di.addFilterUrlMapping("SessionFilter", "/rest/*", DispatcherType.REQUEST);
+        di.addFilterUrlMapping("SessionFilter", "/*", DispatcherType.REQUEST);
 
         FilterInfo connectionFilter = Servlets.filter("ClientConnectionFilter", ClientConnectionFilter.class);
         di.addFilter(connectionFilter);
-        di.addFilterUrlMapping("ClientConnectionFilter", "/rest/*", DispatcherType.REQUEST);
-
-        ServletInfo tmpAdminRedirectServlet = Servlets.servlet("TmpAdminRedirectServlet", TmpAdminRedirectServlet.class);
-        tmpAdminRedirectServlet.addMappings("/admin", "/admin/");
-        di.addServlet(tmpAdminRedirectServlet);
+        di.addFilterUrlMapping("ClientConnectionFilter", "/*", DispatcherType.REQUEST);
 
         server.deploy(di);
 
@@ -310,52 +295,6 @@ public class KeycloakServer {
         info("Stopped Keycloak");
     }
 
-    public static class KeycloakResourceManager implements ResourceManager {
-
-        private String resourcesHome;
-
-        public KeycloakResourceManager(String resourcesHome) {
-            this.resourcesHome = resourcesHome;
-        }
-
-        @Override
-        public Resource getResource(String path) throws IOException {
-            if (resourcesHome == null) {
-                String realPath = "META-INF/resources" + path;
-                URL url = getClass().getClassLoader().getResource(realPath);
-                return new URLResource(url, url.openConnection(), path);
-            } else {
-                File file;
-                if (path.startsWith("/admin/")) {
-                    file = file(resourcesHome, "admin-ui", "src", "main", "resources", "META-INF", "resources", path.replace('/', File.separatorChar));
-                } else if (path.startsWith("/js/")) {
-                    file = file(resourcesHome, "integration", "js", "src", "main", "resources", "META-INF", "resources", path.replace('/', File.separatorChar));
-                } else {
-                    throw new IOException("Unknown resource " + path);
-                }
-                return new FileResource(file, new FileResourceManager(file.getParentFile(), 1), path);
-            }
-        }
-
-        @Override
-        public boolean isResourceChangeListenerSupported() {
-            return false;
-        }
-
-        @Override
-        public void registerResourceChangeListener(ResourceChangeListener listener) {
-        }
-
-        @Override
-        public void removeResourceChangeListener(ResourceChangeListener listener) {
-        }
-
-        @Override
-        public void close() throws IOException {
-        }
-
-    }
-
     private static File file(String... path) {
         StringBuilder s = new StringBuilder();
         for (String p : path) {