diff --git a/daemons/ganeti-noded b/daemons/ganeti-noded
index 606c01837b299939b086e45af3445678aef89223..79116ffa84a1c731b39168bca13519fc837fa24c 100755
--- a/daemons/ganeti-noded
+++ b/daemons/ganeti-noded
@@ -39,11 +39,15 @@ from ganeti import logger
 from ganeti import constants
 from ganeti import objects
 from ganeti import errors
+from ganeti import jstore
 from ganeti import ssconf
 from ganeti import http
 from ganeti import utils
 
 
+queue_lock = None
+
+
 class NodeDaemonRequestHandler(http.HTTPRequestHandler):
   """The server implementation.
 
@@ -539,7 +543,15 @@ class NodeDaemonRequestHandler(http.HTTPRequestHandler):
 
     """
     (file_name, content) = params
-    return backend.JobQueueUpdate(file_name, content)
+
+    # Locking in exclusive, blocking mode because there could be several
+    # children running at the same time.
+    # TODO: Implement nonblocking locking with retries?
+    queue_lock.Exclusive(blocking=True)
+    try:
+      return backend.JobQueueUpdate(file_name, content)
+    finally:
+      queue_lock.Unlock()
 
   @staticmethod
   def perspective_jobqueue_purge(params):
@@ -600,6 +612,8 @@ def main():
   """Main function for the node daemon.
 
   """
+  global queue_lock
+
   options, args = ParseOptions()
   utils.debug = options.debug
   for fname in (constants.SSL_CERT_FILE,):
@@ -640,6 +654,9 @@ def main():
                       stderr_logging=not options.fork)
   logging.info("ganeti node daemon startup")
 
+  # Prepare job queue
+  queue_lock = jstore.InitAndVerifyQueue(must_lock=False)
+
   if options.fork:
     server = ForkingHTTPServer(('', port))
   else: