Index: configure
===================================================================
--- configure	(revision 14936)
+++ configure	(working copy)
@@ -884,6 +884,7 @@
     xvmc_opengl
     xvmc_vld
     dvdv
+    fribidi
 '
 
 MYTHTV_LIST='
@@ -2375,6 +2376,31 @@
 check_foo_config freetype2 freetype ft2build.h FT_Init_FreeType
 
 ##########################################
+# fribidi check
+
+disable fribidi
+FRIBIDI_CONFIG="pkg-config fribidi"
+if ( pkg-config fribidi --version ) >/dev/null 2>&1 ; then
+    _fribidi_version=`${FRIBIDI_CONFIG} --version | sed 's/[^0-9]//g'`
+    if test "$_fribidi_version" -lt 022 ; then
+        disable fribidi
+    else
+        check_cc `${FRIBIDI_CONFIG} --cflags` `${FRIBIDI_CONFIG} --libs` << EOF && enable fribidi
+#include <stdio.h>
+#include <fribidi/fribidi.h>
+int main()
+{
+    if (fribidi_parse_charset("UTF-8") != FRIBIDI_CHAR_SET_UTF8)
+    {
+        printf("Fribidi headers are not consistents with the library!\n");
+        return 1;
+    }
+    return 0;
+}
+EOF
+	fi
+fi
+##########################################
 # SDL check
 
 disable sdl_too_old
@@ -2948,6 +2974,7 @@
   if test x"$mingw32" = x"yes" -o x"$targetos" = x"cygwin" ; then
     echo "DirectX                   ${directx-no}"
   fi
+  echo "Fribidi formatting        ${fribidi}"
   echo
 fi
 
@@ -3038,6 +3065,10 @@
   echo "FREETYPE_CFLAGS=`freetype-config --cflags`" >> $MYTH_CONFIG_MAK
   echo "FREETYPE_LIBS=`freetype-config --libs`" >> $MYTH_CONFIG_MAK
 fi
+if enabled fribidi; then
+  echo "FRIBIDI_LIBS=`${FRIBIDI_CONFIG} --libs`" >> $MYTH_CONFIG_MAK
+  echo "FRIBIDI_CFLAGS=`${FRIBIDI_CONFIG} --cflags`" >> $MYTH_CONFIG_MAK
+fi
 if enabled sdl; then
   echo "SDL_LIBS=`"${SDL_CONFIG}" --libs`" >> $MYTH_CONFIG_MAK
   echo "SDL_CFLAGS=`"${SDL_CONFIG}" --cflags`" >> $MYTH_CONFIG_MAK
Index: libs/libmythtv/osdtypes.cpp
===================================================================
--- libs/libmythtv/osdtypes.cpp	(revision 14936)
+++ libs/libmythtv/osdtypes.cpp	(working copy)
@@ -16,6 +16,11 @@
 #include "mythcontext.h"
 #include "mythdialogs.h"
 
+#ifdef USING_FRIBIDI
+    #include "fribidi/fribidi.h"
+    #include <qtextcodec.h> 
+#endif // USING_FRIBIDI
+
 /// Shared OSD image cache
 OSDImageCache OSDTypeImage::c_cache;
 
@@ -750,7 +755,7 @@
     m_altfont = font;
 }
 
-QString OSDTypeText::ConvertFromRtoL(const QString &text)
+QString OSDTypeText::BasicConvertFromRtoL(const QString &text)
 {
     QStringList rtl_string_composer;
     bool handle_rtl = false;
@@ -790,9 +795,50 @@
         }
     }
 
-    return QDeepCopy<QString>(rtl_string_composer.join(""));
+    QString output = rtl_string_composer.join("");
+
+    return QDeepCopy<QString>(output);
 }
 
+QString OSDTypeText::ConvertFromRtoL(const QString &text) const
+{
+    QString output = BasicConvertFromRtoL(text);
+
+#ifdef USING_FRIBIDI
+    QMutexLocker locker(&fribidi_lock);
+    if (!codeci)
+        codeci = QTextCodec::codecForName("utf8");
+
+    QCString temp = codeci->fromUnicode(output);
+
+    FriBidiCharType base;
+    size_t len;
+
+    bool fribidi_flip_commas = true;
+    base = (fribidi_flip_commas) ? FRIBIDI_TYPE_ON : FRIBIDI_TYPE_L;
+
+    const char *ip = temp;
+    FriBidiChar logical[strlen(ip) + 1], visual[strlen(ip) + 1];
+
+    int char_set_num = fribidi_parse_charset("UTF-8");
+
+    len = fribidi_charset_to_unicode(
+        (FriBidiCharSet) char_set_num, ip, strlen(ip), logical);
+
+    bool log2vis = fribidi_log2vis(
+        logical, len, &base, visual, NULL, NULL, NULL); // output
+
+    if (log2vis)
+        len = fribidi_remove_bidi_marks(visual, len, NULL, NULL, NULL);
+ 
+    output = "";
+    for (size_t i = 0; i < len ; i++)
+        output += QChar(visual[i]);
+#endif // USING_FRIBIDI
+
+    return output;
+}
+
 void OSDTypeText::SetText(const QString &text)
 {
     QMutexLocker locker(&m_lock);
Index: libs/libmythtv/libmythtv.pro
===================================================================
--- libs/libmythtv/libmythtv.pro	(revision 14936)
+++ libs/libmythtv/libmythtv.pro	(working copy)
@@ -248,6 +248,7 @@
     using_ivtv:SOURCES += ivtvdecoder.cpp
 
     # On screen display (video output overlay)
+    using_fribidi:DEFINES += USING_FRIBIDI
     HEADERS += osd.h                    osdtypes.h
     HEADERS += osdsurface.h             osdlistbtntype.h
     HEADERS += osdimagecache.h          osdtypeteletext.h
Index: libs/libmythtv/osdtypes.h
===================================================================
--- libs/libmythtv/osdtypes.h	(revision 14936)
+++ libs/libmythtv/osdtypes.h	(working copy)
@@ -238,7 +238,10 @@
     void SetButton(bool is_button)      { m_button = is_button;     }
     void SetEntryNum(int entrynum)      { m_entrynum = entrynum;    }
 
-    static QString ConvertFromRtoL(const QString &text);
+    QString ConvertFromRtoL(const QString &text) const;
+
+    static QString BasicConvertFromRtoL(const QString &text);
+
   protected:
     ~OSDTypeText();
 
@@ -288,6 +291,9 @@
     mutable QString m_draw_info_str;
     mutable uint    m_draw_info_len;
     mutable vector<DrawInfo> m_draw_info;
+
+    mutable QMutex      fribidi_lock;
+    mutable QTextCodec *codeci;
 };
     
 class OSDTypeImage : public OSDType
Index: settings.pro
===================================================================
--- settings.pro	(revision 14936)
+++ settings.pro	(working copy)
@@ -99,5 +99,6 @@
 EXTRA_LIBS += $$CONFIG_XRANDR_LIBS
 EXTRA_LIBS += $$CONFIG_XVMC_LIBS
 EXTRA_LIBS += $$CONFIG_OPENGL_LIBS
+EXTRA_LIBS += $$FRIBIDI_LIBS
 
 LIRC_LIBS = $$CONFIG_LIRC_LIBS
