tizen 2.4 release
[framework/uifw/elementary.git] / src / lib / elm_interface_scrollable.c
index 3c6f5b2..bd6b3e3 100644 (file)
@@ -1,25 +1,33 @@
+#ifdef HAVE_CONFIG_H
+# include "elementary_config.h"
+#endif
+
 #include <Elementary.h>
+
 #include "elm_priv.h"
 #include "elm_interface_scrollable.h"
 
-static const char PAN_SMART_NAME[] = "elm_pan";
+#define MY_PAN_CLASS ELM_PAN_CLASS
+
+#define MY_PAN_CLASS_NAME "Elm_Pan"
+#define MY_PAN_CLASS_NAME_LEGACY "elm_pan"
 
 #define ELM_PAN_DATA_GET_OR_RETURN(o, ptr)                      \
-  Elm_Pan_Smart_Data *ptr = evas_object_smart_data_get(o);      \
+  Elm_Pan_Smart_Data *ptr = eo_data_scope_get(o, MY_PAN_CLASS);       \
   if (!ptr)                                                     \
     {                                                           \
-       CRITICAL("No smart data for object %p (%s)",             \
+       CRI("No smart data for object %p (%s)",             \
                 o, evas_object_type_get(o));                    \
        return;                                                  \
     }
 
-#define ELM_PAN_DATA_GET_OR_RETURN_VAL(o, ptr, val)            \
-  Elm_Pan_Smart_Data *ptr = evas_object_smart_data_get(o);     \
-  if (!ptr)                                                    \
-    {                                                          \
-       CRITICAL("No smart data for object %p (%s)",            \
-                o, evas_object_type_get(o));                   \
-       return val;                                             \
+#define ELM_PAN_DATA_GET_OR_RETURN_VAL(o, ptr, val)             \
+  Elm_Pan_Smart_Data *ptr = eo_data_scope_get(o, MY_PAN_CLASS);       \
+  if (!ptr)                                                     \
+    {                                                           \
+       CRI("No smart data for object %p (%s)",             \
+                o, evas_object_type_get(o));                    \
+       return val;                                              \
     }
 
 static const char SIG_CHANGED[] = "changed";
@@ -28,10 +36,6 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] = {
    {NULL, NULL}
 };
 
-ELM_INTERNAL_SMART_SUBCLASS_NEW
-  (PAN_SMART_NAME, _elm_pan, Elm_Pan_Smart_Class, Evas_Smart_Class,
-  evas_object_smart_clipped_class_get, _smart_callbacks);
-
 static void _elm_pan_content_set(Evas_Object *, Evas_Object *);
 static void
 _elm_scroll_scroll_to_x(Elm_Scrollable_Smart_Interface_Data *sid,
@@ -42,31 +46,9 @@ _elm_scroll_scroll_to_y(Elm_Scrollable_Smart_Interface_Data *sid,
                         double t_in,
                         Evas_Coord pos_y);
 static void
-_elm_scroll_current_page_get(const Evas_Object *obj,
-                             int *pagenumber_h,
-                             int *pagenumber_v);
-static void
 _elm_scroll_wanted_coordinates_update(Elm_Scrollable_Smart_Interface_Data *sid,
                                       Evas_Coord x,
                                       Evas_Coord y);
-EAPI const Elm_Pan_Smart_Class *
-elm_pan_smart_class_get(void)
-{
-   static Elm_Pan_Smart_Class _sc =
-     ELM_PAN_SMART_CLASS_INIT_NAME_VERSION(PAN_SMART_NAME);
-   static const Elm_Pan_Smart_Class *class = NULL;
-   Evas_Smart_Class *esc = (Evas_Smart_Class *)&_sc;
-
-   if (class)
-     return class;
-
-   _elm_pan_smart_set(&_sc);
-   esc->callbacks = _smart_callbacks;
-   class = &_sc;
-
-   return class;
-}
-
 static double
 _round(double value, int pos)
 {
@@ -103,60 +85,34 @@ _elm_pan_update(Elm_Pan_Smart_Data *psd)
    psd->py = psd->delta_posy * psd->gravity_y;
 }
 
-static void
-_elm_pan_smart_add(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_add(Eo *obj, Elm_Pan_Smart_Data *priv)
 {
-   const Evas_Smart_Class *sc;
-   const Evas_Smart *smart;
-
-   EVAS_SMART_DATA_ALLOC(obj, Elm_Pan_Smart_Data);
-
-   _elm_pan_parent_sc->add(obj);
+   eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_add());
 
    priv->self = obj;
-
-   priv->x = 0;
-   priv->y = 0;
-   priv->w = 0;
-   priv->h = 0;
-   priv->gravity_x = 0.0;
-   priv->gravity_y = 0.0;
-
-   smart = evas_object_smart_smart_get(obj);
-   sc = evas_smart_class_get(smart);
-   priv->api = (const Elm_Pan_Smart_Class *)sc;
 }
 
-static void
-_elm_pan_smart_del(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_del(Eo *obj, Elm_Pan_Smart_Data *_pd EINA_UNUSED)
 {
    _elm_pan_content_set(obj, NULL);
 
-   _elm_pan_parent_sc->del(obj);
+   eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_del());
 }
 
-static void
-_elm_pan_smart_move(Evas_Object *obj,
-                    Evas_Coord x,
-                    Evas_Coord y)
+EOLIAN static void
+_elm_pan_evas_object_smart_move(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord x, Evas_Coord y)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
-   /* we don't want the clipped smart object version here */
-
    psd->x = x;
    psd->y = y;
 
    _elm_pan_update(psd);
 }
 
-static void
-_elm_pan_smart_resize(Evas_Object *obj,
-                      Evas_Coord w,
-                      Evas_Coord h)
+EOLIAN static void
+_elm_pan_evas_object_smart_resize(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord w, Evas_Coord h)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
    psd->w = w;
    psd->h = h;
 
@@ -164,35 +120,27 @@ _elm_pan_smart_resize(Evas_Object *obj,
    evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
 }
 
-static void
-_elm_pan_smart_show(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_show(Eo *obj, Elm_Pan_Smart_Data *psd)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
-   _elm_pan_parent_sc->show(obj);
+   eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_show());
 
    if (psd->content)
      evas_object_show(psd->content);
 }
 
-static void
-_elm_pan_smart_hide(Evas_Object *obj)
+EOLIAN static void
+_elm_pan_evas_object_smart_hide(Eo *obj, Elm_Pan_Smart_Data *psd)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
-   _elm_pan_parent_sc->hide(obj);
+   eo_do_super(obj, MY_PAN_CLASS, evas_obj_smart_hide());
 
    if (psd->content)
      evas_object_hide(psd->content);
 }
 
-static void
-_elm_pan_pos_set(Evas_Object *obj,
-                 Evas_Coord x,
-                 Evas_Coord y)
+EOLIAN static void
+_elm_pan_pos_set(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord x, Evas_Coord y)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
    if ((x == psd->px) && (y == psd->py)) return;
    psd->px = x;
    psd->py = y;
@@ -201,24 +149,16 @@ _elm_pan_pos_set(Evas_Object *obj,
    evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
 }
 
-static void
-_elm_pan_pos_get(const Evas_Object *obj,
-                 Evas_Coord *x,
-                 Evas_Coord *y)
+EOLIAN static void
+_elm_pan_pos_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord *x, Evas_Coord *y)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
    if (x) *x = psd->px;
    if (y) *y = psd->py;
 }
 
-static void
-_elm_pan_pos_max_get(const Evas_Object *obj,
-                     Evas_Coord *x,
-                     Evas_Coord *y)
+EOLIAN static void
+_elm_pan_pos_max_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord *x, Evas_Coord *y)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
    if (x)
      {
         if (psd->w < psd->content_w) *x = psd->content_w - psd->w;
@@ -231,10 +171,8 @@ _elm_pan_pos_max_get(const Evas_Object *obj,
      }
 }
 
-static void
-_elm_pan_pos_min_get(const Evas_Object *obj __UNUSED__,
-                     Evas_Coord *x,
-                     Evas_Coord *y)
+EOLIAN static void
+_elm_pan_pos_min_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *_pd EINA_UNUSED, Evas_Coord *x, Evas_Coord *y)
 {
    if (x)
      *x = 0;
@@ -242,24 +180,24 @@ _elm_pan_pos_min_get(const Evas_Object *obj __UNUSED__,
      *y = 0;
 }
 
-static void
-_elm_pan_content_size_get(const Evas_Object *obj,
-                          Evas_Coord *w,
-                          Evas_Coord *h)
+// TIZEN_ONLY(20150705): Genlist item align feature
+EOLIAN static void
+_elm_pan_pos_adjust(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd EINA_UNUSED, Evas_Coord *x EINA_UNUSED, Evas_Coord *y EINA_UNUSED)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
 
+}
+//
+
+EOLIAN static void
+_elm_pan_content_size_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, Evas_Coord *w, Evas_Coord *h)
+{
    if (w) *w = psd->content_w;
    if (h) *h = psd->content_h;
 }
 
-static void
-_elm_pan_gravity_set(Evas_Object *obj,
-                     double x,
-                     double y)
+EOLIAN static void
+_elm_pan_gravity_set(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, double x, double y)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
    psd->gravity_x = x;
    psd->gravity_y = y;
    psd->prev_cw = psd->content_w;
@@ -268,47 +206,34 @@ _elm_pan_gravity_set(Evas_Object *obj,
    psd->delta_posy = 0;
 }
 
-static void
-_elm_pan_gravity_get(const Evas_Object *obj,
-                     double *x,
-                     double *y)
+EOLIAN static void
+_elm_pan_gravity_get(Eo *obj EINA_UNUSED, Elm_Pan_Smart_Data *psd, double *x, double *y)
 {
-   ELM_PAN_DATA_GET_OR_RETURN(obj, psd);
-
    if (x) *x = psd->gravity_x;
    if (y) *y = psd->gravity_y;
 }
 
-static void
-_elm_pan_smart_set_user(Elm_Pan_Smart_Class *sc)
-{
-   sc->base.add = _elm_pan_smart_add;
-   sc->base.del = _elm_pan_smart_del;
-   sc->base.move = _elm_pan_smart_move;
-   sc->base.resize = _elm_pan_smart_resize;
-   sc->base.show = _elm_pan_smart_show;
-   sc->base.hide = _elm_pan_smart_hide;
-   sc->pos_set = _elm_pan_pos_set;
-   sc->pos_get = _elm_pan_pos_get;
-   sc->pos_max_get = _elm_pan_pos_max_get;
-   sc->pos_min_get = _elm_pan_pos_min_get;
-   sc->content_size_get = _elm_pan_content_size_get;
-   sc->gravity_set = _elm_pan_gravity_set;
-   sc->gravity_get = _elm_pan_gravity_get;
-   sc->pos_adjust = NULL;
-}
-
 static Evas_Object *
 _elm_pan_add(Evas *evas)
 {
-   return evas_object_smart_add(evas, _elm_pan_smart_class_new());
+   Evas_Object *obj = eo_add(MY_PAN_CLASS, evas);
+   return obj;
+}
+
+EOLIAN static void
+_elm_pan_eo_base_constructor(Eo *obj, Elm_Pan_Smart_Data *_pd EINA_UNUSED)
+{
+   eo_do_super(obj, MY_PAN_CLASS, eo_constructor());
+   eo_do(obj,
+         evas_obj_type_set(MY_PAN_CLASS_NAME_LEGACY),
+         evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
 }
 
 static void
 _elm_pan_content_del_cb(void *data,
-                        Evas *e __UNUSED__,
-                        Evas_Object *obj __UNUSED__,
-                        void *event_info __UNUSED__)
+                        Evas *e EINA_UNUSED,
+                        Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
 {
    Elm_Pan_Smart_Data *psd;
 
@@ -321,9 +246,9 @@ _elm_pan_content_del_cb(void *data,
 
 static void
 _elm_pan_content_resize_cb(void *data,
-                           Evas *e __UNUSED__,
-                           Evas_Object *obj __UNUSED__,
-                           void *event_info __UNUSED__)
+                           Evas *e EINA_UNUSED,
+                           Evas_Object *obj EINA_UNUSED,
+                           void *event_info EINA_UNUSED)
 {
    Elm_Pan_Smart_Data *psd;
    Evas_Coord w, h;
@@ -381,46 +306,49 @@ end:
    evas_object_smart_callback_call(psd->self, SIG_CHANGED, NULL);
 }
 
+EOLIAN static void
+_elm_pan_class_constructor(Eo_Class *klass)
+{
+      evas_smart_legacy_type_register(MY_PAN_CLASS_NAME_LEGACY, klass);
+}
+
 /* pan smart object on top, scroller interface on bottom */
 /* ============================================================ */
 
-static const char SCROLL_SMART_NAME[] = "elm_scroll";
+#define MY_SCROLLABLE_INTERFACE ELM_INTERFACE_SCROLLABLE_MIXIN
+
+#define MY_SCROLLABLE_INTERFACE_NAME "Elm_Interface_Scrollable"
+#define MY_SCROLLABLE_INTERFACE_NAME_LEGACY "elm_interface_scrollable"
 
-#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(o, ptr)                     \
-  Elm_Scrollable_Smart_Interface_Data *ptr =                            \
-    evas_object_smart_interface_data_get(o, &(ELM_SCROLLABLE_IFACE.base)); \
-  if (!ptr)                                                             \
-    {                                                                   \
-       CRITICAL("No interface data for object %p (%s)",                 \
-                o, evas_object_type_get(o));                            \
-       return;                                                          \
+#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(o, ptr)     \
+  Elm_Scrollable_Smart_Interface_Data *ptr =            \
+    (!eo_isa(o, MY_SCROLLABLE_INTERFACE) ? NULL :       \
+     eo_data_scope_get(o, MY_SCROLLABLE_INTERFACE));    \
+  if (!ptr)                                             \
+    {                                                   \
+       CRI("No interface data for object %p (%s)", \
+                o, evas_object_type_get(o));            \
+       return;                                          \
     }
 
-#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(o, ptr, val)            \
-  Elm_Scrollable_Smart_Interface_Data *ptr =                            \
-    evas_object_smart_interface_data_get(o, &(ELM_SCROLLABLE_IFACE.base)); \
-  if (!ptr)                                                             \
-    {                                                                   \
-       CRITICAL("No interface data for object %p (%s)",                 \
-                o, evas_object_type_get(o));                            \
-       return val;                                                      \
+#define ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(o, ptr, val) \
+  Elm_Scrollable_Smart_Interface_Data *ptr =                 \
+    (!eo_isa(o, MY_SCROLLABLE_INTERFACE) ? NULL :            \
+     eo_data_scope_get(o, MY_SCROLLABLE_INTERFACE));         \
+  if (!ptr)                                                  \
+    {                                                        \
+       CRI("No interface data for object %p (%s)",      \
+                o, evas_object_type_get(o));                 \
+       return val;                                           \
     }
 
 static void _elm_scroll_scroll_bar_size_adjust(
-  Elm_Scrollable_Smart_Interface_Data *);
-static void _elm_scroll_wanted_region_set(Evas_Object *);
+   Elm_Scrollable_Smart_Interface_Data *);
 static Eina_Bool _paging_is_enabled(Elm_Scrollable_Smart_Interface_Data *sid);
 static Evas_Coord _elm_scroll_page_x_get(
    Elm_Scrollable_Smart_Interface_Data *sid, int offset, Eina_Bool limit);
 static Evas_Coord _elm_scroll_page_y_get(
    Elm_Scrollable_Smart_Interface_Data *sid, int offset, Eina_Bool limit);
-static void _elm_scroll_content_pos_get(const Evas_Object *,
-                                        Evas_Coord *,
-                                        Evas_Coord *);
-static void _elm_scroll_content_pos_set(Evas_Object *,
-                                        Evas_Coord,
-                                        Evas_Coord,
-                                        Eina_Bool);
 
 #define LEFT               0
 #define RIGHT              1
@@ -451,8 +379,6 @@ static int smooth_info_x_count = 0;
 static int smooth_info_y_count = 0;
 static double start_time = 0;
 static int _elm_scroll_smooth_debug = 0;
-static const int _elm_scroll_gradient_check_pixel = 30;
-
 
 void
 _elm_scroll_smooth_debug_init(void)
@@ -544,13 +470,12 @@ _elm_direction_arrows_eval(Elm_Scrollable_Smart_Interface_Data *sid)
    Eina_Bool go_left = EINA_TRUE, go_right = EINA_TRUE;
    Eina_Bool go_up = EINA_TRUE, go_down = EINA_TRUE;
    Evas_Coord x = 0, y = 0, mx = 0, my = 0, minx = 0, miny = 0;
-   
+
    if (!sid->edje_obj || !sid->pan_obj) return;
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-   
-   psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-   psd->api->pos_get(sid->pan_obj, &x, &y);
+
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&x, &y));
 
    if (x == minx) go_left = EINA_FALSE;
    if (x == (mx + minx)) go_right = EINA_FALSE;
@@ -644,6 +569,47 @@ _elm_scroll_smooth_debug_movetime_add(int x,
 
 #endif
 
+static void
+_elm_scroll_scroll_bar_h_visibility_apply(Elm_Scrollable_Smart_Interface_Data *sid)
+{
+   if (sid->hbar_flags != ELM_SCROLLER_POLICY_OFF)
+     {
+        if (sid->hbar_visible)
+          edje_object_signal_emit
+            (sid->edje_obj, "elm,action,show,hbar", "elm");
+        else
+          edje_object_signal_emit
+            (sid->edje_obj, "elm,action,hide,hbar", "elm");
+     }
+   else
+     edje_object_signal_emit(sid->edje_obj, "elm,action,hide,hbar", "elm");
+   edje_object_message_signal_process(sid->edje_obj);
+   _elm_scroll_scroll_bar_size_adjust(sid);
+   if (sid->cb_func.content_min_limit)
+     sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
+}
+
+static void
+_elm_scroll_scroll_bar_v_visibility_apply(Elm_Scrollable_Smart_Interface_Data *sid)
+{
+   if (sid->vbar_flags != ELM_SCROLLER_POLICY_OFF)
+     {
+        if (sid->vbar_visible)
+          edje_object_signal_emit
+            (sid->edje_obj, "elm,action,show,vbar", "elm");
+        else
+          edje_object_signal_emit
+            (sid->edje_obj, "elm,action,hide,vbar", "elm");
+     }
+   else
+     edje_object_signal_emit
+       (sid->edje_obj, "elm,action,hide,vbar", "elm");
+   edje_object_message_signal_process(sid->edje_obj);
+   _elm_scroll_scroll_bar_size_adjust(sid);
+   if (sid->cb_func.content_min_limit)
+     sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
+}
+
 static int
 _elm_scroll_scroll_bar_h_visibility_adjust(
   Elm_Scrollable_Smart_Interface_Data *sid)
@@ -710,26 +676,9 @@ _elm_scroll_scroll_bar_h_visibility_adjust(
                }
           }
      }
-   if (scroll_h_vis_change)
-     {
-        if (sid->hbar_flags != ELM_SCROLLER_POLICY_OFF)
-          {
-             if (sid->hbar_visible)
-               edje_object_signal_emit
-                 (sid->edje_obj, "elm,action,show,hbar", "elm");
-             else
-               edje_object_signal_emit
-                 (sid->edje_obj, "elm,action,hide,hbar", "elm");
-          }
-        else
-          edje_object_signal_emit
-            (sid->edje_obj, "elm,action,hide,hbar", "elm");
-        edje_object_message_signal_process(sid->edje_obj);
-        _elm_scroll_scroll_bar_size_adjust(sid);
-        if (sid->cb_func.content_min_limit)
-          sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
-     }
-   
+
+   if (scroll_h_vis_change) _elm_scroll_scroll_bar_h_visibility_apply(sid);
+
    _elm_direction_arrows_eval(sid);
    return scroll_h_vis_change;
 }
@@ -800,25 +749,7 @@ _elm_scroll_scroll_bar_v_visibility_adjust(
                }
           }
      }
-   if (scroll_v_vis_change)
-     {
-        if (sid->vbar_flags != ELM_SCROLLER_POLICY_OFF)
-          {
-             if (sid->vbar_visible)
-               edje_object_signal_emit
-                 (sid->edje_obj, "elm,action,show,vbar", "elm");
-             else
-               edje_object_signal_emit
-                 (sid->edje_obj, "elm,action,hide,vbar", "elm");
-          }
-        else
-          edje_object_signal_emit
-            (sid->edje_obj, "elm,action,hide,vbar", "elm");
-        edje_object_message_signal_process(sid->edje_obj);
-        _elm_scroll_scroll_bar_size_adjust(sid);
-        if (sid->cb_func.content_min_limit)
-          sid->cb_func.content_min_limit(sid->obj, sid->min_w, sid->min_h);
-     }
+   if (scroll_v_vis_change) _elm_scroll_scroll_bar_v_visibility_apply(sid);
 
    _elm_direction_arrows_eval(sid);
    return scroll_v_vis_change;
