Index: themes/ProjectGrayhem-OSD/osd.xml
===================================================================
--- themes/ProjectGrayhem-OSD/osd.xml	(revision 20227)
+++ themes/ProjectGrayhem-OSD/osd.xml	(working copy)
@@ -284,7 +284,7 @@
 	<position>0,320</position> 
       </image> 
     <textarea name="settings">
-      <area>50,335,350,32</area>
+      <area>50,335,250,32</area>
       <font>settings</font>
     </textarea>
   </container>
@@ -307,22 +307,22 @@
       <multiline>yes</multiline> 
    </textarea> 
    <textarea name="option1"> 
-      <area>120,269,455,30</area> 
+      <area>120,269,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option2"> 
-      <area>120,299,455,30</area> 
+      <area>120,299,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option3"> 
-      <area>120,329,455,30</area> 
+      <area>120,329,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option4"> 
-      <area>120,359,455,30</area> 
+      <area>120,359,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
Index: themes/blootube-osd/osd.xml
===================================================================
--- themes/blootube-osd/osd.xml	(revision 20227)
+++ themes/blootube-osd/osd.xml	(working copy)
@@ -286,7 +286,7 @@
 	<position>30,30</position> 
       </image> 
     <textarea name="settings">
-      <area>50,50,350,32</area>
+      <area>50,50,250,32</area>
       <font>settings</font>
     </textarea>
   </container>
@@ -309,22 +309,22 @@
       <multiline>yes</multiline> 
    </textarea> 
    <textarea name="option1"> 
-      <area>120,269,455,30</area> 
+      <area>120,269,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option2"> 
-      <area>120,299,455,30</area> 
+      <area>120,299,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option3"> 
-      <area>120,329,455,30</area> 
+      <area>120,329,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option4"> 
-      <area>120,359,455,30</area> 
+      <area>120,359,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
Index: myththemes/Gray-OSD/osd.xml
===================================================================
--- myththemes/Gray-OSD/osd.xml	(revision 20227)
+++ myththemes/Gray-OSD/osd.xml	(working copy)
@@ -425,27 +425,27 @@
       <multiline>yes</multiline> 
    </textarea> 
    <textarea name="option1"> 
-      <area>100,255,455,30</area> 
+      <area>100,255,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option2"> 
-      <area>100,285,455,30</area> 
+      <area>100,285,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option3"> 
-      <area>100,315,455,30</area> 
+      <area>100,315,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option4"> 
-      <area>100,345,455,30</area> 
+      <area>100,345,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option5">
-      <area>100,375,455,30</area>
+      <area>100,375,395,30</area>
       <font>infofont</font>
       <altfont>infofontgray</altfont>
     </textarea>
Index: myththemes/Titivillus-OSD/osd.xml
===================================================================
--- myththemes/Titivillus-OSD/osd.xml	(revision 20227)
+++ myththemes/Titivillus-OSD/osd.xml	(working copy)
@@ -359,7 +359,7 @@
 
   <container name="settings">
     <textarea name="settings">
-      <area>50,50,350,32</area>
+      <area>50,50,250,32</area>
       <font>settings</font>
     </textarea>
   </container>
Index: myththemes/isthmus/osd.xml
===================================================================
--- myththemes/isthmus/osd.xml	(revision 20227)
+++ myththemes/isthmus/osd.xml	(working copy)
@@ -315,7 +315,7 @@
 
   <container name="settings">
     <textarea name="settings">
-      <area>50,50,350,32</area>
+      <area>50,50,250,32</area>
       <font>settings</font>
     </textarea>
   </container>
@@ -339,27 +339,27 @@
       <multiline>yes</multiline> 
    </textarea> 
    <textarea name="option1"> 
-      <area>100,255,455,30</area> 
+      <area>100,255,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option2"> 
-      <area>100,285,455,30</area> 
+      <area>100,285,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option3"> 
-      <area>100,315,455,30</area> 
+      <area>100,315,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option4"> 
-      <area>100,345,455,30</area> 
+      <area>100,345,395,30</area> 
       <font>infofont</font> 
       <altfont>infofontgray</altfont> 
    </textarea> 
    <textarea name="option5">
-      <area>100,375,455,30</area>
+      <area>100,375,395,30</area>
       <font>infofont</font>
       <altfont>infofontgray</altfont>
     </textarea>
