Index: data/themes/Makefile.am
===================================================================
--- data/themes/Makefile.am	(revision 73481)
+++ data/themes/Makefile.am	(working copy)
@@ -308,6 +308,7 @@ icon_arrow_up_left.png \
 icon_arrow_up_right.png \
 thumb_shadow.png \
 group_index.png \
+magnifier.png \
 mp_forward.png \
 mp_info.png \
 mp_next.png \
Index: src/lib/elm_priv.h
===================================================================
--- src/lib/elm_priv.h	(revision 73483)
+++ src/lib/elm_priv.h	(working copy)
@@ -133,6 +133,7 @@ struct _Elm_Config
    double        page_scroll_friction;
    double        bring_in_scroll_friction;
    double        zoom_friction;
+   unsigned char magnifier_enable;
    unsigned char thumbscroll_bounce_enable;
    double        thumbscroll_border_friction;
    double        thumbscroll_sensitivity_friction;
Index: src/lib/elm_config.h
===================================================================
--- src/lib/elm_config.h	(revision 73483)
+++ src/lib/elm_config.h	(working copy)
@@ -406,6 +406,24 @@ EAPI void         elm_config_scroll_thumbscroll_se
  */
 
 /**
+ * Get whether magnifier feature is enabled.
+ *
+ * @return EINA_TRUE if the magnifier feature is enabled
+ * @ingroup Entry
+ */
+EAPI Eina_Bool    elm_config_magnifier_enabled_get(void);
+
+/**
+ * Set whether entry should show magnifier while entry is long-pressed.
+ *
+ * @param enabled if true the magnifier feature should be enabled
+ *
+ * @see elm_config_magnifier_enabled_get()
+ * @ingroup Entry
+ */
+EAPI void         elm_config_magnifier_enabled_set(Eina_Bool enabled);
+
+/**
  * Get the duration for occurring long press event.
  *
  * @return Timeout for long press event
Index: src/lib/elm_config.c
===================================================================
--- src/lib/elm_config.c	(revision 73483)
+++ src/lib/elm_config.c	(working copy)
@@ -332,6 +332,7 @@ _desc_init(void)
    ELM_CONFIG_VAL(D, T, page_scroll_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, bring_in_scroll_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, zoom_friction, T_DOUBLE);
+   ELM_CONFIG_VAL(D, T, magnifier_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, thumbscroll_bounce_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, scroll_smooth_time_interval, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, scroll_smooth_amount, T_DOUBLE);
@@ -998,6 +999,7 @@ _config_load(void)
    _elm_config->thumbscroll_friction = 1.0;
    _elm_config->thumbscroll_bounce_friction = 0.5;
    _elm_config->thumbscroll_bounce_enable = EINA_TRUE;
+   _elm_config->magnifier_enable = EINA_FALSE;
    _elm_config->page_scroll_friction = 0.5;
    _elm_config->bring_in_scroll_friction = 0.5;
    _elm_config->zoom_friction = 0.5;
@@ -1378,6 +1380,8 @@ _env_get(void)
    if (s) _elm_config->thumbscroll_friction = _elm_atof(s);
    s = getenv("ELM_THUMBSCROLL_BOUNCE_ENABLE");
    if (s) _elm_config->thumbscroll_bounce_enable = !!atoi(s);
+   s = getenv("ELM_MAGNIFIER_ENABLE");
+   if (s) _elm_config->magnifier_enable = !!atoi(s);
    s = getenv("ELM_THUMBSCROLL_BOUNCE_FRICTION");
    if (s) _elm_config->thumbscroll_bounce_friction = _elm_atof(s);
    s = getenv("ELM_PAGE_SCROLL_FRICTION");
@@ -1889,6 +1893,18 @@ elm_config_scroll_bounce_enabled_set(Eina_Bool ena
    _elm_config->thumbscroll_bounce_enable = enabled;
 }
 
+EAPI Eina_Bool
+elm_config_magnifier_enabled_get(void)
+{
+   return _elm_config->magnifier_enable;
+}
+
+EAPI void
+elm_config_magnifier_enabled_set(Eina_Bool enabled)
+{
+   _elm_config->magnifier_enable = enabled;
+}
+
 EAPI double
 elm_config_scroll_bounce_friction_get(void)
 {
Index: src/lib/elm_entry.c
===================================================================
--- src/lib/elm_entry.c	(revision 73483)
+++ src/lib/elm_entry.c	(working copy)
@@ -83,6 +83,11 @@ struct _Widget_Data
    Eina_Bool autoreturnkey : 1;
    Eina_Bool havetext : 1;
    Elm_Cnp_Mode cnp_mode : 2;
+   Evas_Object *mgf_proxy;
+   Evas_Object *mgf_clip;
+   Evas_Object *mgf_bg;
+   float mgf_scale;
+   Eina_Bool long_pressed : 1;
 };
 
 struct _Elm_Entry_Context_Menu_Item
@@ -142,6 +147,10 @@ static void _signal_entry_cut_notify(void *data, E
 static void _signal_cursor_changed(void *data, Evas_Object *obj, const char *emission, const char *source);
 static void _add_chars_till_limit(Evas_Object *obj, char **text, int can_add, Length_Unit unit);
 static void _entry_hover_anchor_clicked(void *data, Evas_Object *obj, void *event_info);
+static void _magnifier_create(void *data);
+static void _magnifier_show(void *data);
+static void _magnifier_hide(void *data);
+static void _magnifier_move(void *data, Evas_Coord px, Evas_Coord py);
 
 static const char SIG_CHANGED[] = "changed";
 static const char SIG_CHANGED_USER[] = "changed,user";
@@ -516,6 +525,9 @@ _del_hook(Evas_Object *obj)
         wd->append_text_left = NULL;
         wd->append_text_idler = NULL;
      }
+   if (wd->mgf_proxy) evas_object_del(wd->mgf_proxy);
+   if (wd->mgf_bg) evas_object_del(wd->mgf_bg);
+   if (wd->mgf_clip) evas_object_del(wd->mgf_clip);
    if (wd->longpress_timer) ecore_timer_del(wd->longpress_timer);
    EINA_LIST_FREE(wd->items, it)
      {
@@ -1411,13 +1423,134 @@ _menu_press(Evas_Object *obj)
      }
 }
 
+static void
+_magnifier_hide(void *data)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+
+   evas_object_hide(wd->mgf_bg);
+   evas_object_hide(wd->mgf_clip);
+
+   if (wd->scroll)
+     elm_smart_scroller_freeze_set(wd->scroller, EINA_FALSE);
+}
+
+static void
+_magnifier_show(void *data)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+
+   evas_object_show(wd->mgf_bg);
+   evas_object_show(wd->mgf_clip);
+
+   if (wd->scroll)
+     elm_smart_scroller_freeze_set(wd->scroller, EINA_TRUE);
+}
+
+static void
+_magnifier_move(void *data, Evas_Coord px, Evas_Coord py)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   if (!wd) return;
+
+   Evas_Coord x, y, w, h;
+   Evas_Coord mx, my, mw, mh;
+   Evas_Coord rx, ry, ox = 0, oy = 0;
+   Evas_Object *obj_bg = NULL;
+
+   if (wd->scroll)
+     {
+        evas_object_geometry_get(wd->scroller, &x, &y, &w, &h);
+        elm_smart_scroller_child_pos_get(wd->scroller, &ox, &oy);
+     }
+   else
+     evas_object_geometry_get(data, &x, &y, &w, &h);
+
+   rx = px - x + ox;
+   ry = py - y + oy;
+
+   obj_bg = edje_object_part_object_get(wd->mgf_bg, "bg");
+   evas_object_geometry_get(obj_bg, &mx, &my, &mw, &mh);
+   ox = oy = 0;
+
+   if (py - mh < y) oy = -1 * (py - mh - y);
+   if (py > (y + h)) oy = -1 * (py - (y + h));
+   if ((px - (mw / 2)) < x) ox = -1 * (px - (mw / 2) - x);
+   if ((px + (mw / 2)) > (x + w)) ox = -1 * (px + (mw / 2) - (x + w));
+
+   evas_object_move(wd->mgf_bg, px + ox, py + oy);
+   evas_object_move(wd->mgf_proxy, (1 - wd->mgf_scale) * rx + x + ox, (1 - wd->mgf_scale) * ry + y + oy - mh/2);
+}
+
+static void
+_magnifier_create(void *data)
+{
+   Widget_Data *wd = elm_widget_data_get(data);
+   Evas_Coord x, y, w, h, mw, mh;
+   Evas_Object *src_obj = NULL;
+   const char* key_data = NULL;
+
+   if (!wd) return;
+
+   if (wd->mgf_proxy)
+     {
+        evas_object_image_source_unset(wd->mgf_proxy);
+        evas_object_hide(wd->mgf_proxy);
+        evas_object_clip_unset(wd->mgf_proxy);
+        evas_object_del(wd->mgf_proxy);
+     }
+   if (wd->mgf_bg) evas_object_del(wd->mgf_bg);
+   if (wd->mgf_clip) evas_object_del(wd->mgf_clip);
+
+   src_obj = (wd->scroll) ? wd->scroller : data;
+
+   evas_object_geometry_get(src_obj, &x, &y, &w, &h);
+
+   if ((w <= 0) || (h <= 0))
+     return;
+
+   wd->mgf_bg = edje_object_add(evas_object_evas_get(data));
+   _elm_theme_object_set(data, wd->mgf_bg, "entry", "magnifier", "default");
+
+   wd->mgf_clip = evas_object_rectangle_add(evas_object_evas_get(data));
+   edje_object_part_swallow(wd->mgf_bg, "swallow", wd->mgf_clip);
+
+   key_data = edje_object_data_get(wd->mgf_bg, "scale");
+   if (key_data) wd->mgf_scale = atof(key_data);
+   if (wd->mgf_scale <= 0) return;
+
+   wd->mgf_proxy = evas_object_image_add(evas_object_evas_get(src_obj));
+   evas_object_image_source_set(wd->mgf_proxy, src_obj);
+
+   mw = (Evas_Coord)((float)w * wd->mgf_scale);
+   mh = (Evas_Coord)((float)h * wd->mgf_scale);
+
+   evas_object_resize(wd->mgf_proxy, mw, mh);
+   evas_object_image_fill_set(wd->mgf_proxy, 0, 0, mw, mh);
+   evas_object_pass_events_set(wd->mgf_proxy, EINA_TRUE);
+   evas_object_show(wd->mgf_proxy);
+   evas_object_clip_set(wd->mgf_proxy, wd->mgf_clip);
+
+   evas_object_layer_set(wd->mgf_bg, EVAS_LAYER_MAX);
+   evas_object_layer_set(wd->mgf_proxy, EVAS_LAYER_MAX);
+}
+
 static Eina_Bool
 _long_press(void *data)
 {
    Widget_Data *wd = elm_widget_data_get(data);
    if (!wd) return ECORE_CALLBACK_CANCEL;
-   if (!_elm_config->desktop_entry)
+   if (_elm_config->magnifier_enable)
+     {
+        _magnifier_create(data);
+        _magnifier_move(data, wd->downx, wd->downy);
+        _magnifier_show(data);
+     }
+   else if (!_elm_config->desktop_entry)
      _menu_press(data);
+   wd->long_pressed = EINA_TRUE;
    wd->longpress_timer = NULL;
    evas_object_smart_callback_call(data, SIG_LONGPRESSED, NULL);
    return ECORE_CALLBACK_CANCEL;
@@ -1433,6 +1566,7 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Eva
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
    wd->downx = ev->canvas.x;
    wd->downy = ev->canvas.y;
+   wd->long_pressed = EINA_FALSE;
    if (ev->button == 1)
      {
         if (wd->longpress_timer) ecore_timer_del(wd->longpress_timer);
@@ -1449,6 +1583,11 @@ _mouse_up(void *data, Evas *evas __UNUSED__, Evas_
    if (wd->disabled) return;
    if (ev->button == 1)
      {
+        if (_elm_config->magnifier_enable)
+          {
+             _magnifier_hide(data);
+             if (wd->long_pressed) _menu_press(data);
+          }
         if (wd->longpress_timer)
           {
              ecore_timer_del(wd->longpress_timer);
@@ -1469,6 +1608,15 @@ _mouse_move(void *data, Evas *evas __UNUSED__, Eva
    Evas_Event_Mouse_Move *ev = event_info;
    if (!wd) return;
    if (wd->disabled) return;
+
+   if (ev->buttons == 1)
+     {
+        if ((wd->long_pressed) && (_elm_config->magnifier_enable))
+          {
+             _magnifier_move(data, ev->cur.canvas.x, ev->cur.canvas.y);
+             _magnifier_show(data);
+          }
+     }
    if (!wd->selmode)
      {
         if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
Index: data/themes/widgets/entry.edc
===================================================================
--- data/themes/widgets/entry.edc	(revision 73481)
+++ data/themes/widgets/entry.edc	(working copy)
@@ -1394,3 +1394,48 @@ group { name: "elm/entry/anchor/default";
    }
 }
 
+
+#define MAGNIFIER_SCALE 1.2
+#define MAGNIFIER_SIZE_WIDTH 210
+#define MAGNIFIER_SIZE_HEIGHT 100
+
+group { name: "elm/entry/magnifier/default";
+   data.item: "scale" MAGNIFIER_SCALE;
+   images {
+      image: "magnifier.png" COMP;
+   }
+   parts {
+      part { name: "bg";
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            min: MAGNIFIER_SIZE_WIDTH MAGNIFIER_SIZE_HEIGHT;
+            align: 0.5 1.0;
+            image {
+               normal: "magnifier.png";
+            }
+            image.middle: SOLID;
+            fill.smooth: 0;
+         }
+      }
+      part { name: "swallow";
+         type: SWALLOW;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            align: 0.0 0.0;
+            rel1 {
+               to: "bg";
+               offset: 11 11;
+            }
+            rel2 {
+               to: "bg";
+               offset: -19 -17;
+            }
+         }
+      }
+   }
+}
+
Index: src/bin/config.c
===================================================================
--- src/bin/config.c	(revision 73481)
+++ src/bin/config.c	(working copy)
@@ -599,6 +599,20 @@ ac_change(void *data       __UNUSED__,
 }
 
 static void
+en_change(void *data       __UNUSED__,
+          Evas_Object     *obj,
+          void *event_info __UNUSED__)
+{
+   Eina_Bool val = elm_check_state_get(obj);
+   Eina_Bool mg = elm_config_magnifier_enabled_get();
+
+   if (val == mg) return;
+   elm_config_magnifier_enabled_set(val);
+   elm_config_all_flush();
+}
+
+
+static void
 _status_basic(Evas_Object *win,
               Evas_Object *bx0)
 {
@@ -755,6 +769,14 @@ _cf_access(void            *data,
    _flip_to(data, "access");
 }
 
+static void
+_cf_entry(void            *data,
+           Evas_Object *obj __UNUSED__,
+           void *event_info __UNUSED__)
+{
+   _flip_to(data, "entry");
+}
+
 const char *
 _elm_theme_current_get(const char *theme_search_order)
 {
@@ -1267,6 +1289,34 @@ _status_config_access(Evas_Object *win,
    elm_naviframe_item_simple_push(naviframe, bx);
 }
 
+static void
+_status_config_entry(Evas_Object *win,
+                      Evas_Object *naviframe)
+{
+   Evas_Object *bx, *ck;
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(bx, EVAS_HINT_FILL, 0.5);
+
+   ck = elm_check_add(win);
+   elm_object_tooltip_text_set(ck, "Set whether entry shows magnifier<br/>"
+		                           "when entry is long-pressed.");
+   elm_object_text_set(ck, "Enable Magnifier");
+   evas_object_data_set(win, "magnifier_enable", ck);
+   evas_object_size_hint_weight_set(ck, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(ck, EVAS_HINT_FILL, 0.5);
+   elm_check_state_set(ck, elm_config_magnifier_enabled_get());
+   elm_box_pack_end(bx, ck);
+   evas_object_show(ck);
+
+   evas_object_smart_callback_add(ck, "changed", en_change, NULL);
+
+   evas_object_data_set(win, "entry", bx);
+
+   elm_naviframe_item_simple_push(naviframe, bx);
+}
+
 static Evas_Object *
 _sample_theme_new(Evas_Object *win)
 {
@@ -3046,6 +3096,7 @@ _status_config_full(Evas_Object *win,
                            _cf_rendering, win);
    elm_toolbar_item_append(tb, "appointment-new", "Caches", _cf_caches, win);
    elm_toolbar_item_append(tb, "stock_spellcheck", "Access", _cf_access, win);
+   elm_toolbar_item_append(tb, "entry config", "Entry", _cf_entry, win);
 
    elm_box_pack_end(bx0, tb);
    evas_object_show(tb);
@@ -3062,6 +3113,7 @@ _status_config_full(Evas_Object *win,
    _status_config_scrolling(win, naviframe);
    _status_config_caches(win, naviframe);
    _status_config_access(win, naviframe);
+   _status_config_entry(win, naviframe);
    _status_config_sizing(win, naviframe); // Note: call this at the end.
 
    // FIXME uncomment after flip style fix, please