@@ -845,15 +776,19 @@ _elm_scroll_scroll_bar_size_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
 {
    if (!sid->pan_obj || !sid->edje_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
+   if (sid->size_adjust_recurse_abort) return;
+   if (sid->size_adjust_recurse > 20)
+     {
+        sid->size_adjust_recurse_abort = EINA_TRUE;
+        return;
+     }
+   sid->size_adjust_recurse++;
    if ((sid->content) || (sid->extern_pan))
      {
-        Evas_Coord x, y, w, h, mx = 0, my = 0, vw = 0, vh = 0, px, py,
+        Evas_Coord x, y, w, h, mx = 0, my = 0, vw = 0, vh = 0,
                    minx = 0, miny = 0;
         double vx, vy, size;
 
-        edje_object_calc_force(sid->edje_obj);
         edje_object_part_geometry_get
           (sid->edje_obj, "elm.swallow.content", NULL, NULL, &vw, &vh);
         w = sid->content_info.w;
@@ -881,15 +816,19 @@ _elm_scroll_scroll_bar_size_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
         edje_object_part_drag_size_set
           (sid->edje_obj, "elm.dragable.vbar", 1.0, size);
 
-        edje_object_part_drag_value_get
-          (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
-        edje_object_part_drag_value_get
-          (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
+        //TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+        //edje_object_part_drag_value_get
+        //  (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
+        //edje_object_part_drag_value_get
+        //  (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
+        //
 
-        psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-        psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-        x = vx * mx + minx;
-        y = vy * my + miny;
+        eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+        eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+        //TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+        //x = vx * mx + minx;
+        //y = vy * my + miny;
+        //
 
         edje_object_part_drag_step_set
           (sid->edje_obj, "elm.dragable.hbar", (double)sid->step.x /
@@ -914,10 +853,35 @@ _elm_scroll_scroll_bar_size_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
             (sid->edje_obj, "elm.dragable.vbar", 0.0,
             -((double)sid->page.y * ((double)vh / (double)h)) / 100.0);
 
-        psd->api->pos_get(sid->pan_obj, &px, &py);
-        if (vx != mx) x = px;
-        if (vy != my) y = py;
-        psd->api->pos_set(sid->pan_obj, x, y);
+        //TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+        //eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+        //
+        //if (vx != mx) x = px;
+        //if (vy != my) y = py;
+        //
+        eo_do(sid->obj, elm_interface_scrollable_bar_changed_bar_pos_adjust(&x, &y));
+        //
+
+        eo_do(sid->pan_obj, elm_obj_pan_pos_set(x, y));
+
+        if (mx > 0) vx = (double)(x - minx) / (double)mx;
+        else vx = 0.0;
+
+        if (vx < 0.0) vx = 0.0;
+        else if (vx > 1.0)
+          vx = 1.0;
+
+        if (my > 0) vy = (double)(y - miny) / (double)my;
+        else vy = 0.0;
+
+        if (vy < 0.0) vy = 0.0;
+        else if (vy > 1.0)
+          vy = 1.0;
+
+        edje_object_part_drag_value_set
+           (sid->edje_obj, "elm.dragable.vbar", 0.0, vy);
+        edje_object_part_drag_value_set
+           (sid->edje_obj, "elm.dragable.hbar", vx, 0.0);
      }
    else
      {
@@ -927,26 +891,55 @@ _elm_scroll_scroll_bar_size_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
           (sid->edje_obj, "elm.dragable.vbar", 1.0, 1.0);
         edje_object_part_drag_size_set
           (sid->edje_obj, "elm.dragable.hbar", 1.0, 1.0);
-        psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-        psd->api->pos_get(sid->pan_obj, &px, &py);
-        psd->api->pos_set(sid->pan_obj, minx, miny);
+        eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+        eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+        eo_do(sid->pan_obj, elm_obj_pan_pos_set(minx, miny));
         if ((px != minx) || (py != miny))
           edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
      }
    _elm_scroll_scroll_bar_visibility_adjust(sid);
+   sid->size_adjust_recurse--;
+   if (sid->size_adjust_recurse <= 0)
+     {
+        sid->size_adjust_recurse = 0;
+        sid->size_adjust_recurse_abort = EINA_FALSE;
+     }
+}
+
+//TIZEN_ONLY(20150909) : Use the specific bar_chagnged_bar_pos_adjust func only for gengrid.
+EOLIAN static void
+_elm_interface_scrollable_bar_changed_bar_pos_adjust(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
+{
+   Evas_Coord mx, my, minx, miny, px, py;
+   double vx, vy;
+
+   edje_object_part_drag_value_get
+      (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
+   edje_object_part_drag_value_get
+      (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
+
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+
+   *x = _round(vx * (double)mx + minx, 1);
+   *y = _round(vy * (double)my + miny, 1);
+
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+
+   if (vx != mx) *x = px;
+   if (vy != my) *y = py;
 }
+//
 
 static void
 _elm_scroll_scroll_bar_read_and_update(
   Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   Evas_Coord x, y, mx = 0, my = 0, px, py, minx = 0, miny = 0;
+   Evas_Coord x, y, mx = 0, my = 0, minx = 0, miny = 0;
    double vx, vy;
 
    if (!sid->edje_obj || !sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    if ((sid->down.dragged) || (sid->down.bounce_x_animator)
        || (sid->down.bounce_y_animator) || (sid->down.momentum_animator)
        || (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
@@ -955,27 +948,20 @@ _elm_scroll_scroll_bar_read_and_update(
      (sid->edje_obj, "elm.dragable.vbar", NULL, &vy);
    edje_object_part_drag_value_get
      (sid->edje_obj, "elm.dragable.hbar", &vx, NULL);
-   psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
    x = _round(vx * (double)mx + minx, 1);
    y = _round(vy * (double)my + miny, 1);
-   psd->api->pos_get(sid->pan_obj, &px, &py);
-
-   if (!sid->freeze && _paging_is_enabled(sid))
-     {
-        x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
-        y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
-     }
-   psd->api->pos_set(sid->pan_obj, x, y);
-   if ((px != x) || (py != y))
-     {
-        edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
-     }
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
+   _elm_scroll_wanted_coordinates_update(sid, x, y);
 }
 
 static void
 _elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data *sid)
 {
+   sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+   sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+
    if (sid->cb_func.drag_start)
      sid->cb_func.drag_start(sid->obj, NULL);
 }
@@ -983,8 +969,17 @@ _elm_scroll_drag_start(Elm_Scrollable_Smart_Interface_Data *sid)
 static void
 _elm_scroll_drag_stop(Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
-   sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+   Evas_Coord x, y;
+
+   if (!(sid->down.bounce_x_animator) && !(sid->down.bounce_y_animator) &&
+       !(sid->scrollto.x.animator) && !(sid->scrollto.y.animator))
+     {
+        x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+        y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+        if (sid->cb_func.page_change &&
+            ((x != sid->current_page.x) || (y != sid->current_page.y)))
+          sid->cb_func.page_change(sid->obj, NULL);
+     }
 
    if (sid->cb_func.drag_stop)
      sid->cb_func.drag_stop(sid->obj, NULL);
@@ -1000,8 +995,15 @@ _elm_scroll_anim_start(Elm_Scrollable_Smart_Interface_Data *sid)
 static void
 _elm_scroll_anim_stop(Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
-   sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+   Evas_Coord x, y;
+
+   if (sid->cb_func.page_change)
+     {
+        x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
+        y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
+        if ((x != sid->current_page.x) || (y != sid->current_page.y))
+           sid->cb_func.page_change(sid->obj, NULL);
+     }
 
    if (sid->cb_func.animate_stop)
      sid->cb_func.animate_stop(sid->obj, NULL);
@@ -1034,24 +1036,21 @@ _elm_scroll_policy_signal_emit(Elm_Scrollable_Smart_Interface_Data *sid)
 
 static void
 _elm_scroll_reload_cb(void *data,
-                      Evas_Object *obj __UNUSED__,
-                      const char *emission __UNUSED__,
-                      const char *source __UNUSED__)
+                      Evas_Object *obj EINA_UNUSED,
+                      const char *emission EINA_UNUSED,
+                      const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
-
-   // FIXME: refactoring for determining bar's size and visiblity
-   sid->hbar_visible = EINA_TRUE;
-   sid->vbar_visible = EINA_TRUE;
-
    _elm_scroll_policy_signal_emit(sid);
+   _elm_scroll_scroll_bar_h_visibility_apply(sid);
+   _elm_scroll_scroll_bar_v_visibility_apply(sid);
 }
 
 static void
 _elm_scroll_vbar_drag_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                         Evas_Object *obj EINA_UNUSED,
+                         const char *emission EINA_UNUSED,
+                         const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1063,9 +1062,9 @@ _elm_scroll_vbar_drag_cb(void *data,
 
 static void
 _elm_scroll_vbar_press_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                          Evas_Object *obj EINA_UNUSED,
+                          const char *emission EINA_UNUSED,
+                          const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1075,9 +1074,9 @@ _elm_scroll_vbar_press_cb(void *data,
 
 static void
 _elm_scroll_vbar_unpress_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                            Evas_Object *obj EINA_UNUSED,
+                            const char *emission EINA_UNUSED,
+                            const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1087,9 +1086,9 @@ _elm_scroll_vbar_unpress_cb(void *data,
 
 static void
 _elm_scroll_edje_drag_v_start_cb(void *data,
-                                 Evas_Object *obj __UNUSED__,
-                                 const char *emission __UNUSED__,
-                                 const char *source __UNUSED__)
+                                 Evas_Object *obj EINA_UNUSED,
+                                 const char *emission EINA_UNUSED,
+                                 const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1100,9 +1099,9 @@ _elm_scroll_edje_drag_v_start_cb(void *data,
 
 static void
 _elm_scroll_edje_drag_v_stop_cb(void *data,
-                                Evas_Object *obj __UNUSED__,
-                                const char *emission __UNUSED__,
-                                const char *source __UNUSED__)
+                                Evas_Object *obj EINA_UNUSED,
+                                const char *emission EINA_UNUSED,
+                                const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1113,9 +1112,9 @@ _elm_scroll_edje_drag_v_stop_cb(void *data,
 
 static void
 _elm_scroll_edje_drag_v_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                           Evas_Object *obj EINA_UNUSED,
+                           const char *emission EINA_UNUSED,
+                           const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1124,9 +1123,9 @@ _elm_scroll_edje_drag_v_cb(void *data,
 
 static void
 _elm_scroll_hbar_drag_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                         Evas_Object *obj EINA_UNUSED,
+                         const char *emission EINA_UNUSED,
+                         const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1138,9 +1137,9 @@ _elm_scroll_hbar_drag_cb(void *data,
 
 static void
 _elm_scroll_hbar_press_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                          Evas_Object *obj EINA_UNUSED,
+                          const char *emission EINA_UNUSED,
+                          const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1150,9 +1149,9 @@ _elm_scroll_hbar_press_cb(void *data,
 
 static void
 _elm_scroll_hbar_unpress_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                            Evas_Object *obj EINA_UNUSED,
+                            const char *emission EINA_UNUSED,
+                            const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1162,9 +1161,9 @@ _elm_scroll_hbar_unpress_cb(void *data,
 
 static void
 _elm_scroll_edje_drag_h_start_cb(void *data,
-                                 Evas_Object *obj __UNUSED__,
-                                 const char *emission __UNUSED__,
-                                 const char *source __UNUSED__)
+                                 Evas_Object *obj EINA_UNUSED,
+                                 const char *emission EINA_UNUSED,
+                                 const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1175,9 +1174,9 @@ _elm_scroll_edje_drag_h_start_cb(void *data,
 
 static void
 _elm_scroll_edje_drag_h_stop_cb(void *data,
-                                Evas_Object *obj __UNUSED__,
-                                const char *emission __UNUSED__,
-                                const char *source __UNUSED__)
+                                Evas_Object *obj EINA_UNUSED,
+                                const char *emission EINA_UNUSED,
+                                const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -1188,64 +1187,38 @@ _elm_scroll_edje_drag_h_stop_cb(void *data,
 
 static void
 _elm_scroll_edje_drag_h_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           const char *emission __UNUSED__,
-                           const char *source __UNUSED__)
+                           Evas_Object *obj EINA_UNUSED,
+                           const char *emission EINA_UNUSED,
+                           const char *source EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
    _elm_scroll_scroll_bar_read_and_update(sid);
 }
 
-static void
-_elm_scroll_content_size_get(const Evas_Object *obj,
-                             Evas_Coord *w,
-                             Evas_Coord *h)
-{
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   if (sid->content)
-     evas_object_geometry_get(sid->content, NULL, NULL, w, h);
-   else if (sid->pan_obj)
-     {
-        ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-        psd->api->content_size_get(sid->pan_obj, w, h);
-     }
-}
-
-static void
-_elm_scroll_content_viewport_size_get(const Evas_Object *obj,
-                                      Evas_Coord *w,
-                                      Evas_Coord *h)
+EOLIAN static void
+_elm_interface_scrollable_content_size_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *w, Evas_Coord *h)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   if (!sid->pan_obj || !sid->edje_obj) return;
-
-   edje_object_calc_force(sid->edje_obj);
-   evas_object_geometry_get(sid->pan_obj, NULL, NULL, w, h);
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(w, h));
 }
 
-static void
-_elm_scroll_content_viewport_pos_get(const Evas_Object *obj,
-                                     Evas_Coord *x,
-                                     Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_content_viewport_geometry_get(Eo *obj EINA_UNUSED,
+                                                        Elm_Scrollable_Smart_Interface_Data *sid,
+                                                        Evas_Coord *x,
+                                                        Evas_Coord *y,
+                                                        Evas_Coord *w,
+                                                        Evas_Coord *h)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->pan_obj || !sid->edje_obj) return;
 
    edje_object_calc_force(sid->edje_obj);
-   evas_object_geometry_get(sid->pan_obj, x, y, NULL, NULL);
+   evas_object_geometry_get(sid->pan_obj, x, y, w, h);
 }
 
-static void
-_elm_scroll_content_min_limit(Evas_Object *obj,
-                              Eina_Bool w,
-                              Eina_Bool h)
+EOLIAN static void
+_elm_interface_scrollable_content_min_limit(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool w, Eina_Bool h)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->edje_obj) return;
 
    if (!sid->cb_func.content_min_limit)
@@ -1260,48 +1233,23 @@ _elm_scroll_content_min_limit(Evas_Object *obj,
    sid->cb_func.content_min_limit(sid->obj, w, h);
 }
 
-static void
-_elm_scroll_origin_reverse_set(Evas_Object *obj,
-                          Eina_Bool origin_x, Eina_Bool origin_y)
-{
-   Evas_Coord x, y;
-
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->origin_x = origin_x;
-   sid->origin_y = origin_y;
-
-   _elm_scroll_content_pos_get(sid->obj, &x, &y);
-   _elm_scroll_wanted_coordinates_update(sid, x, y);
-}
-
-static void
-_elm_scroll_origin_reverse_get(const Evas_Object *obj,
-                          Eina_Bool *origin_x, Eina_Bool *origin_y)
-{
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   if (origin_x) *origin_x = sid->origin_x;
-   if (origin_y) *origin_y = sid->origin_y;
-}
-
 static Evas_Coord
 _elm_scroll_x_mirrored_get(const Evas_Object *obj,
                            Evas_Coord x)
 {
-   Evas_Coord cw, ch, w, ret;
+   Evas_Coord cw = 0, w = 0, min = 0, ret;
 
    ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, x);
 
    if (!sid->pan_obj) return 0;
 
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&min, NULL));
+   eo_do((Eo *)obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &w, NULL));
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, NULL));
+   ret = cw - w - x + min + min;
 
-   _elm_scroll_content_viewport_size_get(obj, &w, NULL);
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-   ret = (cw - (x + w));
-
-   return (ret >= 0) ? ret : 0;
+   return (ret >= min) ? ret : min;
 }
 
 /* Update the wanted coordinates according to the x, y passed
@@ -1311,54 +1259,37 @@ _elm_scroll_wanted_coordinates_update(Elm_Scrollable_Smart_Interface_Data *sid,
                                       Evas_Coord x,
                                       Evas_Coord y)
 {
-   Evas_Coord cw, ch;
+   Evas_Coord mx = 0, my = 0, minx = 0, miny = 0;
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
 
    /* Update wx/y/w/h - and if the requested positions aren't legal
     * adjust a bit. */
-   _elm_scroll_content_viewport_size_get(sid->obj, &sid->ww, &sid->wh);
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &sid->ww, &sid->wh));
 
-   if (x < 0)
+   if (x < minx && !sid->is_mirrored)
      {
-        if (!sid->loop_h) sid->wx = 0;
-        else sid->wx = cw - sid->ww;
+        if (!sid->loop_h) sid->wx = minx;
+        else sid->wx = mx;
      }
-   else if (!sid->loop_h && (x + sid->ww) > cw)
-     sid->wx = cw - sid->ww;
-   else if (sid->loop_h && x >= cw)
-     sid->wx = 0;
    else if (sid->is_mirrored)
      sid->wx = _elm_scroll_x_mirrored_get(sid->obj, x);
-   else
-     sid->wx = x;
-
-   if (sid->origin_x)
-     {
-        sid->wx = cw - sid->wx;
-        if (sid->wx < 0) sid->wx = 0;
-     }
+   else if (!sid->loop_h && (x > mx)) sid->wx = mx;
+   else if (sid->loop_h && x >= (sid->ww + mx)) sid->wx = 0;
+   else sid->wx = x;
 
-   if (y < 0)
+   if (y < miny)
      {
-        if (!sid->loop_v) sid->wy = 0;
-        else  sid->wy = ch - sid->wh;
+        if (!sid->loop_v) sid->wy = miny;
+        else sid->wy = my;
      }
-   else if (!sid->loop_v && (y + sid->wh) > ch)
-     sid->wy = ch - sid->wh;
-   else if (sid->loop_v && y >= ch)
-     sid->wy = 0;
+   else if (!sid->loop_v && (y > my)) sid->wy = my;
+   else if (sid->loop_v && y >= (sid->wh + my)) sid->wy = 0;
    else sid->wy = y;
-
-   if (sid->origin_y)
-     {
-        sid->wy = ch - sid->wy;
-        if (sid->wy < 0) sid->wy = 0;
-     }
 }
 
 static void
@@ -1367,12 +1298,11 @@ _elm_scroll_momentum_end(Elm_Scrollable_Smart_Interface_Data *sid)
    if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator)) return;
    if (sid->down.momentum_animator)
      {
-        Evas_Coord px, py;
-        _elm_scroll_content_pos_get(sid->obj, &px, &py);
+        Evas_Coord px = 0, py = 0;
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&px, &py));
         _elm_scroll_wanted_coordinates_update(sid, px, py);
 
-        ecore_animator_del(sid->down.momentum_animator);
-        sid->down.momentum_animator = NULL;
+        ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
         sid->down.bounce_x_hold = EINA_FALSE;
         sid->down.bounce_y_hold = EINA_FALSE;
         sid->down.ax = 0;
@@ -1382,25 +1312,28 @@ _elm_scroll_momentum_end(Elm_Scrollable_Smart_Interface_Data *sid)
         sid->down.pdx = 0;
         sid->down.pdy = 0;
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
 }
 
 static Eina_Bool
 _elm_scroll_bounce_x_animator(void *data)
 {
-   Elm_Scrollable_Smart_Interface_Data *sid;
+   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(data, sid, EINA_FALSE);
    Evas_Coord x, y, dx, w, odx, ed, md;
    double t, p, dt, pd, r;
 
-   sid = data;
    t = ecore_loop_time_get();
    dt = t - sid->down.anim_start2;
    if (dt >= 0.0)
      {
         dt = dt / _elm_config->thumbscroll_bounce_friction;
         odx = sid->down.b2x - sid->down.bx;
-        _elm_scroll_content_viewport_size_get(sid->obj, &w, NULL);
+        eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+              (NULL, NULL, &w, NULL));
         if (!sid->down.momentum_animator && (w > abs(odx)))
           {
              pd = (double)odx / (double)w;
@@ -1410,7 +1343,7 @@ _elm_scroll_bounce_x_animator(void *data)
           }
         if (dt > 1.0) dt = 1.0;
         p = 1.0 - ((1.0 - dt) * (1.0 - dt));
-        _elm_scroll_content_pos_get(sid->obj, &x, &y);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
         dx = (odx * p);
         r = 1.0;
         if (sid->down.momentum_animator)
@@ -1422,7 +1355,7 @@ _elm_scroll_bounce_x_animator(void *data)
           }
         x = sid->down.b2x + (int)((double)(dx - odx) * r);
         if (!sid->down.cancelled)
-          _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+          eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
         if (dt >= 1.0)
           {
              if (sid->down.momentum_animator)
@@ -1435,7 +1368,10 @@ _elm_scroll_bounce_x_animator(void *data)
              sid->bouncemex = EINA_FALSE;
              _elm_scroll_momentum_end(sid);
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
              return ECORE_CALLBACK_CANCEL;
           }
      }
@@ -1445,18 +1381,18 @@ _elm_scroll_bounce_x_animator(void *data)
 static Eina_Bool
 _elm_scroll_bounce_y_animator(void *data)
 {
-   Elm_Scrollable_Smart_Interface_Data *sid;
+   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(data, sid, EINA_FALSE);
    Evas_Coord x, y, dy, h, ody, ed, md;
    double t, p, dt, pd, r;
 
-   sid = data;
    t = ecore_loop_time_get();
    dt = t - sid->down.anim_start3;
    if (dt >= 0.0)
      {
         dt = dt / _elm_config->thumbscroll_bounce_friction;
         ody = sid->down.b2y - sid->down.by;
-        _elm_scroll_content_viewport_size_get(sid->obj, NULL, &h);
+        eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+              (NULL, NULL, NULL, &h));
         if (!sid->down.momentum_animator && (h > abs(ody)))
           {
              pd = (double)ody / (double)h;
@@ -1466,7 +1402,7 @@ _elm_scroll_bounce_y_animator(void *data)
           }
         if (dt > 1.0) dt = 1.0;
         p = 1.0 - ((1.0 - dt) * (1.0 - dt));
-        _elm_scroll_content_pos_get(sid->obj, &x, &y);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
         dy = (ody * p);
         r = 1.0;
         if (sid->down.momentum_animator)
@@ -1478,7 +1414,7 @@ _elm_scroll_bounce_y_animator(void *data)
           }
         y = sid->down.b2y + (int)((double)(dy - ody) * r);
         if (!sid->down.cancelled)
-          _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+          eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
         if (dt >= 1.0)
           {
              if (sid->down.momentum_animator)
@@ -1491,7 +1427,10 @@ _elm_scroll_bounce_y_animator(void *data)
              sid->bouncemey = EINA_FALSE;
              _elm_scroll_momentum_end(sid);
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
              return ECORE_CALLBACK_CANCEL;
           }
      }
@@ -1502,32 +1441,36 @@ _elm_scroll_bounce_y_animator(void *data)
 static void
 _elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   Evas_Coord mx, my, px, py, bx, by, b2x, b2y, minx = 0, miny = 0;
+   Evas_Coord mx = 0, my = 0, px = 0, py = 0, bx, by, b2x, b2y, minx = 0, miny = 0;
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    if (sid->freeze) return;
    if ((!sid->bouncemex) && (!sid->bouncemey)) return;
    if (sid->down.now) return;  // down bounce while still held down
    if (sid->down.onhold_animator)
      {
-        ecore_animator_del(sid->down.onhold_animator);
-        sid->down.onhold_animator = NULL;
+        ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
    if (sid->down.hold_animator)
      {
-        ecore_animator_del(sid->down.hold_animator);
-        sid->down.hold_animator = NULL;
+        ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
-   psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
+
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    bx = px;
    by = py;
    if (px < minx) px = minx;
@@ -1543,13 +1486,9 @@ _elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid)
           {
              if (sid->bouncemex)
                {
-                  if (sid->scrollto.x.animator)
-                    {
-                       ecore_animator_del(sid->scrollto.x.animator);
-                       sid->scrollto.x.animator = NULL;
-                    }
+                  ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
                   sid->down.bounce_x_animator =
-                    ecore_animator_add(_elm_scroll_bounce_x_animator, sid);
+                    ecore_animator_add(_elm_scroll_bounce_x_animator, sid->obj);
                   sid->down.anim_start2 = ecore_loop_time_get();
                   sid->down.bx = bx;
                   sid->down.bx0 = bx;
@@ -1567,13 +1506,9 @@ _elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid)
           {
              if (sid->bouncemey)
                {
-                  if (sid->scrollto.y.animator)
-                    {
-                       ecore_animator_del(sid->scrollto.y.animator);
-                       sid->scrollto.y.animator = NULL;
-                    }
+                  ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
                   sid->down.bounce_y_animator =
-                    ecore_animator_add(_elm_scroll_bounce_y_animator, sid);
+                    ecore_animator_add(_elm_scroll_bounce_y_animator, sid->obj);
                   sid->down.anim_start3 = ecore_loop_time_get();
                   sid->down.by = by;
                   sid->down.by0 = by;
@@ -1586,104 +1521,72 @@ _elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid)
      }
 }
 
-static void
-_elm_scroll_content_pos_get(const Evas_Object *obj,
-                            Evas_Coord *x,
-                            Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_content_pos_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->pos_get(sid->pan_obj, x, y);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(x, y));
 }
 
-static void
-_elm_scroll_content_pos_set(Evas_Object *obj,
-                            Evas_Coord x,
-                            Evas_Coord y,
-                            Eina_Bool sig)
+EOLIAN static void
+_elm_interface_scrollable_content_pos_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Eina_Bool sig)
 {
-   Evas_Coord mx = 0, my = 0, px = 0, py = 0, spx = 0, spy = 0, minx = 0, miny = 0, pw = 0, ph = 0;
-   Evas_Coord cw =0, ch = 0, ww = 0, wh = 0; //// TIZEN ONLY
+   Evas_Coord mx = 0, my = 0, px = 0, py = 0, spx = 0, spy = 0, minx = 0, miny = 0;
+   Evas_Coord cw = 0, ch = 0, pw = 0, ph = 0;
+// TIZEN_ONLY(20150820): Overscroll effect
+   Evas_Coord ww = 0, wh = 0;
+//
    double vx, vy;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
 
    if (!sid->edje_obj || !sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->pos_get(sid->pan_obj, &px, &py);
-
-   if ((px == x) && (py == y)) return;
-
    // FIXME: allow for bounce outside of range
-   psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch); //// TIZEN ONLY
-   _elm_scroll_content_viewport_size_get(obj, &ww, &wh); //// TIZEN ONLY
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    evas_object_geometry_get(sid->pan_obj, NULL, NULL, &pw, &ph);
-
-   if (_elm_config->access_mode)
-     {
-        if (((y > 0) && (y % _elm_config->finger_size) < 2 &&
-             !((py % _elm_config->finger_size) < 2 && abs(py - y) < 2)) ||
-            ((x > 0) && (x % _elm_config->finger_size) < 2 &&
-             !((px % _elm_config->finger_size) < 2 && abs(px - x) < 2)))
-          _elm_access_sound_play(ELM_ACCESS_SOUND_SCROLL);
-     }
+// TIZEN_ONLY(20150820): Overscroll effect
+   eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &ww, &wh));
+//
 
    if (_paging_is_enabled(sid))
      {
-        //Work when Page Snap is enabled.
-        /*
-        //we passed one page to the right
-        if (x > sid->current_page.x + sid->pagesize_h)
-          x = sid->current_page.x + sid->pagesize_h;
-        //we passed one page to the left
-        if (x < sid->current_page.x - sid->pagesize_h)
-          x = sid->current_page.x - sid->pagesize_h;
-
-        //we passed one page to the bottom
-        if (y > sid->current_page.y + sid->pagesize_v)
-          y = sid->current_page.y + sid->pagesize_v;
-        //we passed one page to the top
-        if (y < sid->current_page.y - sid->pagesize_v)
-          y = sid->current_page.y - sid->pagesize_v;
-        */
+        if (sid->page_snap_horiz)
+          {
+             //we passed one page to the right
+             if (x > sid->current_page.x + sid->pagesize_h)
+               x = sid->current_page.x + sid->pagesize_h;
+             //we passed one page to the left
+             if (x < sid->current_page.x - sid->pagesize_h)
+               x = sid->current_page.x - sid->pagesize_h;
+          }
+        if (sid->page_snap_vert)
+          {
+             //we passed one page to the bottom
+             if (y > sid->current_page.y + sid->pagesize_v)
+               y = sid->current_page.y + sid->pagesize_v;
+             //we passed one page to the top
+             if (y < sid->current_page.y - sid->pagesize_v)
+               y = sid->current_page.y - sid->pagesize_v;
+          }
      }
 
    if (sid->loop_h && cw > 0)
      {
-        if (_paging_is_enabled(sid))
-          {
-             if (x < 0) x = cw + (x % cw);
-             else if (x >= (pw * sid->pagecount_h)) x = (x % cw);
-          }
-        else
-          {
-             if (x < 0) x = cw + (x % cw);
-             else if (x >= cw) x = (x % cw);
-          }
+        if (x < 0) x = cw + (x % cw);
+        else if (x >= cw) x = (x % cw);
      }
    if (sid->loop_v && ch > 0)
      {
-       if (_paging_is_enabled(sid))
-         {
-            if (y < 0) y = ch + (y % ch);
-            else if (y >= (ph * sid->pagecount_v)) y = (y % ch);
-         }
-       else
-         {
-            if (y < 0) y = ch + (y % ch);
-            else if (y >= ch) y = (y % ch);
-         }
+        if (y < 0) y = ch + (y % ch);
+        else if (y >= ch) y = (y % ch);
      }
 
