Index: src/lib/Elementary.h.in
===================================================================
--- src/lib/Elementary.h.in	(revision 59660)
+++ src/lib/Elementary.h.in	(working copy)
@@ -2179,6 +2179,9 @@ extern "C" {
    EAPI Eina_Bool    elm_progressbar_horizontal_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
    EAPI void         elm_progressbar_inverted_set(Evas_Object *obj, Eina_Bool inverted) EINA_ARG_NONNULL(1);
    EAPI Eina_Bool    elm_progressbar_inverted_get(const Evas_Object *obj) EINA_ARG_NONNULL(1);
+   EAPI void        *elm_progressbar_part_label_set(Evas_Object *obj, const char *part, const char *label) EINA_ARG_NONNULL(1);
+   EAPI const char  *elm_progressbar_part_label_get(const Evas_Object *obj, const char *part) EINA_ARG_NONNULL(1);
+   
    /* smart callbacks called:
     */
    /* available item styles:
Index: src/lib/elm_progressbar.c
===================================================================
--- src/lib/elm_progressbar.c	(revision 59660)
+++ src/lib/elm_progressbar.c	(working copy)
@@ -27,6 +27,7 @@
 #define MAX_RATIO_LVL 1.0
 
 typedef struct _Widget_Data Widget_Data;
+typedef struct _Part_Info Part_Info;
 
 struct _Widget_Data
 {
@@ -38,11 +39,18 @@ struct _Widget_Data
    Eina_Bool inverted : 1;
    Eina_Bool pulse : 1;
    Eina_Bool pulse_state : 1;
+   Eina_List *parts;
    const char *units;
    const char *label;
    double val;
 };
 
+struct _Part_Info
+{
+   const char *name;
+   const char *label;
+};
+
 static const char *widtype = NULL;
 static void _del_hook(Evas_Object *obj);
 static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl);
@@ -57,9 +65,21 @@ static void
 _del_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *l;
+   Part_Info *info;
+
    if (!wd) return;
    if (wd->label) eina_stringshare_del(wd->label);
    if (wd->units) eina_stringshare_del(wd->units);
+   EINA_LIST_FOREACH(wd->parts, l, info)
+     {
+        if (info->label) eina_stringshare_del(info->label);
+        if (info->name) eina_stringshare_del(info->name);
+        wd->parts = eina_list_remove(wd->parts, info);
+
+        free(info);
+     }
+
    free(wd);
 }
 
@@ -75,6 +95,10 @@ static void
 _theme_hook(Evas_Object *obj)
 {
    Widget_Data *wd = elm_widget_data_get(obj);
+   Eina_List *l;
+   Part_Info *info;
+   char buf[4096];
+
    if (!wd) return;
    _elm_widget_mirrored_reload(obj);
    _mirrored_set(obj, elm_widget_mirrored_get(obj));
@@ -93,6 +117,12 @@ _theme_hook(Evas_Object *obj)
         edje_object_part_text_set(wd->progressbar, "elm.text", wd->label);
         edje_object_signal_emit(wd->progressbar, "elm,state,text,visible", "elm");
      }
+   EINA_LIST_FOREACH(wd->parts, l, info)
+     {
+        edje_object_part_text_set(wd->progressbar, info->name, info->label);
+        snprintf(buf, sizeof(buf), "elm,state,%s,visible", info->name);
+        edje_object_signal_emit(wd->progressbar, buf, "elm");
+     }
    if (wd->pulse)
      edje_object_signal_emit(wd->progressbar, "elm,state,pulse", "elm");
    else
@@ -132,6 +162,30 @@ _sizing_eval(Evas_Object *obj)
 }
 
 static void
+_text_set(Evas_Object *obj, Part_Info *info, const char *label)
+{
+   Widget_Data *wd = elm_widget_data_get(obj);
+   char buf[4096];
+
+   if (!wd) return;
+   if (label)
+     {
+        eina_stringshare_replace(&info->label, label);
+        snprintf(buf, sizeof(buf), "elm,state,%s,visible", info->name);
+        edje_object_signal_emit(wd->progressbar, buf, "elm");
+        edje_object_part_text_set(wd->progressbar, info->name, info->label);
+     }
+   else
+     {
+        snprintf(buf, sizeof(buf), "elm,state,%s,hide", info->name);
+        edje_object_signal_emit(wd->progressbar, buf, "elm");
+        wd->parts = eina_list_remove(wd->parts, info);
+        free(info);
+     }
+   edje_object_message_signal_process(wd->progressbar);
+}
+
+static void
 _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
 {
    Widget_Data *wd = elm_widget_data_get(data);
@@ -389,6 +443,75 @@ elm_progressbar_label_get(const Evas_Object *obj)
 }
 
 /**
+ * Sets the text for an object part of the progressbar
+ *
+ * @param obj The progressbar object
+ * @param part The part name
+ * @param label The text label string in UTF-8
+ *
+ * @ingroup Progressbar
+ */
+EAPI void *
+elm_progressbar_part_label_set(Evas_Object *obj, const char *part, const char *label)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Part_Info *info;
+   Eina_List *l;
+   const char* text;
+
+   if (!wd || !part) return;
+
+   text = edje_object_part_text_get(wd->progressbar, part);
+   /* check if new label is same as existing label.*/
+   if (label && text && !strcmp(label, text)) return;
+
+   /* if part already exist, just replace the label  and if label is NULL,
+      remove info from list.*/
+   EINA_LIST_FOREACH(wd->parts, l, info)
+     {
+        if (!strcmp(info->name, part))
+          {
+             _text_set(obj, info, label);
+             return;
+          }
+     }
+   if (label)
+     {
+        info = calloc(1, sizeof(Part_Info));
+        if (!info) return;
+        /* lets every part get appended to list, there is chance during
+        theme hook call, all parts may available.*/
+        wd->parts = eina_list_append(wd->parts, info);
+        eina_stringshare_replace(&info->name, part);
+        _text_set(obj, info, label);
+     }
+
+   _sizing_eval(obj);
+}
+
+/**
+ * Get the text for an object part of the progressbar
+ *
+ * @param obj The progressbar object
+ * @param part The part name
+ * @return The text label string in UTF-8
+ *
+ * @ingroup Progressbar
+ */
+EAPI const char *
+elm_progressbar_part_label_get(const Evas_Object *obj, const char *part)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+   Widget_Data *wd = elm_widget_data_get(obj);
+
+   if (!wd) return NULL;
+
+   return edje_object_part_text_get(wd->progressbar, part);
+
+}
+
+/**
  * Set the icon object of the progressbar object
  *
  * Once the icon object is set, a previously set one will be deleted.
