Index: src/lib/elm_slider.c
===================================================================
--- src/lib/elm_slider.c	(revision 71264)
+++ src/lib/elm_slider.c	(working copy)
@@ -5,7 +5,20 @@
 static const char SLIDER_SMART_NAME[] = "elm_slider";
 
 typedef struct _Elm_Slider_Smart_Data Elm_Slider_Smart_Data;
+typedef struct _Slider_Mod_Api Slider_Mod_Api;
 
+struct _Slider_Mod_Api
+{
+   void *(*obj_hook) (Evas_Object *obj);
+   void (*obj_unhook) (void *module_data);
+   void (*obj_theme_hook)(void *module_data);
+   void (*indicator_show)(void *module_data, Evas_Coord x_offset, Evas_Coord y_offset);
+   void (*indicator_hide)(void *module_data);
+   void (*indicator_text_set)(void *module_data, const char *str);
+   void (*indicator_horizontal_set)(void *module_data, Eina_Bool horizontal);
+   void (*indicator_size_hint_set)(void *module_data, Evas_Coord width, Evas_Coord height);
+};
+
 struct _Elm_Slider_Smart_Data
 {
    Elm_Layout_Smart_Data base;
@@ -13,6 +26,7 @@ struct _Elm_Slider_Smart_Data
    Evas_Object          *spacer;
    Ecore_Timer          *delay;
 
+   void                 *mod_data;
    const char           *units;
    const char           *indicator;
 
@@ -58,6 +72,29 @@ static const Evas_Smart_Cb_Description _smart_call
    {NULL, NULL}
 };
 
+static Slider_Mod_Api *slider_mod = NULL;
+
+static Slider_Mod_Api *
+_slider_mod_init()
+{
+   Elm_Module *mod = NULL;
+   if (!(mod = _elm_module_find_as("slider/api"))) return NULL;
+
+   mod->api = malloc(sizeof(Slider_Mod_Api));
+   if (!mod->api) return NULL;
+
+   ((Slider_Mod_Api *)(mod->api))->obj_hook           =   _elm_module_symbol_get(mod, "obj_hook");
+   ((Slider_Mod_Api *)(mod->api))->obj_unhook         =   _elm_module_symbol_get(mod, "obj_unhook");
+   ((Slider_Mod_Api *)(mod->api))->obj_theme_hook     =   _elm_module_symbol_get(mod, "obj_theme_hook");
+   ((Slider_Mod_Api *)(mod->api))->indicator_show     =   _elm_module_symbol_get(mod, "indicator_show");
+   ((Slider_Mod_Api *)(mod->api))->indicator_hide     =   _elm_module_symbol_get(mod, "indicator_hide");
+   ((Slider_Mod_Api *)(mod->api))->indicator_text_set =   _elm_module_symbol_get(mod, "indicator_text_set");
+   ((Slider_Mod_Api *)(mod->api))->indicator_horizontal_set =   _elm_module_symbol_get(mod, "indicator_horizontal_set");
+   ((Slider_Mod_Api *)(mod->api))->indicator_size_hint_set  =   _elm_module_symbol_get(mod, "indicator_size_hint_set");
+
+   return mod->api;
+}
+
 #define ELM_SLIDER_DATA_GET(o, sd) \
   Elm_Slider_Smart_Data * sd = evas_object_smart_data_get(o)
 
@@ -182,25 +219,24 @@ _units_set(Evas_Object *obj)
 static void
 _indicator_set(Evas_Object *obj)
 {
+   char *buf = NULL;
+
    ELM_SLIDER_DATA_GET(obj, sd);
 
    if (sd->indicator_format_func)
+     buf = sd->indicator_format_func(sd->val);
+   else if (sd->indicator)
      {
-        char *buf;
+        buf = alloca(128);
+        snprintf(buf, 128, sd->indicator, sd->val);
+     }
+   elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf);
 
-        buf = sd->indicator_format_func(sd->val);
-        elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf);
+   if ( sd->indicator_show && slider_mod && slider_mod->indicator_text_set)
+     slider_mod->indicator_text_set(sd->mod_data, buf);
 
-        if (sd->indicator_format_free) sd->indicator_format_free(buf);
-     }
-   else if (sd->indicator)
-     {
-        char buf[1024];
-
-        snprintf(buf, sizeof(buf), sd->indicator, sd->val);
-        elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", buf);
-     }
-   else elm_layout_text_set(obj, "elm.dragable.slider:elm.indicator", NULL);
+   if (sd->indicator_format_free && sd->indicator_format_func)
+     sd->indicator_format_free(buf);
 }
 
 static void