-//// TIZEN ONLY
+// TIZEN_ONLY(20150820): Overscroll effect
    if (cw > ww)
      {
         if (x < minx)
@@ -1699,8 +1602,10 @@ _elm_scroll_content_pos_set(Evas_Object *obj,
           edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom", "elm");
      }
 //
+
    if (!_elm_config->thumbscroll_bounce_enable)
      {
+
         if (x < minx) x = minx;
         if (!sid->loop_h && (x - minx) > mx) x = mx + minx;
         if (y < miny) y = miny;
@@ -1710,16 +1615,16 @@ _elm_scroll_content_pos_set(Evas_Object *obj,
    if (!sid->bounce_horiz)
      {
         if (x < minx) x = minx;
-        if (!sid->loop_h && ((x - minx) > mx)) x = mx + minx;
+        if (!sid->loop_h && (x - minx) > mx) x = mx + minx;
      }
    if (!sid->bounce_vert)
      {
         if (y < miny) y = miny;
-        if (!sid->loop_v && ((y - miny) > my)) y = my + miny;
+        if (!sid->loop_v && (y - miny) > my) y = my + miny;
      }
 
-   psd->api->pos_set(sid->pan_obj, x, y);
-   psd->api->pos_get(sid->pan_obj, &spx, &spy);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_set(x, y));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&spx, &spy));
 
    if (mx > 0) vx = (double)(spx - minx) / (double)mx;
    else vx = 0.0;
@@ -1794,7 +1699,6 @@ _elm_scroll_content_pos_set(Evas_Object *obj,
                     sid->cb_func.scroll_down(obj, NULL);
                   edje_object_signal_emit(sid->edje_obj, "elm,action,scroll,down", "elm");
                }
-               edje_message_signal_process();
           }
         if (x != px)
           {
@@ -1802,11 +1706,17 @@ _elm_scroll_content_pos_set(Evas_Object *obj,
                {
                   if (sid->cb_func.edge_left)
                     sid->cb_func.edge_left(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+//                  edje_object_signal_emit(sid->edje_obj, "elm,edge,left", "elm");
+//
                }
              if (x == (mx + minx))
                {
                   if (sid->cb_func.edge_right)
                     sid->cb_func.edge_right(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+//                  edje_object_signal_emit(sid->edje_obj, "elm,edge,right", "elm");
+//
                }
           }
         if (y != py)
@@ -1815,11 +1725,17 @@ _elm_scroll_content_pos_set(Evas_Object *obj,
                {
                   if (sid->cb_func.edge_top)
                     sid->cb_func.edge_top(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+//                  edje_object_signal_emit(sid->edje_obj, "elm,edge,top", "elm");
+//
                }
              if (y == my + miny)
                {
                   if (sid->cb_func.edge_bottom)
                     sid->cb_func.edge_bottom(obj, NULL);
+//TIZEN_ONLY(20150822): The effect removal it moves to the edge the using item show.
+//                  edje_object_signal_emit(sid->edje_obj, "elm,edge,bottom", "elm");
+//
                }
           }
      }
@@ -1827,14 +1743,11 @@ _elm_scroll_content_pos_set(Evas_Object *obj,
    _elm_direction_arrows_eval(sid);
 }
 
-static void
-_elm_scroll_mirrored_set(Evas_Object *obj,
-                         Eina_Bool mirrored)
+EOLIAN static void
+_elm_interface_scrollable_mirrored_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool mirrored)
 {
    Evas_Coord wx;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->edje_obj) return;
 
    mirrored = !!mirrored;
@@ -1850,7 +1763,7 @@ _elm_scroll_mirrored_set(Evas_Object *obj,
    else
      wx = sid->wx;
 
-   _elm_scroll_content_pos_set(sid->obj, wx, sid->wy, EINA_FALSE);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_set(wx, sid->wy, EINA_FALSE));
 }
 
 /* returns TRUE when we need to move the scroller, FALSE otherwise.
@@ -1862,19 +1775,17 @@ _elm_scroll_content_region_show_internal(Evas_Object *obj,
                                          Evas_Coord w,
                                          Evas_Coord h)
 {
-   Evas_Coord mx = 0, my = 0, cw = 0, ch = 0, px = 0, py = 0, nx = 0, ny = 0,
+   Evas_Coord mx = 0, my = 0, cw = 0, ch = 0, px = 0, py = 0, nx, ny,
               minx = 0, miny = 0, pw = 0, ph = 0, x = *_x, y = *_y;
 
    ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
 
    if (!sid->pan_obj) return EINA_FALSE;
 
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
-
-   psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    evas_object_geometry_get(sid->pan_obj, NULL, NULL, &pw, &ph);
 
    nx = px;
@@ -1889,46 +1800,45 @@ _elm_scroll_content_region_show_internal(Evas_Object *obj,
    if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
        (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
      {
-        if (sid->scrollto.x.animator)
-          {
-             ecore_animator_del(sid->scrollto.x.animator);
-             sid->scrollto.x.animator = NULL;
-          }
-        if (sid->scrollto.y.animator)
-          {
-             ecore_animator_del(sid->scrollto.y.animator);
-             sid->scrollto.y.animator = NULL;
-          }
+        ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+        ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
         if (sid->down.bounce_x_animator)
           {
-             ecore_animator_del(sid->down.bounce_x_animator);
-             sid->down.bounce_x_animator = NULL;
+             ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
              sid->bouncemex = EINA_FALSE;
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
           }
         if (sid->down.bounce_y_animator)
           {
-             ecore_animator_del(sid->down.bounce_y_animator);
-             sid->down.bounce_y_animator = NULL;
+             ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
              sid->bouncemey = EINA_FALSE;
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
           }
+
         _elm_scroll_anim_stop(sid);
      }
    if (sid->down.hold_animator)
      {
-        ecore_animator_del(sid->down.hold_animator);
-        sid->down.hold_animator = NULL;
+        ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
         _elm_scroll_drag_stop(sid);
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
+   ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
    if (sid->down.momentum_animator)
      {
-        ecore_animator_del(sid->down.momentum_animator);
-        sid->down.momentum_animator = NULL;
+        ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
         sid->down.bounce_x_hold = EINA_FALSE;
         sid->down.bounce_y_hold = EINA_FALSE;
         sid->down.ax = 0;
@@ -1936,17 +1846,16 @@ _elm_scroll_content_region_show_internal(Evas_Object *obj,
         sid->down.pdx = 0;
         sid->down.pdy = 0;
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
 
    if (_paging_is_enabled(sid))
      {
         x = _elm_scroll_page_x_get(sid, nx - px, EINA_FALSE);
         y = _elm_scroll_page_y_get(sid, ny - py, EINA_FALSE);
-        if ((pw != sid->pagesize_h) && (sid->pagesize_h != 0))
-          pw = sid->pagesize_h;
-        if ((ph != sid->pagesize_v) && (sid->pagesize_v != 0))
-          ph = sid->pagesize_v;
      }
    else
      {
@@ -1960,32 +1869,33 @@ _elm_scroll_content_region_show_internal(Evas_Object *obj,
      }
    if (!sid->loop_v)
      {
-       if ((y + ph) > ch) y = ch - ph;
-       if (y < miny) y = miny;
+        if ((y + ph) > ch) y = ch - ph;
+        if (y < miny) y = miny;
      }
 
    if ((x == px) && (y == py)) return EINA_FALSE;
    *_x = x;
    *_y = y;
-
    return EINA_TRUE;
 }
 
+EOLIAN static void
+_elm_interface_scrollable_content_region_get(Eo *obj, Elm_Scrollable_Smart_Interface_Data *_pd EINA_UNUSED, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   eo_do(obj, elm_interface_scrollable_content_pos_get(x, y));
+   eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, w, h));
+}
+
 /* Set should be used for calculated positions, for example, when we move
  * because of an animation or because this is the correct position after
  * constraints. */
-static void
-_elm_scroll_content_region_set(Evas_Object *obj,
-                               Evas_Coord x,
-                               Evas_Coord y,
-                               Evas_Coord w,
-                               Evas_Coord h)
+EOLIAN static void
+_elm_interface_scrollable_content_region_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
      {
-        _elm_scroll_content_pos_set(obj, x, y, EINA_FALSE);
+        eo_do(obj, elm_interface_scrollable_content_pos_set(x, y, EINA_FALSE));
         sid->down.sx = x;
         sid->down.sy = y;
         sid->down.x = sid->down.history[0].x;
@@ -1995,71 +1905,16 @@ _elm_scroll_content_region_set(Evas_Object *obj,
 
 /* Set should be used for setting the wanted position, for example a
  * user scroll or moving the cursor in an entry. */
-static void
-_elm_scroll_content_region_show(Evas_Object *obj,
-                                Evas_Coord x,
-                                Evas_Coord y,
-                                Evas_Coord w,
-                                Evas_Coord h)
+EOLIAN static void
+_elm_interface_scrollable_content_region_show(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
 {
-   Evas_Coord cw = 0, ch = 0;
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   if (sid->pan_obj)
-     {
-        ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-        psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-     }
-
-   if (sid->origin_x && cw > 0)
-     {
-        sid->wx = cw - y;
-        if (sid->wx < 0) sid->wx = 0;
-     }
-   else
-     sid->wx = x;
-
-   if (sid->origin_y && ch > 0)
-     {
-        sid->wy = ch - y;
-        if (sid->wy < 0) sid->wy = 0;
-     }
-   else
-     sid->wy = y;
-
+   sid->wx = (sid->is_mirrored ? _elm_scroll_x_mirrored_get(sid->obj, x) : x);
+   sid->wy = y;
    sid->ww = w;
    sid->wh = h;
-   if (_paging_is_enabled(sid))
-     {
-        if (sid->pagesize_h != 0)
-          {
-             x = (int)(x / sid->pagesize_h) * sid->pagesize_h;
-             if (sid->origin_x && cw > 0)
-               {
-                  sid->wx = cw - x;
-                  if (sid->wx < 0) sid->wx = 0;
-               }
-             else
-               sid->wx = x;
-             sid->ww = w = sid->pagesize_h;
-          }
-        if (sid->pagesize_v != 0)
-          {
-             y = (int)(y / sid->pagesize_v) * sid->pagesize_v;
-             if (sid->origin_y && ch > 0)
-               {
-                  sid->wy = ch - y;
-                  if (sid->wy < 0) sid->wy = 0;
-               }
-             else
-               sid->wy = y;
-             sid->wh = h = sid->pagesize_v;
-          }
-     }
-
    if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
      {
-        _elm_scroll_content_pos_set(obj, x, y, EINA_TRUE);
+        eo_do(obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
         sid->down.sx = x;
         sid->down.sy = y;
         sid->down.x = sid->down.history[0].x;
@@ -2067,15 +1922,47 @@ _elm_scroll_content_region_show(Evas_Object *obj,
      }
 }
 
-static void
-_elm_scroll_wanted_region_set(Evas_Object *obj)
+//TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+//static void
+//_elm_scroll_wanted_region_set(Evas_Object *obj)
+//{
+//   Evas_Coord ww, wh, wx;
+//
+//   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+//
+//   wx = sid->wx;
+//   if (sid->down.now || sid->down.momentum_animator ||
+//       sid->down.bounce_x_animator || sid->down.bounce_y_animator ||
+//       sid->down.hold_animator || sid->down.onhold_animator ||
+//       sid->scrollto.x.animator || sid->scrollto.y.animator)
+//     return;
+//
+//   sid->content_info.resized = EINA_FALSE;
+//
+//   /* Flip to RTL cords only if init in RTL mode */
+//   if (sid->is_mirrored)
+//     wx = _elm_scroll_x_mirrored_get(obj, sid->wx);
+//
+//   if (sid->ww == -1)
+//     {
+//        eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+//              (NULL, NULL, &ww, &wh));
+//     }
+//   else
+//     {
+//        ww = sid->ww;
+//        wh = sid->wh;
+//     }
+//
+//   eo_do(obj, elm_interface_scrollable_content_region_set(wx, sid->wy, ww, wh));
+//}
+//
+EOLIAN static void
+_elm_interface_scrollable_wanted_region_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x EINA_UNUSED, Evas_Coord y EINA_UNUSED)
 {
-   Evas_Coord ww, wh, wx, wy, cw= 0, ch = 0;
-
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+   Evas_Coord ww, wh, wx;
 
    wx = sid->wx;
-   wy = sid->wy;
 
    if (sid->down.now || sid->down.momentum_animator ||
        sid->down.bounce_x_animator || sid->down.bounce_y_animator ||
@@ -2083,33 +1970,16 @@ _elm_scroll_wanted_region_set(Evas_Object *obj)
        sid->scrollto.x.animator || sid->scrollto.y.animator)
      return;
 
-   if (sid->pan_obj)
-     {
-        ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-        psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-     }
-
    sid->content_info.resized = EINA_FALSE;
 
    /* Flip to RTL cords only if init in RTL mode */
    if (sid->is_mirrored)
      wx = _elm_scroll_x_mirrored_get(obj, sid->wx);
 
-   if (sid->origin_x && cw > 0)
-     {
-        wx = cw - sid->wx;
-        if (wx < 0) wx = 0;
-     }
-
-   if (sid->origin_y && ch > 0)
-     {
-        wy = ch - sid->wy;
-        if (wy < 0) wy = 0;
-     }
-
    if (sid->ww == -1)
      {
-        _elm_scroll_content_viewport_size_get(obj, &ww, &wh);
+        eo_do(obj, elm_interface_scrollable_content_viewport_geometry_get
+              (NULL, NULL, &ww, &wh));
      }
    else
      {
@@ -2117,24 +1987,23 @@ _elm_scroll_wanted_region_set(Evas_Object *obj)
         wh = sid->wh;
      }
 
-   _elm_scroll_content_region_set(obj, wx, wy, ww, wh);
+   eo_do(obj, elm_interface_scrollable_content_region_set(wx, sid->wy, ww, wh));
 }
+//
 
 static void
 _elm_scroll_wheel_event_cb(void *data,
-                           Evas *e __UNUSED__,
-                           Evas_Object *obj __UNUSED__,
+                           Evas *e EINA_UNUSED,
+                           Evas_Object *obj EINA_UNUSED,
                            void *event_info)
 {
    Elm_Scrollable_Smart_Interface_Data *sid;
    Evas_Event_Mouse_Wheel *ev;
    Evas_Coord x = 0, y = 0, vw = 0, vh = 0, cw = 0, ch = 0;
    int direction = 0;
-   int pagenumber_h, pagenumber_v;
+   int pagenumber_h = 0, pagenumber_v = 0;
 
    sid = data;
-   if (!sid->pan_obj) return;
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
    ev = event_info;
    direction = ev->direction;
 
@@ -2150,40 +2019,38 @@ _elm_scroll_wheel_event_cb(void *data,
      return;
    else if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
      direction = !direction;
-   _elm_scroll_content_pos_get(sid->obj, &x, &y);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
    if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
        (sid->scrollto.x.animator) || (sid->scrollto.y.animator))
      {
         _elm_scroll_anim_stop(sid);
      }
-   if (sid->scrollto.x.animator)
-     {
-        ecore_animator_del(sid->scrollto.x.animator);
-        sid->scrollto.x.animator = NULL;
-     }
-   if (sid->scrollto.y.animator)
-     {
-        ecore_animator_del(sid->scrollto.y.animator);
-        sid->scrollto.y.animator = NULL;
-     }
+   ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+   ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
    if (sid->down.bounce_x_animator)
      {
-        ecore_animator_del(sid->down.bounce_x_animator);
-        sid->down.bounce_x_animator = NULL;
+        ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
         sid->bouncemex = EINA_FALSE;
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
    if (sid->down.bounce_y_animator)
      {
-        ecore_animator_del(sid->down.bounce_y_animator);
-        sid->down.bounce_y_animator = NULL;
+        ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
         sid->bouncemey = EINA_FALSE;
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
-   _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &vw, &vh));
+   if (sid->pan_obj)
+     eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
    if (!_paging_is_enabled(sid))
      {
         if (!direction)
@@ -2204,12 +2071,12 @@ _elm_scroll_wheel_event_cb(void *data,
         if ((!sid->hold) && (!sid->freeze))
           {
              _elm_scroll_wanted_coordinates_update(sid, x, y);
-             _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+             eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
           }
      }
    else
      {
-        _elm_scroll_current_page_get(sid->obj, &pagenumber_h, &pagenumber_v);
+        eo_do(sid->obj, elm_interface_scrollable_current_page_get(&pagenumber_h, &pagenumber_v));
         if (!direction)
           {
              if (ch > vh || cw <= vw)
@@ -2227,7 +2094,7 @@ _elm_scroll_wheel_event_cb(void *data,
 
         if ((!sid->hold) && (!sid->freeze))
           {
-             //_elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
+             _elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
              _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, y);
           }
      }
@@ -2235,7 +2102,7 @@ _elm_scroll_wheel_event_cb(void *data,
 
 static Eina_Bool
 _elm_scroll_post_event_up(void *data,
-                          Evas *e __UNUSED__)
+                          Evas *e EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -2267,9 +2134,11 @@ _elm_scroll_momentum_animator(void *data)
    Evas_Coord x, y, dx, dy, px, py, maxx, maxy, minx, miny;
    Eina_Bool no_bounce_x_end = EINA_FALSE, no_bounce_y_end = EINA_FALSE;
 
-   if (!sid->pan_obj) return ECORE_CALLBACK_CANCEL;
-
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, ECORE_CALLBACK_CANCEL);
+   if (!sid->pan_obj)
+     {
+        sid->down.momentum_animator = NULL;
+        return ECORE_CALLBACK_CANCEL;
+     }
 
    t = ecore_loop_time_get();
    dt = t - sid->down.anim_start;
@@ -2284,26 +2153,17 @@ _elm_scroll_momentum_animator(void *data)
            (_elm_config->thumbscroll_friction + sid->down.extra_time);
         dt = dt / at;
         if (dt > 1.0) dt = 1.0;
+// TIZEN_ONLY(20150705): Genlist item align feature
         p = 1 - powf((1.0) - dt, 3);
 
-        if (psd->api->pos_adjust)
-          {
-             dx = sid->down.dx * p;
-             dy = sid->down.dy * p;
-          }
-        else
-          {
-             dx = (sid->down.dx * (_elm_config->thumbscroll_friction +
-                      sid->down.extra_time) * p);
-             dy = (sid->down.dy * (_elm_config->thumbscroll_friction +
-                      sid->down.extra_time) * p);
-          }
-
+        dx = sid->down.dx * p;
+        dy = sid->down.dy * p;
+//
         sid->down.ax = dx;
         sid->down.ay = dy;
         x = sid->down.sx - dx;
         y = sid->down.sy - dy;
-        _elm_scroll_content_pos_get(sid->obj, &px, &py);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&px, &py));
         if ((sid->down.bounce_x_animator) ||
             (sid->down.bounce_x_hold))
           {
@@ -2316,10 +2176,11 @@ _elm_scroll_momentum_animator(void *data)
              sid->down.by = sid->down.by0 - dy + sid->down.b0y;
              y = py;
           }
-        _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
         _elm_scroll_wanted_coordinates_update(sid, x, y);
-        psd->api->pos_max_get(sid->pan_obj, &maxx, &maxy);
-        psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
+        eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&maxx, &maxy));
+        eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+
         if (!_elm_config->thumbscroll_bounce_enable || !sid->bounce_horiz)
           {
              if (x <= minx) no_bounce_x_end = EINA_TRUE;
@@ -2344,7 +2205,10 @@ _elm_scroll_momentum_animator(void *data)
              sid->down.pdx = 0;
              sid->down.pdy = 0;
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
 
              return ECORE_CALLBACK_CANCEL;
           }
@@ -2361,20 +2225,14 @@ _elm_scroll_page_x_get(Elm_Scrollable_Smart_Interface_Data *sid,
 
    if (!sid->pan_obj) return 0;
 
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
-
-   _elm_scroll_content_pos_get(sid->obj, &x, &y);
-   _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-   psd->api->pos_min_get(sid->pan_obj, &minx, NULL);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &w, &h));
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, NULL));
 
    if (sid->pagerel_h > 0.0)
-     {
-        if (sid->pagecount_h != 0)
-          w = cw / (sid->pagecount_h * sid->pagerel_h);
-        x *= (w * sid->pagerel_h) / sid->pagesize_h;
-        sid->pagesize_h = w * sid->pagerel_h;
-     }
+     sid->pagesize_h = w * sid->pagerel_h;
 
    if (!limit)
      x += offset;
@@ -2390,8 +2248,10 @@ _elm_scroll_page_x_get(Elm_Scrollable_Smart_Interface_Data *sid,
 
    if (sid->pagesize_h > 0)
      {
-        if (x >= minx) x = x + (sid->pagesize_h * 0.5);
-        else x = x - (sid->pagesize_h * 0.5);
+        if (x >= 0)
+          x = x + (sid->pagesize_h * 0.5);
+        else if (x < 0 && sid->loop_h)
+          x = x - (sid->pagesize_h * 0.5);
         x = x / (sid->pagesize_h);
         x = x * (sid->pagesize_h);
      }
@@ -2408,24 +2268,19 @@ static Evas_Coord
 _elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid,
                        int offset, Eina_Bool limit)
 {
-   Evas_Coord x, y, w, h, dy, cw, ch, miny = 0;
+   Evas_Coord x, y, w = 0, h = 0, dy, cw = 0, ch = 0, miny = 0;
 
    if (!sid->pan_obj) return 0;
 
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, 0);
-
-   _elm_scroll_content_pos_get(sid->obj, &x, &y);
-   _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-   psd->api->pos_min_get(sid->pan_obj, NULL, &miny);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &w, &h));
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(NULL, &miny));
 
    if (sid->pagerel_v > 0.0)
-     {
-        if (sid->pagecount_v != 0)
-          h = ch / (sid->pagecount_v * sid->pagerel_v);
-        y *= (h * sid->pagerel_v) / sid->pagesize_v;
-        sid->pagesize_v = h * sid->pagerel_v;
-     }
+     sid->pagesize_v = h * sid->pagerel_v;
+
    if (!limit)
      y += offset;
    else
@@ -2440,8 +2295,10 @@ _elm_scroll_page_y_get(Elm_Scrollable_Smart_Interface_Data *sid,
 
    if (sid->pagesize_v > 0)
      {
-        if (y >= miny) y = y + (sid->pagesize_v * 0.5);
-        else y = y - (sid->pagesize_v * 0.5);
+        if (y >= 0)
+          y = y + (sid->pagesize_v * 0.5);
+        else if (y < 0 && sid->loop_v)
+          y = y - (sid->pagesize_v * 0.5);
         y = y / (sid->pagesize_v);
         y = y * (sid->pagesize_v);
      }
@@ -2461,31 +2318,34 @@ _elm_scroll_scroll_to_x_animator(void *data)
    Evas_Coord px, py;
    double t, tt;
 
-   if (!sid->pan_obj) return ECORE_CALLBACK_CANCEL;
-
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, ECORE_CALLBACK_CANCEL);
+   if (!sid->pan_obj)
+     {
+        sid->scrollto.x.animator = NULL;
+        return ECORE_CALLBACK_CANCEL;
+     }
 
    t = ecore_loop_time_get();
    tt = (t - sid->scrollto.x.t_start) /
      (sid->scrollto.x.t_end - sid->scrollto.x.t_start);
    tt = 1.0 - tt;
    tt = 1.0 - (tt * tt);
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    px = (sid->scrollto.x.start * (1.0 - tt)) +
      (sid->scrollto.x.end * tt);
    if (t >= sid->scrollto.x.t_end)
      {
         px = sid->scrollto.x.end;
-        _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
         sid->down.sx = px;
         sid->down.x = sid->down.history[0].x;
+        sid->down.pdx = 0;
         _elm_scroll_wanted_coordinates_update(sid, px, py);
         sid->scrollto.x.animator = NULL;
         if ((!sid->scrollto.y.animator) && (!sid->down.bounce_y_animator))
           _elm_scroll_anim_stop(sid);
         return ECORE_CALLBACK_CANCEL;
      }
