diff --git a/gracedb/ligoauth/decorators.py b/gracedb/ligoauth/decorators.py
index 4767589c9fcff25ab22433371d156847360c1ca9..bd6fe23cfc79a9d8f73a845aa56fb76163050191 100644
--- a/gracedb/ligoauth/decorators.py
+++ b/gracedb/ligoauth/decorators.py
@@ -25,3 +25,26 @@ def internal_user_required(function=None, raise_exception=True, **kwargs):
     if function:
         return actual_decorator(function)
     return actual_decorator
+
+
+def lvem_observers_only(function=None, login_url=None, superuser_allowed=False,
+    raise_exception=True):
+    """Allow access only to non-LVC LV-EM observers"""
+
+    def check_groups(user):
+        in_lvem_obs = user.groups.filter(
+            name=settings.LVEM_OBSERVERS_GROUP).exists()
+        in_lvc = user.groups.filter(name=settings.LVC_GROUP).exists()
+
+        if ((in_lvem_obs and not in_lvc) or
+            (superuser_allowed and user.is_superuser)):
+            return True
+
+        if raise_exception:
+            raise PermissionDenied
+        return False
+
+    actual_decorator = user_passes_test(check_groups, login_url=login_url)
+    if function:
+        return actual_decorator(function)
+    return actual_decorator
diff --git a/gracedb/templates/profile/manage_password.html b/gracedb/templates/ligoauth/manage_password.html
similarity index 100%
rename from gracedb/templates/profile/manage_password.html
rename to gracedb/templates/ligoauth/manage_password.html