GUACAMOLE-320: Merge Ensure blank values for text attributes are interpreted equivalently to null.
diff --git a/extensions/guacamole-auth-cas/.gitignore b/extensions/guacamole-auth-cas/.gitignore
index c3a023f..30eb487 100644
--- a/extensions/guacamole-auth-cas/.gitignore
+++ b/extensions/guacamole-auth-cas/.gitignore
@@ -1,3 +1,3 @@
 *~
 target/
-META-INF/
+src/main/resources/generated/
diff --git a/extensions/guacamole-auth-cas/pom.xml b/extensions/guacamole-auth-cas/pom.xml
index af129f2..e76c50b 100644
--- a/extensions/guacamole-auth-cas/pom.xml
+++ b/extensions/guacamole-auth-cas/pom.xml
@@ -53,6 +53,85 @@
                 </configuration>
             </plugin>
 
+            <!-- Pre-cache Angular templates with maven-angular-plugin -->
+            <plugin>
+                <groupId>com.keithbranton.mojo</groupId>
+                <artifactId>angular-maven-plugin</artifactId>
+                <version>0.3.2</version>
+                <executions>
+                    <execution>
+                        <phase>generate-resources</phase>
+                        <goals>
+                            <goal>html2js</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <sourceDir>${basedir}/src/main/resources</sourceDir>
+                    <include>**/*.html</include>
+                    <target>${basedir}/src/main/resources/generated/templates-main/templates.js</target>
+                    <prefix>app/ext/guac-cas</prefix>
+                </configuration>
+            </plugin>
+
+            <!-- JS/CSS Minification Plugin -->
+            <plugin>
+                <groupId>com.samaxes.maven</groupId>
+                <artifactId>minify-maven-plugin</artifactId>
+                <version>1.7.5</version>
+                <executions>
+                    <execution>
+                        <id>default-cli</id>
+                        <configuration>
+                            <charset>UTF-8</charset>
+
+                            <webappSourceDir>${basedir}/src/main/resources</webappSourceDir>
+                            <webappTargetDir>${project.build.directory}/classes</webappTargetDir>
+
+                            <cssSourceDir>/</cssSourceDir>
+                            <cssTargetDir>/</cssTargetDir>
+                            <cssFinalFile>cas.css</cssFinalFile>
+
+                            <cssSourceFiles>
+                                <cssSourceFile>license.txt</cssSourceFile>
+                            </cssSourceFiles>
+
+                            <cssSourceIncludes>
+                                <cssSourceInclude>**/*.css</cssSourceInclude>
+                            </cssSourceIncludes>
+
+                            <jsSourceDir>/</jsSourceDir>
+                            <jsTargetDir>/</jsTargetDir>
+                            <jsFinalFile>cas.js</jsFinalFile>
+
+                            <jsSourceFiles>
+                                <jsSourceFile>license.txt</jsSourceFile>
+                            </jsSourceFiles>
+
+                            <jsSourceIncludes>
+                                <jsSourceInclude>**/*.js</jsSourceInclude>
+                            </jsSourceIncludes>
+
+                            <!-- Do not minify and include tests -->
+                            <jsSourceExcludes>
+                                <jsSourceExclude>**/*.test.js</jsSourceExclude>
+                            </jsSourceExcludes>
+                            <jsEngine>CLOSURE</jsEngine>
+
+                            <!-- Disable warnings for JSDoc annotations -->
+                            <closureWarningLevels>
+                                <misplacedTypeAnnotation>OFF</misplacedTypeAnnotation>
+                                <nonStandardJsDocs>OFF</nonStandardJsDocs>
+                            </closureWarningLevels>
+
+                        </configuration>
+                        <goals>
+                            <goal>minify</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
             <!-- Copy dependencies prior to packaging -->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
@@ -105,6 +184,7 @@
                     <excludes>
                         <exclude>**/*.json</exclude>
                         <exclude>src/licenses/**/*</exclude>