-   _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
    _elm_scroll_wanted_coordinates_update(sid, px, py);
    return ECORE_CALLBACK_RENEW;
 }
@@ -2499,29 +2359,28 @@ _elm_scroll_scroll_to_y_animator(void *data)
 
    if (!sid->pan_obj) return EINA_FALSE;
 
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
-
    t = ecore_loop_time_get();
    tt = (t - sid->scrollto.y.t_start) /
      (sid->scrollto.y.t_end - sid->scrollto.y.t_start);
    tt = 1.0 - tt;
    tt = 1.0 - (tt * tt);
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    py = (sid->scrollto.y.start * (1.0 - tt)) +
      (sid->scrollto.y.end * tt);
    if (t >= sid->scrollto.y.t_end)
      {
         py = sid->scrollto.y.end;
-        _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
         sid->down.sy = py;
         sid->down.y = sid->down.history[0].y;
+        sid->down.pdy = 0;
         _elm_scroll_wanted_coordinates_update(sid, px, py);
         sid->scrollto.y.animator = NULL;
         if ((!sid->scrollto.x.animator) && (!sid->down.bounce_x_animator))
           _elm_scroll_anim_stop(sid);
         return ECORE_CALLBACK_CANCEL;
      }
-   _elm_scroll_content_pos_set(sid->obj, px, py, EINA_TRUE);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_set(px, py, EINA_TRUE));
    _elm_scroll_wanted_coordinates_update(sid, px, py);
 
    return ECORE_CALLBACK_RENEW;
@@ -2532,24 +2391,23 @@ _elm_scroll_scroll_to_y(Elm_Scrollable_Smart_Interface_Data *sid,
                         double t_in,
                         Evas_Coord pos_y)
 {
-   Evas_Coord px, py, x, y, w, h;
+   Evas_Coord px = 0, py = 0, x, y, w, h;
    double t;
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    if (sid->freeze) return;
    if (t_in <= 0.0)
      {
-        _elm_scroll_content_pos_get(sid->obj, &x, &y);
-        _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+        eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+              (NULL, NULL, &w, &h));
         y = pos_y;
-        _elm_scroll_content_region_set(sid->obj, x, y, w, h);
+        eo_do(sid->obj, elm_interface_scrollable_content_region_set(x, y, w, h));
         return;
      }
    t = ecore_loop_time_get();
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    sid->scrollto.y.start = py;
    sid->scrollto.y.end = pos_y;
    sid->scrollto.y.t_start = t;
@@ -2563,11 +2421,13 @@ _elm_scroll_scroll_to_y(Elm_Scrollable_Smart_Interface_Data *sid,
      }
    if (sid->down.bounce_y_animator)
      {
-        ecore_animator_del(sid->down.bounce_y_animator);
-        sid->down.bounce_y_animator = NULL;
+        ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
         _elm_scroll_momentum_end(sid);
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
    sid->bouncemey = EINA_FALSE;
 }
@@ -2577,24 +2437,24 @@ _elm_scroll_scroll_to_x(Elm_Scrollable_Smart_Interface_Data *sid,
                         double t_in,
                         Evas_Coord pos_x)
 {
-   Evas_Coord px, py, x, y, w, h;
+   Evas_Coord px = 0, py = 0, x, y, w, h;
    double t;
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    if (sid->freeze) return;
    if (t_in <= 0.0)
      {
-        _elm_scroll_content_pos_get(sid->obj, &x, &y);
-        _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+        eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+              (NULL, NULL, &w, &h));
         x = pos_x;
-        _elm_scroll_content_region_set(sid->obj, x, y, w, h);
+        eo_do(sid->obj, elm_interface_scrollable_content_region_set
+              (x, y, w, h));
         return;
      }
    t = ecore_loop_time_get();
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    sid->scrollto.x.start = px;
    sid->scrollto.x.end = pos_x;
    sid->scrollto.x.t_start = t;
@@ -2608,11 +2468,13 @@ _elm_scroll_scroll_to_x(Elm_Scrollable_Smart_Interface_Data *sid,
      }
    if (sid->down.bounce_x_animator)
      {
-        ecore_animator_del(sid->down.bounce_x_animator);
-        sid->down.bounce_x_animator = NULL;
+        ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
         _elm_scroll_momentum_end(sid);
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
      }
    sid->bouncemex = EINA_FALSE;
 }
