diff -r 1b6ca96bca9a include/Platform.h
--- a/include/Platform.h	Sat Mar 03 11:15:06 2018 +1100
+++ b/include/Platform.h	Sat Mar 03 11:28:44 2018 +1100
@@ -386,6 +386,7 @@
 	virtual void Copy(PRectangle rc, Point from, Surface &surfaceSource)=0;
 
 #ifdef ENABLE_BIDIRECTIONAL
+	virtual void SetBidirectionalDirection(bool r2l)=0;
 	virtual int PositionFromX(const ScreenLine *, XYPOSITION, bool) =0 ;
 	virtual XYPOSITION XFromPosition(const ScreenLine *, int) =0;
 	virtual void FindSelectionIntervals(const ScreenLine *screenLine, int start, int end, IAddInterval *pAdd) = 0;
diff -r 1b6ca96bca9a src/EditView.cxx
--- a/src/EditView.cxx	Sat Mar 03 11:15:06 2018 +1100
+++ b/src/EditView.cxx	Sat Mar 03 11:28:44 2018 +1100
@@ -2340,6 +2340,9 @@
 		}
 		surface->SetUnicodeMode(SC_CP_UTF8 == model.pdoc->dbcsCodePage);
 		surface->SetDBCSMode(model.pdoc->dbcsCodePage);
+#ifdef ENABLE_BIDIRECTIONAL
+		surface->SetBidirectionalDirection(model.bidirectional == EditModel::Bidirectional::bidiR2L);
+#endif
 
 		const Point ptOrigin = model.GetVisibleOriginInMain();
 
diff -r 1b6ca96bca9a src/Editor.h
--- a/src/Editor.h	Sat Mar 03 11:15:06 2018 +1100
+++ b/src/Editor.h	Sat Mar 03 11:28:44 2018 +1100
@@ -600,6 +600,9 @@
 			surf->Init(ed->wMain.GetID());
 			surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
 			surf->SetDBCSMode(ed->CodePage());
+#ifdef ENABLE_BIDIRECTIONAL
+			surf->SetBidirectionalDirection(ed->bidirectional == EditModel::Bidirectional::bidiR2L);
+#endif
 		}
 	}
 	AutoSurface(SurfaceID sid, Editor *ed, int technology = -1) {
@@ -608,6 +611,9 @@
 			surf->Init(sid, ed->wMain.GetID());
 			surf->SetUnicodeMode(SC_CP_UTF8 == ed->CodePage());
 			surf->SetDBCSMode(ed->CodePage());
+#ifdef ENABLE_BIDIRECTIONAL
+			surf->SetBidirectionalDirection(ed->bidirectional == EditModel::Bidirectional::bidiR2L);
+#endif
 		}
 	}
 	// Deleted so AutoSurface objects can not be copied.
diff -r 1b6ca96bca9a win32/PlatWin.cxx
--- a/win32/PlatWin.cxx	Sat Mar 03 11:15:06 2018 +1100
+++ b/win32/PlatWin.cxx	Sat Mar 03 11:28:44 2018 +1100
@@ -544,6 +544,7 @@
 	void Copy(PRectangle rc, Point from, Surface &surfaceSource) override;
 
 #ifdef ENABLE_BIDIRECTIONAL
+	void SetBidirectionalDirection(bool) override;
 	int PositionFromX(const ScreenLine *, XYPOSITION, bool) override;
 	XYPOSITION XFromPosition(const ScreenLine *, int) override;
 	void FindSelectionIntervals(const ScreenLine *, int, int, IAddInterval *) override;
@@ -888,6 +889,9 @@
 
 #ifdef ENABLE_BIDIRECTIONAL
 
+void SurfaceGDI::SetBidirectionalDirection(bool) {
+}
+
 int SurfaceGDI::PositionFromX(const ScreenLine *, XYPOSITION, bool) {
 	return 0;
 }
@@ -1125,6 +1129,7 @@
 	void Copy(PRectangle rc, Point from, Surface &surfaceSource) override;
 
 #ifdef ENABLE_BIDIRECTIONAL
+	void SetBidirectionalDirection(bool r2l) override;
 	int PositionFromX(const ScreenLine *screenLine, XYPOSITION xDistance, bool charPosition) override;
 	XYPOSITION XFromPosition(const ScreenLine *screenLine, int caretPosition) override;
 	void FindSelectionIntervals(const ScreenLine *screenLine, int start, int end, IAddInterval *pAdd) override;
@@ -1256,6 +1261,9 @@
 	}
 	SetUnicodeMode(psurfOther->unicodeMode);
 	SetDBCSMode(psurfOther->codePage);
+#ifdef ENABLE_BIDIRECTIONAL
+	SetBidirectionalDirection(psurfOther->bidiR2L);
+#endif
 }
 
 void SurfaceD2D::PenColour(ColourDesired fore) {
@@ -1704,6 +1712,10 @@
 	return S_OK;
 }
 
+void SurfaceD2D::SetBidirectionalDirection(bool r2l) {
+	bidiR2L = r2l;
+}
+
 // Get the exact position from the provided x
 int SurfaceD2D::PositionFromX(const ScreenLine *screenLine, XYPOSITION xDistance, bool charPosition) {
 	// If the text is empty, then no need to go through this function
diff -r 1b6ca96bca9a win32/ScintillaWin.cxx
--- a/win32/ScintillaWin.cxx	Sat Mar 03 11:15:06 2018 +1100
+++ b/win32/ScintillaWin.cxx	Sat Mar 03 11:28:44 2018 +1100
@@ -3350,6 +3350,9 @@
 				}
 				surfaceWindow->SetUnicodeMode(SC_CP_UTF8 == sciThis->ct.codePage);
 				surfaceWindow->SetDBCSMode(sciThis->ct.codePage);
+#ifdef ENABLE_BIDIRECTIONAL
+				surfaceWindow->SetBidirectionalDirection(sciThis->bidirectional == EditModel::Bidirectional::bidiR2L);
+#endif
 				sciThis->ct.PaintCT(surfaceWindow.get());
 #if defined(USE_D2D)
 				if (pCTRenderTarget)
