Index: src/lib/elm_win.c
===================================================================
--- src/lib/elm_win.c	(리비전 76637)
+++ src/lib/elm_win.c	(작업 사본)
@@ -1857,7 +1857,8 @@ _elm_win_client_message(void *data,
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_ACTIVATE)
                {
-                  _elm_access_highlight_object_activate(ELM_WIDGET_DATA(sd)->obj);
+                  _elm_access_highlight_object_activate
+                    (ELM_WIDGET_DATA(sd)->obj, ELM_ACTIVATE_DEFAULT);
                }
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_READ)
@@ -1877,12 +1878,14 @@ _elm_win_client_message(void *data,
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_UP)
                {
-                  // XXX: call right access func
+                  _elm_access_highlight_object_activate
+                    (ELM_WIDGET_DATA(sd)->obj, ELM_ACTIVATE_UP);
                }
              else if ((unsigned int)e->data.l[1] ==
                       ECORE_X_ATOM_E_ILLUME_ACCESS_ACTION_DOWN)
                {
-                  // XXX: call right access func
+                  _elm_access_highlight_object_activate
+                    (ELM_WIDGET_DATA(sd)->obj, ELM_ACTIVATE_DOWN);
                }
           }
      }
Index: src/lib/elm_access.c
===================================================================
--- src/lib/elm_access.c	(리비전 76637)
+++ src/lib/elm_access.c	(작업 사본)
@@ -294,11 +294,11 @@ _elm_access_on_highlight_hook_set(Elm_Access_Info
 }
 
 EAPI void
-_elm_access_highlight_object_activate(Evas_Object *obj)
+_elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act)
 {
    Evas_Object *highlight_obj;
    highlight_obj = elm_widget_focused_object_get(obj);
-   elm_widget_activate(highlight_obj);
+   elm_widget_activate(highlight_obj, act);
 }
 
 EAPI char *
Index: src/lib/elm_general.h
===================================================================
--- src/lib/elm_general.h	(리비전 76637)
+++ src/lib/elm_general.h	(작업 사본)
@@ -104,6 +104,15 @@ typedef enum
    ELM_OBJECT_SELECT_MODE_MAX
 } Elm_Object_Select_Mode;
 
+typedef enum
+{
+   ELM_ACTIVATE_DEFAULT = 0,
+   ELM_ACTIVATE_UP,
+   ELM_ACTIVATE_DOWN,
+   ELM_ACTIVATE_RIGHT,
+   ELM_ACTIVATE_LEFT
+} Elm_Activate;
+
 /**
  * @typedef Elm_Object_Item
  * An Elementary Object item handle.
Index: src/lib/elm_widget.c
===================================================================
--- src/lib/elm_widget.c	(리비전 76637)
+++ src/lib/elm_widget.c	(작업 사본)
@@ -3507,14 +3507,25 @@ elm_widget_focus_order_get(const Evas_Object *obj)
    return sd->focus_order;
 }
 
-EAPI void 
-elm_widget_activate(Evas_Object *obj)
+EAPI void
+elm_widget_activate(Evas_Object *obj, Elm_Activate act)
 {
+   Evas_Object *parent;
+   Eina_Bool *ret;
+
    API_ENTRY return;
 
-   if (!sd->api->activate) return;
+   ret = EINA_FALSE;
+   if (sd->api->activate)
+     ret = sd->api->activate(obj, act);
 
-   sd->api->activate(obj);
+   if (ret) return;
+
+   parent = elm_widget_parent_get(obj);
+   if (parent)
+     elm_widget_activate(parent, act);
+
+   return;
 }
 
 /**
Index: src/lib/elm_widget.h
===================================================================
--- src/lib/elm_widget.h	(리비전 76637)
+++ src/lib/elm_widget.h	(작업 사본)
@@ -432,7 +432,8 @@ typedef struct _Elm_Widget_Smart_Class
                                       Evas_Object *sobj); /**< 'Virtual' function handling sub objects being removed */
    void             (*access)(Evas_Object *obj,
                               Eina_Bool is_access); /**< 'Virtual' function on the widget being set access */
-   void             (*activate)(Evas_Object *obj); /**< 'Virtual' function to activate widget  */
+   Eina_Bool        (*activate)(Evas_Object *obj,
+                                Elm_Activate act); /**< 'Virtual' function to activate widget  */
 } Elm_Widget_Smart_Class;
 
 /**
@@ -547,7 +548,6 @@ typedef Eina_Bool             (*Elm_Widget_Del_Pre
 
 typedef char *(*Elm_Access_Content_Cb)(void *data, Evas_Object *obj, Elm_Widget_Item *item);
 typedef void (*Elm_Access_On_Highlight_Cb)(void *data);
-typedef void (*Elm_Access_Activate_Cb)(Evas_Object *obj, void *data);
 
 struct _Elm_Access_Item
 {
@@ -563,8 +563,6 @@ struct _Elm_Access_Info
    Ecore_Timer               *delay_timer;
    void                      *on_highlight_data;
    Elm_Access_On_Highlight_Cb on_highlight;
-   void                      *activate_data;
-   Elm_Access_Activate_Cb     activate;
 };
 
 EAPI void             _elm_access_clear(Elm_Access_Info *ac);
@@ -588,7 +586,7 @@ EAPI void             _elm_access_edje_object_part
 EAPI void             _elm_access_widget_item_register(Elm_Widget_Item *item);
 EAPI void             _elm_access_widget_item_unregister(Elm_Widget_Item *item);
 EAPI void             _elm_access_on_highlight_hook_set(Elm_Access_Info *ac, Elm_Access_On_Highlight_Cb func, void *data);
-EAPI void             _elm_access_highlight_object_activate(Evas_Object *obj);
+EAPI void             _elm_access_highlight_object_activate(Evas_Object *obj, Elm_Activate act);
 
 /**< put this as the first member in your widget item struct */
 #define ELM_WIDGET_ITEM       Elm_Widget_Item base
@@ -743,7 +741,7 @@ EAPI void             elm_widget_focus_mouse_up_ha
 EAPI void             elm_widget_focus_tree_unfocusable_handle(Evas_Object *obj);
 EAPI void             elm_widget_focus_disabled_handle(Evas_Object *obj);
 EAPI unsigned int     elm_widget_focus_order_get(const Evas_Object *obj);
-EAPI void             elm_widget_activate(Evas_Object *obj);
+EAPI void             elm_widget_activate(Evas_Object *obj, Elm_Activate act);
 EAPI void             elm_widget_text_part_set(Evas_Object *obj, const char *part, const char *label);
 EAPI const char      *elm_widget_text_part_get(const Evas_Object *obj, const char *part);
 EAPI void             elm_widget_domain_translatable_text_part_set(Evas_Object *obj, const char *part, const char *domain, const char *text);
Index: src/lib/elm_button.c
===================================================================
--- src/lib/elm_button.c	(리비전 76637)
+++ src/lib/elm_button.c	(작업 사본)
@@ -73,11 +73,15 @@ _elm_button_smart_sizing_eval(Evas_Object *obj)
    evas_object_size_hint_min_set(obj, minw, minh);
 }
 
-static void
-_elm_button_smart_activate(Evas_Object *obj)
+static Eina_Bool
+_elm_button_smart_activate(Evas_Object *obj, Elm_Activate act)
 {
+   if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
+
    evas_object_smart_callback_call(obj, SIG_CLICKED, NULL);
    elm_layout_signal_emit(obj, "elm,anim,activate", "elm");
+
+   return EINA_TRUE;
 }
 
 /* FIXME: replicated from elm_layout just because button's icon spot
