Index: src/lib/Evas.h
===================================================================
--- src/lib/Evas.h	(revision 61008)
+++ src/lib/Evas.h	(working copy)
@@ -698,6 +698,13 @@ typedef enum _Evas_Image_Scale_Hint
    EVAS_IMAGE_SCALE_HINT_STATIC = 2
 } Evas_Image_Scale_Hint;
 
+typedef enum _Evas_Image_Animated_Loop_Hint
+{
+   EVAS_IMAGE_ANIMATED_HINT_NONE = 0,
+   EVAS_IMAGE_ANIMATED_HINT_SEQUENTIAL = 1,
+   EVAS_IMAGE_ANIMATED_HINT_REVERSE = 2
+} Evas_Image_Animated_Loop_Hint;
+
 typedef enum _Evas_Engine_Render_Mode
 {
    EVAS_RENDER_MODE_BLOCKING = 0,
@@ -6347,10 +6354,16 @@ EAPI Eina_Bool evas_object_image_extension_can_loa
  */
 EAPI Eina_Bool evas_object_image_extension_can_load_fast_get(const char *file);
 
-/**
- * @}
- */
+// animated feature
+EAPI Eina_Bool evas_object_image_animated_get(const Evas_Object *obj);
+EAPI int evas_object_image_animated_frame_num_get(const Evas_Object *obj);
+EAPI Evas_Image_Animated_Loop_Hint evas_object_image_animated_loop_type_get(const Evas_Object *obj);
+EAPI int evas_object_image_animated_loop_num_get(const Evas_Object *obj);
+EAPI Eina_List *evas_object_image_animated_frame_times_get(const Evas_Object *obj, int start_frame, int fram_num); //return time duration
+EAPI void evas_object_image_animated_frame_set(Evas_Object *obj, int frame_num);
 
+
+
 /**
  * @defgroup Evas_Object_Text Text Object Functions
  *
Index: src/modules/engines/software_generic/evas_engine.c
===================================================================
--- src/modules/engines/software_generic/evas_engine.c	(revision 61008)
+++ src/modules/engines/software_generic/evas_engine.c	(working copy)
@@ -651,6 +651,60 @@ eng_image_scale_hint_get(void *data __UNUSED__, vo
    return im->scale_hint;
 }
 
+static Eina_Bool
+eng_image_animated_get  (void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return EINA_FALSE;
+   im = image;
+   return im->flags.animated;
+}
+
+static int
+eng_image_animated_frame_num_get (void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return -1;
+   im = image;
+   if (!im->flags.animated) return -1;
+   return im->frame_num;
+}
+
+static Evas_Image_Animated_Loop_Hint
+eng_image_animated_loop_type_get (void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return EVAS_IMAGE_ANIMATED_HINT_NONE;
+   im = image;
+   if (!im->flags.animated) return EVAS_IMAGE_ANIMATED_HINT_NONE;
+   return im->loop_hint;
+}
+
+static int
+eng_image_animated_loop_num_get (void *data __UNUSED__, void *image)
+{
+   Image_Entry *im;
+
+   if (!image) return -1;
+   im = image;
+   if (!im->flags.animated) return -1;
+   return im->loop_num;
+}
+///TODO
+static Eina_List*
+eng_image_animated_frame_times_get (void *data __UNUSED__, void *image, int start_frame, int fram_num)
+{
+   Image_Entry *im;
+
+   if (!image) return NULL;
+   im = image;
+   if (!im->flags.animated) return NULL;
+   return NULL;
+}
+
 static void
 eng_image_cache_flush(void *data __UNUSED__)
 {
@@ -1097,7 +1151,12 @@ static Evas_Func func =
      NULL, // FIXME: need software mesa for gl rendering <- gl_native_surface_get
      NULL, // FIXME: need software mesa for gl rendering <- gl_api_get
      eng_image_load_error_get,
-     eng_font_run_font_end_get
+     eng_font_run_font_end_get,
+     eng_image_animated_get,
+     eng_image_animated_frame_num_get,
+     eng_image_animated_loop_type_get,
+     eng_image_animated_loop_num_get,
+     eng_image_animated_frame_times_get
    /* FUTURE software generic calls go here */
 };
 
Index: src/lib/canvas/evas_object_image.c
===================================================================
--- src/lib/canvas/evas_object_image.c	(revision 61008)
+++ src/lib/canvas/evas_object_image.c	(working copy)
@@ -1864,7 +1864,129 @@ evas_object_image_content_hint_get(const Evas_Obje
    return o->content_hint;
 }
 