Index: myththemes/Iulius-OSD/osd.xml
===================================================================
--- myththemes/Iulius-OSD/osd.xml	(revision 20227)
+++ myththemes/Iulius-OSD/osd.xml	(working copy)
@@ -251,7 +251,7 @@
 
   <container name="settings">
     <textarea name="settings">
-      <area>64,85,350,32</area>
+      <area>64,85,264,32</area>
       <font>settings</font>
     </textarea>
   </container>
Index: myththemes/Retro-OSD/osd.xml
===================================================================
--- myththemes/Retro-OSD/osd.xml	(revision 20227)
+++ myththemes/Retro-OSD/osd.xml	(working copy)
@@ -297,7 +297,7 @@
 	<position>30,30</position> 
       </image> 
     <textarea name="settings">
-      <area>50,50,350,32</area>
+      <area>50,50,250,32</area>
       <font>settings</font>
     </textarea>
   </container>
@@ -321,27 +321,27 @@
       <multiline>yes</multiline> 
    </textarea> 
    <textarea name="option1"> 
-      <area>120,239,455,30</area> 
+      <area>120,239,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option2"> 
-      <area>120,269,455,30</area> 
+      <area>120,269,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option3"> 
-      <area>120,299,455,30</area> 
+      <area>120,299,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option4"> 
-      <area>120,329,455,30</area> 
+      <area>120,329,395,30</area> 
       <font>notify</font> 
       <altfont>grayfont</altfont> 
    </textarea> 
    <textarea name="option5">
-      <area>120,359,455,30</area>
+      <area>120,359,395,30</area>
       <font>notify</font>
       <altfont>grayfont</altfont>
     </textarea>
Index: mythtv/themes/defaultosd/osd.xml
===================================================================
--- mythtv/themes/defaultosd/osd.xml	(revision 20227)
+++ mythtv/themes/defaultosd/osd.xml	(working copy)
@@ -239,7 +239,7 @@
 
   <container name="settings">
     <textarea name="settings">
-        <area>50,50,350,32</area>
+        <area>50,50,250,32</area>
         <font>settings</font>
     </textarea>
   </container>
Index: mythtv/themes/blueosd/osd.xml
===================================================================
--- mythtv/themes/blueosd/osd.xml	(revision 20227)
+++ mythtv/themes/blueosd/osd.xml	(working copy)
@@ -276,7 +276,7 @@
 
   <container name="settings">
     <textarea name="settings">
-        <area>50,50,350,32</area>
+        <area>50,50,250,32</area>
         <font>settings</font>
     </textarea>
   </container>