@@ -2620,17 +2482,15 @@ _elm_scroll_scroll_to_x(Elm_Scrollable_Smart_Interface_Data *sid,
 static void
 _elm_scroll_mouse_up_event_cb(void *data,
                               Evas *e,
-                              Evas_Object *obj __UNUSED__,
+                              Evas_Object *obj EINA_UNUSED,
                               void *event_info)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
    Evas_Coord x = 0, y = 0, ox = 0, oy = 0;
-   Evas_Event_Mouse_Down *ev;
+   Evas_Event_Mouse_Up *ev;
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
        (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
      return;
@@ -2645,8 +2505,9 @@ _elm_scroll_mouse_up_event_cb(void *data,
    sid->down.dy = 0;
    evas_post_event_callback_push(e, _elm_scroll_post_event_up, sid);
 
-   //REDWOOD ONLY
+// TIZEN_ONLY(20150820): Overscroll effect
    edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,up", "elm");
+//
 
    // FIXME: respect elm_widget_scroll_hold_get of parent container
    if (!_elm_config->thumbscroll_enable) return;
@@ -2655,10 +2516,12 @@ _elm_scroll_mouse_up_event_cb(void *data,
      {
         if (sid->down.onhold_animator)
           {
-             ecore_animator_del(sid->down.onhold_animator);
-             sid->down.onhold_animator = NULL;
+             ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
           }
         x = ev->canvas.x - sid->down.x;
         y = ev->canvas.y - sid->down.y;
@@ -2678,7 +2541,6 @@ _elm_scroll_mouse_up_event_cb(void *data,
 #endif
 
                   ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
-
                   ax = ev->canvas.x;
                   ay = ev->canvas.y;
                   at = 0.0;
@@ -2688,7 +2550,7 @@ _elm_scroll_mouse_up_event_cb(void *data,
                   for (i = 0; i < 60; i++)
                     {
                        dt = t - sid->down.history[i].timestamp;
-                       if (dt > 0.4) break;
+                       if (dt > 0.2) break;
 #ifdef SCROLLDBG
                        DBG("H: %i %i @ %1.3f\n",
                            sid->down.history[i].x,
@@ -2710,61 +2572,39 @@ _elm_scroll_mouse_up_event_cb(void *data,
                        if ((_elm_config->thumbscroll_friction > 0.0) &&
                            (vel > _elm_config->thumbscroll_momentum_threshold))
                          {
-                            Evas_Coord vw, vh, aw, ah, max_d;
+                            Evas_Coord max_d;
                             int minx, miny, mx, my, px, py;
                             double tt = 0.0, dtt = 0.0;
 
-                            psd->api->pos_min_get
-                              (sid->pan_obj, &minx, &miny);
-                            psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-                            psd->api->pos_get(sid->pan_obj, &px, &py);
+                            eo_do(sid->pan_obj, elm_obj_pan_pos_min_get
+                                  (&minx, &miny));
+                            eo_do(sid->pan_obj, elm_obj_pan_pos_max_get
+                                  (&mx, &my));
+                            eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
                             max_d = _elm_config->thumbscroll_flick_distance_tolerance;
-                            /* TIZEN ONLY */
-                            /* Original scroller used sin graph for calculating flick distance.
-                               But calculated flick distance is so long.
-                               So I divided into two sections. First section use sin grapth divided into 2.
-                               And second section use original logic.
-                               As a result, if flicking velocity is slow, flicking distance will be short.
-                               */
                             if (dx > 0)
                               {
                                  if (dx > max_d) dx = max_d;
-                                 if (0.4 >= ((sin((M_PI * (double)dx / max_d) - (M_PI / 2)) + 1) / 2))
-                                   sid->down.dx = ((sin((M_PI * (double)dx / max_d)
-                                                       - (M_PI / 2)) + 1) / 2) * max_d / at;
-                                 else
-                                   sid->down.dx = ((sin((M_PI * (double)dx / max_d)
-                                                       - (M_PI / 2)) + 1)) * max_d / at;
+                                 sid->down.dx = (sin((M_PI * (double)dx / max_d)
+                                                     - (M_PI / 2)) + 1) * max_d / at;
                               }
                             else
                               {
                                  if (dx < -max_d) dx = -max_d;
-                                 if (-0.4 <= ((sin((M_PI * (double)dx / max_d) + (M_PI / 2)) - 1) / 2))
-                                   sid->down.dx = ((sin((M_PI * (double)dx / max_d)
-                                                       + (M_PI / 2)) - 1) / 2) * max_d / at;
-                                 else
-                                   sid->down.dx = (sin((M_PI * (double)dx / max_d)
-                                                       + (M_PI / 2)) - 1) * max_d / at;
+                                 sid->down.dx = (sin((M_PI * (double)dx / max_d)
+                                                     + (M_PI / 2)) - 1) * max_d / at;
                               }
                             if (dy > 0)
                               {
                                  if (dy > max_d) dy = max_d;
-                                 if (0.4 >= ((sin((M_PI * (double)dy / max_d) - (M_PI / 2)) + 1) / 2))
-                                   sid->down.dy = ((sin((M_PI * (double)dy / max_d)
-                                                       - (M_PI / 2)) + 1) / 2) * max_d / at;
-                                 else
-                                   sid->down.dy = (sin((M_PI * (double)dy / max_d)
-                                                       - (M_PI / 2)) + 1) * max_d / at;
+                                 sid->down.dy = (sin((M_PI * (double)dy / max_d)
+                                                     - (M_PI / 2)) + 1) * max_d / at;
                               }
                             else
                               {
                                  if (dy < -max_d) dy = -max_d;
-                                 if (-0.4 <= ((sin((M_PI * (double)dy / max_d) + (M_PI / 2)) - 1) / 2))
-                                   sid->down.dy = ((sin((M_PI * (double)dy / max_d)
-                                                       + (M_PI / 2)) - 1) / 2) * max_d / at;
-                                 else
-                                   sid->down.dy = (sin((M_PI * (double)dy / max_d)
-                                                       + (M_PI / 2)) - 1) * max_d / at;
+                                 sid->down.dy = (sin((M_PI * (double)dy / max_d)
+                                                     + (M_PI / 2)) - 1) * max_d / at;
                               }
                             if (((sid->down.dx > 0) && (sid->down.pdx > 0)) ||
                                 ((sid->down.dx < 0) && (sid->down.pdx < 0)) ||
@@ -2784,37 +2624,38 @@ _elm_scroll_mouse_up_event_cb(void *data,
                             else
                               sid->down.extra_time = 0.0;
 
-                            aw = abs(sid->down.dx);
-                            _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
-                            if (aw  > vw * 3)
-                              {
-                                 if (sid->down.dx > 0) sid->down.dx = vw * 3;
-                                 else sid->down.dx = -(vw * 3);
-                              }
-                            ah = abs(sid->down.dy);
-                            if (ah  > vh * 3)
+                            if (abs(sid->down.dx) > _elm_config->thumbscroll_acceleration_threshold &&
+                                (dtt < _elm_config->thumbscroll_acceleration_time_limit) &&
+                                (((sid->down.dx > 0) && (sid->down.pdx > 0)) ||
+                                ((sid->down.dx < 0) && (sid->down.pdx < 0))))
+                              if (px > minx && px < mx)
+                                sid->down.dx += (double)sid->down.pdx * _elm_config->thumbscroll_acceleration_weight;
+                            if (abs(sid->down.dy) > _elm_config->thumbscroll_acceleration_threshold &&
+                                (dtt < _elm_config->thumbscroll_acceleration_time_limit) &&
+                                (((sid->down.dy > 0) && (sid->down.pdy > 0)) ||
+                                ((sid->down.dy < 0) && (sid->down.pdy < 0))))
+                              if (py > miny && py < my)
                               {
-                                 if (sid->down.dy > 0) sid->down.dy = vh * 3;
-                                 else sid->down.dy = -(vh * 3);
+                                sid->down.dy += (double)sid->down.pdy * _elm_config->thumbscroll_acceleration_weight;
                               }
 
-                            if (psd->api->pos_adjust)
-                              {
-                                 Evas_Coord pos_x, pos_y;
+// TIZEN_ONLY(20150705): Genlist item align feature
+                            Evas_Coord pos_x, pos_y;
 
-                                 pos_x = sid->down.dx;
-                                 pos_y = sid->down.dy;
+                            pos_x = sid->down.dx;
+                            pos_y = sid->down.dy;
 
-                                 pos_x = _round(pos_x * (_elm_config->thumbscroll_friction +
-                                                         sid->down.extra_time), 0);
-                                 pos_y = _round(pos_y * (_elm_config->thumbscroll_friction +
-                                                         sid->down.extra_time), 0);
-                                 psd->api->pos_adjust(sid, &pos_x, &pos_y);
+                            pos_x = _round(pos_x * (_elm_config->thumbscroll_friction +
+                                     sid->down.extra_time), 0);
+                            pos_y = _round(pos_y * (_elm_config->thumbscroll_friction +
+                                     sid->down.extra_time), 0);
 
-                                 sid->down.dx = pos_x;
-                                 sid->down.dy = pos_y;
-                              }
+                            eo_do(sid->pan_obj, elm_obj_pan_pos_adjust(&pos_x, &pos_y));
 
+                            // adjusted position using to _elm_scroll_momentum_animator()
+                            sid->down.dx = pos_x;
+                            sid->down.dy = pos_y;
+//
                             sid->down.pdx = sid->down.dx;
                             sid->down.pdy = sid->down.dy;
                             ox = -sid->down.dx;
@@ -2835,46 +2676,43 @@ _elm_scroll_mouse_up_event_cb(void *data,
                                       _elm_scroll_anim_start(sid);
                                    }
                                  sid->down.anim_start = ecore_loop_time_get();
-                                 _elm_scroll_content_pos_get(sid->obj, &x, &y);
+                                 eo_do(sid->obj,
+                                       elm_interface_scrollable_content_pos_get(&x, &y));
                                  sid->down.sx = x;
                                  sid->down.sy = y;
                                  sid->down.b0x = 0;
                                  sid->down.b0y = 0;
                               }
                          }
+// TIZEN_ONLY(20150705): Genlist item align feature
                        else
                          {
-                            if (psd->api->pos_adjust)
-                              {
-                                 Evas_Coord pos_x = 0, pos_y = 0;
-                                 Evas_Coord adjust_x, adjust_y;
+                            Evas_Coord pos_x = 0, pos_y = 0;
+                            Evas_Coord adjust_x, adjust_y;
 
-                                 psd->api->pos_adjust(sid, &pos_x, &pos_y);
+                            eo_do(sid->pan_obj, elm_obj_pan_pos_adjust(&pos_x, &pos_y));
 
-                                 _elm_scroll_content_pos_get(sid->obj, &adjust_x, &adjust_y);
-                                 pos_y = -pos_y;
-                                 adjust_y += pos_y;
+                            eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&adjust_x, &adjust_y));
+                            pos_y = -pos_y;
+                            adjust_y += pos_y;
 
-                                 _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
-                              }
+                            _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
                          }
-                  }
-                else
-                  {
-                     if (psd->api->pos_adjust)
-                       {
-                          Evas_Coord pos_x = 0, pos_y = 0;
-                          Evas_Coord adjust_x, adjust_y;
-
-                          psd->api->pos_adjust(sid, &pos_x, &pos_y);
-
-                          _elm_scroll_content_pos_get(sid->obj, &adjust_x, &adjust_y);
-                          pos_y = -pos_y;
-                          adjust_y += pos_y;
-
-                          _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
-                       }
-                  }
+                    }
+                  else
+                    {
+                       Evas_Coord pos_x = 0, pos_y = 0;
+                       Evas_Coord adjust_x, adjust_y;
+
+                       eo_do(sid->pan_obj, elm_obj_pan_pos_adjust(&pos_x, &pos_y));
+
+                       eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&adjust_x, &adjust_y));
+                       pos_y = -pos_y;
+                       adjust_y += pos_y;
+
+                       _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, adjust_y);
+                    }
+//
                }
              else
                {
@@ -2886,69 +2724,34 @@ _elm_scroll_mouse_up_event_cb(void *data,
                {
                   Evas_Coord pgx, pgy;
 
-                  _elm_scroll_content_pos_get(sid->obj, &x, &y);
+                  eo_do(sid->obj, elm_interface_scrollable_content_pos_get
+                        (&x, &y));
                   if ((!sid->obj) ||
                       (!elm_widget_drag_child_locked_x_get
                          (sid->obj)))
                     {
-                       //TIZEN ONLY
-                       if (sid->down.dir_x && sid->pagesize_h > 0)
-                         {
-                            if (ox > 0)
-                              {
-                                if (sid->down.pageflick_h < 0)
-                                  ox = sid->pagesize_h + sid->down.pageflick_h;
-                                else
-                                  ox = sid->pagesize_h * 0.5;
-                              }
-                            else if (ox < 0)
-                              {
-                                if (sid->down.pageflick_h > 0)
-                                  ox = -(sid->pagesize_h - sid->down.pageflick_h + 1);
-                                else
-                                  ox = -(sid->pagesize_h * 0.5 + 1);
-                              }
-                         }
                        pgx = _elm_scroll_page_x_get(sid, ox, EINA_TRUE);
                        if (pgx != x &&
                            !(sid->block &
-                             ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
+                            ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
                          {
                             ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
                             _elm_scroll_scroll_to_x
-                               (sid, _elm_config->page_scroll_friction, pgx);
+                              (sid, _elm_config->page_scroll_friction, pgx);
                          }
                     }
                   if ((!sid->obj) ||
                       (!elm_widget_drag_child_locked_y_get
                          (sid->obj)))
                     {
-                       //TIZEN ONLY
-                       if (sid->down.dir_y && sid->pagesize_v > 0)
-                         {
-                            if (oy > 0)
-                              {
-                                if (sid->down.pageflick_v < 0)
-                                  oy = sid->pagesize_v + sid->down.pageflick_v;
-                                else
-                                  oy = sid->pagesize_v * 0.5;
-                              }
-                            else if (oy < 0)
-                              {
-                                if (sid->down.pageflick_v > 0)
-                                  oy = -(sid->pagesize_v - sid->down.pageflick_v + 1);
-                                else
-                                  oy = -(sid->pagesize_v * 0.5 + 1);
-                              }
-                         }
                        pgy = _elm_scroll_page_y_get(sid, oy, EINA_TRUE);
                        if (pgy != y &&
                            !(sid->block &
-                             ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+                            ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
                          {
                             ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
                             _elm_scroll_scroll_to_y
-                               (sid, _elm_config->page_scroll_friction, pgy);
+                              (sid, _elm_config->page_scroll_friction, pgy);
                          }
                     }
                }
@@ -2961,7 +2764,8 @@ _elm_scroll_mouse_up_event_cb(void *data,
                {
                   Evas_Coord pgx, pgy;
 
-                  _elm_scroll_content_pos_get(sid->obj, &x, &y);
+                  eo_do(sid->obj, elm_interface_scrollable_content_pos_get
+                        (&x, &y));
                   if ((!sid->obj) ||
                       (!elm_widget_drag_child_locked_x_get
                          (sid->obj)))
@@ -2984,11 +2788,14 @@ _elm_scroll_mouse_up_event_cb(void *data,
           }
         if (sid->down.hold_animator)
           {
-             ecore_animator_del(sid->down.hold_animator);
-             sid->down.hold_animator = NULL;
+             ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
           }
+        ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
         if (sid->down.scroll)
           {
              ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
@@ -3005,12 +2812,15 @@ _elm_scroll_mouse_up_event_cb(void *data,
         sid->down.want_dragged = EINA_FALSE;
         sid->down.dragged = EINA_FALSE;
         sid->down.now = EINA_FALSE;
-        _elm_scroll_content_pos_get(sid->obj, &x, &y);
-        _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
         _elm_scroll_wanted_coordinates_update(sid, x, y);
 
         if (sid->content_info.resized)
-          _elm_scroll_wanted_region_set(sid->obj);
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
 
         if (!_paging_is_enabled(sid))
           _elm_scroll_bounce_eval(sid);
@@ -3019,8 +2829,8 @@ _elm_scroll_mouse_up_event_cb(void *data,
 
 static void
 _elm_scroll_mouse_down_event_cb(void *data,
-                                Evas *e __UNUSED__,
-                                Evas_Object *obj __UNUSED__,
+                                Evas *e EINA_UNUSED,
+                                Evas_Object *obj EINA_UNUSED,
                                 void *event_info)
 {
    Elm_Scrollable_Smart_Interface_Data *sid;
@@ -3030,118 +2840,120 @@ _elm_scroll_mouse_down_event_cb(void *data,
    sid = data;
    ev = event_info;
 
-#ifdef SMOOTHDBG
-   if (getenv("ELS_SCROLLER_SMOOTH_DEBUG")) _elm_scroll_smooth_debug = 1;
-   if (_elm_scroll_smooth_debug) _elm_scroll_smooth_debug_init();
-#endif
-
    if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
        (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
      return;
 
-   //REDWOOD ONLY
+// TIZEN_ONLY(20150820): Overscroll effect
    edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,down", "elm");
+//
 
-   if (_elm_config->thumbscroll_enable)
+#ifdef SMOOTHDBG
+   if (getenv("ELS_SCROLLER_SMOOTH_DEBUG")) _elm_scroll_smooth_debug = 1;
+   if (_elm_scroll_smooth_debug) _elm_scroll_smooth_debug_init();
+#endif
+
+   if (!_elm_config->thumbscroll_enable) return;
+
+   sid->down.hold = EINA_FALSE;
+   if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
+       (sid->down.momentum_animator) || (sid->scrollto.x.animator) ||
+       (sid->scrollto.y.animator))
+     {
+        //TIZEN_ONLY: (20150819) Do not hold the flag causes click skip
+        //and not required as we are deleting all animators here.
+        //ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL |
+        //  EVAS_EVENT_FLAG_ON_HOLD;
+        ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL;
+        //
+        sid->down.scroll = EINA_TRUE;
+        //TIZEN_ONLY: (20150819) Do not hold the flag causes click skip
+        //sid->down.hold = EINA_TRUE;
+        //
+        _elm_scroll_anim_stop(sid);
+     }
+   ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+   ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
+   if (sid->down.bounce_x_animator)
      {
-        sid->down.hold = EINA_FALSE;
-        if ((sid->down.bounce_x_animator) || (sid->down.bounce_y_animator) ||
-            (sid->down.momentum_animator) || (sid->scrollto.x.animator) ||
-            (sid->scrollto.y.animator))
-          {
-             ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL |
-               EVAS_EVENT_FLAG_ON_HOLD;
-             sid->down.scroll = EINA_TRUE;
-             sid->down.hold = EINA_TRUE;
-             _elm_scroll_anim_stop(sid);
-          }
-        if (sid->scrollto.x.animator)
-          {
-             ecore_animator_del(sid->scrollto.x.animator);
-             sid->scrollto.x.animator = NULL;
-          }
-        if (sid->scrollto.y.animator)
-          {
-             ecore_animator_del(sid->scrollto.y.animator);
-             sid->scrollto.y.animator = NULL;
-          }
-        if (sid->down.bounce_x_animator)
-          {
-             ecore_animator_del(sid->down.bounce_x_animator);
-             sid->down.bounce_x_animator = NULL;
-             sid->bouncemex = EINA_FALSE;
-             if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
-          }
-        if (sid->down.bounce_y_animator)
-          {
-             ecore_animator_del(sid->down.bounce_y_animator);
-             sid->down.bounce_y_animator = NULL;
-             sid->bouncemey = EINA_FALSE;
-             if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
-          }
-        if (sid->down.hold_animator)
-          {
-             ecore_animator_del(sid->down.hold_animator);
-             sid->down.hold_animator = NULL;
-             _elm_scroll_drag_stop(sid);
-             if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
-          }
-        if (sid->down.momentum_animator)
-          {
-             ecore_animator_del(sid->down.momentum_animator);
-             sid->down.momentum_animator = NULL;
-             sid->down.bounce_x_hold = EINA_FALSE;
-             sid->down.bounce_y_hold = EINA_FALSE;
-             sid->down.ax = 0;
-             sid->down.ay = 0;
-             if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
-          }
-        if (ev->button == 1)
-          {
-             if (_paging_is_enabled(sid))
-               {
-                  sid->down.pageflick_h = 0;
-                  sid->down.pageflick_v = 0;
-               }
-             sid->down.hist.est_timestamp_diff =
-               ecore_loop_time_get() - ((double)ev->timestamp / 1000.0);
-             sid->down.hist.tadd = 0.0;
-             sid->down.hist.dxsum = 0.0;
-             sid->down.hist.dysum = 0.0;
-             sid->down.now = EINA_TRUE;
-             sid->down.dragged = EINA_FALSE;
-             sid->down.dir_x = EINA_FALSE;
-             sid->down.dir_y = EINA_FALSE;
-             sid->down.x = ev->canvas.x;
-             sid->down.y = ev->canvas.y;
-             _elm_scroll_content_pos_get(sid->obj, &x, &y);
-             sid->down.sx = x;
-             sid->down.sy = y;
-             sid->down.locked = EINA_FALSE;
-             memset(&(sid->down.history[0]), 0,
-                    sizeof(sid->down.history[0]) * ELM_SCROLL_HISTORY_SIZE);
+        ELM_SAFE_FREE(sid->down.bounce_x_animator, ecore_animator_del);
+        sid->bouncemex = EINA_FALSE;
+        if (sid->content_info.resized)
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
+     }
+   if (sid->down.bounce_y_animator)
+     {
+        ELM_SAFE_FREE(sid->down.bounce_y_animator, ecore_animator_del);
+        sid->bouncemey = EINA_FALSE;
+        if (sid->content_info.resized)
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
+     }
+   if (sid->down.hold_animator)
+     {
+        ELM_SAFE_FREE(sid->down.hold_animator, ecore_animator_del);
+        _elm_scroll_drag_stop(sid);
+        if (sid->content_info.resized)
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
+     }
+   ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del);
+   if (sid->down.momentum_animator)
+     {
+        ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
+        sid->down.bounce_x_hold = EINA_FALSE;
+        sid->down.bounce_y_hold = EINA_FALSE;
+        sid->down.ax = 0;
+        sid->down.ay = 0;
+        if (sid->content_info.resized)
+          //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+          //_elm_scroll_wanted_region_set(sid->obj);
+          eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+          //
+     }
+   if (ev->button == 1)
+     {
+        sid->down.hist.est_timestamp_diff =
+          ecore_loop_time_get() - ((double)ev->timestamp / 1000.0);
+        sid->down.hist.tadd = 0.0;
+        sid->down.hist.dxsum = 0.0;
+        sid->down.hist.dysum = 0.0;
+        sid->down.now = EINA_TRUE;
+        sid->down.dragged = EINA_FALSE;
+        sid->down.dir_x = EINA_FALSE;
+        sid->down.dir_y = EINA_FALSE;
+        sid->down.x = ev->canvas.x;
+        sid->down.y = ev->canvas.y;
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
+        sid->down.sx = x;
+        sid->down.sy = y;
+        sid->down.locked = EINA_FALSE;
+        memset(&(sid->down.history[0]), 0,
+               sizeof(sid->down.history[0]) * 60);
 #ifdef EVTIME
-             sid->down.history[0].timestamp = ev->timestamp / 1000.0;
-             sid->down.history[0].localtimestamp = ecore_loop_time_get();
+        sid->down.history[0].timestamp = ev->timestamp / 1000.0;
+        sid->down.history[0].localtimestamp = ecore_loop_time_get();
 #else
-             sid->down.history[0].timestamp = ecore_loop_time_get();
+        sid->down.history[0].timestamp = ecore_loop_time_get();
 #endif
-             sid->down.dragged_began_timestamp = sid->down.history[0].timestamp;
-             sid->down.history[0].x = ev->canvas.x;
-             sid->down.history[0].y = ev->canvas.y;
-          }
-        sid->down.dragged_began = EINA_FALSE;
-        sid->down.hold_parent = EINA_FALSE;
-        sid->down.cancelled = EINA_FALSE;
-        if (sid->hold || sid->freeze)
-          sid->down.want_reset = EINA_TRUE;
-        else
-          sid->down.want_reset = EINA_FALSE;
+        sid->down.dragged_began_timestamp = sid->down.history[0].timestamp;
+        sid->down.history[0].x = ev->canvas.x;
+        sid->down.history[0].y = ev->canvas.y;
      }
+   sid->down.dragged_began = EINA_FALSE;
+   sid->down.hold_parent = EINA_FALSE;
+   sid->down.cancelled = EINA_FALSE;
+   if (sid->hold || sid->freeze)
+     sid->down.want_reset = EINA_TRUE;
+   else
+     sid->down.want_reset = EINA_FALSE;
 }
 
 static Eina_Bool
@@ -3152,11 +2964,9 @@ _elm_scroll_can_scroll(Elm_Scrollable_Smart_Interface_Data *sid,
 
    if (!sid->pan_obj) return EINA_FALSE;
 
-   ELM_PAN_DATA_GET_OR_RETURN_VAL(sid->pan_obj, psd, EINA_FALSE);
-
-   psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-   psd->api->pos_get(sid->pan_obj, &px, &py);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+   eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
    switch (dir)
      {
       case LEFT:
@@ -3183,81 +2993,79 @@ _elm_scroll_can_scroll(Elm_Scrollable_Smart_Interface_Data *sid,
 
 static Eina_Bool
 _elm_scroll_post_event_move(void *data,
-                            Evas *e __UNUSED__)
+                            Evas *e EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
    Eina_Bool horiz, vert;
+   int start = 0;
 
-   if (sid->down.want_dragged)
-     {
-        int start = 0;
+   if (!sid->down.want_dragged) return EINA_TRUE;
 
-        elm_widget_parents_bounce_get(sid->obj, &horiz, &vert);
-        if (sid->down.hold_parent)
+   elm_widget_parents_bounce_get(sid->obj, &horiz, &vert);
+   if (sid->down.hold_parent)
+     {
+        if ((sid->down.dir_x) && (horiz || !sid->bounce_horiz) &&
+            !_elm_scroll_can_scroll(sid, sid->down.hdir))
           {
-             if ((sid->down.dir_x) && (horiz || !sid->bounce_horiz) &&
-                 !_elm_scroll_can_scroll(sid, sid->down.hdir))
-               {
-                  sid->down.dir_x = EINA_FALSE;
-               }
-             if ((sid->down.dir_y) && (vert || !sid->bounce_vert) &&
-                 !_elm_scroll_can_scroll(sid, sid->down.vdir))
-               {
-                  sid->down.dir_y = EINA_FALSE;
-               }
-             sid->down.dragged_began = EINA_TRUE;
+             sid->down.dir_x = EINA_FALSE;
           }
-        if (sid->down.dir_x)
+        if ((sid->down.dir_y) && (vert || !sid->bounce_vert) &&
+            !_elm_scroll_can_scroll(sid, sid->down.vdir))
           {
-             if ((!sid->obj) ||
-                 (!elm_widget_drag_child_locked_x_get(sid->obj)))
-               {
-                  if (sid->down.dragged_began)
+             sid->down.dir_y = EINA_FALSE;
+          }
+        sid->down.dragged_began = EINA_TRUE;
+     }
+   if (sid->down.dir_x)
+     {
+        if ((!sid->obj) ||
+            (!elm_widget_drag_child_locked_x_get(sid->obj)))
+          {
+             if (sid->down.dragged_began)
+               {
+                  sid->down.want_dragged = EINA_FALSE;
+                  sid->down.dragged = EINA_TRUE;
+                  if (sid->obj)
                     {
-                       sid->down.want_dragged = EINA_FALSE;
-                       sid->down.dragged = EINA_TRUE;
-                       if (sid->obj)
-                         {
-                            elm_widget_drag_lock_x_set(sid->obj, 1);
-                         }
-                       start = 1;
+                       elm_widget_drag_lock_x_set(sid->obj, 1);
                     }
-               }
-             else
-               {
-                  sid->down.dragged_began = EINA_TRUE;
-                  sid->down.dir_x = EINA_FALSE;
+                  start = 1;
                }
           }
-        if (sid->down.dir_y)
+        else
           {
-             if ((!sid->obj) ||
-                 (!elm_widget_drag_child_locked_y_get(sid->obj)))
+             sid->down.dragged_began = EINA_TRUE;
+             sid->down.dir_x = EINA_FALSE;
+          }
+     }
+   if (sid->down.dir_y)
+     {
+        if ((!sid->obj) ||
+            (!elm_widget_drag_child_locked_y_get(sid->obj)))
+          {
+             if (sid->down.dragged_began)
                {
-                  if (sid->down.dragged_began)
+                  sid->down.want_dragged = EINA_FALSE;
+                  sid->down.dragged = EINA_TRUE;
+                  if (sid->obj)
                     {
-                       sid->down.want_dragged = EINA_FALSE;
-                       sid->down.dragged = EINA_TRUE;
-                       if (sid->obj)
-                         {
-                            elm_widget_drag_lock_y_set
-                               (sid->obj, EINA_TRUE);
-                         }
-                       start = 1;
+                       elm_widget_drag_lock_y_set
+                          (sid->obj, EINA_TRUE);
                     }
-               }
-             else
-               {
-                  sid->down.dragged_began = EINA_TRUE;
-                  sid->down.dir_y = EINA_FALSE;
+                  start = 1;
                }
           }
-        if ((!sid->down.dir_x) && (!sid->down.dir_y))
+        else
           {
-             sid->down.cancelled = EINA_TRUE;
+             sid->down.dragged_began = EINA_TRUE;
+             sid->down.dir_y = EINA_FALSE;
           }
-        if (start) _elm_scroll_drag_start(sid);
      }
+   if ((!sid->down.dir_x) && (!sid->down.dir_y))
+     {
+        sid->down.cancelled = EINA_TRUE;
+     }
+   if (start) _elm_scroll_drag_start(sid);
 
    return EINA_TRUE;
 }
@@ -3271,14 +3079,6 @@ _elm_scroll_down_coord_eval(Elm_Scrollable_Smart_Interface_Data *sid,
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   if (_paging_is_enabled(sid))
-     {
-        sid->down.pageflick_h = *x - sid->down.x;
-        sid->down.pageflick_v = *y - sid->down.y;
-     }
-
    if (sid->down.dir_x) *x = sid->down.sx - (*x - sid->down.x);
    else *x = sid->down.sx;
    if (sid->down.dir_y) *y = sid->down.sy - (*y - sid->down.y);
@@ -3293,7 +3093,7 @@ _elm_scroll_down_coord_eval(Elm_Scrollable_Smart_Interface_Data *sid,
           }
      }
 
-   psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
+   eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
 
    if (!sid->loop_h && *x < minx)
      *x += (minx - *x) * _elm_config->thumbscroll_border_friction;
@@ -3312,374 +3112,112 @@ _elm_scroll_down_coord_eval(Elm_Scrollable_Smart_Interface_Data *sid,
        _elm_config->thumbscroll_border_friction;
 }
 
-//TIZEN ONLY : for scroll smooth algorithm
-
-#define iround(x) ((x)>=0?(int)((x)+0.5):(int)((x)-0.5))
-
-//> Frequency of move events
-#define ELM_MOVE_PER_SECOND (90.75)
-//>Time between two subsequent events
-#define ELM_MOVE_TIMEOUT (1./ELM_MOVE_PER_SECOND)
-
-//>Quantity of move events in time interval
-#define ELM_MOVE_COUNT(t) iround((t)*ELM_MOVE_PER_SECOND)
-
-//>Getting coordinate (x is 0, y is 1) from struct Elm_Scroll_Pos or Elm_Scroll_History_Item.
-#define ELM_GET_COORD(p, coord) (*((int *)p + coord))
-
-//>Difference of coordinates of points with indexes ind and ind+inc.
-#define ELM_DIFF(p, coord, ind, inc)  (ELM_GET_COORD((p + ind), coord) - ELM_GET_COORD((p + ind + inc), coord))
-
-//>Index in array for calculation of smoothed velocity.
-#define ELM_SMOOTH_SPEED_INDEX 9
-
-//>in seconds, includes driver to X time gap
-#define EXTRA_PREDIOCTION_TIME (-0.005)
-
-//>Calculating current velocity. In normal situation it is (pos[0].x - pos[ELM_SMOOTH_SPEED_INDEX].x) / (pos[0].t - pos[ELM_SMOOTH_SPEED_INDEX].t).
-//>But in situations when: 1. Sign of velocity was changes or 2. The acceleration is of constant sign or 3. There was stop of movement
-//>The index ELM_SMOOTH_SPEED_INDEX is replaced by 1.
-double _elm_scroll_get_v(Elm_Scroll_Pos *pos, int num, int coord,
-                         double *dt, int *pdiff, double *padt, Elm_Scroll_Predict *predict)
-{
-   double v = 0;
-   int nmeasure_idx = (num > ELM_SMOOTH_SPEED_INDEX) ? ELM_SMOOTH_SPEED_INDEX : (num -1);
-   // a recent input takes higher priority
-#if USE_HISTORY_WEIGHT
-   if (nmeasure_idx >= 2)
-     *pdiff = (ELM_DIFF(pos, coord, 0, 1) * 2 + ELM_DIFF(pos, coord, 1, 1))/3;
-   else
-#else
-     *pdiff = ELM_DIFF(pos, coord, 0, 1);
-#endif
-
-#if ADJUST_EVENT_TIME
-   *dt = -ELM_MOVE_TIMEOUT;
-#else
-   if (nmeasure_idx >= 2)
-       *dt = -(pos[2].t - pos[0].t)/2.;
-   else
-       *dt = -(pos[1].t - pos[0].t);
-#endif
-   if (*dt == 0)
-     *dt = -ELM_MOVE_TIMEOUT;
-   v = *pdiff / *dt;
-   predict->k[coord] = 0;
-   *padt = EXTRA_PREDIOCTION_TIME;
-
-   return v;
-}
-
-static Eina_Bool _elm_scroll_get_pos(Elm_Scrollable_Smart_Interface_Data *sid,
-                                     Elm_Scroll_Pos *pos, int num, int *fx, int *fy)
-{
-   double vx = 0, vy = 0, dt = 0, dtx = 0, dty = 0;
-
-   if (num < 1)
-     {
-        return EINA_FALSE;
-     }
-   else if (num == 1)
-     {
-        *fx = iround((double)pos[0].x);
-        *fy = iround((double)pos[0].y);
-     }
-   else if (num >= 2)
-     {
-        int diffx, diffy;
-        if (sid->down.dir_y)
-          vy = _elm_scroll_get_v(pos, num, 1, &dt, &diffy, &dty, &sid->down.predict);
-        if (sid->down.dir_x)
-          vx = _elm_scroll_get_v(pos, num, 0, &dt, &diffx, &dtx, &sid->down.predict);
-     }
-
-   if (sid->down.dir_x)
-     {
-        *fx = iround((double)pos[0].x - (pos[0].t + dtx) * vx);
-        // don't go back even though over-run is detected.
-        if (sid->down.anim_vx_prev && sid->down.anim_vx_prev * vx >= 0)
-          if (vx == 0 || (vx > 0 && *fx  > sid->down.anim_x_prev) ||
-              (vx < 0 && *fx  < sid->down.anim_x_prev))
-            *fx = sid->down.anim_x_prev;
-     }
-
-   if (sid->down.dir_y)
-     {
-        *fy = iround((double)pos[0].y - (pos[0].t + dty) * vy);
-        // don't go back even though over-run is detected.
-        if (sid->down.anim_vy_prev && sid->down.anim_vy_prev * vy >= 0)
-          if (vy == 0 || (vy > 0 && *fy  > sid->down.anim_y_prev) ||
-              (vy < 0 && *fy  < sid->down.anim_y_prev))
-            *fy = sid->down.anim_y_prev;
-     }
-
-   sid->down.anim_x_prev = *fx;
-   sid->down.anim_y_prev = *fy;
-   sid->down.anim_vx_prev = vx;
-   sid->down.anim_vy_prev = vy;
-
-   return EINA_TRUE;
-}
-
-#define COMPENSATE_FOR_INITIAL_RENDER_DELAY 0
-#define ADJUST_ANIMATOR_TIMING              1
-#define SMART_SMOOTH_START                  1
-#define HOLD_ANIMATOR_DEBUG_LEVEL1          0
-#define HOLD_ANIMATOR_DEBUG_LEVEL2          0
-#define HOLD_ANIMATOR_DEBUG_X_AXIS          1
-#define USE_LOOP_TIME                       0
-#define ADJUST_EVENT_TIME                   0
-#define USE_HISTORY_WEIGHT                  0
-#define PREDICT_WHEN_PAUSED                 0
-
 static Eina_Bool
-_elm_scroll_hold_animator(void *data)
+_elm_scroll_hold_enterer(void *data)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
-   Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0, x = 0, y = 0, num = 0;
-   Evas_Coord fx_coord = 0, fy_coord = 0;
-   fx = sid->down.hold_x;
-   fy = sid->down.hold_y;
-   fx_coord = sid->down.anim_x_coord_prev;
-   fy_coord = sid->down.anim_y_coord_prev;
-#define QUEUE_SIZE 3 /* for event queue size */
-   Elm_Scroll_Pos pos[QUEUE_SIZE];
-
-   double now, now_diff, prev;
-   double animators_frametime=0, d = 0;
-   double pos_diff = 0;
-
-   Ecore_Animator_Source source;
+   Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0;
 
-   sid->down.anim_count++;
+   sid->down.hold_enterer = NULL;
 
-   source = ecore_animator_source_get();
-
-   // FIXME: assume server and client have the same "timezone"
-   // (0 timepoint) for now. this needs to be figured out in advance
-   // though.
-#if USE_LOOP_TIME
-   now = ecore_loop_time_get();
-#else
-   now = ecore_time_get();
-#endif
-
-   // init variables for the first animator run
-   if (sid->down.anim_count == 1)
-     {
-        sid->down.anim_t_prev = now;
-        sid->down.anim_x_coord_prev = fx;
-        sid->down.anim_y_coord_prev = fy;
-        fx_coord = fx;
-        fy_coord = fy;
-     }
-   prev = sid->down.anim_t_prev;
-   now_diff = now - prev;
-   animators_frametime = ecore_animator_frametime_get();
-#if COMPENSATE_FOR_INITIAL_RENDER_DELAY
-   if (sid->down.anim_count == 1)
-     {
-        if (source != ECORE_ANIMATOR_SOURCE_CUSTOM)
-          sid->down.anim_t_delay = fmod(now, animators_frametime);
-     }
-   else
-#endif
-     {
-        sid->down.anim_t_delay += now_diff - animators_frametime;
-     }
-
-   // skip this turn if specified.
-   if (sid->down.anim_skip > 0)
-     {
-        sid->down.anim_skip--;
-#if HOLD_ANIMATOR_DEBUG_LEVEL1
-        DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev: %.4f skip(%d)\n",
-            sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
-            now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
-            now_diff*1000,
-            (now_diff - d)*1000,
-            d*1000,
-            sid->down.history[0].timestamp,
-            sid->down.anim_skip);
-#endif
-            if ((now_diff * 1000) > 18)
-              {
-#if ADJUST_ANIMATOR_TIMING
-                 sid->down.anim_t_dont_adjust = 1;
-#endif
-                 goto update_time_and_quit;
-              }
-     }
-
-   // We don't need to process old events again.
-   if (sid->down.anim_count != 1 &&
-           sid->down.anim_pos_t_prev == sid->down.history[0].timestamp)
-     {
-#if HOLD_ANIMATOR_DEBUG_LEVEL1
-        DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev:%.4f skip(%d) no events.\n",
-            sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
-            now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
-            now_diff*1000,
-            (now_diff - d)*1000,
-            d*1000,
-            sid->down.history[0].timestamp,
-            sid->down.anim_skip);
-#endif
-
-        goto update_time_and_quit;
-   }
+   fx = sid->down.hold_x;
+   fy = sid->down.hold_y;
 
-#if ADJUST_ANIMATOR_TIMING
-   if (sid->down.anim_count != 1 && !sid->down.anim_t_dont_adjust)
+   if (_elm_config->scroll_smooth_amount > 0.0)
      {
-        if (now_diff < animators_frametime*3/4)
-          {
-             d += animators_frametime/4;
-          }
-        else if (now_diff < animators_frametime)
-          {
-             d = animators_frametime - now_diff;
-          }
-        else if (now_diff < animators_frametime*5/4)
+        int i, count = 0;
+        Evas_Coord basex = 0, basey = 0, x, y;
+        double dt, t, tdiff, tnow, twin;
+        struct
           {
-             d = -(now_diff - animators_frametime);
-          }
-        else
+             Evas_Coord x, y, dx, dy;
+             double t, dt;
+          } pos[60];
+
+        tdiff = sid->down.hist.est_timestamp_diff;
+        tnow = ecore_time_get() - tdiff;
+        t = tnow;
+        twin = _elm_config->scroll_smooth_time_window;
+        for (i = 0; i < 60; i++)
           {
-             d = -animators_frametime/4;
-          }
-
-        now += d;
-        now_diff +=d;
-        sid->down.anim_t_adjusted += d;
-     }
-
-   sid->down.anim_t_dont_adjust = 0;
-
-#endif
-
-#if COMPENSATE_FOR_INITIAL_RENDER_DELAY
-   // in case the first animator is called manually to make up for gpu's wake-up time,
-   // then the second animator should be skipped.
-   if ((sid->down.anim_count == 1) && (sid->down.anim_skip <= 0))
-     sid->down.anim_skip++;
-#endif
-
-   if ((!sid->hold) && (!sid->freeze) &&
-       _elm_config->scroll_smooth_time_interval > 0.0)
-     {
-        int i = 0;
-        int ncur_diff_x=0, ncur_diff_y=0;
-        int nprev_diff_x=0, nprev_diff_y=0;
-
-        for (i = 0; i < QUEUE_SIZE; i++)
-          {
-             if (sid->down.history[i].timestamp >=
+             if (sid->down.history[i].timestamp >
                  sid->down.dragged_began_timestamp)
                {
-                  x = sid->down.history[i].x;
-                  y = sid->down.history[i].y;
-
-                  //if there is no history value, we don't deal with it if
-                  //there is better wat to know existance of history value
-                  //, I will modify this code to it
-                  if ((x == 0) && (y == 0))
-                    {
-                       break;
-                    }
-
-                  pos[i].x = x;
-                  pos[i].y = y;
-                  pos[i].t = now - sid->down.history[i].timestamp;
-                  num++;
-
-                  if (num <= 1)
-                      continue;
-
-                  // get rid of histories with different move direction.
-                  if (sid->down.dir_x)
-                    ncur_diff_x = pos[i].x - pos[i-1].x;
-                  if (sid->down.dir_y)
-                    ncur_diff_y = pos[i].y - pos[i-1].y;
-
-                  if (ncur_diff_x * nprev_diff_x < 0 || ncur_diff_y * nprev_diff_y < 0)
+                  // oldest point is sd->down.history[i]
+                  // newset is sd->down.history[0]
+                  dt = t - sid->down.history[i].timestamp;
+                  if (dt > twin)
                     {
-                       num--;
-#if HOLD_ANIMATOR_DEBUG_LEVEL2
-                       DBG("[%03d] i=%d a dir change detected. stopped.\n",
-                           sid->down.anim_count, i);
-#endif
+                       i--;
+                       count--;
                        break;
                     }
-
-                  nprev_diff_x = ncur_diff_x;
-                  nprev_diff_y = ncur_diff_y;
-
-#if ADJUST_EVENT_TIME
-                  //> a event is delayed??
-                  if (ELM_MOVE_COUNT(pos[i].t - pos[i-1].t) <= 0)
+                  x = sid->down.history[i].x;
+                  y = sid->down.history[i].y;
+                  _elm_scroll_down_coord_eval(sid, &x, &y);
+                  if (i == 0)
                     {
-                       DBG("[%03d] i=%d a event is delayed (%f) ??????????????????\n",
-                           sid->down.anim_count,
-                           i, pos[i].t - pos[i-1].t);
+                       basex = x;
+                       basey = y;
                     }
-
-                  //> a pause in movement detected
-                  if (ELM_MOVE_COUNT(pos[i].t - pos[i-1].t) >= 2)
-                    {
-#if HOLD_ANIMATOR_DEBUG_LEVEL2
-                       DBG("[%03d] i=%d a pause(%f) in movement detected. stopped.\n",
-                           sid->down.anim_count, i, pos[i].t - pos[i-1].t);
-#endif
-#if PREDICT_WHEN_PAUSED
-                       pos[i].t = pos[i-1].t + ELM_MOVE_TIMEOUT;
-#else
-                       num--;
-#endif
-                       break;
-                    }
-#endif
+                  pos[i].x = x - basex;
+                  pos[i].y = y - basey;
+                  pos[i].t = sid->down.history[i].timestamp - sid->down.history[0].timestamp;
+                  count++;
                }
           }
-
-#if ADJUST_EVENT_TIME
-        // X server fills in time in milisecond order and it rounds off.
-        // let's makt it more precise and this is proven by machine moving at constant speed.
-        if (num >= 2)
+        if (count >= 2)
           {
-             double tmp = sid->down.history[0].timestamp;
-             for (i = num - 1; i >= 1; i--)
+             double dtsum = 0.0, tadd, maxdt;
+             double dxsum = 0.0, dysum = 0.0, xsum = 0.0, ysum = 0.0;
+             for (i = 0; i < (count - 1); i++)
+               {
+                  pos[i].dx = pos[i].x - pos[i + 1].x;
+                  pos[i].dy = pos[i].y - pos[i + 1].y;
+                  pos[i].dt = pos[i].t - pos[i + 1].t;
+                  dxsum += pos[i].dx;
+                  dysum += pos[i].dy;
+                  dtsum += pos[i].dt;
+                  xsum += pos[i].x;
+                  ysum += pos[i].y;
+               }
+             maxdt = pos[i].t;
+             dxsum /= (double)i;
+             dysum /= (double)i;
+             dtsum /= (double)i;
+             if (dtsum > 0)
                {
-                  pos[i-1].t = pos[i].t - ELM_MOVE_TIMEOUT;
-                  sid->down.history[i-1].timestamp = now - pos[i-1].t;
+                  xsum /= (double)i;
+                  ysum /= (double)i;
+                  tadd = tnow - sid->down.history[0].timestamp + _elm_config->scroll_smooth_future_time;
+                  tadd = tadd - (maxdt / 2);
+#define WEIGHT(n, o, v) n = (((double)o * (1.0 - v)) + ((double)n * v))
+                  WEIGHT(tadd, sid->down.hist.tadd, _elm_config->scroll_smooth_history_weight);
+                  WEIGHT(dxsum, sid->down.hist.dxsum, _elm_config->scroll_smooth_history_weight);
+                  WEIGHT(dysum, sid->down.hist.dysum, _elm_config->scroll_smooth_history_weight);
+                  fx = basex + xsum + ((dxsum * tadd) / dtsum);
+                  fy = basey + ysum + ((dysum * tadd) / dtsum);
+                  sid->down.hist.tadd = tadd;
+                  sid->down.hist.dxsum = dxsum;
+                  sid->down.hist.dysum = dysum;
+                  WEIGHT(fx, sid->down.hold_x, _elm_config->scroll_smooth_amount);
+                  WEIGHT(fy, sid->down.hold_y, _elm_config->scroll_smooth_amount);
                }
-             pos_diff = sid->down.history[0].timestamp - tmp;
           }
-
-#endif
-        sid->down.anim_pos_t_prev = sid->down.history[0].timestamp;
-
-        //TIZEN ONLY : for scroll smooth algorithm
-        _elm_scroll_get_pos(sid, pos, num, &fx, &fy);
-
-        fx_coord = fx;
-        fy_coord = fy;
-        _elm_scroll_down_coord_eval(sid, &fx_coord, &fy_coord);
-
      }
 
-   _elm_scroll_content_pos_get(sid->obj, &ox, &oy);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&ox, &oy));
    if (sid->down.dir_x)
      {
         if ((!sid->obj) ||
             (!elm_widget_drag_child_locked_x_get(sid->obj)))
-          ox = fx_coord;
+          ox = fx;
      }
    if (sid->down.dir_y)
      {
         if ((!sid->obj) ||
             (!elm_widget_drag_child_locked_y_get(sid->obj)))
-          oy = fy_coord;
+          oy = fy;
      }
 
 #ifdef SMOOTHDBG
@@ -3687,42 +3225,19 @@ _elm_scroll_hold_animator(void *data)
      _elm_scroll_smooth_debug_movetime_add(ox, oy);
 #endif
 
-   _elm_scroll_content_pos_set(sid->obj, ox, oy, EINA_TRUE);
-
-#if HOLD_ANIMATOR_DEBUG_LEVEL1
-#if HOLD_ANIMATOR_DEBUG_X_AXIS
-   DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev:%02d %3.4f/%+.3f p:%d(%d) = %d%+d %d %d\n",
-       sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
-       now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
-       now_diff*1000,
-       (now_diff - d)*1000,
-       d*1000,
-       num, sid->down.history[0].timestamp, pos_diff*1000,
-       ox, fx,
-       sid->down.hold_x, ox - sid->down.hold_x,
-       ox - sid->down.anim_x_coord_prev,
-       (int)sid->down.anim_vx_prev);
-#else
-   DBG("[%03d/%s] %.4f %.3f/%.3f dt:%.3f = %.3f%+.3f ev:%02d %3.4f/%+.3f p:%d(%d) = %d%+d %d %d\n",
-       sid->down.anim_count, (source == ECORE_ANIMATOR_SOURCE_CUSTOM) ? "V" : "T",
-       now, sid->down.anim_t_delay * 1000, sid->down.anim_t_adjusted * 1000,
-       now_diff*1000,
-       (now_diff - d)*1000,
-       d*1000,
-       num, sid->down.history[0].timestamp, pos_diff*1000,
-       oy, fy,
-       sid->down.hold_y, oy - sid->down.hold_y,
-       oy - sid->down.anim_y_coord_prev,
-       (int)sid->down.anim_vy_prev);
-#endif
-#endif
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_set(ox, oy, EINA_TRUE));
 
-   sid->down.anim_x_coord_prev = ox;
-   sid->down.anim_y_coord_prev = oy;
+   return EINA_FALSE;
+}
 
-update_time_and_quit:
-   sid->down.anim_t_prev = now;
+static Eina_Bool
+_elm_scroll_hold_animator(void *data)
+{
+   Elm_Scrollable_Smart_Interface_Data *sid = data;
 
+   ecore_idle_enterer_del(sid->down.hold_enterer);
+   sid->down.hold_enterer =
+     ecore_idle_enterer_before_add(_elm_scroll_hold_enterer, sid);
    return ECORE_CALLBACK_RENEW;
 }
 
@@ -3731,7 +3246,7 @@ _elm_scroll_on_hold_animator(void *data)
 {
    double t, td;
    double vx, vy;
-   Evas_Coord x, y, ox, oy;
+   Evas_Coord x, y, ox = 0, oy = 0;
    Elm_Scrollable_Smart_Interface_Data *sid;
 
    sid = data;
@@ -3743,7 +3258,7 @@ _elm_scroll_on_hold_animator(void *data)
           (double)_elm_config->thumbscroll_hold_threshold * 2.0;
         vy = sid->down.onhold_vy * td *
           (double)_elm_config->thumbscroll_hold_threshold * 2.0;
-        _elm_scroll_content_pos_get(sid->obj, &ox, &oy);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&ox, &oy));
         x = ox;
         y = oy;
 
@@ -3769,7 +3284,7 @@ _elm_scroll_on_hold_animator(void *data)
                }
           }
 
-        _elm_scroll_content_pos_set(sid->obj, x, y, EINA_TRUE);
+        eo_do(sid->obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
      }
    sid->down.onhold_tlast = t;
 
@@ -3779,7 +3294,7 @@ _elm_scroll_on_hold_animator(void *data)
 static void
 _elm_scroll_mouse_move_event_cb(void *data,
                                 Evas *e,
-                                Evas_Object *obj __UNUSED__,
+                                Evas_Object *obj EINA_UNUSED,
                                 void *event_info)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
@@ -3788,8 +3303,6 @@ _elm_scroll_mouse_move_event_cb(void *data,
 
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    if ((sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
        (sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
      return;
@@ -3800,393 +3313,360 @@ _elm_scroll_mouse_move_event_cb(void *data,
    evas_post_event_callback_push(e, _elm_scroll_post_event_move, sid);
 
    // FIXME: respect elm_widget_scroll_hold_get of parent container
-   if (_elm_config->thumbscroll_enable)
-     {
-        if (sid->down.now)
-          {
-             //REDWOOD ONLY
-             edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,move", "elm");
+   if (!_elm_config->thumbscroll_enable)
+     return;
 
-             if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze) &&
-                 !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
-               {
-                  Evas_Coord px;
-                  ecore_animator_del(sid->scrollto.x.animator);
-                  sid->scrollto.x.animator = NULL;
-                  psd->api->pos_get(sid->pan_obj, &px, NULL);
-                  sid->down.sx = px;
-                  sid->down.x = sid->down.history[0].x;
-               }
+   if (!sid->down.now) return;
 
-             if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze) &&
-                 !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
-               {
-                  Evas_Coord py;
-                  ecore_animator_del(sid->scrollto.y.animator);
-                  sid->scrollto.y.animator = NULL;
-                  psd->api->pos_get(sid->pan_obj, NULL, &py);
-                  sid->down.sy = py;
-                  sid->down.y = sid->down.history[0].y;
-               }
+// TIZEN_ONLY(20150820): Overscroll effect
+   edje_object_signal_emit(sid->edje_obj, "elm,state,mouse,move", "elm");
+//
+
+   if ((sid->scrollto.x.animator) && (!sid->hold) && (!sid->freeze) &&
+       !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
+     {
+        Evas_Coord px = 0;
+        ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+        eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, NULL));
+        sid->down.sx = px;
+        sid->down.x = sid->down.history[0].x;
+     }
+
+   if ((sid->scrollto.y.animator) && (!sid->hold) && (!sid->freeze) &&
+       !(sid->block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+     {
+        Evas_Coord py = 0;
+        ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
+        eo_do(sid->pan_obj, elm_obj_pan_pos_get(NULL, &py));
+        sid->down.sy = py;
+        sid->down.y = sid->down.history[0].y;
+     }
 
 #ifdef SCROLLDBG
-             DBG("::: %i %i\n", ev->cur.canvas.x, ev->cur.canvas.y);
+   DBG("::: %i %i\n", ev->cur.canvas.x, ev->cur.canvas.y);
 #endif
-             memmove(&(sid->down.history[1]), &(sid->down.history[0]),
-                     sizeof(sid->down.history[0]) * (ELM_SCROLL_HISTORY_SIZE - 1));
+   memmove(&(sid->down.history[1]), &(sid->down.history[0]),
+           sizeof(sid->down.history[0]) * (60 - 1));
 #ifdef EVTIME
-             sid->down.history[0].timestamp = ev->timestamp / 1000.0;
-             sid->down.history[0].localtimestamp = ecore_loop_time_get();
+   sid->down.history[0].timestamp = ev->timestamp / 1000.0;
+   sid->down.history[0].localtimestamp = ecore_loop_time_get();
 #else
-             sid->down.history[0].timestamp = ecore_loop_time_get();
+   sid->down.history[0].timestamp = ecore_loop_time_get();
 #endif
-             sid->down.history[0].x = ev->cur.canvas.x;
-             sid->down.history[0].y = ev->cur.canvas.y;
-
-             if (!sid->down.dragged_began)
-               {
-                  x = ev->cur.canvas.x - sid->down.x;
-                  y = ev->cur.canvas.y - sid->down.y;
+   sid->down.history[0].x = ev->cur.canvas.x;
+   sid->down.history[0].y = ev->cur.canvas.y;
 
-                  if (sid->one_direction_at_a_time == ELM_SCROLLER_SINGLE_DIRECTION_HARD)
-                    {
-                       if (abs(x) <_elm_scroll_gradient_check_pixel && abs(y) <_elm_scroll_gradient_check_pixel)
-                         {
-                            return;
-                         }
-                    }
+   if (!sid->down.dragged_began)
+     {
+        x = ev->cur.canvas.x - sid->down.x;
+        y = ev->cur.canvas.y - sid->down.y;
 
-                  sid->down.hdir = -1;
-                  sid->down.vdir = -1;
+        sid->down.hdir = -1;
+        sid->down.vdir = -1;
 
-                  if (x > 0) sid->down.hdir = LEFT;
-                  else if (x < 0)
-                    sid->down.hdir = RIGHT;
-                  if (y > 0) sid->down.vdir = UP;
-                  else if (y < 0)
-                    sid->down.vdir = DOWN;
+        if (x > 0) sid->down.hdir = LEFT;
+        else if (x < 0)
+          sid->down.hdir = RIGHT;
+        if (y > 0) sid->down.vdir = UP;
+        else if (y < 0)
+          sid->down.vdir = DOWN;
 
-                  if (x < 0) x = -x;
-                  if (y < 0) y = -y;
+        if (x < 0) x = -x;
+        if (y < 0) y = -y;
 
-                  if (sid->one_direction_at_a_time)
+        if (sid->one_direction_at_a_time)
+          {
+             if (((x * x) + (y * y)) >
+                 (_elm_config->thumbscroll_threshold *
+                  _elm_config->thumbscroll_threshold))
+               {
+                  if (sid->one_direction_at_a_time ==
+                      ELM_SCROLLER_SINGLE_DIRECTION_SOFT)
                     {
-                       if (((x * x) + (y * y)) >
-                            (_elm_config->thumbscroll_threshold *
-                             _elm_config->thumbscroll_threshold))
+                       int dodir = 0;
+                       if (x > (y * 2))
                          {
-                            if (sid->one_direction_at_a_time ==
-                                ELM_SCROLLER_SINGLE_DIRECTION_SOFT)
+                            if (!(sid->block &
+                                  ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
                               {
-                                 int dodir = 0;
-                                 if (x > (y * 2))
-                                   {
-                                      if (!(sid->block &
-                                            ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
-                                        {
-                                           sid->down.dir_x = EINA_TRUE;
-                                        }
-                                      sid->down.dir_y = EINA_FALSE;
-                                      dodir++;
-                                   }
-                                 if (y > (x * 2))
-                                   {
-                                      sid->down.dir_x = EINA_FALSE;
-                                      if (!(sid->block &
-                                            ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
-                                        {
-                                           sid->down.dir_y = EINA_TRUE;
-                                        }
-                                      dodir++;
-                                   }
-                                 if (!dodir)
-                                   {
-                                      if (!(sid->block &
-                                            ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
-                                        {
-                                           sid->down.dir_x = EINA_TRUE;
-                                        }
-                                      if (!(sid->block &
-                                            ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
-                                        {
-                                           sid->down.dir_y = EINA_TRUE;
-                                        }
-                                   }
-                              }
-                            else if (sid->one_direction_at_a_time ==
-                                     ELM_SCROLLER_SINGLE_DIRECTION_HARD)
-                              {
-                                 if (x > y*2)
-                                   {
-                                      if (!(sid->block &
-                                            ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
-                                        {
-                                           sid->down.dir_x = EINA_TRUE;
-                                        }
-                                      sid->down.dir_y = EINA_FALSE;
-                                   }
-                                   else
-                                 //if (y > x)
-                                   {
-                                      sid->down.dir_x = EINA_FALSE;
-                                      if (!(sid->block &
-                                            ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
-                                        {
-                                           sid->down.dir_y = EINA_TRUE;
-                                        }
-                                   }
+                                 sid->down.dir_x = EINA_TRUE;
                               }
+                            sid->down.dir_y = EINA_FALSE;
+                            dodir++;
                          }
-                    }
-                  else
-                    {
-                       if (!(sid->block &
-                             ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
-                         {
-                            sid->down.dir_x = EINA_TRUE;
-                         }
-                       if (!(sid->block &
-                             ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+                       if (y > (x * 2))
                          {
-                            sid->down.dir_y = EINA_TRUE;
-                         }
-                    }
-               }
-             if ((!sid->hold) && (!sid->freeze))
-               {
-                  if ((sid->down.dragged) ||
-                      (((x * x) + (y * y)) >
-                       (_elm_config->thumbscroll_threshold *
-                        _elm_config->thumbscroll_threshold)))
-                    {
-                       if (!sid->down.dragged_began &&
-                           _elm_config->scroll_smooth_start_enable)
-                         {
-#if SMART_SMOOTH_START
-                            int i = 0;
-                            for (i = 0 ; i < 5 ; i++)
-                              if (!sid->down.history[i].timestamp)
-                                break;
-                            if (i > 0)
+                            sid->down.dir_x = EINA_FALSE;
+                            if (!(sid->block &
+                                  ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
                               {
-                                 i--;
-                                 DBG("smooth-start(-%d): %d->%d->%d->%d->%d->%d\n",
-                                     i,
-                                     sid->down.history[0].x,
-                                     sid->down.history[1].x,
-                                     sid->down.history[2].x,
-                                     sid->down.history[3].x,
-                                     sid->down.history[4].x,
-                                     sid->down.x);
-                                 sid->down.x = sid->down.history[i].x;
-                                 sid->down.y = sid->down.history[i].y;
-                                 sid->down.dragged_began_timestamp = sid->down.history[i].timestamp;
-
+                                 sid->down.dir_y = EINA_TRUE;
                               }
-#else
-                            sid->down.x = ev->cur.canvas.x;
-                            sid->down.y = ev->cur.canvas.y;
-#ifdef EVTIME
-                            sid->down.dragged_began_timestamp =
-                               ev->timestamp / 1000.0;
-#else
-                            sid->down.dragged_began_timestamp =
-                               ecore_loop_time_get();
-#endif
-#endif
-                         }
-
-                       if (!sid->down.dragged)
-                         {
-                            sid->down.want_dragged = EINA_TRUE;
-                         }
-                       //***************** TIZEN Only
-                       if ((((_elm_scroll_can_scroll(sid, LEFT) || _elm_scroll_can_scroll(sid, RIGHT)) && sid->down.dir_x) ||
-                            ((_elm_scroll_can_scroll(sid, UP) || _elm_scroll_can_scroll(sid, DOWN)) && sid->down.dir_y)) &&
-                           !sid->down.dragged_began)
-                         {
-                            ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
-                            sid->down.dragged_began = EINA_TRUE;
-                         }
-                       else if (sid->down.dragged_began)
-                         {
-                            ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
-                         }
-                       //****************************
-                       if (sid->down.dir_x)
-                         x = sid->down.sx - (ev->cur.canvas.x - sid->down.x);
-                       else
-                         x = sid->down.sx;
-                       if (sid->down.dir_y)
-                         y = sid->down.sy - (ev->cur.canvas.y - sid->down.y);
-                       else
-                         y = sid->down.sy;
-                       if (sid->down.want_reset)
-                         {
-                            sid->down.x = ev->cur.canvas.x;
-                            sid->down.y = ev->cur.canvas.y;
-                            sid->down.want_reset = EINA_FALSE;
+                            dodir++;
                          }
-                       if ((sid->down.dir_x) || (sid->down.dir_y))
+                       if (!dodir)
                          {
-                            if (!sid->down.locked)
+                            if (!(sid->block &
+                                  ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
                               {
-                                 sid->down.locked_x = x;
-                                 sid->down.locked_y = y;
-                                 sid->down.locked = EINA_TRUE;
+                                 sid->down.dir_x = EINA_TRUE;
                               }
-                            if (!((sid->down.dir_x) && (sid->down.dir_y)))
+                            if (!(sid->block &
+                                  ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
                               {
-                                 if (sid->down.dir_x) y = sid->down.locked_y;
-                                 else x = sid->down.locked_x;
+                                 sid->down.dir_y = EINA_TRUE;
                               }
                          }
-                       {
-                          Evas_Coord minx, miny, mx, my;
-
-                          psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-                          psd->api->pos_max_get(sid->pan_obj, &mx, &my);
-                          if (!sid->loop_v && y < miny)
-                            y += (miny - y) *
-                              _elm_config->thumbscroll_border_friction;
-                          else if (!sid->loop_v && my <= 0)
-                            y += (sid->down.sy - y) *
-                              _elm_config->thumbscroll_border_friction;
-                          else if (!sid->loop_v && (my + miny) < y)
-                            y += (my + miny - y) *
-                              _elm_config->thumbscroll_border_friction;
-                          if (!sid->loop_h && x < minx)
-                            x += (minx - x) *
-                              _elm_config->thumbscroll_border_friction;
-                          else if (!sid->loop_h && mx <= 0)
-                            x += (sid->down.sx - x) *
-                              _elm_config->thumbscroll_border_friction;
-                          else if (!sid->loop_h && (mx + minx) < x)
-                            x += (mx + minx - x) *
-                              _elm_config->thumbscroll_border_friction;
-                       }
-
-                       sid->down.hold_x = x;
-                       sid->down.hold_y = y;
-                       if (!sid->down.hold_animator)
-                         {
-                            sid->down.hold_animator =
-                               ecore_animator_add(_elm_scroll_hold_animator, sid);
-                            sid->down.anim_x_prev = 0;
-                            sid->down.anim_y_prev = 0;
-                            sid->down.anim_vx_prev = 0;
-                            sid->down.anim_vy_prev = 0;
-                            sid->down.anim_t_prev = 0;
-                            sid->down.anim_x_coord_prev = 0;
-                            sid->down.anim_y_coord_prev = 0;
-                            sid->down.anim_count = 0;
-                            sid->down.anim_skip = 0;
-                            sid->down.anim_t_dont_adjust = 0;
-                            sid->down.anim_t_delay = 0;
-                            sid->down.anim_t_adjusted = 0;
-                            sid->down.anim_pos_t_prev = 0;
-                            memset(&sid->down.predict, 0 , sizeof(sid->down.predict));
-                         }
                     }
-                  else
+                  else if (sid->one_direction_at_a_time ==
+                           ELM_SCROLLER_SINGLE_DIRECTION_HARD)
                     {
-                       if (sid->down.dragged_began)
+                       if (x > y)
                          {
-                            //***************** TIZEN Only
-                            if ((_elm_scroll_can_scroll(sid, sid->down.hdir) && sid->down.dir_x) ||
-                                (_elm_scroll_can_scroll(sid, sid->down.vdir) && sid->down.dir_y))
+                            if (!(sid->block &
+                                  ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
                               {
-                                 ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+                                 sid->down.dir_x = EINA_TRUE;
                               }
-                            //****************************
-                            if (!sid->down.hold)
+                            sid->down.dir_y = EINA_FALSE;
+                         }
+                       if (y > x)
+                         {
+                            sid->down.dir_x = EINA_FALSE;
+                            if (!(sid->block &
+                                  ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
                               {
-                                 sid->down.hold = EINA_TRUE;
-                                 evas_event_feed_hold
-                                   (e, 1, ev->timestamp, ev->data);
+                                 sid->down.dir_y = EINA_TRUE;
                               }
                          }
                     }
                }
-             else if (!sid->freeze)
+          }
+        else
+          {
+             if (!(sid->block &
+                   ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL))
+               {
+                  sid->down.dir_x = EINA_TRUE;
+               }
+             if (!(sid->block &
+                   ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL))
+               {
+                  sid->down.dir_y = EINA_TRUE;
+               }
+          }
+     }
+   if ((!sid->hold) && (!sid->freeze))
+     {
+        if ((sid->down.dragged) ||
+            (((x * x) + (y * y)) >
+             (_elm_config->thumbscroll_threshold *
+              _elm_config->thumbscroll_threshold)))
+          {
+             if (!sid->down.dragged_began &&
+                 _elm_config->scroll_smooth_start_enable)
                {
-                  double vx = 0.0, vy = 0.0;
+                  sid->down.x = ev->cur.canvas.x;
+                  sid->down.y = ev->cur.canvas.y;
+#ifdef EVTIME
+                  sid->down.dragged_began_timestamp = ev->timestamp / 1000.0;
+#else
+                  sid->down.dragged_began_timestamp = ecore_loop_time_get();
+#endif
+               }
 
-                  x = ev->cur.canvas.x - sid->x;
-                  y = ev->cur.canvas.y - sid->y;
-                  if (x < _elm_config->thumbscroll_hold_threshold)
-                    {
-                       if (_elm_config->thumbscroll_hold_threshold > 0.0)
-                         vx = -(double)(_elm_config->thumbscroll_hold_threshold - x)
-                           / _elm_config->thumbscroll_hold_threshold;
-                       else
-                         vx = -1.0;
-                    }
-                  else if (x > (sid->w - _elm_config->thumbscroll_hold_threshold))
-                    {
-                       if (_elm_config->thumbscroll_hold_threshold > 0.0)
-                         vx = (double)(_elm_config->thumbscroll_hold_threshold -
-                                       (sid->w - x)) /
-                           _elm_config->thumbscroll_hold_threshold;
-                       else
-                         vx = 1.0;
-                    }
-                  if (y < _elm_config->thumbscroll_hold_threshold)
+             if (!sid->down.dragged)
+               {
+                  sid->down.want_dragged = EINA_TRUE;
+               }
+             if ((((_elm_scroll_can_scroll(sid, LEFT) || _elm_scroll_can_scroll(sid, RIGHT)) && sid->down.dir_x) ||
+                  ((_elm_scroll_can_scroll(sid, UP) || _elm_scroll_can_scroll(sid, DOWN)) && sid->down.dir_y)) &&
+                 !sid->down.dragged_began)
+               {
+                  ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+                  sid->down.dragged_began = EINA_TRUE;
+               }
+             else if (sid->down.dragged_began)
+               {
+                  ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
+               }
+             if (sid->down.dir_x)
+               x = sid->down.sx - (ev->cur.canvas.x - sid->down.x);
+             else
+               x = sid->down.sx;
+             if (sid->down.dir_y)
+               y = sid->down.sy - (ev->cur.canvas.y - sid->down.y);
+             else
+               y = sid->down.sy;
+             if (sid->down.want_reset)
+               {
+                  sid->down.x = ev->cur.canvas.x;
+                  sid->down.y = ev->cur.canvas.y;
+                  sid->down.want_reset = EINA_FALSE;
+               }
+             if ((sid->down.dir_x) || (sid->down.dir_y))
+               {
+                  if (!sid->down.locked)
                     {
-                       if (_elm_config->thumbscroll_hold_threshold > 0.0)
-                         vy = -(double)(_elm_config->thumbscroll_hold_threshold - y)
-                           / _elm_config->thumbscroll_hold_threshold;
-                       else
-                         vy = -1.0;
+                       sid->down.locked_x = x;
+                       sid->down.locked_y = y;
+                       sid->down.locked = EINA_TRUE;
                     }
-                  else if (y > (sid->h - _elm_config->thumbscroll_hold_threshold))
+                  if (!((sid->down.dir_x) && (sid->down.dir_y)))
                     {
-                       if (_elm_config->thumbscroll_hold_threshold > 0.0)
-                         vy = (double)(_elm_config->thumbscroll_hold_threshold -
-                                       (sid->h - y)) /
-                           _elm_config->thumbscroll_hold_threshold;
-                       else
-                         vy = 1.0;
+                       if (sid->down.dir_x) y = sid->down.locked_y;
+                       else x = sid->down.locked_x;
                     }
-                  if ((vx != 0.0) || (vy != 0.0))
+               }
+             {
+                Evas_Coord minx = 0, miny = 0, mx, my;
+
+                eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+                eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my));
+                if (!sid->loop_v && y < miny)
+                  y += (miny - y) *
+                    _elm_config->thumbscroll_border_friction;
+                else if (!sid->loop_v && my <= 0)
+                  y += (sid->down.sy - y) *
+                    _elm_config->thumbscroll_border_friction;
+                else if (!sid->loop_v && (my + miny) < y)
+                  y += (my + miny - y) *
+                    _elm_config->thumbscroll_border_friction;
+                if (!sid->loop_h && x < minx)
+                  x += (minx - x) *
+                    _elm_config->thumbscroll_border_friction;
+                else if (!sid->loop_h && mx <= 0)
+                  x += (sid->down.sx - x) *
+                    _elm_config->thumbscroll_border_friction;
+                else if (!sid->loop_h && (mx + minx) < x)
+                  x += (mx + minx - x) *
+                    _elm_config->thumbscroll_border_friction;
+             }
+
+             sid->down.hold_x = x;
+             sid->down.hold_y = y;
+             if (!sid->down.hold_animator)
+               sid->down.hold_animator =
+                 ecore_animator_add(_elm_scroll_hold_animator, sid);
+          }
+        else
+          {
+             if (sid->down.dragged_began)
+               {
+                  if ((_elm_scroll_can_scroll(sid, sid->down.hdir) && sid->down.dir_x) ||
+                      (_elm_scroll_can_scroll(sid, sid->down.vdir) && sid->down.dir_y))
                     {
-                       sid->down.onhold_vx = vx;
-                       sid->down.onhold_vy = vy;
-                       if (!sid->down.onhold_animator)
-                         {
-                            sid->down.onhold_vxe = 0.0;
-                            sid->down.onhold_vye = 0.0;
-                            sid->down.onhold_tlast = 0.0;
-                            sid->down.onhold_animator = ecore_animator_add
-                               (_elm_scroll_on_hold_animator, sid);
-                         }
+                       ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
                     }
-                  else
+                  if (!sid->down.hold)
                     {
-                       if (sid->down.onhold_animator)
-                         {
-                            ecore_animator_del(sid->down.onhold_animator);
-                            sid->down.onhold_animator = NULL;
-                            if (sid->content_info.resized)
-                              _elm_scroll_wanted_region_set(sid->obj);
-                         }
+                       sid->down.hold = EINA_TRUE;
+                       evas_event_feed_hold
+                         (e, 1, ev->timestamp, ev->data);
                     }
                }
           }
      }
+   else if (!sid->freeze)
+     {
+        double vx = 0.0, vy = 0.0;
+
+        x = ev->cur.canvas.x - sid->x;
+        y = ev->cur.canvas.y - sid->y;
+        if (x < _elm_config->thumbscroll_hold_threshold)
+          {
+             if (_elm_config->thumbscroll_hold_threshold > 0.0)
+               vx = -(double)(_elm_config->thumbscroll_hold_threshold - x)
+                 / _elm_config->thumbscroll_hold_threshold;
+             else
+               vx = -1.0;
+          }
+        else if (x > (sid->w - _elm_config->thumbscroll_hold_threshold))
+          {
+             if (_elm_config->thumbscroll_hold_threshold > 0.0)
+               vx = (double)(_elm_config->thumbscroll_hold_threshold -
+                             (sid->w - x)) /
+                 _elm_config->thumbscroll_hold_threshold;
+             else
+               vx = 1.0;
+          }
+        if (y < _elm_config->thumbscroll_hold_threshold)
+          {
+             if (_elm_config->thumbscroll_hold_threshold > 0.0)
+               vy = -(double)(_elm_config->thumbscroll_hold_threshold - y)
+                 / _elm_config->thumbscroll_hold_threshold;
+             else
+               vy = -1.0;
+          }
+        else if (y > (sid->h - _elm_config->thumbscroll_hold_threshold))
+          {
+             if (_elm_config->thumbscroll_hold_threshold > 0.0)
+               vy = (double)(_elm_config->thumbscroll_hold_threshold -
+                             (sid->h - y)) /
+                 _elm_config->thumbscroll_hold_threshold;
+             else
+               vy = 1.0;
+          }
+        if ((vx != 0.0) || (vy != 0.0))
+          {
+             sid->down.onhold_vx = vx;
+             sid->down.onhold_vy = vy;
+             if (!sid->down.onhold_animator)
+               {
+                  sid->down.onhold_vxe = 0.0;
+                  sid->down.onhold_vye = 0.0;
+                  sid->down.onhold_tlast = 0.0;
+                  sid->down.onhold_animator = ecore_animator_add
+                      (_elm_scroll_on_hold_animator, sid);
+               }
+          }
+        else
+          {
+             if (sid->down.onhold_animator)
+               {
+                  ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
+                  if (sid->content_info.resized)
+                    //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+                    //_elm_scroll_wanted_region_set(sid->obj);
+                    eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+                    //
+               }
+          }
+     }
+}
+
+static void
+_elm_scroll_page_adjust(Elm_Scrollable_Smart_Interface_Data *sid)
+{
+   Evas_Coord x, y, w, h;
+
+   if (!_paging_is_enabled(sid)) return;
+
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &w, &h));
+
+   x = _elm_scroll_page_x_get(sid, 0, EINA_TRUE);
+   y = _elm_scroll_page_y_get(sid, 0, EINA_TRUE);
+
+   eo_do(sid->obj, elm_interface_scrollable_content_region_set(x, y, w, h));
 }
 
 static void
 _elm_scroll_reconfigure(Elm_Scrollable_Smart_Interface_Data *sid)
 {
    _elm_scroll_scroll_bar_size_adjust(sid);
+   // TIZEN_ONLY(20150716): Remove dulplicated function calls for applying scroll bars visibility.
+   //_elm_scroll_scroll_bar_h_visibility_apply(sid);
+   //_elm_scroll_scroll_bar_v_visibility_apply(sid);
+   //
+   _elm_scroll_page_adjust(sid);
 }
 
 static void
 _on_edje_move(void *data,
-              Evas *e __UNUSED__,
+              Evas *e EINA_UNUSED,
               Evas_Object *edje_obj,
-              void *event_info __UNUSED__)
+              void *event_info EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
    int x, y;
@@ -4201,20 +3681,36 @@ _on_edje_move(void *data,
 
 static void
 _on_edje_resize(void *data,
-                Evas *e __UNUSED__,
+                Evas *e,
                 Evas_Object *edje_obj,
-                void *event_info __UNUSED__)
+                void *event_info EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
-   int w, h;
+   Evas_Coord w, h;
+   int current_calc;
+   Eina_Bool reconf_ok = EINA_TRUE;
 
    evas_object_geometry_get(edje_obj, NULL, NULL, &w, &h);
 
    sid->w = w;
    sid->h = h;
 
-   _elm_scroll_reconfigure(sid);
-   _elm_scroll_wanted_region_set(sid->obj);
+   current_calc = evas_smart_objects_calculate_count_get(e);
+   if (current_calc == sid->current_calc)
+     {
+        sid->size_count++;
+        if (sid->size_count > 3) reconf_ok = EINA_FALSE;
+     }
+   else
+     {
+        sid->current_calc = current_calc;
+        sid->size_count = 0;
+     }
+   if (reconf_ok) _elm_scroll_reconfigure(sid);
+   //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+   //_elm_scroll_wanted_region_set(sid->obj);
+   eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+   //
 }
 
 static void
@@ -4377,24 +3873,20 @@ _scroll_event_object_detach(Evas_Object *obj)
      _elm_scroll_mouse_move_event_cb, sid);
 }
 
-static void
-_elm_scroll_objects_set(Evas_Object *obj,
-                        Evas_Object *edje_object,
-                        Evas_Object *hit_rectangle)
+EOLIAN static void
+_elm_interface_scrollable_objects_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Object *edje_object, Evas_Object *hit_rectangle)
 {
    Evas_Coord mw, mh;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!edje_object || !hit_rectangle) return;
 
    if (sid->edje_obj)
-       _scroll_edje_object_detach(obj);
+     _scroll_edje_object_detach(obj);
 
    sid->edje_obj = edje_object;
 
    if (sid->event_rect)
-       _scroll_event_object_detach(obj);
+     _scroll_event_object_detach(obj);
 
    sid->event_rect = hit_rectangle;
    evas_object_repeat_events_set(hit_rectangle, EINA_TRUE);
@@ -4409,7 +3901,7 @@ _elm_scroll_objects_set(Evas_Object *obj,
         Evas_Object *base;
 
         base = edje_object_part_swallow_get
-            (sid->edje_obj, "elm.scrollbar.base");
+           (sid->edje_obj, "elm.scrollbar.base");
         if (!base)
           {
              base = evas_object_rectangle_add
@@ -4445,80 +3937,65 @@ _elm_scroll_scroll_bar_reset(Elm_Scrollable_Smart_Interface_Data *sid)
      }
    if (sid->pan_obj)
      {
-        ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-        psd->api->pos_min_get(sid->pan_obj, &minx, &miny);
-        psd->api->pos_get(sid->pan_obj, &px, &py);
-        psd->api->pos_set(sid->pan_obj, minx, miny);
+        eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny));
+        eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py));
+        eo_do(sid->pan_obj, elm_obj_pan_pos_set(minx, miny));
      }
    if ((px != minx) || (py != miny))
      edje_object_signal_emit(sid->edje_obj, "elm,action,scroll", "elm");
    _elm_direction_arrows_eval(sid);
 }
 
-/* even external pan objects get this */
 static void
-_elm_scroll_pan_changed_cb(void *data,
-                           Evas_Object *obj __UNUSED__,
-                           void *event_info __UNUSED__)
+_elm_scroll_pan_resized_cb(void *data,
+                          Evas *e EINA_UNUSED,
+                          Evas_Object *obj EINA_UNUSED,
+                          void *event_info EINA_UNUSED)
 {
-   Evas_Coord w, h, vw, vh;
+   Evas_Coord w = 0, h = 0;
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
-   if (!sid->pan_obj) return;
-
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->content_size_get(sid->pan_obj, &w, &h);
-   _elm_scroll_content_viewport_size_get(sid->obj, &vw, &vh);
-   if ((w != sid->content_info.w) || (h != sid->content_info.h))
+   if (sid->cb_func.content_viewport_resize)
      {
-        if (_paging_is_enabled(sid))
-          {
-             if (w != sid->content_info.w)
-               {
-                  if (sid->pagerel_h > 0)
-                    sid->pagecount_h = w / (vw * sid->pagerel_h);
-               }
-             if (h != sid->content_info.h)
-               {
-                  if (sid->pagerel_v > 0)
-                    sid->pagecount_v = h / (vh * sid->pagerel_v);
-               }
-          }
-        sid->content_info.w = w;
-        sid->content_info.h = h;
-        _elm_scroll_scroll_bar_size_adjust(sid);
-
-        evas_object_size_hint_min_set
-          (sid->edje_obj, sid->content_info.w, sid->content_info.h);
-        sid->content_info.resized = EINA_TRUE;
-        _elm_scroll_reconfigure(sid);
-        _elm_scroll_wanted_region_set(sid->obj);
+        eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+              (NULL, NULL, &w, &h));
+        sid->cb_func.content_viewport_resize(sid->obj, w, h);
      }
 }
 
+/* even external pan objects get this */
 static void
-_elm_scroll_pan_resized_cb(void *data,
-                          Evas *e __UNUSED__,
-                          Evas_Object *obj __UNUSED__,
-                          void *event_info __UNUSED__)
+_elm_scroll_pan_changed_cb(void *data,
+                           Evas_Object *obj EINA_UNUSED,
+                           void *event_info EINA_UNUSED)
 {
-   Evas_Coord w, h;
+   Evas_Coord w = 0, h = 0;
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
-   if (sid->cb_func.content_viewport_resize)
+   if (!sid->pan_obj) return;
+
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&w, &h));
+   if ((w != sid->content_info.w) || (h != sid->content_info.h))
      {
-        _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
-        sid->cb_func.content_viewport_resize(sid->obj, w, h);
+        sid->content_info.w = w;
+        sid->content_info.h = h;
+        _elm_scroll_scroll_bar_size_adjust(sid);
+
+        evas_object_size_hint_min_set
+          (sid->edje_obj, sid->content_info.w, sid->content_info.h);
+        sid->content_info.resized = EINA_TRUE;
+        //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+        //_elm_scroll_wanted_region_set(sid->obj);
+        eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+        //
      }
 }
 
 static void
 _elm_scroll_content_del_cb(void *data,
-                           Evas *e __UNUSED__,
-                           Evas_Object *obj __UNUSED__,
-                           void *event_info __UNUSED__)
+                           Evas *e EINA_UNUSED,
+                           Evas_Object *obj EINA_UNUSED,
+                           void *event_info EINA_UNUSED)
 {
    Elm_Scrollable_Smart_Interface_Data *sid = data;
 
@@ -4527,15 +4004,12 @@ _elm_scroll_content_del_cb(void *data,
    _elm_scroll_scroll_bar_reset(sid);
 }
 
-static void
-_elm_scroll_content_set(Evas_Object *obj,
-                        Evas_Object *content)
+EOLIAN static void
+_elm_interface_scrollable_content_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Object *content)
 {
-   Evas_Coord w, h;
+   Evas_Coord w = 0, h = 0;
    Evas_Object *o;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->edje_obj) return;
 
    if (sid->content)
@@ -4563,13 +4037,11 @@ _elm_scroll_content_set(Evas_Object *obj,
         edje_object_part_swallow(sid->edje_obj, "elm.swallow.content", o);
      }
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
    evas_object_event_callback_add
      (content, EVAS_CALLBACK_DEL, _elm_scroll_content_del_cb, sid);
 
    _elm_pan_content_set(sid->pan_obj, content);
-   psd->api->content_size_get(sid->pan_obj, &w, &h);
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&w, &h));
    sid->content_info.w = w;
    sid->content_info.h = h;
 
@@ -4577,15 +4049,12 @@ _elm_scroll_content_set(Evas_Object *obj,
    _elm_scroll_scroll_bar_reset(sid);
 }
 
-static void
-_elm_scroll_extern_pan_set(Evas_Object *obj,
-                           Evas_Object *pan)
+EOLIAN static void
+_elm_interface_scrollable_extern_pan_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Object *pan)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->edje_obj) return;
 
-   _elm_scroll_content_set(obj, NULL);
+   eo_do(obj, elm_interface_scrollable_content_set(NULL));
 
    if (sid->pan_obj)
      {
@@ -4606,11 +4075,7 @@ _elm_scroll_extern_pan_set(Evas_Object *obj,
      }
    else
      {
-        if (sid->pan_obj)
-          {
-             evas_object_del(sid->pan_obj);
-             sid->pan_obj = NULL;
-          }
+        ELM_SAFE_FREE(sid->pan_obj, evas_object_del);
      }
    if (!pan)
      {
@@ -4629,290 +4094,188 @@ _elm_scroll_extern_pan_set(Evas_Object *obj,
      (sid->edje_obj, "elm.swallow.content", sid->pan_obj);
 }
 
-static void
-_elm_scroll_drag_start_cb_set(Evas_Object *obj,
-                              void (*drag_start_cb)(Evas_Object *obj,
-                                                    void *data))
+EOLIAN static void
+_elm_interface_scrollable_drag_start_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb drag_start_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.drag_start = drag_start_cb;
 }
 
-static void
-_elm_scroll_drag_stop_cb_set(Evas_Object *obj,
-                             void (*drag_stop_cb)(Evas_Object *obj,
-                                                  void *data))
+EOLIAN static void
+_elm_interface_scrollable_drag_stop_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb drag_stop_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.drag_stop = drag_stop_cb;
 }
 
-static void
-_elm_scroll_animate_start_cb_set(Evas_Object *obj,
-                                 void (*animate_start_cb)(Evas_Object *obj,
-                                                          void *data))
+EOLIAN static void
+_elm_interface_scrollable_animate_start_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb animate_start_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.animate_start = animate_start_cb;
 }
 
-static void
-_elm_scroll_animate_stop_cb_set(Evas_Object *obj,
-                                void (*animate_stop_cb)(Evas_Object *obj,
-                                                        void *data))
+EOLIAN static void
+_elm_interface_scrollable_animate_stop_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb animate_stop_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.animate_stop = animate_stop_cb;
 }
 
-static void
-_elm_scroll_scroll_cb_set(Evas_Object *obj,
-                          void (*scroll_cb)(Evas_Object *obj,
-                                            void *data))
+EOLIAN static void
+_elm_interface_scrollable_page_change_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb page_change_cb EINA_UNUSED)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+   sid->cb_func.page_change = page_change_cb;
+}
 
+EOLIAN static void
+_elm_interface_scrollable_scroll_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_cb)
+{
    sid->cb_func.scroll = scroll_cb;
 }
 
-static void
-_elm_scroll_scroll_left_cb_set(Evas_Object *obj,
-                          void (*scroll_left_cb)(Evas_Object *obj,
-                                            void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_left_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_left_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.scroll_left = scroll_left_cb;
 }
 
-static void
-_elm_scroll_scroll_right_cb_set(Evas_Object *obj,
-                          void (*scroll_right_cb)(Evas_Object *obj,
-                                            void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_right_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_right_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.scroll_right = scroll_right_cb;
 }
 
-static void
-_elm_scroll_scroll_up_cb_set(Evas_Object *obj,
-                          void (*scroll_up_cb)(Evas_Object *obj,
-                                            void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_up_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_up_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.scroll_up = scroll_up_cb;
 }
 
-static void
-_elm_scroll_scroll_down_cb_set(Evas_Object *obj,
-                          void (*scroll_down_cb)(Evas_Object *obj,
-                                            void *data))
+EOLIAN static void
+_elm_interface_scrollable_scroll_down_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb scroll_down_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.scroll_down = scroll_down_cb;
 }
 
-static void
-_elm_scroll_edge_left_cb_set(Evas_Object *obj,
-                             void (*edge_left_cb)(Evas_Object *obj,
-                                                  void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_left_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_left_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->cb_func.edge_left = edge_left_cb;
+   sid->cb_func.edge_left = edje_left_cb;
 }
 
-static void
-_elm_scroll_edge_right_cb_set(Evas_Object *obj,
-                              void (*edge_right_cb)(Evas_Object *obj,
-                                                    void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_right_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_right_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->cb_func.edge_right = edge_right_cb;
+   sid->cb_func.edge_right = edje_right_cb;
 }
 
-static void
-_elm_scroll_edge_top_cb_set(Evas_Object *obj,
-                            void (*edge_top_cb)(Evas_Object *obj,
-                                                void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_top_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_top_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->cb_func.edge_top = edge_top_cb;
+   sid->cb_func.edge_top = edje_top_cb;
 }
 
-static void
-_elm_scroll_edge_bottom_cb_set(Evas_Object *obj,
-                               void (*edge_bottom_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_edge_bottom_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb edje_bottom_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->cb_func.edge_bottom = edge_bottom_cb;
+   sid->cb_func.edge_bottom = edje_bottom_cb;
 }
 
-static void
-_elm_scroll_vbar_drag_cb_set(Evas_Object *obj,
-                               void (*vbar_drag_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_vbar_drag_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb vbar_drag_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.vbar_drag = vbar_drag_cb;
 }
 
-static void
-_elm_scroll_vbar_press_cb_set(Evas_Object *obj,
-                               void (*vbar_press_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_vbar_press_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb vbar_press_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.vbar_press = vbar_press_cb;
 }
 
-static void
-_elm_scroll_vbar_unpress_cb_set(Evas_Object *obj,
-                               void (*vbar_unpress_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_vbar_unpress_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb vbar_unpress_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.vbar_unpress = vbar_unpress_cb;
 }
 
-static void
-_elm_scroll_hbar_drag_cb_set(Evas_Object *obj,
-                               void (*hbar_drag_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_hbar_drag_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb hbar_drag_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.hbar_drag = hbar_drag_cb;
 }
 
-static void
-_elm_scroll_hbar_press_cb_set(Evas_Object *obj,
-                               void (*hbar_press_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_hbar_press_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb hbar_press_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.hbar_press = hbar_press_cb;
 }
 
-static void
-_elm_scroll_hbar_unpress_cb_set(Evas_Object *obj,
-                               void (*hbar_unpress_cb)(Evas_Object *obj,
-                                                      void *data))
+EOLIAN static void
+_elm_interface_scrollable_hbar_unpress_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Cb hbar_unpress_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->cb_func.hbar_unpress = hbar_unpress_cb;
 }
 
-static void
-_elm_scroll_content_min_limit_cb_set(Evas_Object *obj,
-                                     void (*c_min_limit_cb)(Evas_Object *obj,
-                                                            Eina_Bool w,
-                                                            Eina_Bool h))
+EOLIAN static void
+_elm_interface_scrollable_content_min_limit_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Min_Limit_Cb min_limit_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->cb_func.content_min_limit = c_min_limit_cb;
+   sid->cb_func.content_min_limit = min_limit_cb;
 }
 
-static void
-_elm_scroll_content_viewport_resize_cb_set(Evas_Object *obj,
-                                 void (*c_viewport_resize_cb)(Evas_Object *obj,
-                                                              Evas_Coord w,
-                                                              Evas_Coord h))
+EOLIAN static void
+_elm_interface_scrollable_content_viewport_resize_cb_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Interface_Scrollable_Resize_Cb viewport_resize_cb)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->cb_func.content_viewport_resize = c_viewport_resize_cb;
+   sid->cb_func.content_viewport_resize = viewport_resize_cb;
 }
 
-static Eina_Bool
-_elm_scroll_momentum_animator_disabled_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_momentum_animator_disabled_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
    return sid->momentum_animator_disabled;
 }
 
-static void
-_elm_scroll_momentum_animator_disabled_set(Evas_Object *obj,
-                                           Eina_Bool disabled)
+EOLIAN static void
+_elm_interface_scrollable_momentum_animator_disabled_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool disabled)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->momentum_animator_disabled = disabled;
    if (sid->momentum_animator_disabled)
      {
         if (sid->down.momentum_animator)
           {
-             ecore_animator_del(sid->down.momentum_animator);
-             sid->down.momentum_animator = NULL;
+             ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del);
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
           }
      }
 }
 
-static Eina_Bool
-_elm_scroll_bounce_animator_disabled_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_bounce_animator_disabled_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
    return sid->bounce_animator_disabled;
 }
 
-static void
-_elm_scroll_bounce_animator_disabled_set(Evas_Object *obj,
-                                         Eina_Bool disabled)
+EOLIAN static void
+_elm_interface_scrollable_bounce_animator_disabled_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool disabled)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->bounce_animator_disabled = disabled;
    if (sid->bounce_animator_disabled)
      {
-        if (sid->scrollto.x.animator)
-          {
-             ecore_animator_del(sid->scrollto.x.animator);
-             sid->scrollto.x.animator = NULL;
-          }
-
-        if (sid->scrollto.y.animator)
-          {
-             ecore_animator_del(sid->scrollto.y.animator);
-             sid->scrollto.y.animator = NULL;
-          }
+        ELM_SAFE_FREE(sid->scrollto.x.animator, ecore_animator_del);
+        ELM_SAFE_FREE(sid->scrollto.y.animator, ecore_animator_del);
      }
 }
 
-static Eina_Bool
-_elm_scroll_wheel_disabled_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_wheel_disabled_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
    return sid->wheel_disabled;
 }
 
-static void
-_elm_scroll_wheel_disabled_set(Evas_Object *obj,
-                               Eina_Bool disabled)
+EOLIAN static void
+_elm_interface_scrollable_wheel_disabled_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool disabled)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->event_rect) return;
 
    if ((!sid->wheel_disabled) && (disabled))
@@ -4926,30 +4289,9 @@ _elm_scroll_wheel_disabled_set(Evas_Object *obj,
    sid->wheel_disabled = disabled;
 }
 
-static void
-_elm_scroll_movement_block_set(Evas_Object *obj,
-                               Elm_Scroller_Movement_Block block)
-{
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   sid->block = block;
-}
-
-static Elm_Scroller_Movement_Block
-_elm_scroll_movement_block_get(const Evas_Object *obj)
-{
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, ELM_SCROLLER_MOVEMENT_NO_BLOCK);
-
-   return sid->block;
-}
-
-static void
-_elm_scroll_step_size_set(Evas_Object *obj,
-                          Evas_Coord x,
-                          Evas_Coord y)
+EOLIAN static void
+_elm_interface_scrollable_step_size_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (x < 1) x = 1;
    if (y < 1) y = 1;
    sid->step.x = x;
@@ -4958,48 +4300,32 @@ _elm_scroll_step_size_set(Evas_Object *obj,
    _elm_scroll_scroll_bar_size_adjust(sid);
 }
 
-static void
-_elm_scroll_step_size_get(const Evas_Object *obj,
-                          Evas_Coord *x,
-                          Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_step_size_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (x) *x = sid->step.x;
    if (y) *y = sid->step.y;
 }
 
-static void
-_elm_scroll_page_size_set(Evas_Object *obj,
-                          Evas_Coord x,
-                          Evas_Coord y)
+EOLIAN static void
+_elm_interface_scrollable_page_size_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->page.x = x;
    sid->page.y = y;
 
    _elm_scroll_scroll_bar_size_adjust(sid);
 }
 
-static void
-_elm_scroll_page_size_get(const Evas_Object *obj,
-                          Evas_Coord *x,
-                          Evas_Coord *y)
+EOLIAN static void
+_elm_interface_scrollable_page_size_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord *x, Evas_Coord *y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (x) *x = sid->page.x;
    if (y) *y = sid->page.y;
 }
 
-static void
-_elm_scroll_policy_set(Evas_Object *obj,
-                       Elm_Scroller_Policy hbar,
-                       Elm_Scroller_Policy vbar)
+EOLIAN static void
+_elm_interface_scrollable_policy_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Policy hbar, Elm_Scroller_Policy vbar)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->edje_obj) return;
 
    if ((sid->hbar_flags == hbar) && (sid->vbar_flags == vbar)) return;
@@ -5012,165 +4338,145 @@ _elm_scroll_policy_set(Evas_Object *obj,
    _elm_direction_arrows_eval(sid);
 }
 
-static void
-_elm_scroll_policy_get(const Evas_Object *obj,
-                       Elm_Scroller_Policy *hbar,
-                       Elm_Scroller_Policy *vbar)
+EOLIAN static void
+_elm_interface_scrollable_policy_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Policy *hbar, Elm_Scroller_Policy *vbar)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (hbar) *hbar = sid->hbar_flags;
    if (vbar) *vbar = sid->vbar_flags;
 }
 
-static void
-_elm_scroll_single_direction_set(Evas_Object *obj,
-                                 Elm_Scroller_Single_Direction single_dir)
+EOLIAN static void
+_elm_interface_scrollable_single_direction_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Single_Direction single_dir)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->one_direction_at_a_time = single_dir;
 }
 
-static Elm_Scroller_Single_Direction
-_elm_scroll_single_direction_get(const Evas_Object *obj)
+EOLIAN static Elm_Scroller_Single_Direction
+_elm_interface_scrollable_single_direction_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, ELM_SCROLLER_SINGLE_DIRECTION_SOFT);
-
    return sid->one_direction_at_a_time;
 }
 
-static void
-_elm_scroll_repeat_events_set(Evas_Object *obj,
-                                 Eina_Bool repeat_events)
+EOLIAN static void
+_elm_interface_scrollable_repeat_events_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool repeat_events)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   evas_object_repeat_events_set(sid->event_rect, repeat_events);
+   if (sid->event_rect)
+     evas_object_repeat_events_set(sid->event_rect, repeat_events);
 }
 
-static Eina_Bool
-_elm_scroll_repeat_events_get(const Evas_Object *obj)
+EOLIAN static Eina_Bool
+_elm_interface_scrollable_repeat_events_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
-   return evas_object_repeat_events_get(sid->event_rect);
+   if (sid->event_rect)
+     return evas_object_repeat_events_get(sid->event_rect);
+   else
+     return EINA_TRUE;
 }
 
-static void
-_elm_scroll_hold_set(Evas_Object *obj,
-                     Eina_Bool hold)
+EOLIAN static void
+_elm_interface_scrollable_hold_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool hold)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->hold = hold;
 }
 
