diff --git a/jobs.py b/jobs.py
index c5d6442f705f6bc0bb6f299109f529c02c166d8d..aff04af9758791c49ab5eccd0d75424d88131da2 100644
--- a/jobs.py
+++ b/jobs.py
@@ -1,6 +1,7 @@
 from server import *
 import traceback
 import json
+import random
 
 @app.route('/jobs/overview')
 @register_navbar('Jobs', iconlib='fa',  icon='suitcase')
@@ -31,11 +32,18 @@ def date_json_handler(obj):
 
 @app.route('/jobs/api/ping', methods=['GET', 'POST'])
 @jobs_api_token_required
-def jobs_ping():
+def jobs_worker_ping():
 	hostname = request.values['host']
 	query('INSERT OR REPLACE INTO worker (hostname, last_ping) values (?, ?)',hostname,datetime.now())
 	return 'OK',200
 
+@app.route('/jobs/api/job/<id>/ping', methods=['GET', 'POST'])
+@jobs_api_token_required
+def jobs_ping(id):
+	hostname = request.values['host']
+	query('UPDATE jobs SET worker = ?, last_ping = ? where id = ?',hostname,datetime.now(),id)
+	return 'OK',200
+
 @app.route('/jobs/api/schedule', methods=['POST'])
 @jobs_api_token_required
 def jobs_schedule():
@@ -43,9 +51,18 @@ def jobs_schedule():
 	print(hostdata)
 	if not hostdata:
 		return 'no data', 500
+	job = None
 	jobtypes = hostdata['jobtypes'] if 'jobtypes' in hostdata else []
-	for i in query('SELECT * FROM jobs WHERE state = "ready" ORDER BY priority DESC'):
-		if i['type'] in hostdata['jobtypes'].split(','):
-			job=i
-			break
+	while (not job):
+		query("BEGIN")
+		for i in query('SELECT * FROM jobs WHERE state = "ready" ORDER BY priority DESC'):
+			if i['type'] in hostdata['jobtypes'].split(','):
+				job=i
+				break
+		modify('UPDATE jobs SET state="running", worker = ? WHERE id = ?', hostdata['host'], job['id'])
+		try:
+			query("COMMIT")
+		except:
+			job = None
+			sleep(random.randinti(0,50))
 	return Response(json.dumps(job, default=date_json_handler),  mimetype='application/json')