Index: mythtv/libs/libmythtv/rtl.cpp
===================================================================
--- mythtv/libs/libmythtv/rtl.cpp	(revision 0)
+++ mythtv/libs/libmythtv/rtl.cpp	(revision 0)
@@ -0,0 +1,126 @@
+/*
+ * Right To Left Languages manipulation for OSD
+ *
+ * Copyright Ido Roseman, Daniel Kristjansson, 
+ * 	      Tony Arie Kolev and Ran Nachmany     2006 - 2009                              
+ * Distributed as part of MythTV under the GPLv2, or at your option a later
+ * version of the GPL. See COPYING which should accompany this for details.
+ */
+
+#include <QStringList>
+#include <Qt3Support/q3cstring.h>
+#include "rtl.h"
+
+#ifdef USING_FRIBIDI
+#   include "fribidi/fribidi.h"
+#   include <QTextCodec>
+#endif // USING_FRIBIDI
+
+static QString BasicConvertFromRtoL(const QString &text, bool &isRTL)
+{
+    QStringList rtl_string_composer;
+    bool handle_rtl = false;
+    QChar prev_char;
+
+    isRTL = false;
+
+    // Handling Right-to-Left languages.
+    // Left-to-Right languages are not affected.
+    for (int i = (int)text.length() - 1; i >= 0; i--)
+    {
+        QChar::Direction text_dir = text[i].direction();
+        if (text_dir != QChar::DirR && 
+            text_dir != QChar::DirRLE &&
+            text_dir != QChar::DirRLO)
+        {
+            if (handle_rtl || rtl_string_composer.empty())
+                rtl_string_composer.append(QString());
+
+            if (text[i].isSpace() && !prev_char.isNull()
+                    && prev_char.isDigit() && handle_rtl)
+                rtl_string_composer.back().append(text[i]);
+            else
+                rtl_string_composer.back().prepend(text[i]);
+
+            prev_char = text[i];
+
+            handle_rtl = false;
+        }
+        else
+        {
+            if (!handle_rtl)
+            {
+                rtl_string_composer.append(QString());
+                handle_rtl = true;
+                prev_char = QChar();
+            }
+            rtl_string_composer.back().append(text[i]);
+            isRTL = true;
+        }
+    }
+
+    QString output = rtl_string_composer.join("");
+    output.detach();
+    return output;
+}
+
+QString RTL::ConvertFromRtoL(const QString &text, bool &isRTL) const
+{
+#ifndef USING_FRIBIDI
+    return BasicConvertFromRtoL(text, isRTL);
+#else
+    isRTL = false;
+    QString output = text;
+    QMutexLocker locker(&fribidi_lock);
+    if (!codeci)
+        codeci = QTextCodec::codecForName("utf8");
+
+    if (!codeci)
+        return output;
+
+    Q3CString 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);
+
+    FriBidiLevel embedding_level_list[len];
+    FriBidiStrIndex position_L_to_V_list[len];
+    FriBidiStrIndex position_V_to_L_list[len];
+
+    bool log2vis = fribidi_log2vis(
+        logical, len, &base, visual, position_L_to_V_list, position_V_to_L_list,
+        embedding_level_list); // output
+
+    if (log2vis)
+    {
+        len = fribidi_remove_bidi_marks(visual, len, NULL, NULL, NULL);
+        for (uint i=0; i < len; i++)
+        {
+            if (embedding_level_list[i]%2==1)
+            {
+                isRTL = true;
+                break;
+            }
+        }
+    }
+
+    output = "";
+    for (size_t i = 0; i < len ; i++)
+        output += QChar(visual[i]);
+
+    return output;
+#endif // !USING_FRIBIDI
+}
+
Index: mythtv/libs/libmythtv/rtl.h
===================================================================
--- mythtv/libs/libmythtv/rtl.h	(revision 0)
+++ mythtv/libs/libmythtv/rtl.h	(revision 0)
@@ -0,0 +1,21 @@
+#ifndef RTL_H_
+#define RTL_H_
+
+#include <qstring.h>
+#include <qmutex.h>
+
+class QTextCodec;
+
+class RTL
+{
+  public:
+    RTL(void) : codeci(NULL) { }
+
+    QString ConvertFromRtoL(const QString &text, bool &isRTL) const;
+
+  private:
+    mutable QMutex      fribidi_lock;
+    mutable QTextCodec *codeci;
+};
+
+#endif

Index: mythtv/libs/libmythtv/osdtypes.cpp
===================================================================
--- mythtv/libs/libmythtv/osdtypes.cpp	(revision 20227)
+++ mythtv/libs/libmythtv/osdtypes.cpp	(working copy)
@@ -19,11 +19,6 @@
 #include "mythdialogs.h"
 #include "mythverbose.h"
 
-#ifdef USING_FRIBIDI
-    #include "fribidi/fribidi.h"
-    #include <QTextCodec>
-#endif // USING_FRIBIDI
-
 /// Shared OSD image cache
 OSDImageCache OSDTypeImage::c_cache;
 
@@ -698,8 +693,7 @@
     m_scrollposy(0),
     m_scrollinit(false),
     m_linespacing(1.5f),
-    m_draw_info_str(QString::null), m_draw_info_len(0),
-    codeci(NULL)
+    m_draw_info_str(QString::null), m_rtl(new RTL())
 {
 }
 
@@ -722,8 +716,7 @@
     m_scrollposy(0),
     m_scrollinit(false),
     m_linespacing(1.5f),
-    m_draw_info_str(QString::null), m_draw_info_len(0),
-    codeci(NULL)
+    m_draw_info_str(QString::null), m_rtl(new RTL())
 {
     QMutexLocker locker(&other.m_lock);
 
@@ -766,6 +759,8 @@
 
 OSDTypeText::~OSDTypeText()
 {
+    if (m_rtl)
+        delete m_rtl;
 }
 
 void OSDTypeText::SetAltFont(TTFFont *font)
@@ -774,98 +769,10 @@
     m_altfont = font;
 }
 
