diff --git a/warden_server/test_warden_server.py b/warden_server/test_warden_server.py
index fddf0a0e7bcdd66e604e2979d6f51b29e176623b..4926f6c8c55edf7692ab0f098286ae7ac5776945 100755
--- a/warden_server/test_warden_server.py
+++ b/warden_server/test_warden_server.py
@@ -200,12 +200,17 @@ class Warden3ServerTest(unittest.TestCase):
             ("/sendEvents?secret=abc", "", "200 OK", ['{"saved": 0}']),
             ("/sendEvents?secret=abc", "{'test': 'true'}", "400 Deserialization error.", None),
             ("/sendEvents?secret=abc", '{"test": "true"}', "400 List of events expected.", None),
-            ("/sendEvents?secret=abc", '[{"test": "true"}]', "422 Event does not bear valid Node attribute", None),
-            ("/sendEvents?secret=abc", '[{"Node": ["test", "test2"]}]', "422 Event does not bear valid Node attribute", None),
-            ("/sendEvents?secret=abc", '[{"Node": ["Name", "test"]}]', "422 Event does not bear valid Node attribute", None),
-            ("/sendEvents?secret=abc", '[{"Node": [{"Name"}]}]', "400 Deserialization error.", None),
-            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}]}]', "422 Node does not correspond with saving client", None),
-            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}]}]', "200 OK", ['{"saved": 1}']),
+            ("/sendEvents?secret=abc", '[{"test": "true"}]', "422 Missing IDEA ID", None),
+            ("/sendEvents?secret=abc", '[{"test": "true", "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None),
+            ("/sendEvents?secret=abc", '[{"Node": ["test", "test2"], "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None),
+            ("/sendEvents?secret=abc", '[{"Node": ["Name", "test"], "ID": "120820201142"}]', "422 Event does not bear valid Node attribute", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name"}], "ID": "120820201142"}]', "400 Deserialization error.", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}], "ID": "120820201142"}]', "422 Node does not correspond with saving client", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "test"}], "ID": "verylongideaidverylongideaidverylongideaidverylongideaidverylongideaid"}]', "422 The provided event ID is too long", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "verylongideaidverylongideaidverylongideaidverylongideaidverylongideaid"}]', "422 The provided event ID is too long", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "ideaidcontaininga\\u0000byte"}]', "422 IDEA ID cannot contain null bytes", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "verylongideaidverylongideaid\\u0000verylongideaidverylongideaidverylongideaid"}]', "422 Multiple errors", None),
+            ("/sendEvents?secret=abc", '[{"Node": [{"Name": "cz.cesnet.warden3test"}], "ID": "120820201142"}]', "200 OK", ['{"saved": 1}']),
         ]
         for query, payload, expected_status, expected_response in tests:
             with self.subTest(query=query, payload=payload, expected_status=expected_status, expected_response=expected_response):
diff --git a/warden_server/warden_server.py b/warden_server/warden_server.py
index 6c1b86b899c8adf29e911dd106dd8dbdb3b82b1e..3e84cb829d9c1ce73db4c4407b2ca9d1f8ca8eba 100755
--- a/warden_server/warden_server.py
+++ b/warden_server/warden_server.py
@@ -1743,6 +1743,27 @@ class WardenHandler(ObjectBase):
             ]
         return []
 
+    def check_idea_id(self, event, event_indx):
+        id_length_limit = 64
+        try:
+            id_ = event["ID"]
+        except (KeyError, TypeError, ValueError):
+            return [ErrorMessage(422, "Missing IDEA ID", {event_indx})]
+        if not isinstance(id_, unicode) or len(id_) == 0:
+            return [ErrorMessage(422, "The provided IDEA ID is invalid", {event_indx})]
+
+        errors = []
+        if len(id_) > id_length_limit:
+            errors.append(
+                ErrorMessage(
+                    422, "The provided event ID is too long",
+                    {event_indx}, id_length_limit=id_length_limit
+                )
+            )
+        if '\x00' in id_:
+            errors.append(ErrorMessage(422, "IDEA ID cannot contain null bytes", {event_indx}))
+        return errors
+
     def add_errors(self, errs_to_add):
         for err in errs_to_add:
             self.errs.setdefault((err.error, err.message, err.unique_id), err).events.update(err.events)
@@ -1774,6 +1795,11 @@ class WardenHandler(ObjectBase):
                 self.add_errors(v_errs)
                 continue
 
+            idea_id_errs = self.check_idea_id(event, i)
+            if idea_id_errs:
+                self.add_errors(idea_id_errs)
+                continue
+
             node_errs = self.check_node(event, i, self.req.client.name)
             if node_errs:
                 self.add_errors(node_errs)