@@ -217,7 +253,15 @@ _drag(void *data,
       const char *emission __UNUSED__,
       const char *source __UNUSED__)
 {
+   Evas_Coord x, y;
+   ELM_SLIDER_DATA_GET(obj, sd);
+
    _slider_update(data);
+   if ((sd->indicator_show) && (slider_mod) && (slider_mod->indicator_show))
+     {
+        edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &x, &y, NULL, NULL);
+        slider_mod->indicator_show(sd->mod_data, x, y);
+     }
 }
 
 static void
@@ -226,7 +270,17 @@ _drag_start(void *data,
             const char *emission __UNUSED__,
             const char *source __UNUSED__)
 {
+   Evas_Coord x, y;
+   ELM_SLIDER_DATA_GET(obj, sd);
+
    _slider_update(data);
+   if ((sd->indicator_show) && (slider_mod) && (slider_mod->indicator_show))
+     {
+        edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &x, &y, NULL, NULL);
+        slider_mod->indicator_show(sd->mod_data, x, y);
+     }
+   else
+     elm_layout_signal_emit(data, "elm,state,indicator,show", "elm");
    evas_object_smart_callback_call(data, SIG_DRAG_START, NULL);
    elm_widget_scroll_freeze_push(data);
 }
@@ -237,7 +291,13 @@ _drag_stop(void *data,
            const char *emission __UNUSED__,
            const char *source __UNUSED__)
 {
+   ELM_SLIDER_DATA_GET(obj, sd);
+
    _slider_update(data);
+   if ((slider_mod) && (slider_mod->indicator_hide))
+     slider_mod->indicator_hide(sd->mod_data);
+   else
+     elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
    evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
    elm_widget_scroll_freeze_pop(data);
 }
@@ -372,6 +432,8 @@ _visuals_refresh(Evas_Object *obj)
 static Eina_Bool
 _elm_slider_smart_theme(Evas_Object *obj)
 {
+   Evas_Coord w, h;
+
    ELM_SLIDER_DATA_GET(obj, sd);
 
    if (sd->horizontal)
@@ -398,6 +460,15 @@ _elm_slider_smart_theme(Evas_Object *obj)
 
    _visuals_refresh(obj);
 
+   if ((slider_mod) && (slider_mod->obj_theme_hook))
+     slider_mod->obj_theme_hook(sd->mod_data); // module - theme change cb
+
+   if ((slider_mod) && (slider_mod->indicator_size_hint_set))
+     {
+        edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", NULL, NULL, &w, &h);
+        slider_mod->indicator_size_hint_set(sd->mod_data, w, h);
+     }
+
    edje_object_message_signal_process(ELM_WIDGET_DATA(sd)->resize_obj);
 
    elm_layout_sizing_eval(obj);
@@ -418,6 +489,8 @@ _elm_slider_smart_sizing_eval(Evas_Object *obj)
    elm_coords_finger_size_adjust(1, &minw, 1, &minh);
    evas_object_size_hint_min_set(obj, minw, minh);
    evas_object_size_hint_max_set(obj, maxw, maxh);
+   if ((slider_mod) && (slider_mod->indicator_hide))
+     slider_mod->indicator_hide(sd->mod_data);
 }
 
 static void
@@ -455,7 +528,14 @@ _spacer_down_cb(void *data,
      button_x, button_y);
    _slider_update(data);
    evas_object_smart_callback_call(data, SIG_DRAG_START, NULL);
-   elm_layout_signal_emit(data, "elm,state,indicator,show", "elm");
+
+   if ((sd->indicator_show) && (slider_mod) && (slider_mod->indicator_show))
+     {
+        edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &x, &y, NULL, NULL);
+        slider_mod->indicator_show(sd->mod_data, x, y);
+     }
+   else
+     elm_layout_signal_emit(data, "elm,state,indicator,show", "elm");
 }
 
 static void
@@ -497,7 +577,10 @@ _spacer_move_cb(void *data,
                   elm_widget_scroll_freeze_pop(data);
                   sd->frozen = EINA_FALSE;
                }
-             elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
+             if ((slider_mod) && (slider_mod->indicator_hide))
+               slider_mod->indicator_hide(sd->mod_data);
+             else
+               elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
              elm_slider_value_set(data, sd->val2);
              return;
           }
@@ -519,6 +602,12 @@ _spacer_move_cb(void *data,
           button_x, button_y);
 
         _slider_update(data);