-static void
-_elm_scroll_freeze_set(Evas_Object *obj,
-                       Eina_Bool freeze)
+EOLIAN static void
+_elm_interface_scrollable_freeze_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool freeze)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->freeze = freeze;
    if (sid->freeze)
      {
         if (sid->down.onhold_animator)
           {
-             ecore_animator_del(sid->down.onhold_animator);
-             sid->down.onhold_animator = NULL;
+             ELM_SAFE_FREE(sid->down.onhold_animator, ecore_animator_del);
              if (sid->content_info.resized)
-               _elm_scroll_wanted_region_set(sid->obj);
+               //TIZEN_ONLY(20150825) : Use the specific wanted_region_set func only for gengrid.
+               //_elm_scroll_wanted_region_set(sid->obj);
+               eo_do(sid->obj, elm_interface_scrollable_wanted_region_set(sid->wx, sid->wy));
+               //
           }
      }
    else
      _elm_scroll_bounce_eval(sid);
 }
 
-static void
-_elm_scroll_bounce_allow_set(Evas_Object *obj,
-                             Eina_Bool horiz,
-                             Eina_Bool vert)
+EOLIAN static void
+_elm_interface_scrollable_page_snap_allow_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool horiz, Eina_Bool vert)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+   sid->page_snap_horiz = !!horiz;
+   sid->page_snap_vert = !!vert;
+}
 