+// animated feature
+EAPI Eina_Bool
+evas_object_image_animated_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EINA_FALSE;
+   MAGIC_CHECK_END();
+
+   if (obj->layer->evas->engine.func->image_animated_get)
+     return obj->layer->evas->engine.func->image_animated_get(obj->layer->evas->engine.data.output, o->engine_data);
+   return EINA_FALSE;
+}
+
+EAPI int
+evas_object_image_animated_frame_num_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return -1;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return -1;
+   MAGIC_CHECK_END();
+
+   if (obj->layer->evas->engine.func->image_animated_frame_num_get)
+     return obj->layer->evas->engine.func->image_animated_frame_num_get(obj->layer->evas->engine.data.output, o->engine_data);
+   return -1;
+}
+
+EAPI Evas_Image_Animated_Loop_Hint
+evas_object_image_animated_loop_type_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return EVAS_IMAGE_ANIMATED_HINT_NONE;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return EVAS_IMAGE_ANIMATED_HINT_NONE;
+   MAGIC_CHECK_END();
+
+   if (obj->layer->evas->engine.func->image_animated_loop_type_get)
+     return obj->layer->evas->engine.func->image_animated_loop_type_get(obj->layer->evas->engine.data.output, o->engine_data);
+   return EVAS_IMAGE_ANIMATED_HINT_NONE;
+}
+
+EAPI int
+evas_object_image_animated_loop_num_get(const Evas_Object *obj)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return -1;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return -1;
+   MAGIC_CHECK_END();
+
+   if (obj->layer->evas->engine.func->image_animated_loop_num_get)
+     return obj->layer->evas->engine.func->image_animated_loop_num_get(obj->layer->evas->engine.data.output, o->engine_data);
+   return -1;
+}
+
+EAPI Eina_List *
+evas_object_image_animated_frame_times_get(const Evas_Object *obj, int start_frame, int frame_num)
+{
+   Evas_Object_Image *o;
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return NULL;
+   MAGIC_CHECK_END();
+   if (obj->layer->evas->engine.func->image_animated_frame_times_get)
+     return obj->layer->evas->engine.func->image_animated_frame_times_get(obj->layer->evas->engine.data.output, o->engine_data, start_frame, frame_num);
+   return NULL;
+}
+
 EAPI void
+evas_object_image_animated_frame_set(Evas_Object *obj, int frame_index)
+{
+   Evas_Object_Image *o;
+   int frame_num = 0;
+   Eina_Bool animated = EINA_FALSE;
+   char frame_index_char[4];
+
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Image *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE);
+   return;
+   MAGIC_CHECK_END();
+
+   if (obj->layer->evas->engine.func->image_animated_get)
+     animated = obj->layer->evas->engine.func->image_animated_get(obj->layer->evas->engine.data.output, o->engine_data);
+
+   if (!animated) return;
+   if (!o->cur.file) return;
+   //We maybe need to modify this code after making new cache system for animated image.
+
+   frame_num = evas_object_image_animated_frame_num_get(obj);
+
+   //We limit the size of max index to 9999
+   if ((frame_num > 10000-1) || (frame_num < 0) || (frame_index >  frame_num))
+     return;
+   snprintf(frame_index_char, 4, "%i",frame_index);
+   evas_object_image_file_set(obj, o->cur.file, frame_index_char);
+}
+
+EAPI void
 evas_image_cache_flush(Evas *e)
 {
    MAGIC_CHECK(e, Evas, MAGIC_EVAS);
Index: src/lib/include/evas_private.h
===================================================================
--- src/lib/include/evas_private.h	(revision 61008)
+++ src/lib/include/evas_private.h	(working copy)
@@ -750,6 +750,13 @@ struct _Evas_Func
    void *(*gl_api_get)                   (void *data);
    int  (*image_load_error_get)          (void *data, void *image);
    int  (*font_run_end_get)              (void *data, Evas_Font_Set *font, Evas_Font_Instance **script_fi, Evas_Font_Instance **cur_fi, Evas_Script_Type script, const Eina_Unicode *text, int run_len);
+
+  /* animated feature */
+   Eina_Bool (*image_animated_get)  (void *data, void *image);
+   int (*image_animated_frame_num_get) (void *data, void *image);
+   Evas_Image_Animated_Loop_Hint  (*image_animated_loop_type_get) (void *data, void *image);
+   int (*image_animated_loop_num_get) (void *data, void *image);
+   Eina_List* (*image_animated_frame_times_get) (void *data, void *image, int start_frame, int fram_num);
 };
 
 struct _Evas_Image_Load_Func
Index: src/modules/loaders/gif/evas_image_load_gif.c
===================================================================
--- src/modules/loaders/gif/evas_image_load_gif.c	(revision 61008)
+++ src/modules/loaders/gif/evas_image_load_gif.c	(working copy)
@@ -17,7 +17,9 @@ static Evas_Image_Load_Func evas_image_load_gif_fu
   evas_image_load_file_head_gif,
   evas_image_load_file_data_gif
 };
+#define byte_to_uint(a,b)         (((b)<<8)|(a))
 
