diff --git a/cesnet/cesnet.cpp b/cesnet/cesnet.cpp
index 80656520a2f7a6dc076e9dbf225284a304124fa7..f633a798696e08de6e000b503493d958a738158f 100644
--- a/cesnet/cesnet.cpp
+++ b/cesnet/cesnet.cpp
@@ -12,7 +12,7 @@
 #include <sys/shm.h>
 #endif
 
-#define REQUIRED_SHM_VERSION 5
+#define REQUIRED_SHM_VERSION 6
 #define SEM_KEY 5004
 #define SHM_KEY 5004
 
@@ -180,8 +180,8 @@ void cesnet_set_render_buffer_yuv_i420(unsigned char *y, unsigned char *u, unsig
 		perror("shmat");
 		return;
 	}
-	/// 2 semaphores: [ready_to_consume_frame, freame_ready]
-	int sem = semget(SEM_KEY, 2, 0);
+	/// 3 semaphores: [ready_to_consume_frame, freame_ready, lock]
+	int sem = semget(SEM_KEY, 3, 0);
 	if (sem == -1) {
 		perror("semget");
 		return;
@@ -191,11 +191,14 @@ void cesnet_set_render_buffer_yuv_i420(unsigned char *y, unsigned char *u, unsig
 		return;
 	}
 
-	struct sembuf op;
-	op.sem_num = 0; // wait until UltraGrid is able to take a frame
-	op.sem_op = -1; // decrement by one
-	op.sem_flg = 0;
-	if (semop(sem, &op, 1) == -1) {
+	struct sembuf op[2];
+	op[0].sem_num = 0; // wait until UltraGrid is able to take a frame
+	op[0].sem_op = -1; // decrement by one
+	op[0].sem_flg = 0;
+	op[1].sem_num = 2; // lock
+	op[1].sem_op = -1;
+	op[1].sem_flg = 0;
+	if (semop(sem, op, 2) == -1) {
 		perror("semop");
 		return;
 	}
@@ -236,10 +239,13 @@ void cesnet_set_render_buffer_yuv_i420(unsigned char *y, unsigned char *u, unsig
 		convert_render_pkt_to_view_matrix(&cesnet_shm->pkt, g_view_matrix);
 	}
 
-	op.sem_num = 1;
-	op.sem_op = 1;  // and post that we have a new frame
-	op.sem_flg = 0;
-	if (semop(sem, &op, 1) == -1) {
+	op[0].sem_num = 1;
+	op[0].sem_op = 1;  // and post that we have a new frame
+	op[0].sem_flg = 0;
+	op[1].sem_num = 2;
+	op[1].sem_op = 1;  // unlock
+	op[1].sem_flg = 0;
+	if (semop(sem, op, 2) == -1) {
 		perror("semop");
 	}
 	shmdt(cesnet_shm);