diff --git a/src/linkahead/common/administration.py b/src/linkahead/common/administration.py
index 417081b0dad19ce15049b8ce05aeef8cc86607f7..92129a4d4918a5f8ac25c80d7e7107431b227557 100644
--- a/src/linkahead/common/administration.py
+++ b/src/linkahead/common/administration.py
@@ -23,7 +23,7 @@
 #
 # ** end header
 #
-
+from __future__ import annotations
 """missing docstring."""
 
 import random
@@ -38,8 +38,12 @@ from ..exceptions import (EntityDoesNotExistError, HTTPClientError,
                           ServerConfigurationException)
 from .utils import xml2str
 
+from typing import Dict, Optional, TYPE_CHECKING
+if TYPE_CHECKING:
+    from ..common.models import Entity
+
 
-def set_server_property(key, value):
+def set_server_property(key: str, value: str):
     """set_server_property.
 
     Set a server property.
@@ -65,7 +69,7 @@ def set_server_property(key, value):
             "Debug mode in server is probably disabled.") from None
 
 
-def get_server_properties():
+def get_server_properties() -> Dict[str, Optional[str]]:
     """get_server_properties.
 
     Get all server properties as a dict.
@@ -84,7 +88,7 @@ def get_server_properties():
             "Debug mode in server is probably disabled.") from None
 
     xml = etree.parse(body)
-    props = dict()
+    props: Dict[str, Optional[str]] = dict()
 
     for elem in xml.getroot():
         props[elem.tag] = elem.text
@@ -92,7 +96,7 @@ def get_server_properties():
     return props
 
 
-def get_server_property(key):
+def get_server_property(key: str) -> Optional[str]:
     """get_server_property.
 
     Get a server property.
@@ -149,7 +153,7 @@ def generate_password(length: int):
     return password
 
 
-def _retrieve_user(name, realm=None, **kwargs):
+def _retrieve_user(name: str, realm: Optional[str] = None, **kwargs):
     con = get_connection()
     try:
         return con._http_request(method="GET", path="User/" + (realm + "/" + name if realm is not None else name), **kwargs).read()
@@ -161,7 +165,7 @@ def _retrieve_user(name, realm=None, **kwargs):
         raise
 
 
-def _delete_user(name, **kwargs):
+def _delete_user(name: str, **kwargs):
     con = get_connection()
     try:
         return con._http_request(method="DELETE", path="User/" + name, **kwargs).read()
@@ -173,10 +177,14 @@ def _delete_user(name, **kwargs):
         raise
 
 
-def _update_user(name, realm=None, password=None, status=None,
-                 email=None, entity=None, **kwargs):
+def _update_user(name: str,
+                 realm: Optional[str] = None,
+                 password: Optional[str] = None,
+                 status: Optional[str] = None,
+                 email: Optional[str] = None,
+                 entity: Optional[Entity] = None, **kwargs):
     con = get_connection()
-    params = {}
+    params: Dict[str, Optional[str]] = {}
 
     if password is not None:
         params["password"] = password
@@ -204,7 +212,11 @@ def _update_user(name, realm=None, password=None, status=None,
         raise
 
 
-def _insert_user(name, password=None, status=None, email=None, entity=None, **kwargs):
+def _insert_user(name: str,
+                 password: Optional[str] = None,
+                 status: Optional[str] = None,
+                 email: Optional[str] = None,
+                 entity: Optional[Entity] = None, **kwargs):
     con = get_connection()
     params = {"username": name}
 
@@ -394,15 +406,15 @@ priority : bool, optional
     """
 
     @staticmethod
-    def _parse_boolean(bstr):
+    def _parse_boolean(bstr) -> bool:
         return str(bstr) in ["True", "true", "TRUE", "yes"]
 
-    def __init__(self, action, permission, priority=False):
+    def __init__(self, action: str, permission: str, priority: bool = False):
         self._action = action
         self._permission = permission
         self._priority = PermissionRule._parse_boolean(priority)
 
-    def _to_xml(self):
+    def _to_xml(self) -> etree._Element:
         xml = etree.Element(self._action)
         xml.set("permission", self._permission)
 
@@ -412,12 +424,15 @@ priority : bool, optional
         return xml
 
     @staticmethod
-    def _parse_element(elem):
-        return PermissionRule(elem.tag, elem.get(
-            "permission"), elem.get("priority"))
+    def _parse_element(elem: etree._Element):
+        permission = elem.get("permission")
+        if permission is None:
+            raise ValueError(f"Permission is missing in PermissionRule xml: {etree.tostring(elem)}")
+        priority = PermissionRule._parse_boolean(elem.get("priority"))
+        return PermissionRule(elem.tag, permission, priority if priority is not None else False)
 
     @staticmethod
-    def _parse_body(body):
+    def _parse_body(body: str):
         xml = etree.fromstring(body)
         ret = set()