-QString OSDTypeText::BasicConvertFromRtoL(const QString &text)
-{
-    QStringList rtl_string_composer;
-    bool handle_rtl = false;
-    QChar prev_char;
-
-    // Handling Right-to-Left languages.
-    // Left-to-Right languages are not affected.
-    for (int i = (int)text.length() - 1; i >= 0; i--)
-    {
-        QChar::Direction text_dir = text[i].direction();
-        if (text_dir != QChar::DirR && 
-            text_dir != QChar::DirRLE &&
-            text_dir != QChar::DirRLO)
-        {
-            if (handle_rtl || rtl_string_composer.empty())
-                rtl_string_composer.append(QString());
-
-            if (text[i].isSpace() && !prev_char.isNull()
-                    && prev_char.isDigit() && handle_rtl)
-                rtl_string_composer.back().append(text[i]);
-            else
-                rtl_string_composer.back().prepend(text[i]);
-
-            prev_char = text[i];
-
-            handle_rtl = false;
-        }
-        else
-        {
-            if (!handle_rtl)
-            {
-                rtl_string_composer.append(QString());
-                handle_rtl = true;
-                prev_char = QChar();
-            }
-            rtl_string_composer.back().append(text[i]);
-        }
-    }
-
-    QString output = rtl_string_composer.join("");
-
-    return 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");
-
-    if (!codeci)
-        return output;
-
-    QByteArray temp = codeci->fromUnicode(output);
-
-    FriBidiCharType base;
-    size_t len;
-
-    bool fribidi_flip_commas = true;
-    base = (fribidi_flip_commas) ? FRIBIDI_TYPE_ON : FRIBIDI_TYPE_L;
-
-    std::vector<FriBidiChar> logical(temp.length() + 1);
-    std::vector<FriBidiChar> visual(temp.length() + 1);
-
-    int char_set_num = fribidi_parse_charset("UTF-8");
-
-    len = fribidi_charset_to_unicode((FriBidiCharSet) char_set_num,
-                                     temp.constData(), temp.length(),
-                                     &logical[0]);
-
-    bool log2vis = fribidi_log2vis(&logical[0], len, &base, &visual[0], NULL,
-                                   NULL, NULL); // output
-
-    if (log2vis)
-        len = fribidi_remove_bidi_marks(&visual[0], 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);
-    m_message    = ConvertFromRtoL(text);
+    m_message    = text; m_message.detach();
     m_cursorpos  = m_message.length();
     m_scrollinit = false;
 }
@@ -873,14 +780,15 @@
 QString OSDTypeText::GetText(void) const
 {
     QMutexLocker locker(&m_lock);
-    return m_message;
+    QString tmp = m_message; tmp.detach();
+    return tmp;
 }
 
 void OSDTypeText::SetDefaultText(const QString &text)
 {
     QMutexLocker locker(&m_lock);
-    m_message     = ConvertFromRtoL(text);
-    m_default_msg = m_message;
+    m_message     = text; m_message.detach();
+    m_default_msg = text; m_default_msg.detach();
     m_scrollinit  = false;
 }
 
