Index: src/lib/edje_convert.h
===================================================================
--- src/lib/edje_convert.h	(revision 73912)
+++ src/lib/edje_convert.h	(working copy)
@@ -89,7 +89,7 @@ struct _Old_Edje_Part
    const char            *name; /* the name if any of the part */
    Old_Edje_Part_Description *default_desc; /* the part descriptor for default */
    Eina_List             *other_desc; /* other possible descriptors */
-   const char            *source, *source2, *source3, *source4, *source5, *source6;
+   const char            *source, *source2, *source3, *source4, *source5, *source6, *source7, *source8;
    int                    id; /* its id number */
    int                    clip_to_id; /* the part id to clip this one to */
    Edje_Part_Dragable     dragable;
Index: src/lib/edje_private.h
===================================================================
--- src/lib/edje_private.h	(revision 73912)
+++ src/lib/edje_private.h	(working copy)
@@ -849,7 +849,7 @@ struct _Edje_Part
 
    Edje_Part_Description_List    other; /* other possible descriptors */
 
-   const char           *source, *source2, *source3, *source4, *source5, *source6;
+   const char           *source, *source2, *source3, *source4, *source5, *source6, *source7, *source8;
    int                    id; /* its id number */
    int                    clip_to_id; /* the part id to clip this one to */
    Edje_Part_Dragable     dragable;
