diff -urNBb evas/src/lib/engines/common/evas_font_draw.c evas-m1/src/lib/engines/common/evas_font_draw.c
--- evas/src/lib/engines/common/evas_font_draw.c	2006-04-09 15:38:10.000000000 +0200
+++ evas-m1/src/lib/engines/common/evas_font_draw.c	2006-04-10 10:43:21.000000000 +0200
@@ -57,6 +57,7 @@
 evas_common_font_glyph_search(RGBA_Font *fn, RGBA_Font_Int **fi_ret, int gl)
 {
    Evas_List *l;
+   char justloaded=0;
 
    for (l = fn->fonts; l; l = l->next)
      {
@@ -64,20 +65,37 @@
 	int index;
 
 	fi = l->data;
+	justloaded = 0;
  	if (!fi->ft.size)
 	  {
 	     if (!fi->src->ft.face)
 	       evas_common_font_source_load_complete(fi->src);
 	     evas_common_font_int_load_complete(fi);
+	     justloaded = 1;
 	  }
 	  
         index = FT_Get_Char_Index(fi->src->ft.face, gl);
 	if (index != 0)
 	  {
+	      if (justloaded)
+	      {
+  		fi->usage = -2;
+		evas_common_fonts_unload(fn);
+	      }
+
 	     *fi_ret = fi;
 	     return index;
 	  }
+	  else
+	  {
+	    if (justloaded)
+	      fi->usage = -3;/* this font can be unloaded from memory*/
+	  }
+
      }
+   if (justloaded)
+     evas_common_fonts_unload(fn);
+
    return 0;
 }
 
diff -urNBb evas/src/lib/engines/common/evas_font_load.c evas-m1/src/lib/engines/common/evas_font_load.c
--- evas/src/lib/engines/common/evas_font_load.c	2006-04-09 15:38:10.000000000 +0200
+++ evas-m1/src/lib/engines/common/evas_font_load.c	2006-04-10 11:03:50.000000000 +0200
@@ -546,3 +546,61 @@
      }
    return NULL;
 }
+void 
+evas_common_fonts_unload(RGBA_Font *fn)
+{
+  RGBA_Font_Int    *fi, *fi_last;
+  Evas_List *l;
+  int isfound = 0;
+
+  for(l = fn->fonts; l; l = l->next)
+    {
+      fi = (RGBA_Font_Int *) l->data;
+      if (fi->usage==-3) /* loaded fonts but not used*/
+	isfound = 1;
+      if (isfound && fi->usage==-2){
+	isfound = 2;      
+        fi_last = fi;
+	break;
+      }
+    }
+  if (!isfound)
+    return ;
+
+  if (isfound==1){
+    for (l = fn->fonts; l; l = l->next)
+      {
+	fi = (RGBA_Font_Int *) l->data;
+	if (fi->usage==-3)
+	  fi->usage = 0;
+      }
+    return ;
+  }
+
+  for (l = fn->fonts; l; l = l->next)
+    {
+      fi = (RGBA_Font_Int *) l->data;
+      if (fi->usage==-3)
+	{
+	  /*first unload font from memory*/
+
+	  FT_Done_Size(fi->ft.size);
+	  fi->ft.size = NULL;
+	  evas_common_font_int_modify_cache_by(fi, -1);
+
+	  evas_hash_foreach(fi->glyphs, font_flush_free_glyph_cb, NULL);
+	  evas_hash_free(fi->glyphs);
+
+	  FT_Done_Face(fi->src->ft.face); /* unload font from memory */
+	  fi->src->ft.face = NULL;
+	  fn->fonts = evas_list_remove(fn->fonts, fi);
+	  fn->fonts = evas_list_append_relative(fn->fonts, fi,fi_last);
+	  fi_last = fi;
+
+	  l = fn->fonts;
+	  /*restart font list scanning from the beginning , because font was deleted */
+	}
+     if (fi->usage==-3 || fi->usage==-2)
+        fi->usage = 0;
+    }
+}
diff -urNBb evas/src/lib/include/evas_common.h evas-m1/src/lib/include/evas_common.h
--- evas/src/lib/include/evas_common.h	2006-04-09 15:38:10.000000000 +0200
+++ evas-m1/src/lib/include/evas_common.h	2006-04-10 10:44:16.000000000 +0200
@@ -866,6 +866,7 @@
 RGBA_Font_Source *evas_common_font_source_memory_load(const char *name, const void *data, int data_size);
 RGBA_Font_Source *evas_common_font_source_load       (const char *name);
 int		 evas_common_font_source_load_complete(RGBA_Font_Source *fs);
+void             evas_common_fonts_unload           (RGBA_Font *fn);
 RGBA_Font_Source *evas_common_font_source_find       (const char *name);
 void              evas_common_font_source_free       (RGBA_Font_Source *fs);
 void              evas_common_font_size_use         (RGBA_Font *fn);