@@ -1090,7 +998,8 @@
 
     if (text != m_draw_info_str)
     {
-        m_draw_info_str = text;
+        m_draw_info_str = text;
+        m_draw_info_str.detach();
         m_draw_info.clear();
         m_draw_info_len = 0;
 
@@ -1203,6 +1112,10 @@
 {
     QMutexLocker locker(&m_lock);
 
+    bool isRTL = false;
+    QString msg = m_rtl->ConvertFromRtoL(text, isRTL);
+    m_right = isRTL;
+
     if (m_centered || m_right)
     {
         int textlength = 0;
@@ -1228,7 +1141,7 @@
     if ((m_usingalt || m_selected) && m_altfont)
         font = m_altfont;
 
-    font->DrawString(surface, rect.left(), rect.top(), text,
+    font->DrawString(surface, rect.left(), rect.top(), msg,
                      rect.right(), rect.bottom(), alphamod, doubl);
 
     // draw cursor
Index: mythtv/libs/libmythtv/libmythtv.pro
===================================================================
--- mythtv/libs/libmythtv/libmythtv.pro	(revision 20227)
+++ mythtv/libs/libmythtv/libmythtv.pro	(working copy)
@@ -281,10 +281,12 @@
     HEADERS += osdsurface.h             osdlistbtntype.h
     HEADERS += osdimagecache.h          osdtypeteletext.h
     HEADERS += udpnotify.h                  tvosdmenuentry.h
+    HEADERS += rtl.h
     SOURCES += osd.cpp                  osdtypes.cpp
     SOURCES += osdsurface.cpp           osdlistbtntype.cpp
     SOURCES += osdimagecache.cpp        osdtypeteletext.cpp
     SOURCES += udpnotify.cpp              tvosdmenuentry.cpp
+    SOURCES += rtl.cpp
 
     # Video output
     HEADERS += videooutbase.h           videoout_null.h
Index: mythtv/libs/libmythtv/osdtypes.h
===================================================================
--- mythtv/libs/libmythtv/osdtypes.h	(revision 20227)
+++ mythtv/libs/libmythtv/osdtypes.h	(working copy)
@@ -12,6 +12,7 @@
 #include <qcolor.h>
 #include "cc708window.h"
 #include "osdimagecache.h"
+#include "rtl.h"
 
 using namespace std;
 
@@ -238,10 +239,6 @@
     void SetButton(bool is_button)      { m_button = is_button;     }
     void SetEntryNum(int entrynum)      { m_entrynum = entrynum;    }
 
-    QString ConvertFromRtoL(const QString &text) const;
-
-    static QString BasicConvertFromRtoL(const QString &text);
-
   protected:
     ~OSDTypeText();
 
@@ -292,8 +289,7 @@
     mutable uint    m_draw_info_len;
     mutable vector<DrawInfo> m_draw_info;
 
-    mutable QMutex      fribidi_lock;
-    mutable QTextCodec *codeci;
+    RTL *m_rtl;
 };
     
 class OSDTypeImage : public OSDType
Index: mythtv/libs/libmythtv/osdlistbtntype.h
===================================================================
--- mythtv/libs/libmythtv/osdlistbtntype.h	(revision 20227)
+++ mythtv/libs/libmythtv/osdlistbtntype.h	(working copy)
@@ -35,6 +35,7 @@
 #include "osdtypes.h"
 #include "ttfont.h"
 #include "generictree.h"
+#include "rtl.h"
 
 class OSDListBtnType;
 class OSDListBtnTypeItem;
@@ -149,6 +150,7 @@
     int       m_levelnum;
     bool      m_visible;
     bool      m_arrowAccel;
+    bool      m_isRtl;
 };
  
 class OSDListBtnType : public OSDType
@@ -311,6 +313,7 @@
     QRect           m_arrowRect;
     QRect           m_pixmapRect;
     QRect           m_textRect;
+    RTL            *m_rtl;
 };
 


Index: mythtv/libs/libmythtv/osdlistbtntype.cpp
===================================================================
--- mythtv/libs/libmythtv/osdlistbtntype.cpp	(revision 20227)
+++ mythtv/libs/libmythtv/osdlistbtntype.cpp	(working copy)
@@ -67,8 +67,13 @@
     m_wmult        = (wmult == 0.0f) ? 1.0f : wmult;
     m_hmult        = (hmult == 0.0f) ? 1.0f : hmult;
     m_unbiasedarea = unbias(area,      wmult, hmult);
     m_unbiasedsize = unbias(levelsize, wmult, hmult);
+
+    if (gContext->GetSettingOnHost("Language",gContext->GetHostName())=="HE")
+	m_isRtl = true;
+    else
+	m_isRtl = false;
 }
 
 OSDListTreeType::~OSDListTreeType()
 {
@@ -142,10 +147,22 @@
     for (uint i = 0; i < (uint)m_depth; i++)
     {
         QString levelname = QString("level%1").arg(i + 1);
         QRect curlevelarea = m_levelsize;
-        curlevelarea.translate(m_totalarea.x(), m_totalarea.y());
-        curlevelarea.translate((m_levelsize.width() + m_levelspacing) * i, 0);
+	
+// if we are left to right
+	if (false == m_isRtl)
+        {
+		curlevelarea.translate(m_totalarea.x(), m_totalarea.y());
+        	curlevelarea.translate((m_levelsize.width() + m_levelspacing) * i, 0);
+	}
+        
+// if we are right to left
+	else
+	{
+		curlevelarea.translate(m_totalarea.width(), m_totalarea.y());
+        	curlevelarea.translate( ((-1 - i) * m_levelsize.width()) - m_levelspacing,0);
+	}
 
         OSDListBtnType *newlevel = new OSDListBtnType(
             levelname, curlevelarea, m_wmult, m_hmult, true);
 
@@ -216,24 +233,42 @@
     {
         GetLevel(m_levelnum)->MovePageDown();
         EnterItem();
     }
-    else if (has_action("LEFT", actions) && (m_levelnum > 0))
+    else if (!m_isRtl && has_action("LEFT", actions) && (m_levelnum > 0))
     {
         GetLevel(m_levelnum)->Reset();
         GetLevel(m_levelnum)->SetVisible(false);
 
         m_levelnum--;
         EnterItem();
     }
-    else if ((has_action("LEFT", actions) && m_arrowAccel) ||
+    else if (m_isRtl && has_action("LEFT",actions))
+	{
+		// Right to left - left acts as select / advance one stage
+		if ((m_levelnum + 1 < m_depth) &&
+		    (currentpos->childCount() > 0))	
+		{
+			GetLevel(m_levelnum)->SetActive(false);
+			m_levelnum++;
+		
+			FillLevelFromTree(currentpos, m_levelnum);
+			GetLevel(m_levelnum)->SetVisible(true);
+			EnterItem();
+		}
+		else
+		{
+			SelectItem();
+		}
+	}	
+    else if ((!m_isRtl &&  has_action("LEFT", actions) && m_arrowAccel) ||
              has_action("ESCAPE",   actions) ||
              has_action("CLEAROSD", actions) ||
              has_action("MENU",     actions))
     {
         m_visible = false;
     }
-    else if (has_action("RIGHT", actions) &&
+    else if ((!m_isRtl && has_action("RIGHT", actions) && m_arrowAccel) ||
              (m_levelnum + 1 < m_depth) &&
              (currentpos->childCount() > 0))
     {
         GetLevel(m_levelnum)->SetActive(false);
@@ -247,8 +282,16 @@
              has_action("SELECT", actions))
     {
         SelectItem();
     }
+    else if ((true ==m_isRtl) && has_action("RIGHT",actions) && (m_levelnum > 0))
+    {
+	GetLevel(m_levelnum)->Reset();
+	GetLevel(m_levelnum)->SetVisible(false);
+
+	m_levelnum--;
+	EnterItem();
+    }
     else
     {
         return false;
     }
@@ -666,9 +709,12 @@
 
     LoadPixmap(m_checkNonePix, "check-empty");
     LoadPixmap(m_checkHalfPix, "check-half");
     LoadPixmap(m_checkFullPix, "check-full");
-    LoadPixmap(m_arrowPix, "arrow");
+    if (gContext->GetSettingOnHost("Language",gContext->GetHostName())=="HE")
+       LoadPixmap(m_arrowPix, "ltarrow");
+    else
+       LoadPixmap(m_arrowPix, "arrow");
 
     uint itemWidth = (m_rect.width() + 1) & (~1);
 
     InitItem(m_itemRegPix,      itemWidth,    m_itemHeight,
@@ -781,10 +827,14 @@
 
     if (m_checkable) 
         m_checkRect  = QRect(margin, (height - ch)/2, cw, ch);
 
-    if (m_showArrow) 
-        m_arrowRect  = QRect(width - aw - margin, (height - ah)/2, aw, ah);
+    if (m_showArrow)
+	if (gContext->GetSettingOnHost("Language",gContext->GetHostName())=="HE")
+		m_arrowRect  = QRect(m_parent->m_contentsRect.x() + margin, (height - ah)/2, aw, ah);
+	else
+		m_arrowRect  = QRect(width - aw - margin, (height - ah)/2, aw, ah);
+	
 
     if (m_pixmap)
     {
         int tmp = (m_checkable) ? (2 * margin + m_checkRect.width()) : margin;
@@ -795,8 +845,12 @@
     tx += (m_checkable) ? m_checkRect.width()  + margin : 0;
     tx += (m_pixmap)    ? m_pixmapRect.width() + margin : 0;
     tw -= (m_checkable) ? m_checkRect.width()  + margin : 0;
     tw -= (m_showArrow) ? m_arrowRect.width()  + margin : 0;
+    
+    if (gContext->GetSettingOnHost("Language",gContext->GetHostName())=="HE")
+	tx += (m_showArrow) ? m_arrowRect.width()  + margin : 0;
+
     tw -= (m_pixmap)    ? m_pixmapRect.width() + margin : 0;
     m_textRect = QRect(tx, 0, tw, height);
 
     m_parent->InsertItem(this);