+                        <exclude>src/main/resources/templates/*.html</exclude>
                     </excludes>
                 </configuration>
 
diff --git a/extensions/guacamole-auth-cas/src/main/resources/casConfig.js b/extensions/guacamole-auth-cas/src/main/resources/config/casConfig.js
similarity index 93%
rename from extensions/guacamole-auth-cas/src/main/resources/casConfig.js
rename to extensions/guacamole-auth-cas/src/main/resources/config/casConfig.js
index 76ee755..95356f7 100644
--- a/extensions/guacamole-auth-cas/src/main/resources/casConfig.js
+++ b/extensions/guacamole-auth-cas/src/main/resources/config/casConfig.js
@@ -25,7 +25,7 @@
 
     // Define field for ticket from CAS service
     formServiceProvider.registerFieldType("GUAC_CAS_TICKET", {
-        templateUrl   : '',
+        templateUrl   : 'app/ext/guac-cas/templates/casTicketField.html',
         controller    : 'guacCASController',
         module        : 'guacCAS'
     });
diff --git a/extensions/guacamole-auth-cas/src/main/resources/casController.js b/extensions/guacamole-auth-cas/src/main/resources/controllers/casController.js
similarity index 100%
rename from extensions/guacamole-auth-cas/src/main/resources/casController.js
rename to extensions/guacamole-auth-cas/src/main/resources/controllers/casController.js
diff --git a/extensions/guacamole-auth-cas/src/main/resources/guac-manifest.json b/extensions/guacamole-auth-cas/src/main/resources/guac-manifest.json
index fd963a2..d241e38 100644
--- a/extensions/guacamole-auth-cas/src/main/resources/guac-manifest.json
+++ b/extensions/guacamole-auth-cas/src/main/resources/guac-manifest.json
@@ -14,9 +14,15 @@
     ],
 
     "js" : [
-        "casModule.js",
-        "casController.js",
-        "casConfig.js"
-    ]
+        "cas.min.js"
+    ],
+
+    "css" : [
+        "cas.min.css"
+    ],
+
+    "resources" : {
+        "templates/casTicketField.html" : "text/html"
+    }
 
 }
diff --git a/extensions/guacamole-auth-cas/src/main/resources/casConfig.js b/extensions/guacamole-auth-cas/src/main/resources/license.txt
similarity index 66%
copy from extensions/guacamole-auth-cas/src/main/resources/casConfig.js
copy to extensions/guacamole-auth-cas/src/main/resources/license.txt
index 76ee755..042f3ce 100644
--- a/extensions/guacamole-auth-cas/src/main/resources/casConfig.js
+++ b/extensions/guacamole-auth-cas/src/main/resources/license.txt
@@ -16,18 +16,3 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-/**
- * Config block which registers CAS-specific field types.
- */
-angular.module('guacCAS').config(['formServiceProvider',
-        function guacCASConfig(formServiceProvider) {
-
-    // Define field for ticket from CAS service
-    formServiceProvider.registerFieldType("GUAC_CAS_TICKET", {
-        templateUrl   : '',
-        controller    : 'guacCASController',
-        module        : 'guacCAS'
-    });
-
-}]);
diff --git a/extensions/guacamole-auth-cas/src/main/resources/casConfig.js b/extensions/guacamole-auth-cas/src/main/resources/styles/cas.css
similarity index 66%
copy from extensions/guacamole-auth-cas/src/main/resources/casConfig.js
copy to extensions/guacamole-auth-cas/src/main/resources/styles/cas.css
index 76ee755..6c775d2 100644
--- a/extensions/guacamole-auth-cas/src/main/resources/casConfig.js
+++ b/extensions/guacamole-auth-cas/src/main/resources/styles/cas.css
@@ -17,17 +17,19 @@
  * under the License.
  */
 
-/**
- * Config block which registers CAS-specific field types.
- */
-angular.module('guacCAS').config(['formServiceProvider',
-        function guacCASConfig(formServiceProvider) {
+.cas-ticket-field-container {
+    height: 100%;
+    width: 100%;
+    position: fixed;
+    left: 0;
+    top: 0;
+    display: table;
+    background: white;
+}
 
-    // Define field for ticket from CAS service
-    formServiceProvider.registerFieldType("GUAC_CAS_TICKET", {
-        templateUrl   : '',
-        controller    : 'guacCASController',
-        module        : 'guacCAS'
-    });
-
-}]);
+.cas-ticket-field {
+    width: 100%;
+    display: table-cell;
+    vertical-align: middle;
+    text-align: center;
+}
diff --git a/extensions/guacamole-auth-cas/src/main/resources/templates/casTicketField.html b/extensions/guacamole-auth-cas/src/main/resources/templates/casTicketField.html
new file mode 100644
index 0000000..55ca4bb
--- /dev/null
+++ b/extensions/guacamole-auth-cas/src/main/resources/templates/casTicketField.html
@@ -0,0 +1,5 @@
+<div class="cas-ticket-field-container">
+    <div class="cas-ticket-field">
+        <p>{{ 'LOGIN.INFO_CAS_REDIRECT_PENDING' | translate }}</p>
+    </div>
+</div>
diff --git a/extensions/guacamole-auth-cas/src/main/resources/translations/en.json b/extensions/guacamole-auth-cas/src/main/resources/translations/en.json
index dfda606..29d1363 100644
--- a/extensions/guacamole-auth-cas/src/main/resources/translations/en.json
+++ b/extensions/guacamole-auth-cas/src/main/resources/translations/en.json
@@ -6,7 +6,7 @@
 
     "LOGIN" : {
         "FIELD_HEADER_TICKET"        : "",
-        "INFO_CAS_REDIRECT_PENDING"  : "Please wait, redirecting to CAS authentication."
+        "INFO_CAS_REDIRECT_PENDING"  : "Please wait, redirecting to CAS authentication..."
     }
 
 }