+EOLIAN static void
+_elm_interface_scrollable_page_snap_allow_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *horiz, Eina_Bool *vert)
+{
+   if (horiz) *horiz = sid->page_snap_horiz;
+   if (vert) *vert = sid->page_snap_vert;
+}
+
+EOLIAN static void
+_elm_interface_scrollable_bounce_allow_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool horiz, Eina_Bool vert)
+{
    sid->bounce_horiz = !!horiz;
    sid->bounce_vert = !!vert;
 }
 
-static void
-_elm_scroll_bounce_allow_get(const Evas_Object *obj,
-                             Eina_Bool *horiz,
-                             Eina_Bool *vert)
+EOLIAN static void
+_elm_interface_scrollable_bounce_allow_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *horiz, Eina_Bool *vert)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (horiz) *horiz = sid->bounce_horiz;
    if (vert) *vert = sid->bounce_vert;
 }
 
-static void
-_elm_scroll_paging_set(Evas_Object *obj,
-                       double pagerel_h,
-                       double pagerel_v,
-                       Evas_Coord pagesize_h,
-                       Evas_Coord pagesize_v)
+EOLIAN static void
+_elm_interface_scrollable_paging_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double pagerel_h, double pagerel_v, Evas_Coord pagesize_h, Evas_Coord pagesize_v)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->pagerel_h = pagerel_h;
    sid->pagerel_v = pagerel_v;
    sid->pagesize_h = pagesize_h;
    sid->pagesize_v = pagesize_v;