Index: src/lib/edje_convert.c
===================================================================
--- src/lib/edje_convert.c	(revision 73912)
+++ src/lib/edje_convert.c	(working copy)
@@ -377,6 +377,8 @@ _edje_collection_convert(Edje_File *file, Old_Edje
 	replacement->source4 = part->source4;
 	replacement->source5 = part->source5;
 	replacement->source6 = part->source6;
+	replacement->source7 = part->source7;
+	replacement->source8 = part->source8;
 	replacement->id = part->id;
 	replacement->clip_to_id = part->clip_to_id;
 	replacement->dragable = part->dragable;
Index: src/lib/edje_data.c
===================================================================
--- src/lib/edje_data.c	(revision 73912)
+++ src/lib/edje_data.c	(working copy)
@@ -842,6 +842,8 @@ _edje_edd_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source4", source4, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source5", source5, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source6", source6, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source7", source7, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source8", source8, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "id", id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "dragable.x", dragable.x, EET_T_CHAR);
Index: src/bin/edje_convert.h
===================================================================
--- src/bin/edje_convert.h	(revision 73912)
+++ src/bin/edje_convert.h	(working copy)
@@ -92,7 +92,7 @@ struct _Old_Edje_Part
    const char            *name; /* the name if any of the part */
    Old_Edje_Part_Description *default_desc; /* the part descriptor for default */
    Eina_List             *other_desc; /* other possible descriptors */
-   const char            *source, *source2, *source3, *source4, *source5, *source6;
+   const char            *source, *source2, *source3, *source4, *source5, *source6, *source7, *source8;
    int                    id; /* its id number */
    int                    clip_to_id; /* the part id to clip this one to */
    Edje_Part_Dragable     dragable;
Index: src/bin/edje_cc_handlers.c
===================================================================
--- src/bin/edje_cc_handlers.c	(revision 73912)
+++ src/bin/edje_cc_handlers.c	(working copy)
@@ -138,6 +138,8 @@ static void st_collections_group_parts_part_source
 static void st_collections_group_parts_part_source4(void);
 static void st_collections_group_parts_part_source5(void);
 static void st_collections_group_parts_part_source6(void);
+static void st_collections_group_parts_part_source7(void);
+static void st_collections_group_parts_part_source8(void);
 static void st_collections_group_parts_part_entry_mode(void);
 static void st_collections_group_parts_part_select_mode(void);
 static void st_collections_group_parts_part_cursor_mode(void);
@@ -381,6 +383,8 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.part.source4", st_collections_group_parts_part_source4},
      {"collections.group.parts.part.source5", st_collections_group_parts_part_source5},
      {"collections.group.parts.part.source6", st_collections_group_parts_part_source6},
+     {"collections.group.parts.part.source7", st_collections_group_parts_part_source7},
+     {"collections.group.parts.part.source8", st_collections_group_parts_part_source8},
      {"collections.group.parts.part.dragable.x", st_collections_group_parts_part_dragable_x},
      {"collections.group.parts.part.dragable.y", st_collections_group_parts_part_dragable_y},
      {"collections.group.parts.part.dragable.confine", st_collections_group_parts_part_dragable_confine},
@@ -2382,6 +2386,8 @@ st_collections_group_inherit(void)
         ep->source4 = STRDUP(ep2->source4);
         ep->source5 = STRDUP(ep2->source5);
         ep->source6 = STRDUP(ep2->source6);
+        ep->source7 = STRDUP(ep2->source7);
+        ep->source8 = STRDUP(ep2->source8);
 
         data_queue_copied_part_lookup(pc, &(ep2->clip_to_id), &(ep->clip_to_id));
 
@@ -3469,8 +3475,8 @@ st_collections_group_parts_part_source4(void)
         [another group's name]
     @effect
         Only available to TEXTBLOCK parts. It is used for the group to be 
-        loaded and used for anchors display UNDER the anchor position. source6
-        is used for over the anchors text, if source6 is specified.
+        loaded and used for anchors display UNDER the anchor position. source5
+        is used for over the anchors text, if source5 is specified.
     @endproperty
 */
 static void
@@ -3507,8 +3513,52 @@ st_collections_group_parts_part_source6(void)
 
 /**
     @page edcref
+    @property
+        source7
+    @parameters
+        [another group's name]
+    @effect
+        Only available to TEXTBLOCK parts. It is used for the group to be 
+        loaded and used for anchor display OVER the anchor position. source5
+        is used for under the anchor text, if source7 is specified.
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_source7(void)
+{
+   check_arg_count(1);
 
+   //FIXME: validate this somehow (need to decide on the format also)
+   current_part->source7 = parse_str(0);
+   data_queue_group_lookup(current_part->source7, current_part);
+}
+
+/**
+    @page edcref
     @property
+        source8
+    @parameters
+        [another group's name]
+    @effect
+        Only available to TEXTBLOCK parts. It is used for the group to be 
+        loaded and used for anchor display OVER the anchor position. source5
+        is used for under the anchor text, if source8 is specified.
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_source8(void)
+{
+   check_arg_count(1);
+
+   //FIXME: validate this somehow (need to decide on the format also)
+   current_part->source8 = parse_str(0);
+   data_queue_group_lookup(current_part->source8, current_part);
+}
+
+/**
+    @page edcref
+
+    @property
         effect
     @parameters
         [EFFECT]
Index: src/bin/edje_data_convert.c
===================================================================
--- src/bin/edje_data_convert.c	(revision 73912)
+++ src/bin/edje_data_convert.c	(working copy)
@@ -422,6 +422,8 @@ _edje_edd_old_init(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "source4", source4, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "source5", source5, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "source6", source6, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "source7", source7, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "source8", source8, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_old_edje_part, Old_Edje_Part, "items", items, _edje_edd_old_edje_pack_element);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "api.name", api.name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_old_edje_part, Old_Edje_Part, "api.description", api.description, EET_T_STRING);
Index: src/lib/edje_entry.c
===================================================================
--- src/lib/edje_entry.c	(revision 73912)
+++ src/lib/edje_entry.c	(working copy)
@@ -18,6 +18,9 @@ struct _Entry
    Edje_Real_Part *rp;
    Evas_Object *cursor_bg;
    Evas_Object *cursor_fg;
+   Evas_Object *handler_start;
+   Evas_Object *handler_end;
+   Evas_Coord ox, oy;
    Evas_Textblock_Cursor *cursor;
    Evas_Textblock_Cursor *sel_start, *sel_end;
    Evas_Textblock_Cursor *cursor_user, *cursor_user_extra;
@@ -476,6 +479,14 @@ _sel_extend(Evas_Textblock_Cursor *c, Evas_Object
    _edje_entry_imf_context_reset(en->rp);
    _sel_enable(c, o, en);
    if (!evas_textblock_cursor_compare(c, en->sel_end)) return;
+
+   if ((en->handler_start) && (en->handler_end))
+     {
+        /* Do NOT allow sel_end to pass sel_start while extending */
+        if (evas_textblock_cursor_compare(c, en->sel_start) <= 0)
+          evas_textblock_cursor_pos_set(c, evas_textblock_cursor_pos_get(en->sel_start) + 1);
+     }
+
    evas_textblock_cursor_copy(c, en->sel_end);
    if (en->selection)
      {
@@ -492,6 +503,14 @@ _sel_preextend(Evas_Textblock_Cursor *c, Evas_Obje
    _edje_entry_imf_context_reset(en->rp);
    _sel_enable(c, o, en);
    if (!evas_textblock_cursor_compare(c, en->sel_start)) return;
+
+   if ((en->handler_start) && (en->handler_end))
+     {
+        /* Do NOT allow sel_start to pass sel_end while pre-extending */
+        if (evas_textblock_cursor_compare(c, en->sel_end) >= 0)
+          evas_textblock_cursor_pos_set(c, evas_textblock_cursor_pos_get(en->sel_end) - 1);
+     }
+
    evas_textblock_cursor_copy(c, en->sel_start);
    if (en->selection)
      {
@@ -532,6 +551,10 @@ _sel_clear(Evas_Textblock_Cursor *c __UNUSED__, Ev
         en->have_selection = EINA_FALSE;
         _edje_emit(en->rp->edje, "selection,cleared", en->rp->part->name);
      }
+   if (en->handler_start)
+     edje_object_signal_emit(en->handler_start, "edje,handler,hide", "edje");
+   if (en->handler_end)
+     edje_object_signal_emit(en->handler_end, "edje,handler,hide", "edje");
 }
 
 static void
@@ -592,11 +615,15 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, E
    evas_object_geometry_get(o, &x, &y, &w, &h);
    if (en->have_selection)
      {
+        int lc, li = 0;
+        lc = eina_list_count(en->sel);
+
         EINA_LIST_FOREACH(en->sel, l, sel)
           {
              Evas_Textblock_Rectangle *r;
+             r = range->data;
+             li++;
 
-             r = range->data;
              if (sel->obj_bg)
                {
                   evas_object_move(sel->obj_bg, x + r->x, y + r->y);
@@ -607,6 +634,21 @@ _sel_update(Evas_Textblock_Cursor *c __UNUSED__, E
                   evas_object_move(sel->obj_fg, x + r->x, y + r->y);
                   evas_object_resize(sel->obj_fg, r->w, r->h);
                }
+             if (en->rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT)
+               {
+                  if (li == 1)
+                    {
+                       evas_object_move(en->handler_start, x + r->x, y + r->y);
+                       evas_object_resize(en->handler_start, 0, r->h);
+                       edje_object_signal_emit(en->handler_start, "edje,handler,show", "edje");
+                    }
+                  if (li == lc)
+                    {
+                       evas_object_move(en->handler_end, x + r->x + r->w, y + r->y);
+                       evas_object_resize(en->handler_end, 0, r->h);
+                       edje_object_signal_emit(en->handler_end, "edje,handler,show", "edje");
+                    }
+               }
              *(&(sel->rect)) = *r;
              range = eina_list_remove_list(range, range);
              free(r);
@@ -2042,6 +2084,103 @@ _edje_part_mouse_move_cb(void *data, Evas *e __UNU
 }
 
 static void
+_edje_entry_handler_start_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   Edje_Real_Part *rp = data;
+   Entry *en = rp->entry_data;
+   Evas_Coord hx, hy, hw, hh;
+
+   if (ev->button != 1) return;
+
+   evas_object_geometry_get(en->handler_start, &hx, &hy, &hw, &hh);
+   en->ox = hx - ev->canvas.x;
+   en->oy = hy + hh/2 - ev->canvas.y;
+
+   en->select_mod_start = EINA_TRUE;
+   en->selecting = EINA_TRUE;
+
+   _edje_emit(en->rp->edje, "handler,move,start", en->rp->part->name);
+
+}
+
+static void
+_edje_entry_handler_start_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Edje_Real_Part *rp = data;
+   Entry *en = rp->entry_data;
+
+   en->selecting = EINA_FALSE;
+   en->select_mod_start = EINA_FALSE;
+
+   _edje_emit(en->rp->edje, "handler,move,end", en->rp->part->name);
+}
+
+static void
+_edje_entry_handler_start_mouse_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   Edje_Real_Part *rp = data;
+   Entry *en = rp->entry_data;
+
+   if (ev->buttons != 1) return;
+
+   ev->cur.canvas.x += en->ox;
+   ev->cur.canvas.y += en->oy;
+   _edje_part_mouse_move_cb(data, e, obj, ev);
+
+   _edje_emit(en->rp->edje, "handler,moving", en->rp->part->name);
+}
+
+static void
+_edje_entry_handler_end_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Evas_Event_Mouse_Down *ev = event_info;
+   Edje_Real_Part *rp = data;
+   Entry *en = rp->entry_data;
+   Evas_Coord hx, hy, hw, hh;
+
+   if (ev->button != 1) return;
+
+   evas_object_geometry_get(en->handler_end, &hx, &hy, &hw, &hh);
+   en->ox = hx - ev->canvas.x;
+   en->oy = hy + hh/2 - ev->canvas.y;
+
+   en->select_mod_end = EINA_TRUE;
+   en->selecting = EINA_TRUE;
+
+   _edje_emit(en->rp->edje, "handler,move,start", en->rp->part->name);
+}
+
+static void
+_edje_entry_handler_end_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Edje_Real_Part *rp = data;
+   Entry *en = rp->entry_data;
+
+   en->selecting = EINA_FALSE;
+   en->select_mod_end = EINA_FALSE;
+
+   _edje_emit(en->rp->edje, "handler,move,end", en->rp->part->name);
+}
+
+static void
+_edje_entry_handler_end_mouse_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Evas_Event_Mouse_Move *ev = event_info;
+   Edje_Real_Part *rp = data;
+   Entry *en = rp->entry_data;
+
+   if (ev->buttons != 1) return;
+
+   ev->cur.canvas.x += en->ox;
+   ev->cur.canvas.y += en->oy;
+   _edje_part_mouse_move_cb(data, e, obj, ev);
+
+   _edje_emit(en->rp->edje, "handler,moving", en->rp->part->name);
+}
+
+static void
 _evas_focus_in_cb(void *data, Evas *e, __UNUSED__ void *event_info)
 {
    Edje *ed = (Edje *)data;
@@ -2152,6 +2291,30 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
    evas_object_pass_events_set(en->cursor_fg, EINA_TRUE);
    _edje_subobj_register(en->rp->edje, en->cursor_fg);
 
+   if (en->rp->part->select_mode == EDJE_ENTRY_SELECTION_MODE_EXPLICIT)
+     {
+        if (rp->part->source7)
+          {
+             en->handler_start = edje_object_add(rp->edje->base.evas);
+             edje_object_file_set(en->handler_start, rp->edje->path, rp->part->source7);
+             evas_object_show(en->handler_start);
+             _edje_subobj_register(en->rp->edje, en->handler_start);
+             evas_object_event_callback_add(en->handler_start, EVAS_CALLBACK_MOUSE_DOWN, _edje_entry_handler_start_mouse_down_cb, en->rp);
+             evas_object_event_callback_add(en->handler_start, EVAS_CALLBACK_MOUSE_UP, _edje_entry_handler_start_mouse_up_cb, en->rp);
+             evas_object_event_callback_add(en->handler_start, EVAS_CALLBACK_MOUSE_MOVE, _edje_entry_handler_start_mouse_move_cb, en->rp);
+          }
+        if (rp->part->source8)
+          {
+             en->handler_end = edje_object_add(rp->edje->base.evas);
+             edje_object_file_set(en->handler_end, rp->edje->path, rp->part->source8);
+             evas_object_show(en->handler_end);
+             _edje_subobj_register(en->rp->edje, en->handler_end);
+             evas_object_event_callback_add(en->handler_end, EVAS_CALLBACK_MOUSE_DOWN, _edje_entry_handler_end_mouse_down_cb, en->rp);
+             evas_object_event_callback_add(en->handler_end, EVAS_CALLBACK_MOUSE_UP, _edje_entry_handler_end_mouse_up_cb, en->rp);
+             evas_object_event_callback_add(en->handler_end, EVAS_CALLBACK_MOUSE_MOVE, _edje_entry_handler_end_mouse_move_cb, en->rp);
+          }
+     }
+
    evas_object_textblock_legacy_newline_set(rp->object, EINA_TRUE);
 
    if (rp->part->entry_mode >= EDJE_ENTRY_EDIT_MODE_EDITABLE)
@@ -2228,6 +2391,16 @@ _edje_entry_real_part_shutdown(Edje_Real_Part *rp)
    evas_object_del(en->cursor_bg);
    evas_object_del(en->cursor_fg);
 
+   if (en->handler_start)
+     {
+        evas_object_del(en->handler_start);
+        en->handler_start = NULL;
+     }
+   if (en->handler_end)
+     {
+        evas_object_del(en->handler_end);
+        en->handler_end = NULL;
+     }
    if (en->pw_timer)
      {
         ecore_timer_del(en->pw_timer);