+#define FRAME_MAX 1024
 static Eina_Bool
 evas_image_load_file_head_gif(Image_Entry *ie, const char *file, const char *key __UNUSED__, int *error)
 {
@@ -29,6 +31,11 @@ evas_image_load_file_head_gif(Image_Entry *ie, con
    int                 h;
    int                 alpha;
 
+   // for animated image
+   int      frame_num = 0;
+   int loop_num = -1;
+   Evas_Image_Animated_Loop_Hint loop_hint = EVAS_IMAGE_ANIMATED_HINT_NONE;
+
    done = 0;
    w = 0;
    h = 0;
@@ -41,16 +48,16 @@ evas_image_load_file_head_gif(Image_Entry *ie, con
 #endif
    if (fd < 0)
      {
-	*error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
-	return EINA_FALSE;
+        *error = EVAS_LOAD_ERROR_DOES_NOT_EXIST;
+        return EINA_FALSE;
      }
 
    gif = DGifOpenFileHandle(fd);
    if (!gif)
      {
         close(fd);
-	*error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
-	return EINA_FALSE;
+        *error = EVAS_LOAD_ERROR_UNKNOWN_FORMAT;
+        return EINA_FALSE;
      }
 
    do
@@ -60,26 +67,40 @@ evas_image_load_file_head_gif(Image_Entry *ie, con
              /* PrintGifError(); */
              rec = TERMINATE_RECORD_TYPE;
           }
-        if ((rec == IMAGE_DESC_RECORD_TYPE) && (!done))
+        if (rec == IMAGE_DESC_RECORD_TYPE)
           {
+             int img_code;
+             GifByteType *img;
+
              if (DGifGetImageDesc(gif) == GIF_ERROR)
                {
                   /* PrintGifError(); */
                   rec = TERMINATE_RECORD_TYPE;
                }
+             frame_num++;
              w = gif->Image.Width;
              h = gif->Image.Height;
-	     if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
+             if ((w < 1) || (h < 1) || (w > IMG_MAX_SIZE) || (h > IMG_MAX_SIZE) ||
                  IMG_TOO_BIG(w, h))
-	       {
-		  DGifCloseFile(gif);
-		  if (IMG_TOO_BIG(w, h))
-		    *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
-		  else
-		    *error = EVAS_LOAD_ERROR_GENERIC;
-		  return EINA_FALSE;
-	       }
-	     done = 1;
+               {
+                  DGifCloseFile(gif);
+                  if (IMG_TOO_BIG(w, h))
+                    *error = EVAS_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+                  else
+                    *error = EVAS_LOAD_ERROR_GENERIC;
+                  return EINA_FALSE;
+               }
+             /* we have to count frame, so use DGifGetCode and skip decoding */
+             if (DGifGetCode(gif, &img_code, &img) == GIF_ERROR)
+               {
+                  /* PrintGifError(); */
+                  rec = TERMINATE_RECORD_TYPE;
+               }
+             while (img)
+               {
+                  img = NULL;
+                  DGifGetExtensionNext(gif, &img);
+               }
           }
         else if (rec == EXTENSION_RECORD_TYPE)
           {
@@ -90,10 +111,26 @@ evas_image_load_file_head_gif(Image_Entry *ie, con
              DGifGetExtension(gif, &ext_code, &ext);
              while (ext)
                {
-                  if ((ext_code == 0xf9) && (ext[1] & 1) && (alpha < 0))
+                  if(ext_code == 0xf9) /* Graphic Control Extension */
                     {
-                       alpha = (int)ext[4];
+                       if ((ext[1] & 1) && (alpha < 0)) alpha = (int)ext[4];
+                         //frame_time[frame_num] = byte_to_uint (ext[2], ext[3]); //get each frame time 
                     }
+                  else if(ext_code == 0xff)/* application extension */
+                    {
+                       if (!strncmp ((char*)(&ext[1]), "NETSCAPE2.0", 11) || !strncmp ((char*)(&ext[1]), "ANIMEXTS1.0", 11))
+                         {
+                            ext=NULL;
+                            DGifGetExtensionNext(gif, &ext);
+
+                            if (ext[1] == 0x01)
+                            {
+                               loop_num = ext[2] + (ext[3] << 8);
+                               if (loop_num > 0) loop_num++;
+                            }
+                         }
+                    }
+
                   ext = NULL;
                   DGifGetExtensionNext(gif, &ext);
                }
@@ -104,6 +141,15 @@ evas_image_load_file_head_gif(Image_Entry *ie, con
    ie->w = w;
    ie->h = h;
 
+   if (frame_num > 1)
+     {
+        ie->flags.animated = 1;
+        ie->loop_num = loop_num;
+        ie->loop_hint = EVAS_IMAGE_ANIMATED_HINT_SEQUENTIAL;
+        ie->frame_num = frame_num;
+     }
+
+
    DGifCloseFile(gif);
    *error = EVAS_LOAD_ERROR_NONE;
    return EINA_TRUE;