+
+   _elm_scroll_page_adjust(sid);
 }
 
-static void
-_elm_scroll_paging_get(const Evas_Object *obj,
-                       double *pagerel_h,
-                       double *pagerel_v,
-                       Evas_Coord *pagesize_h,
-                       Evas_Coord *pagesize_v)
+EOLIAN static void
+_elm_interface_scrollable_paging_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double *pagerel_h, double *pagerel_v, Evas_Coord *pagesize_h, Evas_Coord *pagesize_v)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (pagerel_h) *pagerel_h = sid->pagerel_h;
    if (pagerel_v) *pagerel_v = sid->pagerel_v;
    if (pagesize_h) *pagesize_h = sid->pagesize_h;
    if (pagesize_v) *pagesize_v = sid->pagesize_v;
 }
 
-static void
-_elm_scroll_page_scroll_limit_set(const Evas_Object *obj,
-                                  int page_limit_h,
-                                  int page_limit_v)
+EOLIAN static void
+_elm_interface_scrollable_page_relative_set(Eo *obj, Elm_Scrollable_Smart_Interface_Data *_pd EINA_UNUSED, double h_pagerel, double v_pagerel)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+   Evas_Coord pagesize_h, pagesize_v;
 
+   eo_do(obj, elm_interface_scrollable_paging_get(NULL, NULL, &pagesize_h, &pagesize_v));
+
+   eo_do(obj, elm_interface_scrollable_paging_set(h_pagerel, v_pagerel, pagesize_h, pagesize_v));
+}
+
+EOLIAN static void
+_elm_interface_scrollable_page_scroll_limit_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int page_limit_h, int page_limit_v)
+{
    sid->page_limit_h = page_limit_h;
    sid->page_limit_v = page_limit_v;
 }
 
-static void
-_elm_scroll_page_scroll_limit_get(const Evas_Object *obj,
-                                  int *page_limit_h,
-                                  int *page_limit_v)
+EOLIAN static void
+_elm_interface_scrollable_page_scroll_limit_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int *page_limit_h, int *page_limit_v)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (page_limit_h) *page_limit_h = sid->page_limit_h;
    if (page_limit_v) *page_limit_v = sid->page_limit_v;
 }
 
-static void
-_elm_scroll_current_page_get(const Evas_Object *obj,
-                             int *pagenumber_h,
-                             int *pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_current_page_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int *pagenumber_h, int *pagenumber_v)
 {
    Evas_Coord x, y;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
-   _elm_scroll_content_pos_get(sid->obj, &x, &y);
+   eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&x, &y));
    if (pagenumber_h)
      {
         if (sid->pagesize_h > 0)
@@ -5201,114 +4507,90 @@ _elm_scroll_current_page_get(const Evas_Object *obj,
      }
 }
 
-static void
-_elm_scroll_last_page_get(const Evas_Object *obj,
-                          int *pagenumber_h,
-                          int *pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_last_page_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, int *pagenumber_h, int *pagenumber_v)
 {
    Evas_Coord cw, ch;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->content_size_get(sid->pan_obj, &cw, &ch);
+   eo_do(sid->pan_obj, elm_obj_pan_content_size_get(&cw, &ch));
    if (pagenumber_h)
      {
-        if (sid->pagesize_h > 0)
+        if ((sid->pagesize_h > 0) && (cw > sid->pagesize_h))
           *pagenumber_h = cw / sid->pagesize_h - 1;
         else
           *pagenumber_h = 0;
      }
    if (pagenumber_v)
      {
-        if (sid->pagesize_v > 0)
+        if ((sid->pagesize_v > 0) && (ch > sid->pagesize_v))
           *pagenumber_v = ch / sid->pagesize_v - 1;
         else
           *pagenumber_v = 0;
      }
 }
 
-static void
-_elm_scroll_page_show(Evas_Object *obj,
-                      int pagenumber_h,
-                      int pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_page_show(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, int pagenumber_h, int pagenumber_v)
 {
-   Evas_Coord w, h, cw = 0, ch = 0;
+   Evas_Coord w = 0, h = 0;
    Evas_Coord x = 0;
    Evas_Coord y = 0;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-   if (sid->pan_obj)
-     {
-        ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-        psd->api->content_size_get(sid->pan_obj, &cw, &ch);
-     }
-
    sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
    sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
 
-   _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
-   if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
-   if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
-
-   if (sid->origin_x && cw > 0)
-     {
-        sid->wx = cw - x;
-        if (sid->wx < 0) sid->wx = 0;
-     }
-   else
-     sid->wx = x;
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &w, &h));
+   x = sid->pagesize_h * pagenumber_h;
+   y = sid->pagesize_v * pagenumber_v;
 
-   if (sid->origin_y && ch > 0)
-     {
-        sid->wy = ch - y;
-        if (sid->wy < 0) sid->wy = 0;
-     }
-   else
-     sid->wy = y;
+   sid->wx = (sid->is_mirrored ? _elm_scroll_x_mirrored_get(sid->obj, x) : x);
+   sid->wy = y;
    sid->ww = w;
    sid->wh = h;
 
    if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
-     _elm_scroll_content_pos_set(obj, x, y, EINA_TRUE);
+     eo_do(obj, elm_interface_scrollable_content_pos_set(x, y, EINA_TRUE));
+
+   if ((sid->current_page.x != x) || (sid->current_page.y != y))
+     {
+        if (sid->cb_func.page_change)
+          sid->cb_func.page_change(sid->obj, NULL);
+     }
 }
 
-static void
-_elm_scroll_page_bring_in(Evas_Object *obj,
-                          int pagenumber_h,
-                          int pagenumber_v)
+EOLIAN static void
+_elm_interface_scrollable_page_bring_in(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, int pagenumber_h, int pagenumber_v)
 {
-   Evas_Coord w, h;
+   Evas_Coord w = 0, h = 0;
    Evas_Coord x = 0;
    Evas_Coord y = 0;
 
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    sid->current_page.x = _elm_scroll_page_x_get(sid, 0, EINA_FALSE);
    sid->current_page.y = _elm_scroll_page_y_get(sid, 0, EINA_FALSE);
 
-   _elm_scroll_content_viewport_size_get(sid->obj, &w, &h);
-   if (pagenumber_h >= 0) x = sid->pagesize_h * pagenumber_h;
-   if (pagenumber_v >= 0) y = sid->pagesize_v * pagenumber_v;
+   eo_do(sid->obj, elm_interface_scrollable_content_viewport_geometry_get
+         (NULL, NULL, &w, &h));
+   x = sid->pagesize_h * pagenumber_h;
+   y = sid->pagesize_v * pagenumber_v;
    if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
      {
         _elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
         _elm_scroll_scroll_to_y(sid, _elm_config->bring_in_scroll_friction, y);
      }
+
+   if ((sid->current_page.x != x) || (sid->current_page.y != y))
+     {
+        if (sid->cb_func.page_change)
+          sid->cb_func.page_change(sid->obj, NULL);
+     }
 }
 
-static void
-_elm_scroll_region_bring_in(Evas_Object *obj,
-                            Evas_Coord x,
-                            Evas_Coord y,
-                            Evas_Coord w,
-                            Evas_Coord h)
+EOLIAN static void
+_elm_interface_scrollable_region_bring_in(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (_elm_scroll_content_region_show_internal(obj, &x, &y, w, h))
      {
         _elm_scroll_scroll_to_x(sid, _elm_config->bring_in_scroll_friction, x);
@@ -5316,67 +4598,53 @@ _elm_scroll_region_bring_in(Evas_Object *obj,
      }
 }
 
-static void
-_elm_scroll_gravity_set(Evas_Object *obj,
-                        double x,
-                        double y)
+EOLIAN static void
+_elm_interface_scrollable_gravity_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double x, double y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->gravity_set(sid->pan_obj, x, y);
+   eo_do(sid->pan_obj, elm_obj_pan_gravity_set(x, y));
 }
 
-static void
-_elm_scroll_gravity_get(const Evas_Object *obj,
-                        double *x,
-                        double *y)
+EOLIAN static void
+_elm_interface_scrollable_gravity_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, double *x, double *y)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    if (!sid->pan_obj) return;
 
-   ELM_PAN_DATA_GET_OR_RETURN(sid->pan_obj, psd);
-
-   psd->api->gravity_get(sid->pan_obj, x, y);
+   eo_do(sid->pan_obj, elm_obj_pan_gravity_get(x, y));
 }
 
+EOLIAN static void
+_elm_interface_scrollable_movement_block_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Elm_Scroller_Movement_Block block)
+{
+   sid->block = block;
+}
 
-static void
-_elm_scroll_loop_set(Evas_Object *obj,
-                              Eina_Bool loop_h,
-                              Eina_Bool loop_v)
+EOLIAN static Elm_Scroller_Movement_Block
+_elm_interface_scrollable_movement_block_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
+   return sid->block;
+}
 
-   if (sid->loop_h == loop_h &&
-       sid->loop_v == loop_v)
-     return;
+EOLIAN static void
+_elm_interface_scrollable_loop_set(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool loop_h, Eina_Bool loop_v)
+{
+   if (sid->loop_h == loop_h && sid->loop_v == loop_v) return;
 
    sid->loop_h = loop_h;
    sid->loop_v = loop_v;
 }
 
-static void
-_elm_scroll_loop_get(const Evas_Object *obj,
-                              Eina_Bool *loop_h,
-                              Eina_Bool *loop_v)
+EOLIAN static void
+_elm_interface_scrollable_loop_get(Eo *obj EINA_UNUSED, Elm_Scrollable_Smart_Interface_Data *sid, Eina_Bool *loop_h, Eina_Bool *loop_v)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
-
    *loop_h = sid->loop_h;
    *loop_v = sid->loop_v;
 }
 
-
-static Eina_Bool
-_elm_scroll_interface_add(Evas_Object *obj)
+EOLIAN static void
+_elm_interface_scrollable_evas_object_smart_add(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN_VAL(obj, sid, EINA_FALSE);
-
    memset(sid, 0, sizeof(*sid));
 
    sid->obj = obj;
@@ -5397,8 +4665,6 @@ _elm_scroll_interface_add(Evas_Object *obj)
    sid->vbar_visible = EINA_TRUE;
    sid->loop_h = EINA_FALSE;
    sid->loop_v = EINA_FALSE;
-   sid->origin_x = EINA_FALSE;
-   sid->origin_y = EINA_FALSE;
 
    sid->bounce_horiz = EINA_TRUE;
    sid->bounce_vert = EINA_TRUE;
@@ -5410,110 +4676,39 @@ _elm_scroll_interface_add(Evas_Object *obj)
 
    _elm_scroll_scroll_bar_reset(sid);
 
-   return EINA_TRUE;
+   eo_do_super(obj, MY_SCROLLABLE_INTERFACE, evas_obj_smart_add());
 }
 
-static void
-_elm_scroll_interface_del(Evas_Object *obj)
+EOLIAN static void
+_elm_interface_scrollable_evas_object_smart_del(Eo *obj, Elm_Scrollable_Smart_Interface_Data *sid)
 {
-   ELM_SCROLL_IFACE_DATA_GET_OR_RETURN(obj, sid);
 
-   _elm_scroll_content_set(obj, NULL);
+   eo_do_super(obj, MY_SCROLLABLE_INTERFACE, evas_obj_smart_del());
+
+   eo_do(obj, elm_interface_scrollable_content_set(NULL));
    if (!sid->extern_pan) evas_object_del(sid->pan_obj);
 
-   if (sid->down.hold_animator)
-     ecore_animator_del(sid->down.hold_animator);
-   if (sid->down.onhold_animator)
-     ecore_animator_del(sid->down.onhold_animator);
-   if (sid->down.momentum_animator)
-     ecore_animator_del(sid->down.momentum_animator);
-   if (sid->down.bounce_x_animator)
-     ecore_animator_del(sid->down.bounce_x_animator);
-   if (sid->down.bounce_y_animator)
-     ecore_animator_del(sid->down.bounce_y_animator);
-   if (sid->scrollto.x.animator) ecore_animator_del(sid->scrollto.x.animator);
-   if (sid->scrollto.y.animator) ecore_animator_del(sid->scrollto.y.animator);
-}
-
-EAPI const char ELM_SCROLLABLE_IFACE_NAME[] = "elm_interface_scrollable";
-
-EAPI const Elm_Scrollable_Smart_Interface ELM_SCROLLABLE_IFACE =
-{
-   {
-      ELM_SCROLLABLE_IFACE_NAME,
-      sizeof(Elm_Scrollable_Smart_Interface_Data),
-      _elm_scroll_interface_add,
-      _elm_scroll_interface_del
-   },
-
-   _elm_scroll_objects_set,
-   _elm_scroll_content_set,
-   _elm_scroll_extern_pan_set,
-   _elm_scroll_drag_start_cb_set,
-   _elm_scroll_drag_stop_cb_set,
-   _elm_scroll_animate_start_cb_set,
-   _elm_scroll_animate_stop_cb_set,
-   _elm_scroll_scroll_cb_set,
-   _elm_scroll_scroll_left_cb_set,
-   _elm_scroll_scroll_right_cb_set,
-   _elm_scroll_scroll_up_cb_set,
-   _elm_scroll_scroll_down_cb_set,
-   _elm_scroll_edge_left_cb_set,
-   _elm_scroll_edge_right_cb_set,
-   _elm_scroll_edge_top_cb_set,
-   _elm_scroll_edge_bottom_cb_set,
-   _elm_scroll_vbar_drag_cb_set,
-   _elm_scroll_vbar_press_cb_set,
-   _elm_scroll_vbar_unpress_cb_set,
-   _elm_scroll_hbar_drag_cb_set,
-   _elm_scroll_hbar_press_cb_set,
-   _elm_scroll_hbar_unpress_cb_set,
-   _elm_scroll_content_min_limit_cb_set,
-   _elm_scroll_content_viewport_resize_cb_set,
-   _elm_scroll_content_pos_set,
-   _elm_scroll_content_pos_get,
-   _elm_scroll_content_region_show,
-   _elm_scroll_content_region_set,
-   _elm_scroll_content_size_get,
-   _elm_scroll_content_viewport_size_get,
-   _elm_scroll_content_viewport_pos_get,
-   _elm_scroll_content_min_limit,
-   _elm_scroll_step_size_set,
-   _elm_scroll_step_size_get,
-   _elm_scroll_page_size_set,
-   _elm_scroll_page_size_get,
-   _elm_scroll_policy_set,
-   _elm_scroll_policy_get,
-   _elm_scroll_single_direction_set,
-   _elm_scroll_single_direction_get,
-   _elm_scroll_repeat_events_set,
-   _elm_scroll_repeat_events_get,
-   _elm_scroll_mirrored_set,
-   _elm_scroll_hold_set,
-   _elm_scroll_freeze_set,
-   _elm_scroll_bounce_allow_set,
-   _elm_scroll_bounce_allow_get,
-   _elm_scroll_origin_reverse_set,
-   _elm_scroll_origin_reverse_get,
-   _elm_scroll_paging_set,
-   _elm_scroll_paging_get,
-   _elm_scroll_page_scroll_limit_set,
-   _elm_scroll_page_scroll_limit_get,
-   _elm_scroll_current_page_get,
-   _elm_scroll_last_page_get,
-   _elm_scroll_page_show,
-   _elm_scroll_page_bring_in,
-   _elm_scroll_region_bring_in,
-   _elm_scroll_gravity_set,
-   _elm_scroll_gravity_get,
-   _elm_scroll_loop_set,
-   _elm_scroll_loop_get,
-   _elm_scroll_momentum_animator_disabled_get,
-   _elm_scroll_momentum_animator_disabled_set,
-   _elm_scroll_bounce_animator_disabled_set,
-   _elm_scroll_bounce_animator_disabled_get,
-   _elm_scroll_wheel_disabled_get,
-   _elm_scroll_wheel_disabled_set,
-   _elm_scroll_movement_block_set,
-   _elm_scroll_movement_block_get
-};
+   ecore_idle_enterer_del(sid->down.hold_enterer);
+   ecore_animator_del(sid->down.hold_animator);
+   ecore_animator_del(sid->down.onhold_animator);
+   ecore_animator_del(sid->down.momentum_animator);
+   ecore_animator_del(sid->down.bounce_x_animator);
+   ecore_animator_del(sid->down.bounce_y_animator);
+   ecore_animator_del(sid->scrollto.x.animator);
+   ecore_animator_del(sid->scrollto.y.animator);
+}
+
+EOLIAN static void
+_elm_interface_scrollable_eo_base_constructor(Eo *obj, Elm_Scrollable_Smart_Interface_Data *class_data EINA_UNUSED)
+{
+   eo_do_super(obj, MY_SCROLLABLE_INTERFACE, eo_constructor());
+}
+
+EOLIAN static void
+_elm_interface_scrollable_class_constructor(Eo_Class *klass)
+{
+   evas_smart_legacy_type_register(MY_SCROLLABLE_INTERFACE_NAME_LEGACY, klass);
+}
+
+#include "elm_interface_scrollable.eo.c"
+#include "elm_pan.eo.c"