+
+        if ((sd->indicator_show) && (slider_mod) && (slider_mod->indicator_show))
+          {
+             edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", &x, &y, NULL, NULL);
+             slider_mod->indicator_show(sd->mod_data, x, y);
+          }
      }
 }
 
@@ -534,6 +623,10 @@ _spacer_up_cb(void *data,
    if (sd->spacer_down) sd->spacer_down = EINA_FALSE;
 
    _slider_update(data);
+   if ((slider_mod) && (slider_mod->indicator_hide))
+     slider_mod->indicator_hide(sd->mod_data);
+   else
+     elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
    evas_object_smart_callback_call(data, SIG_DRAG_STOP, NULL);
 
    if (sd->frozen)
@@ -541,7 +634,6 @@ _spacer_up_cb(void *data,
         elm_widget_scroll_freeze_pop(data);
         sd->frozen = EINA_FALSE;
      }
-   elm_layout_signal_emit(data, "elm,state,indicator,hide", "elm");
 }
 
 static void
@@ -626,6 +718,9 @@ _elm_slider_smart_del(Evas_Object *obj)
    if (sd->units) eina_stringshare_del(sd->units);
    if (sd->delay) ecore_timer_del(sd->delay);
 
+   if ((slider_mod) && (slider_mod->obj_unhook))
+     slider_mod->obj_unhook(sd->mod_data);
+
    ELM_WIDGET_CLASS(_elm_slider_parent_sc)->base.del(obj);
 }
 
