diff --git a/Source/DisplayCluster/Private/DisplayClusterConstants.h b/Source/DisplayCluster/Private/DisplayClusterConstants.h
index abc132245985dec89e99e8dc110b0b55546a9b66..6a10c4bfc2097af9a5d12fea919b93b0caf1d97b 100644
--- a/Source/DisplayCluster/Private/DisplayClusterConstants.h
+++ b/Source/DisplayCluster/Private/DisplayClusterConstants.h
@@ -12,8 +12,8 @@ namespace DisplayClusterConstants
 	{
 		static constexpr int32  ClientConnectTriesAmount    = 100;   // times
 		static constexpr float  ClientConnectRetryDelay     = 1.0f; // sec
-		static constexpr uint32 BarrierGameStartWaitTimeout = 80000; // ms
-		static constexpr uint32 BarrierWaitTimeout          = 10000; // ms
+		static constexpr uint32 BarrierGameStartWaitTimeout = 90000; // ms
+		static constexpr uint32 BarrierWaitTimeout          = 30000; // ms
 		static constexpr int32  SocketBufferSize            = INT16_MAX; // bytes
 		static constexpr int32  MessageBufferSize           = INT16_MAX; // bytes
 	};
diff --git a/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp b/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp
index 238d5634dffb98e6843be9ec80d748b484cd4baf..0b35d20927ab0ba2db4b84df0f1a7a565674bdb7 100644
--- a/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp
+++ b/Source/DisplayCluster/Private/Render/Devices/Monoscopic/DisplayClusterDeviceMonoscopicOpenGL.cpp
@@ -51,9 +51,8 @@ bool FDisplayClusterDeviceMonoscopicOpenGL::Present(int32& InOutSyncInterval)
 {
 	UE_LOG(LogDisplayClusterRender, Verbose, TEXT("FDisplayClusterDeviceQuadBufferStereoOpenGL::Present"));
 
-	const int halfSizeX = BackBuffSize.X / 2;
 	const int dstX1 = 0;
-	const int dstX2 = halfSizeX;
+	const int dstX2 = BackBuffSize.X;
 
 	// Convert to left bottom origin and flip Y
 	const int dstY1 = ViewportSize.Y;
@@ -76,7 +75,7 @@ bool FDisplayClusterDeviceMonoscopicOpenGL::Present(int32& InOutSyncInterval)
 	glReadBuffer(GL_COLOR_ATTACHMENT0);
 
 	glBlitFramebuffer(
-		0, 0, halfSizeX, BackBuffSize.Y,
+		0, 0, BackBuffSize.X, BackBuffSize.Y,
 		dstX1, dstY1, dstX2, dstY2,
 		GL_COLOR_BUFFER_BIT,
 		GL_NEAREST);
diff --git a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp
index 663544d184dafd7c29c5160c7afc0b882f8c3464..2b3567417861ba6391c7dfbc0832f346f1ed2434 100644
--- a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp
+++ b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.cpp
@@ -23,6 +23,11 @@ FDisplayClusterDeviceQuadBufferStereoOpenGL::~FDisplayClusterDeviceQuadBufferSte
 {
 }
 
+bool FDisplayClusterDeviceQuadBufferStereoOpenGL::ShouldUseSeparateRenderTarget() const
+{
+	return true;
+}
+
 void FDisplayClusterDeviceQuadBufferStereoOpenGL::SetSwapSyncPolicy(EDisplayClusterSwapSyncPolicy policy)
 {
 	FScopeLock lock(&InternalsSyncScope);
@@ -99,11 +104,52 @@ bool FDisplayClusterDeviceQuadBufferStereoOpenGL::Present(int32& InOutSyncInterv
 // Linux implementation
 //////////////////////////////////////////////////////////////////////////////////////////////
 #if PLATFORM_LINUX
-//@todo: Implementation for Linux
 bool FDisplayClusterDeviceQuadBufferStereoOpenGL::Present(int32& InOutSyncInterval)
 {
-	// Forward to default implementation (should be a black screen)
-	return FDisplayClusterDeviceBase::Present(InOutSyncInterval);
+	UE_LOG(LogDisplayClusterRender, Verbose, TEXT("FDisplayClusterDeviceQuadBufferStereoOpenGL::Present"));
+
+	const int halfSizeX = BackBuffSize.X / 2;
+	const int dstX1 = 0;
+	const int dstX2 = halfSizeX;
+
+	// Convert to left bottom origin and flip Y
+	const int dstY1 = ViewportSize.Y;
+	const int dstY2 = 0;
+
+	FOpenGLViewport* pOglViewport = static_cast<FOpenGLViewport*>(CurrentViewport->GetViewportRHI().GetReference());
+	check(pOglViewport);
+	FPlatformOpenGLContext* const pContext = pOglViewport->GetGLContext();
+	check(pContext);
+
+	const FTexture2DRHIRef& renderTargetTexture = CurrentViewport->GetRenderTargetTexture();
+	check(IsValidRef(renderTargetTexture));
+	GLuint nativeRenderTargetTexture = *reinterpret_cast<GLuint*>(renderTargetTexture->GetNativeResource());
+	glFramebufferTexture(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, nativeRenderTargetTexture, 0);
+
+	glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
+
+	glBindFramebuffer(GL_READ_FRAMEBUFFER, pContext->ViewportFramebuffer);
+	glReadBuffer(GL_COLOR_ATTACHMENT0);
+
+	glDrawBuffer(GL_BACK_LEFT);
+	glBlitFramebuffer(
+		0, 0, halfSizeX, BackBuffSize.Y,
+		dstX1, dstY1, dstX2, dstY2,
+		GL_COLOR_BUFFER_BIT,
+		GL_NEAREST);
+
+	glDrawBuffer(GL_BACK_RIGHT);
+	glBlitFramebuffer(
+		halfSizeX, 0, BackBuffSize.X, BackBuffSize.Y,
+		dstX1, dstY1, dstX2, dstY2,
+		GL_COLOR_BUFFER_BIT,
+		GL_NEAREST);
+
+	// Perform buffers swap logic
+	SwapBuffers(pOglViewport, InOutSyncInterval);
+	REPORT_GL_END_BUFFER_EVENT_FOR_FRAME_DUMP();
+
+	return false;
 }
 #endif
 
diff --git a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h
index f9c9157403b718c5ead082834ce26f4d01f2f68a..f40383af966e2caf2146b79435b76b716c36687f 100644
--- a/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h
+++ b/Source/DisplayCluster/Private/Render/Devices/QuadBufferStereo/DisplayClusterDeviceQuadBufferStereoOpenGL.h
@@ -16,6 +16,7 @@ public:
 	virtual ~FDisplayClusterDeviceQuadBufferStereoOpenGL();
 
 protected:
+	virtual bool ShouldUseSeparateRenderTarget() const override;
 	virtual void SetSwapSyncPolicy(EDisplayClusterSwapSyncPolicy policy);
 	virtual bool Present(int32& InOutSyncInterval) override;
 	void SwapBuffers(FOpenGLViewport* pOglViewport, int32& InOutSyncInterval);