diff --git a/www/js/directives.js b/www/js/directives.js
index c1b6c8daa54d0bbc611314d35c1273cb089cd8e7..ee0a5b4562839850377e074f632d29755680fdce 100644
--- a/www/js/directives.js
+++ b/www/js/directives.js
@@ -47,6 +47,20 @@ angular.module('cesium')
     };
   })
 
+  .directive('email', function() {
+    var EMAIL_REGEXP = new RegExp('^[a-z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$');
+    return {
+      require: 'ngModel',
+      link: function(scope, element, attrs, ngModel) {
+        if (ngModel) {
+          ngModel.$validators.email = function (value) {
+            return ngModel.$isEmpty(value) || EMAIL_REGEXP.test(value);
+          };
+        }
+      }
+    };
+  })
+
   // Add a copy-on-click directive
   .directive('copyOnClick', function ($window, $document, Device, UIUtils) {
     'ngInject';