@@ -653,6 +748,7 @@ elm_slider_add(Evas_Object *parent)
 {
    Evas *e;
    Evas_Object *obj;
+   Evas_Coord w, h;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
 
@@ -664,6 +760,21 @@ elm_slider_add(Evas_Object *parent)
    if (!elm_widget_sub_object_add(parent, obj))
      ERR("could not add %p as sub object of %p", obj, parent);
 
+   // module - initialise module for slider
+   if (!slider_mod) slider_mod = _slider_mod_init();
+
+   ELM_SLIDER_DATA_GET(obj, sd);
+
+   if ((slider_mod) && (slider_mod->obj_hook))
+     sd->mod_data = slider_mod->obj_hook(obj);
+   if ((slider_mod) && (slider_mod->indicator_horizontal_set))
+     slider_mod->indicator_horizontal_set(sd->mod_data, sd->horizontal);
+   if ((slider_mod) && (slider_mod->indicator_size_hint_set))
+     {
+        edje_object_part_geometry_get(ELM_WIDGET_DATA(sd)->resize_obj, "elm.dragable.slider", NULL, NULL, &w, &h);
+        slider_mod->indicator_size_hint_set(sd->mod_data, w, h);
+     }
+
    elm_layout_sizing_eval(obj);
 
    return obj;
@@ -769,6 +880,9 @@ elm_slider_horizontal_set(Evas_Object *obj,
    if (sd->horizontal == horizontal) return;
    sd->horizontal = horizontal;
 
+   if ((slider_mod) && (slider_mod->indicator_horizontal_set))
+     slider_mod->indicator_horizontal_set(sd->mod_data, horizontal);
+
    ELM_WIDGET_DATA(sd)->api->theme(obj);
 }
 
Index: src/modules/indicator_popup/indicator_popup.c
===================================================================
--- src/modules/indicator_popup/indicator_popup.c	(revision 0)
+++ src/modules/indicator_popup/indicator_popup.c	(revision 0)
@@ -0,0 +1,149 @@
+#include <Elementary.h>
+#include "elm_priv.h"
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+
+typedef struct _Elm_Indicator_Module_Data Elm_Indicator_Module_Data;
+
+struct _Elm_Indicator_Module_Data
+{
+   Evas_Object *obj;
+   Evas_Object *popup;
+   Evas_Coord minw, minh;
+   Evas_Coord indicator_item_width, indicator_item_height;
+};
+
+static void
+_mirrored_set(Elm_Indicator_Module_Data *indicator_mod, Eina_Bool rtl)
+{
+   if (!indicator_mod) return;
+
+   edje_object_mirrored_set(indicator_mod->popup, rtl);
+}
+
+EAPI void *
+obj_hook(Evas_Object *obj)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+   Evas_Coord minw = -1, minh = -1;
+
+   indicator_mod = ELM_NEW(Elm_Indicator_Module_Data);
+   if (!indicator_mod) return NULL;
+
+   indicator_mod->obj = obj;
+   indicator_mod->popup = edje_object_add(evas_object_evas_get(indicator_mod->obj));
+   _elm_theme_object_set(indicator_mod->obj, indicator_mod->popup, "layout", "indicator",
+                         elm_widget_style_get(indicator_mod->obj));
+   _mirrored_set(indicator_mod, elm_widget_mirrored_get(indicator_mod->obj));
+   edje_object_size_min_restricted_calc(indicator_mod->popup, &minw, &minh, minw, minh);
+   indicator_mod->minw = minw;
+   indicator_mod->minh = minh;
+
+   return ((void*)indicator_mod);
+}
+
+EAPI void
+obj_unhook(void *module_data)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+
+   indicator_mod = (Elm_Indicator_Module_Data *)module_data;
+   if (!indicator_mod) return;
+
+   if (indicator_mod->popup)
+     evas_object_del(indicator_mod->popup);
+
+   if (indicator_mod)
+     {
+        free(indicator_mod);
+        indicator_mod = NULL;
+     }
+}
+
+EAPI void
+obj_theme_hook(void *module_data)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+   Evas_Coord minw = -1, minh = -1;
+
+   indicator_mod = (Elm_Indicator_Module_Data *)module_data;
+   if (!indicator_mod) return;
+
+   _elm_theme_object_set(indicator_mod->obj, indicator_mod->popup, "layout", "indicator",
+                         elm_widget_style_get(indicator_mod->obj));
+   _mirrored_set(indicator_mod, elm_widget_mirrored_get(indicator_mod->obj));
+   edje_object_size_min_restricted_calc(indicator_mod->popup, &minw, &minh, minw, minh);
+   indicator_mod->minw = minw;
+   indicator_mod->minh = minh;
+}
+
+EAPI void
+indicator_show(void *module_data, Evas_Coord x_offset, Evas_Coord y_offset)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+   Evas_Coord x, y, w, h;
+
+   indicator_mod = (Elm_Indicator_Module_Data *)module_data;
+   if (!indicator_mod) return;
+
+   evas_object_geometry_get(indicator_mod->obj, &x, &y, &w, &h);
+   x_offset += x + (0.5 * indicator_mod->indicator_item_width);
+   y_offset += y - (0.5 * indicator_mod->minh);
+   evas_object_move(indicator_mod->popup, x_offset, y_offset);
+   evas_object_show(indicator_mod->popup);
+}
+
+EAPI void
+indicator_hide(void *module_data)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+
+   indicator_mod = (Elm_Indicator_Module_Data *)module_data;
+   if (!indicator_mod) return;
+
+   evas_object_hide(indicator_mod->popup);
+}
+
+EAPI void
+indicator_text_set(void *module_data, const char *str)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+
+   indicator_mod = (Elm_Indicator_Module_Data *)module_data;
+   if (!indicator_mod) return;
+
+   edje_object_part_text_set(indicator_mod->popup, "text.indicator", str);
+}
+
+EAPI void
+indicator_size_hint_set(void *module_data, Evas_Coord width, Evas_Coord height)
+{
+   Elm_Indicator_Module_Data *indicator_mod;
+
+   indicator_mod = (Elm_Indicator_Module_Data *)module_data;
+   if (!indicator_mod) return;
+
+   indicator_mod->indicator_item_width = width;
+   indicator_mod->indicator_item_height = height;
+}
+
+EAPI void
+indicator_horizontal_set(void *module_data, Eina_Bool horizontal)
+{
+   /* will be implemented in future modules, if needed. */
+}
+
+// module api funcs needed
+EAPI int
+elm_modapi_init(void *m __UNUSED__)
+{
+   return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m __UNUSED__)
+{
+   return 1; // succeed always
+}
+
Index: src/modules/indicator_popup/Makefile.am
===================================================================
--- src/modules/indicator_popup/Makefile.am	(revision 0)
+++ src/modules/indicator_popup/Makefile.am	(revision 0)
@@ -0,0 +1,35 @@
+
+MAINTAINERCLEANFILES = Makefile.in
+
+AM_CPPFLAGS = \
+-DELM_INTERNAL_API_ARGESFSDFEFC=1 \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib \
+-I$(top_builddir)/src/lib \
+-DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+@ELEMENTARY_CFLAGS@ \
+@ELEMENTARY_X_CFLAGS@ \
+@ELEMENTARY_FB_CFLAGS@ \
+@ELEMENTARY_WIN32_CFLAGS@ \
+@ELEMENTARY_WINCE_CFLAGS@ \
+@ELEMENTARY_EDBUS_CFLAGS@ \
+@ELEMENTARY_EFREET_CFLAGS@ \
+@ELEMENTARY_ETHUMB_CFLAGS@ \
+@ELEMENTARY_EMAP_CFLAGS@ \
+@EVIL_CFLAGS@
+
+if ELEMENTARY_WINDOWS_BUILD
+AM_CPPFLAGS += -DELEMENTARY_BUILD
+endif
+
+pkgdir = $(libdir)/elementary/modules/indicator_popup/$(MODULE_ARCH)
+pkg_LTLIBRARIES = module.la
+
+module_la_SOURCES = indicator_popup.c
+
+module_la_LIBADD = $(top_builddir)/src/lib/libelementary.la @EVIL_LIBS@
+module_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -module -avoid-version
+module_la_LIBTOOLFLAGS = --tag=disable-static
Index: src/modules/Makefile.am
===================================================================
--- src/modules/Makefile.am	(revision 71264)
+++ src/modules/Makefile.am	(working copy)
@@ -5,4 +5,5 @@ SUBDIRS = \
 test_entry \
 test_map \
 access_output \
-datetime_input_ctxpopup
+datetime_input_ctxpopup \
+indicator_popup
Index: configure.ac
===================================================================
--- configure.ac	(revision 71264)
+++ configure.ac	(working copy)
@@ -715,6 +715,7 @@ src/bin/Makefile
 src/modules/Makefile
 src/modules/access_output/Makefile
 src/modules/datetime_input_ctxpopup/Makefile
+src/modules/indicator_popup/Makefile
 src/modules/test_entry/Makefile
 src/modules/test_map/Makefile
 src/edje_externals/Makefile
Index: config/illume/base.src
===================================================================
--- config/illume/base.src	(revision 71264)
+++ config/illume/base.src	(working copy)
@@ -30,7 +30,7 @@ group "Elm_Config" struct {
   value "finger_size" int: 40;
   value "fps" double: 60.0;
   value "theme" string: "default";
-  value "modules" string: "datetime_input_ctxpopup>datetime/api";
+  value "modules" string: "datetime_input_ctxpopup>datetime/api:indicator_popup>slider/api";
   value "tooltip_delay" double: 1.0;
   value "cursor_engine_only" uchar: 1;
   value "focus_highlight_enable" uchar: 0;
Index: data/themes/widgets/layout.edc
===================================================================
--- data/themes/widgets/layout.edc	(revision 71264)
+++ data/themes/widgets/layout.edc	(working copy)
@@ -825,3 +825,60 @@ group { name: "elm/layout/application/titlebar";
    }
 }
 
+   group { name: "elm/layout/indicator/default";
+           alias: "elm/layout/indicator/disabled";
+      images {
+         image: "bt_basew.png" COMP;
+      }
+      parts {
+         part { name: "bg";
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: 40 40;
+               image {
+                  normal: "bt_basew.png";
+                  border: 6 6 4 8;
+                  border_scale: 1;
+               }
+            }
+         }
+         part { name: "left_padding";
+            type: RECT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               visible: 0;
+               fixed: 1 1;
+               min: 5 5;
+               align: 0.0 0.0;
+            }
+         }
+         part { name: "right_padding";
+            type: RECT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               visible: 0;
+               min: 5 5;
+               align: 1.0 1.0;
+            }
+         }
+         part { name: "text.indicator";
+            type: TEXT;
+            mouse_events: 0;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: left_padding;
+               rel2.to: right_padding;
+               color: 0 0 0 255;
+               text {
+                  font: "Sans,Edje-Vera";
+                  size: 20;
+                  min: 1 0;
+               }
+            }
+         }
+      }
+   }
Index: data/themes/widgets/slider.edc
===================================================================
--- data/themes/widgets/slider.edc	(revision 71264)
+++ data/themes/widgets/slider.edc	(working copy)
@@ -1337,20 +1337,6 @@ group { name: "elm/slider/horizontal/indicator/def
             set_value_hide();
          }
       }
-      program { name: "val_show";
-         signal: "mouse,down,*";
-         source: "button_events";
-         script {
-            thumb_down();
-         }
-      }
-      program { name: "val_hide";
-         signal: "mouse,up,*";
-         source: "button_events";
-         script {
-            thumb_up();
-         }
-      }
       program { name: "indicator_show";
          signal: "elm,state,indicator,show";
          source: "elm";
