[Pkg-e-commits] [SCM] Enlightenment DR17 graphical layout and animation library branch, new-svn-snapshot, updated. debian/0.9.9.050+svn20081206-1-1315-gc14fa32

Albin Tonnerre albin.tonnerre at gmail.com
Mon Dec 7 15:01:25 UTC 2009


The following commit has been merged in the new-svn-snapshot branch:
commit d556f8a6f9c4af6b5f452671b57ff6c364c3e9fc
Author: Albin Tonnerre <albin.tonnerre at gmail.com>
Date:   Sat Dec 5 09:27:40 2009 +0100

    Import upstream release 0.9.93.063

diff --git a/Makefile.in b/Makefile.in
index d4938c7..ea4f30e 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -143,6 +143,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -214,6 +216,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -228,6 +231,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -346,7 +350,7 @@ clean-libtool:
 	-rm -rf .libs _libs
 
 distclean-libtool:
-	-rm -f libtool
+	-rm -f libtool config.lt
 install-pkgconfigDATA: $(pkgconfig_DATA)
 	@$(NORMAL_INSTALL)
 	test -z "$(pkgconfigdir)" || $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)"
@@ -440,7 +444,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
diff --git a/aclocal.m4 b/aclocal.m4
index a0c466b..1ee38f8 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.10.1 -*- Autoconf -*-
+# generated automatically by aclocal 1.10.2 -*- Autoconf -*-
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
 # 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
@@ -13,8 +13,8 @@
 
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-m4_if(AC_AUTOCONF_VERSION, [2.61],,
-[m4_warning([this file was generated for autoconf 2.61.
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],,
+[m4_warning([this file was generated for autoconf 2.63.
 You have another version of autoconf.  It may work, but is not guaranteed to.
 If you have problems, you may need to regenerate the build system entirely.
 To do so, use the procedure documented by the package, typically `autoreconf'.])])
@@ -177,7 +177,7 @@ else
 fi[]dnl
 ])# PKG_CHECK_MODULES
 
-# Copyright (C) 2002, 2003, 2005, 2006, 2007  Free Software Foundation, Inc.
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
@@ -192,7 +192,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 [am__api_version='1.10'
 dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.10.1], [],
+m4_if([$1], [1.10.2], [],
       [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 ])
 
@@ -206,12 +206,12 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 # AM_SET_CURRENT_AUTOMAKE_VERSION
 # -------------------------------
 # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.10.1])dnl
+[AM_AUTOMAKE_VERSION([1.10.2])dnl
 m4_ifndef([AC_AUTOCONF_VERSION],
   [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-_AM_AUTOCONF_VERSION(AC_AUTOCONF_VERSION)])
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 
 # AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 
@@ -461,57 +461,68 @@ _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
 
 # Generate code to set up dependency tracking.              -*- Autoconf -*-
 
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-#serial 3
+#serial 5
 
 # _AM_OUTPUT_DEPENDENCY_COMMANDS
 # ------------------------------
 AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-    dirpart=`AS_DIRNAME("$mf")`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`AS_DIRNAME(["$file"])`
-    AS_MKDIR_P([$dirpart/$fdir])
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`AS_DIRNAME("$mf")`
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`AS_DIRNAME(["$file"])`
+      AS_MKDIR_P([$dirpart/$fdir])
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
   done
-done
+}
 ])# _AM_OUTPUT_DEPENDENCY_COMMANDS
 
 
@@ -753,14 +764,14 @@ AC_MSG_RESULT([$_am_result])
 rm -f confinc confmf
 ])
 
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005
+# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008
 # Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 5
+# serial 6
 
 # AM_PROG_CC_C_O
 # --------------
@@ -772,8 +783,9 @@ AC_REQUIRE_AUX_FILE([compile])dnl
 # FIXME: we rely on the cache variable name because
 # there is no other way.
 set dummy $CC
-ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
+am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
    # Losing compiler, so override with the script.
    # FIXME: It is wrong to rewrite CC.
    # But if we don't then we get into trouble of one sort or another.
@@ -851,13 +863,13 @@ esac
 
 # Helper functions for option handling.                     -*- Autoconf -*-
 
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
+# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.
 #
 # This file is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
 
-# serial 3
+# serial 4
 
 # _AM_MANGLE_OPTION(NAME)
 # -----------------------
@@ -874,7 +886,7 @@ AC_DEFUN([_AM_SET_OPTION],
 # ----------------------------------
 # OPTIONS is a space-separated list of Automake options.
 AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
 
 # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
 # -------------------------------------------
@@ -996,8 +1008,21 @@ python2.1 python2.0 python1.6 python1.5])
   dnl doesn't work.
   AC_CACHE_CHECK([for $am_display_PYTHON script directory],
     [am_cv_python_pythondir],
-    [am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null ||
-     echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`])
+    [if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null ||
+     echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     esac
+    ])
   AC_SUBST([pythondir], [$am_cv_python_pythondir])
 
   dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was
@@ -1013,8 +1038,21 @@ python2.1 python2.0 python1.6 python1.5])
   dnl doesn't work.
   AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
     [am_cv_python_pyexecdir],
-    [am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null ||
-     echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`])
+    [if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null ||
+     echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     esac
+    ])
   AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
 
   dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
diff --git a/config.h.in b/config.h.in
index a91d3e9..9df4c8d 100644
--- a/config.h.in
+++ b/config.h.in
@@ -8,6 +8,10 @@
 /* Define to 1 if using `alloca.c'. */
 #undef C_ALLOCA
 
+/* Cache result of edje_part_recalc - this uses up extra ram with the gain of
+   reducing CPU usage when edje object are not resized */
+#undef EDJE_CALC_CACHE
+
 /* Cache result of program glob matches - this uses up extra ram with the gain
    of faster program matching */
 #undef EDJE_PROGRAM_CACHE
diff --git a/configure b/configure
index 6072d31..5d781bc 100755
--- a/configure
+++ b/configure
@@ -1,11 +1,11 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for edje 0.9.92.062.
+# Generated by GNU Autoconf 2.63 for edje 0.9.93.063.
 #
 # Report bugs to <enlightenment-devel at lists.sourceforge.net>.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
 ## --------------------- ##
@@ -17,7 +17,7 @@ DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
@@ -39,17 +39,45 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
 as_cr_digits='0123456789'
 as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
   else
-    PATH_SEPARATOR=:
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
   fi
-  rm -f conf$$.sh
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
 fi
 
 # Support unset when possible.
@@ -65,8 +93,6 @@ fi
 # there to prevent editors from complaining about space-tab.
 # (If _AS_PATH_WALK were called with IFS unset, it would disable word
 # splitting by setting IFS to empty value.)
-as_nl='
-'
 IFS=" ""	$as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
@@ -89,7 +115,7 @@ if test "x$as_myself" = x; then
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
   { (exit 1); exit 1; }
 fi
 
@@ -102,17 +128,10 @@ PS2='> '
 PS4='+ '
 
 # NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-  fi
-done
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
 
 # Required to use basename.
 if expr a : '\(a\)' >/dev/null 2>&1 &&
@@ -134,7 +153,7 @@ as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
+$as_echo X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -160,7 +179,7 @@ else
   as_have_required=no
 fi
 
-  if test $as_have_required = yes && 	 (eval ":
+  if test $as_have_required = yes &&	 (eval ":
 (as_func_return () {
   (exit \$1)
 }
@@ -242,7 +261,7 @@ IFS=$as_save_IFS
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
@@ -263,7 +282,7 @@ _ASEOF
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
@@ -343,10 +362,10 @@ fi
 
       if test "x$CONFIG_SHELL" != x; then
   for as_var in BASH_ENV ENV
-        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-        done
-        export CONFIG_SHELL
-        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
+	do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
+	done
+	export CONFIG_SHELL
+	exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
 fi
 
 
@@ -415,9 +434,10 @@ fi
 
 test \$exitcode = 0") || {
   echo No shell found that supports shell functions.
-  echo Please tell autoconf at gnu.org about your system,
-  echo including any error possibly output before this
-  echo message
+  echo Please tell bug-autoconf at gnu.org about your system,
+  echo including any error possibly output before this message.
+  echo This can help us improve future autoconf versions.
+  echo Configuration will now proceed without shell functions.
 }
 
 
@@ -453,7 +473,7 @@ test \$exitcode = 0") || {
       s/-\n.*//
     ' >$as_me.lineno &&
   chmod +x "$as_me.lineno" ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
@@ -481,7 +501,6 @@ case `echo -n x` in
 *)
   ECHO_N='-n';;
 esac
-
 if expr a : '\(a\)' >/dev/null 2>&1 &&
    test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
@@ -494,19 +513,22 @@ if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
 else
   rm -f conf$$.dir
-  mkdir conf$$.dir
-fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s='ln -s'
-  # ... but there are two gotchas:
-  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-  # In both cases, we have to default to `cp -p'.
-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
     as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
+  fi
 else
   as_ln_s='cp -p'
 fi
@@ -531,10 +553,10 @@ else
   as_test_x='
     eval sh -c '\''
       if test -d "$1"; then
-        test -d "$1/.";
+	test -d "$1/.";
       else
 	case $1 in
-        -*)set "./$1";;
+	-*)set "./$1";;
 	esac;
 	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
 	???[sx]*):;;*)false;;esac;fi
@@ -723,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='edje'
 PACKAGE_TARNAME='edje'
-PACKAGE_VERSION='0.9.92.062'
-PACKAGE_STRING='edje 0.9.92.062'
+PACKAGE_VERSION='0.9.93.063'
+PACKAGE_STRING='edje 0.9.93.063'
 PACKAGE_BUGREPORT='enlightenment-devel at lists.sourceforge.net'
 
 ac_unique_file="configure.ac"
@@ -764,156 +786,181 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL
-PATH_SEPARATOR
-PACKAGE_NAME
-PACKAGE_TARNAME
-PACKAGE_VERSION
-PACKAGE_STRING
-PACKAGE_BUGREPORT
-exec_prefix
-prefix
-program_transform_name
-bindir
-sbindir
-libexecdir
-datarootdir
-datadir
-sysconfdir
-sharedstatedir
-localstatedir
-includedir
-oldincludedir
-docdir
-infodir
-htmldir
-dvidir
-pdfdir
-psdir
-libdir
-localedir
-mandir
-DEFS
-ECHO_C
-ECHO_N
-ECHO_T
-LIBS
-build_alias
-host_alias
-target_alias
-build
-build_cpu
-build_vendor
-build_os
-host
-host_cpu
-host_vendor
-host_os
-CC
-CFLAGS
-LDFLAGS
-CPPFLAGS
-ac_ct_CC
-EXEEXT
-OBJEXT
-INSTALL_PROGRAM
-INSTALL_SCRIPT
-INSTALL_DATA
-am__isrc
-CYGPATH_W
-PACKAGE
-VERSION
-ACLOCAL
-AUTOCONF
-AUTOMAKE
-AUTOHEADER
-MAKEINFO
-install_sh
-STRIP
-INSTALL_STRIP_PROGRAM
-mkdir_p
-AWK
-SET_MAKE
-am__leading_dot
-AMTAR
-am__tar
-am__untar
-DEPDIR
-am__include
-am__quote
-AMDEP_TRUE
-AMDEP_FALSE
-AMDEPBACKSLASH
-CCDEPMODE
-am__fastdepCC_TRUE
-am__fastdepCC_FALSE
-AS
-DLLTOOL
-OBJDUMP
-LIBTOOL
-SED
-GREP
-EGREP
-FGREP
-LD
-DUMPBIN
-ac_ct_DUMPBIN
-NM
-LN_S
-AR
-RANLIB
-lt_ECHO
-DSYMUTIL
-NMEDIT
-LIPO
-OTOOL
-OTOOL64
-CPP
-version_info
-release_info
-BUILD_EDJE_CC_TRUE
-BUILD_EDJE_CC_FALSE
-BUILD_EDJE_DECC_TRUE
-BUILD_EDJE_DECC_FALSE
-EDJE_CC_PRG
-EDJE_DECC_PRG
-EDJE_RECC_PRG
-EDJE_PROGRAM_CACHE_TRUE
-EDJE_PROGRAM_CACHE_FALSE
-vimdir
-efl_have_doxygen
-efl_doxygen
-EFL_BUILD_DOC_TRUE
-EFL_BUILD_DOC_FALSE
-PYTHON
-PYTHON_VERSION
-PYTHON_PREFIX
-PYTHON_EXEC_PREFIX
-PYTHON_PLATFORM
-pythondir
-pkgpythondir
-pyexecdir
-pkgpyexecdir
-HAVE_PYTHON_TRUE
-HAVE_PYTHON_FALSE
-PKG_CONFIG
-EVIL_CFLAGS
-EVIL_LIBS
-EFL_EDJE_BUILD
-EDJE_CFLAGS
-EDJE_LIBS
-ECORE_IMF_CFLAGS
-ECORE_IMF_LIBS
-ECORE_FILE_CFLAGS
-ECORE_FILE_LIBS
-ECORE_EVAS_CFLAGS
-ECORE_EVAS_LIBS
-lt_enable_auto_import
-ALLOCA
-requirement_edje
+ac_subst_vars='LTLIBOBJS
 LIBOBJS
-LTLIBOBJS'
+requirement_edje
+ALLOCA
+lt_enable_auto_import
+ECORE_EVAS_LIBS
+ECORE_EVAS_CFLAGS
+ECORE_FILE_LIBS
+ECORE_FILE_CFLAGS
+ECORE_IMF_LIBS
+ECORE_IMF_CFLAGS
+EDJE_LIBS
+EDJE_CFLAGS
+LUA_LIBS
+LUA_CFLAGS
+EFL_EDJE_BUILD
+EVIL_LIBS
+EVIL_CFLAGS
+pkgconfig_requires_private
+PKG_CONFIG
+HAVE_PYTHON_FALSE
+HAVE_PYTHON_TRUE
+pkgpyexecdir
+pyexecdir
+pkgpythondir
+pythondir
+PYTHON_PLATFORM
+PYTHON_EXEC_PREFIX
+PYTHON_PREFIX
+PYTHON_VERSION
+PYTHON
+EFL_BUILD_DOC_FALSE
+EFL_BUILD_DOC_TRUE
+efl_doxygen
+efl_have_doxygen
+vimdir
+EDJE_CALC_CACHE_FALSE
+EDJE_CALC_CACHE_TRUE
+EDJE_PROGRAM_CACHE_FALSE
+EDJE_PROGRAM_CACHE_TRUE
+EDJE_RECC_PRG
+EDJE_DECC_PRG
+EDJE_CC_PRG
+BUILD_EDJE_DECC_FALSE
+BUILD_EDJE_DECC_TRUE
+BUILD_EDJE_CC_FALSE
+BUILD_EDJE_CC_TRUE
+EDJE_AMALGAMATION_FALSE
+EDJE_AMALGAMATION_TRUE
+release_info
+version_info
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+lt_ECHO
+RANLIB
+AR
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+LIBTOOL
+OBJDUMP
+DLLTOOL
+AS
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
 ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+enable_libtool_lock
+enable_amalgamation
+enable_edje_cc
+enable_edje_program_cache
+enable_edje_calc_cache
+with_vim
+enable_doc
+with_doxygen
+'
       ac_precious_vars='build_alias
 host_alias
 target_alias
@@ -926,6 +973,8 @@ CPP
 PKG_CONFIG
 EVIL_CFLAGS
 EVIL_LIBS
+LUA_CFLAGS
+LUA_LIBS
 EDJE_CFLAGS
 EDJE_LIBS
 ECORE_IMF_CFLAGS
@@ -939,6 +988,8 @@ ECORE_EVAS_LIBS'
 # Initialize some variables set by options.
 ac_init_help=
 ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
 # The variables have the same names as the options, with
 # dashes changed to underlines.
 cache_file=/dev/null
@@ -1037,13 +1088,21 @@ do
     datarootdir=$ac_optarg ;;
 
   -disable-* | --disable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
-    eval enable_$ac_feature=no ;;
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=no ;;
 
   -docdir | --docdir | --docdi | --doc | --do)
     ac_prev=docdir ;;
@@ -1056,13 +1115,21 @@ do
     dvidir=$ac_optarg ;;
 
   -enable-* | --enable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2
    { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
-    eval enable_$ac_feature=\$ac_optarg ;;
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$ac_optarg ;;
 
   -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
   | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
@@ -1253,22 +1320,38 @@ do
     ac_init_version=: ;;
 
   -with-* | --with-*)
-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
-    eval with_$ac_package=\$ac_optarg ;;
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
 
   -without-* | --without-*)
-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2
    { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
-    eval with_$ac_package=no ;;
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=no ;;
 
   --x)
     # Obsolete; use --with-x.
@@ -1288,7 +1371,7 @@ do
   | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
     x_libraries=$ac_optarg ;;
 
-  -*) { echo "$as_me: error: unrecognized option: $ac_option
+  -*) { $as_echo "$as_me: error: unrecognized option: $ac_option
 Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; }
     ;;
@@ -1297,16 +1380,16 @@ Try \`$0 --help' for more information." >&2
     ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
     # Reject names that are not valid shell variable names.
     expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+      { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2
    { (exit 1); exit 1; }; }
     eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
 
   *)
     # FIXME: should be removed in autoconf 3.0.
-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
     expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
     : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
     ;;
 
@@ -1315,22 +1398,38 @@ done
 
 if test -n "$ac_prev"; then
   ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { echo "$as_me: error: missing argument to $ac_option" >&2
+  { $as_echo "$as_me: error: missing argument to $ac_option" >&2
    { (exit 1); exit 1; }; }
 fi
 
-# Be sure to have absolute directory names.
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2
+   { (exit 1); exit 1; }; } ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
 for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
 		datadir sysconfdir sharedstatedir localstatedir includedir \
 		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
 		libdir localedir mandir
 do
   eval ac_val=\$$ac_var
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
   case $ac_val in
     [\\/$]* | ?:[\\/]* )  continue;;
     NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+  { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
    { (exit 1); exit 1; }; }
 done
 
@@ -1345,7 +1444,7 @@ target=$target_alias
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
     If a cross compiler is detected then cross compile mode will be used." >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
@@ -1361,10 +1460,10 @@ test "$silent" = yes && exec 6>/dev/null
 ac_pwd=`pwd` && test -n "$ac_pwd" &&
 ac_ls_di=`ls -di .` &&
 ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  { echo "$as_me: error: Working directory cannot be determined" >&2
+  { $as_echo "$as_me: error: working directory cannot be determined" >&2
    { (exit 1); exit 1; }; }
 test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  { echo "$as_me: error: pwd does not report name of working directory" >&2
+  { $as_echo "$as_me: error: pwd does not report name of working directory" >&2
    { (exit 1); exit 1; }; }
 
 
@@ -1372,12 +1471,12 @@ test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
 if test -z "$srcdir"; then
   ac_srcdir_defaulted=yes
   # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$0" ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$0" : 'X\(//\)[^/]' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$0" |
+  ac_confdir=`$as_dirname -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -1404,12 +1503,12 @@ else
 fi
 if test ! -r "$srcdir/$ac_unique_file"; then
   test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+  { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
    { (exit 1); exit 1; }; }
 fi
 ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
 ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
+	cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2
    { (exit 1); exit 1; }; }
 	pwd)`
 # When building in place, set srcdir=.
@@ -1436,7 +1535,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures edje 0.9.92.062 to adapt to many kinds of systems.
+\`configure' configures edje 0.9.93.063 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1458,9 +1557,9 @@ Configuration:
 
 Installation directories:
   --prefix=PREFIX         install architecture-independent files in PREFIX
-			  [$ac_default_prefix]
+                          [$ac_default_prefix]
   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-			  [PREFIX]
+                          [PREFIX]
 
 By default, \`make install' will install all the files in
 \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
@@ -1470,25 +1569,25 @@ for instance \`--prefix=\$HOME'.
 For better control, use the options below.
 
 Fine tuning of the installation directories:
-  --bindir=DIR           user executables [EPREFIX/bin]
-  --sbindir=DIR          system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
-  --libdir=DIR           object code libraries [EPREFIX/lib]
-  --includedir=DIR       C header files [PREFIX/include]
-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR          info documentation [DATAROOTDIR/info]
-  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR           man documentation [DATAROOTDIR/man]
-  --docdir=DIR           documentation root [DATAROOTDIR/doc/edje]
-  --htmldir=DIR          html documentation [DOCDIR]
-  --dvidir=DIR           dvi documentation [DOCDIR]
-  --pdfdir=DIR           pdf documentation [DOCDIR]
-  --psdir=DIR            ps documentation [DOCDIR]
+  --bindir=DIR            user executables [EPREFIX/bin]
+  --sbindir=DIR           system admin executables [EPREFIX/sbin]
+  --libexecdir=DIR        program executables [EPREFIX/libexec]
+  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
+  --libdir=DIR            object code libraries [EPREFIX/lib]
+  --includedir=DIR        C header files [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
+  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
+  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
+  --infodir=DIR           info documentation [DATAROOTDIR/info]
+  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
+  --mandir=DIR            man documentation [DATAROOTDIR/man]
+  --docdir=DIR            documentation root [DATAROOTDIR/doc/edje]
+  --htmldir=DIR           html documentation [DOCDIR]
+  --dvidir=DIR            dvi documentation [DOCDIR]
+  --pdfdir=DIR            pdf documentation [DOCDIR]
+  --psdir=DIR             ps documentation [DOCDIR]
 _ACEOF
 
   cat <<\_ACEOF
@@ -1506,11 +1605,12 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of edje 0.9.92.062:";;
+     short | recursive ) echo "Configuration of edje 0.9.93.063:";;
    esac
   cat <<\_ACEOF
 
 Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --disable-dependency-tracking  speeds up one-time build
@@ -1520,10 +1620,14 @@ Optional Features:
   --enable-fast-install[=PKGS]
                           optimize for fast installation [default=yes]
   --disable-libtool-lock  avoid locking (might break parallel builds)
+  --enable-amalgamation   enable generation of one single file with all source
+                          code in it, helps compiler optimizations.
   --disable-edje-cc       disable building of edje_cc
   --enable-edje-program-cache
                           enable EDJE_PROGRAM_CACHE support.
                           [[default=disabled]]
+  --enable-edje-calc-cache
+                          enable EDJE_CALC_CACHE support. [[default=disabled]]
   --disable-doc           Disable documentation build [default=enabled]
 
 Optional Packages:
@@ -1547,6 +1651,8 @@ Some influential environment variables:
   PKG_CONFIG  path to pkg-config utility
   EVIL_CFLAGS C compiler flags for EVIL, overriding pkg-config
   EVIL_LIBS   linker flags for EVIL, overriding pkg-config
+  LUA_CFLAGS  C compiler flags for LUA, overriding pkg-config
+  LUA_LIBS    linker flags for LUA, overriding pkg-config
   EDJE_CFLAGS C compiler flags for EDJE, overriding pkg-config
   EDJE_LIBS   linker flags for EDJE, overriding pkg-config
   ECORE_IMF_CFLAGS
@@ -1573,15 +1679,17 @@ fi
 if test "$ac_init_help" = "recursive"; then
   # If there are subdirs, report their specific --help.
   for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" || continue
+    test -d "$ac_dir" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
+      continue
     ac_builddir=.
 
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -1617,7 +1725,7 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
       echo &&
       $SHELL "$ac_srcdir/configure" --help=recursive
     else
-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
     fi || ac_status=$?
     cd "$ac_pwd" || { ac_status=$?; break; }
   done
@@ -1626,11 +1734,11 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-edje configure 0.9.92.062
-generated by GNU Autoconf 2.61
+edje configure 0.9.93.063
+generated by GNU Autoconf 2.63
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1640,8 +1748,8 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by edje $as_me 0.9.92.062, which was
-generated by GNU Autoconf 2.61.  Invocation command line was
+It was created by edje $as_me 0.9.93.063, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
 
   $ $0 $@
 
@@ -1677,7 +1785,7 @@ for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
-  echo "PATH: $as_dir"
+  $as_echo "PATH: $as_dir"
 done
 IFS=$as_save_IFS
 
@@ -1712,7 +1820,7 @@ do
     | -silent | --silent | --silen | --sile | --sil)
       continue ;;
     *\'*)
-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
     esac
     case $ac_pass in
     1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
@@ -1764,11 +1872,12 @@ _ASBOX
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
       *) $as_unset $ac_var ;;
       esac ;;
     esac
@@ -1798,9 +1907,9 @@ _ASBOX
     do
       eval ac_val=\$$ac_var
       case $ac_val in
-      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
       esac
-      echo "$ac_var='\''$ac_val'\''"
+      $as_echo "$ac_var='\''$ac_val'\''"
     done | sort
     echo
 
@@ -1815,9 +1924,9 @@ _ASBOX
       do
 	eval ac_val=\$$ac_var
 	case $ac_val in
-	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
 	esac
-	echo "$ac_var='\''$ac_val'\''"
+	$as_echo "$ac_var='\''$ac_val'\''"
       done | sort
       echo
     fi
@@ -1833,8 +1942,8 @@ _ASBOX
       echo
     fi
     test "$ac_signal" != 0 &&
-      echo "$as_me: caught signal $ac_signal"
-    echo "$as_me: exit $exit_status"
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_echo "$as_me: exit $exit_status"
   } >&5
   rm -f core *.core core.conftest.* &&
     rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
@@ -1876,21 +1985,24 @@ _ACEOF
 
 
 # Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
 if test -n "$CONFIG_SITE"; then
-  set x "$CONFIG_SITE"
+  ac_site_file1=$CONFIG_SITE
 elif test "x$prefix" != xNONE; then
-  set x "$prefix/share/config.site" "$prefix/etc/config.site"
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
 else
-  set x "$ac_default_prefix/share/config.site" \
-	"$ac_default_prefix/etc/config.site"
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
 fi
-shift
-for ac_site_file
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
 do
+  test "x$ac_site_file" = xNONE && continue
   if test -r "$ac_site_file"; then
-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
+    { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
     sed 's/^/| /' "$ac_site_file" >&5
     . "$ac_site_file"
   fi
@@ -1900,16 +2012,16 @@ if test -r "$cache_file"; then
   # Some versions of bash will fail to source /dev/null (special
   # files actually), so we avoid doing that.
   if test -f "$cache_file"; then
-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
+    { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
     case $cache_file in
       [\\/]* | ?:[\\/]* ) . "$cache_file";;
       *)                      . "./$cache_file";;
     esac
   fi
 else
-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
+  { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5
+$as_echo "$as_me: creating cache $cache_file" >&6;}
   >$cache_file
 fi
 
@@ -1923,29 +2035,38 @@ for ac_var in $ac_precious_vars; do
   eval ac_new_val=\$ac_env_${ac_var}_value
   case $ac_old_set,$ac_new_set in
     set,)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,set)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+      { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
       ac_cache_corrupted=: ;;
     ,);;
     *)
       if test "x$ac_old_val" != "x$ac_new_val"; then
-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
-echo "$as_me:   former value:  $ac_old_val" >&2;}
-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
-echo "$as_me:   current value: $ac_new_val" >&2;}
-	ac_cache_corrupted=:
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:$LINENO:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:$LINENO:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
       fi;;
   esac
   # Pass precious variables to config.status.
   if test "$ac_new_set" = set; then
     case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
     *) ac_arg=$ac_var=$ac_new_val ;;
     esac
     case " $ac_configure_args " in
@@ -1955,10 +2076,12 @@ echo "$as_me:   current value: $ac_new_val" >&2;}
   fi
 done
 if $ac_cache_corrupted; then
-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+  { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
    { (exit 1); exit 1; }; }
 fi
 
@@ -1993,6 +2116,7 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+release="ver-svn-05"
 
 
 
@@ -2013,8 +2137,8 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
   fi
 done
 if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
-echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
+$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
    { (exit 1); exit 1; }; }
 fi
 
@@ -2029,34 +2153,34 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
-echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
+$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
    { (exit 1); exit 1; }; }
 
-{ echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
 if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_build_alias=$build_alias
 test "x$ac_build_alias" = x &&
   ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
 test "x$ac_build_alias" = x &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
    { (exit 1); exit 1; }; }
 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
 case $ac_cv_build in
 *-*-*) ;;
-*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
-echo "$as_me: error: invalid value of canonical build" >&2;}
+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
+$as_echo "$as_me: error: invalid value of canonical build" >&2;}
    { (exit 1); exit 1; }; };;
 esac
 build=$ac_cv_build
@@ -2073,27 +2197,27 @@ IFS=$ac_save_IFS
 case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
 
 
-{ echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
 if test "${ac_cv_host+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test "x$host_alias" = x; then
   ac_cv_host=$ac_cv_build
 else
   ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
-    { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
+    { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5
+$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;}
    { (exit 1); exit 1; }; }
 fi
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
 case $ac_cv_host in
 *-*-*) ;;
-*) { { echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
-echo "$as_me: error: invalid value of canonical host" >&2;}
+*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5
+$as_echo "$as_me: error: invalid value of canonical host" >&2;}
    { (exit 1); exit 1; }; };;
 esac
 host=$ac_cv_host
@@ -2118,10 +2242,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2134,7 +2258,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2145,11 +2269,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2158,10 +2282,10 @@ if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
@@ -2174,7 +2298,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2185,11 +2309,11 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_CC" = x; then
@@ -2197,12 +2321,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -2215,10 +2335,10 @@ if test -z "$CC"; then
           if test -n "$ac_tool_prefix"; then
     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2231,7 +2351,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2242,11 +2362,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2255,10 +2375,10 @@ fi
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2276,7 +2396,7 @@ do
        continue
      fi
     ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2299,11 +2419,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2314,10 +2434,10 @@ if test -z "$CC"; then
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -2330,7 +2450,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2341,11 +2461,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2358,10 +2478,10 @@ if test -z "$CC"; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
@@ -2374,7 +2494,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -2385,11 +2505,11 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -2401,12 +2521,8 @@ done
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -2416,44 +2532,50 @@ fi
 fi
 
 
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
 See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO: checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
 { (ac_try="$ac_compiler --version >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 { (ac_try="$ac_compiler -v >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 { (ac_try="$ac_compiler -V >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 
 cat >conftest.$ac_ext <<_ACEOF
@@ -2472,27 +2594,22 @@ main ()
 }
 _ACEOF
 ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
+ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
 # Try to create an executable without -o first, disregard a.out.
 # It will help us diagnose broken compilers, and finding out an intuition
 # of exeext.
-{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-#
-# List of possible output files, starting from the most likely.
-# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
-# only as a last resort.  b.out is created by i960 compilers.
-ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
-#
-# The IRIX 6 linker writes into existing files which may not be
-# executable, retaining their permissions.  Remove them first so a
-# subsequent execution test works.
+{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
 ac_rmfiles=
 for ac_file in $ac_files
 do
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
     * ) ac_rmfiles="$ac_rmfiles $ac_file";;
   esac
 done
@@ -2503,10 +2620,11 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link_default") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
 # So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
@@ -2517,7 +2635,7 @@ for ac_file in $ac_files ''
 do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
 	;;
     [ab].out )
 	# We found the default executable, but exeext='' is most
@@ -2544,25 +2662,27 @@ else
   ac_file=''
 fi
 
-{ echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
 if test -z "$ac_file"; then
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables
 See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
+$as_echo "$as_me: error: C compiler cannot create executables
 See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
+   { (exit 77); exit 77; }; }; }
 fi
 
 ac_exeext=$ac_cv_exeext
 
 # Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
 # FIXME: These cross compiler hacks should be removed for Autoconf 3.0
 # If not cross compiling, check that we can run a simple program.
 if test "$cross_compiling" != yes; then
@@ -2571,49 +2691,53 @@ if test "$cross_compiling" != yes; then
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
     cross_compiling=no
   else
     if test "$cross_compiling" = maybe; then
 	cross_compiling=yes
     else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs.
 If you meant to cross compile, use \`--host'.
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
+$as_echo "$as_me: error: cannot run C compiled programs.
 If you meant to cross compile, use \`--host'.
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
     fi
   fi
 fi
-{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
 # Check that the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
-{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
 
-{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
 if { (ac_try="$ac_link"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   # If both `conftest.exe' and `conftest' are `present' (well, observable)
 # catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
@@ -2622,31 +2746,33 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
 for ac_file in conftest.exe conftest conftest.*; do
   test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
 	  break;;
     * ) break;;
   esac
 done
 else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 fi
 
 rm -f conftest$ac_cv_exeext
-{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
 
 rm -f conftest.$ac_ext
 EXEEXT=$ac_cv_exeext
 ac_exeext=$EXEEXT
-{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
 if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2669,40 +2795,43 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   for ac_file in conftest.o conftest.obj conftest.*; do
   test -f "$ac_file" || continue;
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
 done
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
 See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
+$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 fi
 
 rm -f conftest.$ac_cv_objext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
 OBJEXT=$ac_cv_objext
 ac_objext=$OBJEXT
-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -2728,20 +2857,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_compiler_gnu=no
@@ -2751,15 +2881,19 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
-GCC=`test $ac_compiler_gnu = yes && echo yes`
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=$ac_c_werror_flag
    ac_c_werror_flag=yes
@@ -2786,20 +2920,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	CFLAGS=""
@@ -2824,20 +2959,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   :
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_c_werror_flag=$ac_save_c_werror_flag
@@ -2863,20 +2999,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
@@ -2891,8 +3028,8 @@ fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_c_werror_flag=$ac_save_c_werror_flag
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -2908,10 +3045,10 @@ else
     CFLAGS=
   fi
 fi
-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
 if test "${ac_cv_prog_cc_c89+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
@@ -2982,20 +3119,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_c89=$ac_arg
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
@@ -3011,15 +3149,15 @@ fi
 # AC_CACHE_VAL
 case "x$ac_cv_prog_cc_c89" in
   x)
-    { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
   xno)
-    { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
   *)
     CC="$CC $ac_cv_prog_cc_c89"
-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
 
@@ -3030,10 +3168,10 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-{ echo "$as_me:$LINENO: checking for library containing strerror" >&5
-echo $ECHO_N "checking for library containing strerror... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for library containing strerror" >&5
+$as_echo_n "checking for library containing strerror... " >&6; }
 if test "${ac_cv_search_strerror+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_func_search_save_LIBS=$LIBS
 cat >conftest.$ac_ext <<_ACEOF
@@ -3071,26 +3209,30 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_search_strerror=$ac_res
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext
   if test "${ac_cv_search_strerror+set}" = set; then
@@ -3105,8 +3247,8 @@ fi
 rm conftest.$ac_ext
 LIBS=$ac_func_search_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
-echo "${ECHO_T}$ac_cv_search_strerror" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5
+$as_echo "$ac_cv_search_strerror" >&6; }
 ac_res=$ac_cv_search_strerror
 if test "$ac_res" != no; then
   test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
@@ -3129,11 +3271,12 @@ am__api_version='1.10'
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # OS/2's system install, which has a completely different semantic
 # ./install, which can be erroneously created by make from ./install.sh.
-{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
 if test -z "$INSTALL"; then
 if test "${ac_cv_path_install+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
@@ -3162,17 +3305,29 @@ case $as_dir/ in
 	    # program-specific install script used by HP pwplus--don't use.
 	    :
 	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
 	  fi
 	fi
       done
     done
     ;;
 esac
+
 done
 IFS=$as_save_IFS
 
+rm -rf conftest.one conftest.two conftest.dir
 
 fi
   if test "${ac_cv_path_install+set}" = set; then
@@ -3185,8 +3340,8 @@ fi
     INSTALL=$ac_install_sh
   fi
 fi
-{ echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5
+$as_echo "$INSTALL" >&6; }
 
 # Use test -z because SunOS4 sh mishandles braces in ${var-val}.
 # It thinks the first close brace ends the variable substitution.
@@ -3196,8 +3351,8 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
 
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
-{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
 # Just in case
 sleep 1
 echo timestamp > conftest.file
@@ -3220,9 +3375,9 @@ if (
       # if, for instance, CONFIG_SHELL is bash and it inherits a
       # broken ls alias from the environment.  This has actually
       # happened.  Such a system could not be considered "sane".
-      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
+      { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
 alias in your environment" >&5
-echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
+$as_echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
 alias in your environment" >&2;}
    { (exit 1); exit 1; }; }
    fi
@@ -3233,26 +3388,23 @@ then
    # Ok.
    :
 else
-   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+   { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files!
 Check your system clock" >&5
-echo "$as_me: error: newly created file is older than distributed files!
+$as_echo "$as_me: error: newly created file is older than distributed files!
 Check your system clock" >&2;}
    { (exit 1); exit 1; }; }
 fi
-{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 test "$program_prefix" != NONE &&
   program_transform_name="s&^&$program_prefix&;$program_transform_name"
 # Use a double $ so make ignores it.
 test "$program_suffix" != NONE &&
   program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.  echo might interpret backslashes.
+# Double any \ or $.
 # By default was `s,x,x', remove it if useless.
-cat <<\_ACEOF >conftest.sed
-s/[\\$]/&&/g;s/;s,x,x,$//
-_ACEOF
-program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm -f conftest.sed
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
 
 # expand $ac_aux_dir to an absolute path
 am_aux_dir=`cd $ac_aux_dir && pwd`
@@ -3263,15 +3415,15 @@ if eval "$MISSING --run true"; then
   am_missing_run="$MISSING --run "
 else
   am_missing_run=
-  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
-echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+  { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
-{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
-echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
 if test -z "$MKDIR_P"; then
   if test "${ac_cv_path_mkdir+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
@@ -3306,8 +3458,8 @@ fi
     MKDIR_P="$ac_install_sh -d"
   fi
 fi
-{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
-echo "${ECHO_T}$MKDIR_P" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
 
 mkdir_p="$MKDIR_P"
 case $mkdir_p in
@@ -3319,10 +3471,10 @@ for ac_prog in gawk mawk nawk awk
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_AWK+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$AWK"; then
   ac_cv_prog_AWK="$AWK" # Let the user override the test.
@@ -3335,7 +3487,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AWK="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3346,22 +3498,23 @@ fi
 fi
 AWK=$ac_cv_prog_AWK
 if test -n "$AWK"; then
-  { echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
   test -n "$AWK" && break
 done
 
-{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
-set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
 if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.make <<\_ACEOF
 SHELL = /bin/sh
@@ -3378,12 +3531,12 @@ esac
 rm -f conftest.make
 fi
 if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
   SET_MAKE=
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
   SET_MAKE="MAKE=${MAKE-make}"
 fi
 
@@ -3408,8 +3561,8 @@ am__doit:
 .PHONY: am__doit
 END
 # If we don't find an include directive, just comment out the code.
-{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
 am__include="#"
 am__quote=
 _am_result=none
@@ -3436,8 +3589,8 @@ if test "$am__include" = "#"; then
 fi
 
 
-{ echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5
+$as_echo "$_am_result" >&6; }
 rm -f confinc confmf
 
 # Check whether --enable-dependency-tracking was given.
@@ -3464,8 +3617,8 @@ if test "`cd $srcdir && pwd`" != "`pwd`"; then
   am__isrc=' -I$(srcdir)'
   # test to see if srcdir already configured
   if test -f $srcdir/config.status; then
-    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
-echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+    { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
    { (exit 1); exit 1; }; }
   fi
 fi
@@ -3482,7 +3635,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='edje'
- VERSION='0.9.92.062'
+ VERSION='0.9.93.063'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3520,10 +3673,10 @@ if test "$cross_compiling" != no; then
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$STRIP"; then
   ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
@@ -3536,7 +3689,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3547,11 +3700,11 @@ fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  { echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -3560,10 +3713,10 @@ if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_STRIP"; then
   ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
@@ -3576,7 +3729,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3587,11 +3740,11 @@ fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_STRIP" = x; then
@@ -3599,12 +3752,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     STRIP=$ac_ct_STRIP
@@ -3629,10 +3778,10 @@ am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
 
 depcc="$CC"   am_compiler_list=
 
-{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
   # We make a subdir and do the tests there.  Otherwise we can end up
@@ -3720,8 +3869,8 @@ else
 fi
 
 fi
-{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
 CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
 
  if
@@ -3739,6 +3888,7 @@ fi
 ac_config_headers="$ac_config_headers config.h"
 
 
+
 enable_win32_dll=yes
 
 case $host in
@@ -3746,10 +3896,10 @@ case $host in
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
 set dummy ${ac_tool_prefix}as; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_AS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$AS"; then
   ac_cv_prog_AS="$AS" # Let the user override the test.
@@ -3762,7 +3912,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AS="${ac_tool_prefix}as"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3773,11 +3923,11 @@ fi
 fi
 AS=$ac_cv_prog_AS
 if test -n "$AS"; then
-  { echo "$as_me:$LINENO: result: $AS" >&5
-echo "${ECHO_T}$AS" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $AS" >&5
+$as_echo "$AS" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -3786,10 +3936,10 @@ if test -z "$ac_cv_prog_AS"; then
   ac_ct_AS=$AS
   # Extract the first word of "as", so it can be a program name with args.
 set dummy as; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_AS"; then
   ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
@@ -3802,7 +3952,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_AS="as"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3813,11 +3963,11 @@ fi
 fi
 ac_ct_AS=$ac_cv_prog_ac_ct_AS
 if test -n "$ac_ct_AS"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
-echo "${ECHO_T}$ac_ct_AS" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
+$as_echo "$ac_ct_AS" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_AS" = x; then
@@ -3825,12 +3975,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     AS=$ac_ct_AS
@@ -3842,10 +3988,10 @@ fi
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
 set dummy ${ac_tool_prefix}dlltool; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_DLLTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$DLLTOOL"; then
   ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
@@ -3858,7 +4004,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3869,11 +4015,11 @@ fi
 fi
 DLLTOOL=$ac_cv_prog_DLLTOOL
 if test -n "$DLLTOOL"; then
-  { echo "$as_me:$LINENO: result: $DLLTOOL" >&5
-echo "${ECHO_T}$DLLTOOL" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -3882,10 +4028,10 @@ if test -z "$ac_cv_prog_DLLTOOL"; then
   ac_ct_DLLTOOL=$DLLTOOL
   # Extract the first word of "dlltool", so it can be a program name with args.
 set dummy dlltool; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_DLLTOOL"; then
   ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
@@ -3898,7 +4044,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_DLLTOOL="dlltool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3909,11 +4055,11 @@ fi
 fi
 ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
 if test -n "$ac_ct_DLLTOOL"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
-echo "${ECHO_T}$ac_ct_DLLTOOL" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_DLLTOOL" = x; then
@@ -3921,12 +4067,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     DLLTOOL=$ac_ct_DLLTOOL
@@ -3938,10 +4080,10 @@ fi
   if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
 set dummy ${ac_tool_prefix}objdump; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_OBJDUMP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$OBJDUMP"; then
   ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
@@ -3954,7 +4096,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -3965,11 +4107,11 @@ fi
 fi
 OBJDUMP=$ac_cv_prog_OBJDUMP
 if test -n "$OBJDUMP"; then
-  { echo "$as_me:$LINENO: result: $OBJDUMP" >&5
-echo "${ECHO_T}$OBJDUMP" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -3978,10 +4120,10 @@ if test -z "$ac_cv_prog_OBJDUMP"; then
   ac_ct_OBJDUMP=$OBJDUMP
   # Extract the first word of "objdump", so it can be a program name with args.
 set dummy objdump; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OBJDUMP"; then
   ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
@@ -3994,7 +4136,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_OBJDUMP="objdump"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4005,11 +4147,11 @@ fi
 fi
 ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
 if test -n "$ac_ct_OBJDUMP"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
-echo "${ECHO_T}$ac_ct_OBJDUMP" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_OBJDUMP" = x; then
@@ -4017,12 +4159,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     OBJDUMP=$ac_ct_OBJDUMP
@@ -4056,14 +4194,14 @@ test -z "$OBJDUMP" && OBJDUMP=objdump
 
 case `pwd` in
   *\ * | *\	*)
-    { echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
-echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+    { $as_echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
 esac
 
 
 
-macro_version='2.2.4'
-macro_revision='1.2976'
+macro_version='2.2.6'
+macro_revision='1.3012'
 
 
 
@@ -4079,48 +4217,43 @@ macro_revision='1.2976'
 
 ltmain="$ac_aux_dir/ltmain.sh"
 
-{ echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
-echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
 if test "${ac_cv_path_SED+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
             ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
      for ac_i in 1 2 3 4 5 6 7; do
        ac_script="$ac_script$as_nl$ac_script"
      done
-     echo "$ac_script" | sed 99q >conftest.sed
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
      $as_unset ac_script || ac_script=
-     # Extract the first word of "sed gsed" to use in msg output
-if test -z "$SED"; then
-set dummy sed gsed; ac_prog_name=$2
-if test "${ac_cv_path_SED+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
+     if test -z "$SED"; then
   ac_path_SED_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_prog in sed gsed; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
-    # Check for GNU ac_path_SED and select it if it is found.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
   # Check for GNU $ac_path_SED
 case `"$ac_path_SED" --version 2>&1` in
 *GNU*)
   ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
 *)
   ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  $as_echo_n 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    echo '' >> "conftest.nl"
+    $as_echo '' >> "conftest.nl"
     "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
     ac_count=`expr $ac_count + 1`
@@ -4135,31 +4268,23 @@ case `"$ac_path_SED" --version 2>&1` in
   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-
-    $ac_path_SED_found && break 3
+      $ac_path_SED_found && break 3
+    done
   done
 done
-
-done
 IFS=$as_save_IFS
-
-
-fi
-
-SED="$ac_cv_path_SED"
-if test -z "$SED"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in \$PATH" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in \$PATH" >&2;}
+  if test -z "$ac_cv_path_SED"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5
+$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
-fi
-
+  fi
 else
   ac_cv_path_SED=$SED
 fi
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
-echo "${ECHO_T}$ac_cv_path_SED" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
  SED="$ac_cv_path_SED"
   rm -f conftest.sed
 
@@ -4176,42 +4301,37 @@ Xsed="$SED -e 1s/^X//"
 
 
 
-{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
-echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # Extract the first word of "grep ggrep" to use in msg output
-if test -z "$GREP"; then
-set dummy grep ggrep; ac_prog_name=$2
+{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
 if test "${ac_cv_path_GREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
+  if test -z "$GREP"; then
   ac_path_GREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_prog in grep ggrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-    # Check for GNU ac_path_GREP and select it if it is found.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
+# Check for GNU ac_path_GREP and select it if it is found.
   # Check for GNU $ac_path_GREP
 case `"$ac_path_GREP" --version 2>&1` in
 *GNU*)
   ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
 *)
   ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  $as_echo_n 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    echo 'GREP' >> "conftest.nl"
+    $as_echo 'GREP' >> "conftest.nl"
     "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
     ac_count=`expr $ac_count + 1`
@@ -4226,74 +4346,60 @@ case `"$ac_path_GREP" --version 2>&1` in
   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-
-    $ac_path_GREP_found && break 3
+      $ac_path_GREP_found && break 3
+    done
   done
 done
-
-done
 IFS=$as_save_IFS
-
-
-fi
-
-GREP="$ac_cv_path_GREP"
-if test -z "$GREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+  if test -z "$ac_cv_path_GREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
    { (exit 1); exit 1; }; }
-fi
-
+  fi
 else
   ac_cv_path_GREP=$GREP
 fi
 
-
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
-echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
  GREP="$ac_cv_path_GREP"
 
 
-{ echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
 if test "${ac_cv_path_EGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
    then ac_cv_path_EGREP="$GREP -E"
    else
-     # Extract the first word of "egrep" to use in msg output
-if test -z "$EGREP"; then
-set dummy egrep; ac_prog_name=$2
-if test "${ac_cv_path_EGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
+     if test -z "$EGREP"; then
   ac_path_EGREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_prog in egrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-    # Check for GNU ac_path_EGREP and select it if it is found.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
+# Check for GNU ac_path_EGREP and select it if it is found.
   # Check for GNU $ac_path_EGREP
 case `"$ac_path_EGREP" --version 2>&1` in
 *GNU*)
   ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
 *)
   ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  $as_echo_n 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    echo 'EGREP' >> "conftest.nl"
+    $as_echo 'EGREP' >> "conftest.nl"
     "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
     ac_count=`expr $ac_count + 1`
@@ -4308,75 +4414,61 @@ case `"$ac_path_EGREP" --version 2>&1` in
   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-
-    $ac_path_EGREP_found && break 3
+      $ac_path_EGREP_found && break 3
+    done
   done
 done
-
-done
 IFS=$as_save_IFS
-
-
-fi
-
-EGREP="$ac_cv_path_EGREP"
-if test -z "$EGREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+  if test -z "$ac_cv_path_EGREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
    { (exit 1); exit 1; }; }
-fi
-
+  fi
 else
   ac_cv_path_EGREP=$EGREP
 fi
 
-
    fi
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
-echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
  EGREP="$ac_cv_path_EGREP"
 
 
-{ echo "$as_me:$LINENO: checking for fgrep" >&5
-echo $ECHO_N "checking for fgrep... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
 if test "${ac_cv_path_FGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
    then ac_cv_path_FGREP="$GREP -F"
    else
-     # Extract the first word of "fgrep" to use in msg output
-if test -z "$FGREP"; then
-set dummy fgrep; ac_prog_name=$2
-if test "${ac_cv_path_FGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
+     if test -z "$FGREP"; then
   ac_path_FGREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  # Loop through the user's path and test for each of PROGNAME-LIST
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
 for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
 do
   IFS=$as_save_IFS
   test -z "$as_dir" && as_dir=.
   for ac_prog in fgrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
-    # Check for GNU ac_path_FGREP and select it if it is found.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
   # Check for GNU $ac_path_FGREP
 case `"$ac_path_FGREP" --version 2>&1` in
 *GNU*)
   ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
 *)
   ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
+  $as_echo_n 0123456789 >"conftest.in"
   while :
   do
     cat "conftest.in" "conftest.in" >"conftest.tmp"
     mv "conftest.tmp" "conftest.in"
     cp "conftest.in" "conftest.nl"
-    echo 'FGREP' >> "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
     "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
     diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
     ac_count=`expr $ac_count + 1`
@@ -4391,33 +4483,24 @@ case `"$ac_path_FGREP" --version 2>&1` in
   rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
 esac
 
-
-    $ac_path_FGREP_found && break 3
+      $ac_path_FGREP_found && break 3
+    done
   done
 done
-
-done
 IFS=$as_save_IFS
-
-
-fi
-
-FGREP="$ac_cv_path_FGREP"
-if test -z "$FGREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
+  if test -z "$ac_cv_path_FGREP"; then
+    { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
+$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
    { (exit 1); exit 1; }; }
-fi
-
+  fi
 else
   ac_cv_path_FGREP=$FGREP
 fi
 
-
    fi
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5
-echo "${ECHO_T}$ac_cv_path_FGREP" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
  FGREP="$ac_cv_path_FGREP"
 
 
@@ -4451,8 +4534,8 @@ fi
 ac_prog=ld
 if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
-  { echo "$as_me:$LINENO: checking for ld used by $CC" >&5
-echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -4481,14 +4564,14 @@ echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&6; }
     ;;
   esac
 elif test "$with_gnu_ld" = yes; then
-  { echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
 else
-  { echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
 fi
 if test "${lt_cv_path_LD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -z "$LD"; then
   lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
@@ -4518,19 +4601,19 @@ fi
 
 LD="$lt_cv_path_LD"
 if test -n "$LD"; then
-  { echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $LD" >&5
+$as_echo "$LD" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
    { (exit 1); exit 1; }; }
-{ echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
 if test "${lt_cv_prog_gnu_ld+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   # I'd rather use --version here, but apparently some GNU lds only accept -v.
 case `$LD -v 2>&1 </dev/null` in
@@ -4542,8 +4625,8 @@ case `$LD -v 2>&1 </dev/null` in
   ;;
 esac
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
 with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
@@ -4554,10 +4637,10 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
 
-{ echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
-echo $ECHO_N "checking for BSD- or MS-compatible name lister (nm)... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
 if test "${lt_cv_path_NM+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$NM"; then
   # Let the user override the test.
@@ -4603,8 +4686,8 @@ else
   : ${lt_cv_path_NM=no}
 fi
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
-echo "${ECHO_T}$lt_cv_path_NM" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
 if test "$lt_cv_path_NM" != "no"; then
   NM="$lt_cv_path_NM"
 else
@@ -4614,10 +4697,10 @@ else
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_DUMPBIN+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$DUMPBIN"; then
   ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
@@ -4630,7 +4713,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4641,11 +4724,11 @@ fi
 fi
 DUMPBIN=$ac_cv_prog_DUMPBIN
 if test -n "$DUMPBIN"; then
-  { echo "$as_me:$LINENO: result: $DUMPBIN" >&5
-echo "${ECHO_T}$DUMPBIN" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -4658,10 +4741,10 @@ if test -z "$DUMPBIN"; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_DUMPBIN"; then
   ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
@@ -4674,7 +4757,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -4685,11 +4768,11 @@ fi
 fi
 ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
 if test -n "$ac_ct_DUMPBIN"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
-echo "${ECHO_T}$ac_ct_DUMPBIN" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -4701,12 +4784,8 @@ done
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     DUMPBIN=$ac_ct_DUMPBIN
@@ -4725,45 +4804,45 @@ test -z "$NM" && NM=nm
 
 
 
-{ echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
-echo $ECHO_N "checking the name lister ($NM) interface... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
 if test "${lt_cv_nm_interface+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_nm_interface="BSD nm"
   echo "int some_variable = 0;" > conftest.$ac_ext
-  (eval echo "\"\$as_me:4735: $ac_compile\"" >&5)
+  (eval echo "\"\$as_me:4814: $ac_compile\"" >&5)
   (eval "$ac_compile" 2>conftest.err)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4738: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval echo "\"\$as_me:4817: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
   (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
   cat conftest.err >&5
-  (eval echo "\"\$as_me:4741: output\"" >&5)
+  (eval echo "\"\$as_me:4820: output\"" >&5)
   cat conftest.out >&5
   if $GREP 'External.*some_variable' conftest.out > /dev/null; then
     lt_cv_nm_interface="MS dumpbin"
   fi
   rm -f conftest*
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
-echo "${ECHO_T}$lt_cv_nm_interface" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
 
-{ echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
 LN_S=$as_ln_s
 if test "$LN_S" = "ln -s"; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
 fi
 
 # find the maximum length of command line arguments
-{ echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
-echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
 if test "${lt_cv_sys_max_cmd_len+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
     i=0
   teststring="ABCD"
@@ -4880,11 +4959,11 @@ else
 fi
 
 if test -n $lt_cv_sys_max_cmd_len ; then
-  { echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
-echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
 else
-  { echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6; }
+  { $as_echo "$as_me:$LINENO: result: none" >&5
+$as_echo "none" >&6; }
 fi
 max_cmd_len=$lt_cv_sys_max_cmd_len
 
@@ -4897,8 +4976,8 @@ max_cmd_len=$lt_cv_sys_max_cmd_len
 : ${MV="mv -f"}
 : ${RM="rm -f"}
 
-{ echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
-echo $ECHO_N "checking whether the shell understands some XSI constructs... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
 # Try some XSI features
 xsi_shell=no
 ( _lt_dummy="a/b/c"
@@ -4907,18 +4986,18 @@ xsi_shell=no
     && eval 'test $(( 1 + 1 )) -eq 2 \
     && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
   && xsi_shell=yes
-{ echo "$as_me:$LINENO: result: $xsi_shell" >&5
-echo "${ECHO_T}$xsi_shell" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
 
 
-{ echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
-echo $ECHO_N "checking whether the shell understands \"+=\"... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
 lt_shell_append=no
 ( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
     >/dev/null 2>&1 \
   && lt_shell_append=yes
-{ echo "$as_me:$LINENO: result: $lt_shell_append" >&5
-echo "${ECHO_T}$lt_shell_append" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
 
 
 if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
@@ -4952,15 +5031,15 @@ esac
 
 
 
-{ echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
 if test "${lt_cv_ld_reload_flag+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_ld_reload_flag='-r'
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
 reload_flag=$lt_cv_ld_reload_flag
 case $reload_flag in
 "" | " "*) ;;
@@ -4986,10 +5065,10 @@ esac
 
 
 
-{ echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
-echo $ECHO_N "checking how to recognize dependent libraries... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
 if test "${lt_cv_deplibs_check_method+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_file_magic_cmd='$MAGIC_CMD'
 lt_cv_file_magic_test_file=
@@ -5176,8 +5255,8 @@ tpf*)
 esac
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
 file_magic_cmd=$lt_cv_file_magic_cmd
 deplibs_check_method=$lt_cv_deplibs_check_method
 test -z "$deplibs_check_method" && deplibs_check_method=unknown
@@ -5196,10 +5275,10 @@ test -z "$deplibs_check_method" && deplibs_check_method=unknown
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ar; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_AR+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$AR"; then
   ac_cv_prog_AR="$AR" # Let the user override the test.
@@ -5212,7 +5291,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_AR="${ac_tool_prefix}ar"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5223,11 +5302,11 @@ fi
 fi
 AR=$ac_cv_prog_AR
 if test -n "$AR"; then
-  { echo "$as_me:$LINENO: result: $AR" >&5
-echo "${ECHO_T}$AR" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $AR" >&5
+$as_echo "$AR" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -5236,10 +5315,10 @@ if test -z "$ac_cv_prog_AR"; then
   ac_ct_AR=$AR
   # Extract the first word of "ar", so it can be a program name with args.
 set dummy ar; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_AR"; then
   ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
@@ -5252,7 +5331,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_AR="ar"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5263,11 +5342,11 @@ fi
 fi
 ac_ct_AR=$ac_cv_prog_ac_ct_AR
 if test -n "$ac_ct_AR"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
-echo "${ECHO_T}$ac_ct_AR" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_AR" = x; then
@@ -5275,12 +5354,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     AR=$ac_ct_AR
@@ -5305,10 +5380,10 @@ test -z "$AR_FLAGS" && AR_FLAGS=cru
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$STRIP"; then
   ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
@@ -5321,7 +5396,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5332,11 +5407,11 @@ fi
 fi
 STRIP=$ac_cv_prog_STRIP
 if test -n "$STRIP"; then
-  { echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -5345,10 +5420,10 @@ if test -z "$ac_cv_prog_STRIP"; then
   ac_ct_STRIP=$STRIP
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_STRIP"; then
   ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
@@ -5361,7 +5436,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_STRIP="strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5372,11 +5447,11 @@ fi
 fi
 ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
 if test -n "$ac_ct_STRIP"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_STRIP" = x; then
@@ -5384,12 +5459,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     STRIP=$ac_ct_STRIP
@@ -5408,10 +5479,10 @@ test -z "$STRIP" && STRIP=:
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$RANLIB"; then
   ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
@@ -5424,7 +5495,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5435,11 +5506,11 @@ fi
 fi
 RANLIB=$ac_cv_prog_RANLIB
 if test -n "$RANLIB"; then
-  { echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -5448,10 +5519,10 @@ if test -z "$ac_cv_prog_RANLIB"; then
   ac_ct_RANLIB=$RANLIB
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_RANLIB"; then
   ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
@@ -5464,7 +5535,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_RANLIB="ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -5475,11 +5546,11 @@ fi
 fi
 ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
 if test -n "$ac_ct_RANLIB"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_RANLIB" = x; then
@@ -5487,12 +5558,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     RANLIB=$ac_ct_RANLIB
@@ -5569,10 +5636,10 @@ compiler=$CC
 
 
 # Check for command to grab the raw symbol name followed by C symbol from nm.
-{ echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
-echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
 if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
 
 # These are sane defaults that work on at least a few old systems.
@@ -5690,14 +5757,14 @@ _LT_EOF
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
     # Now try to grab the symbols.
     nlist=conftest.nm
     if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
   (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && test -s "$nlist"; then
       # Try sorting and uniquifying the output.
       if sort "$nlist" | uniq > "$nlist"T; then
@@ -5754,7 +5821,7 @@ _LT_EOF
 	  if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && test -s conftest${ac_exeext}; then
 	    pipe_works=yes
 	  fi
@@ -5789,11 +5856,11 @@ if test -z "$lt_cv_sys_global_symbol_pipe"; then
   lt_cv_sys_global_symbol_to_cdecl=
 fi
 if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
-  { echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6; }
+  { $as_echo "$as_me:$LINENO: result: failed" >&5
+$as_echo "failed" >&6; }
 else
-  { echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6; }
+  { $as_echo "$as_me:$LINENO: result: ok" >&5
+$as_echo "ok" >&6; }
 fi
 
 
@@ -5833,7 +5900,7 @@ ia64-*-hpux*)
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
     case `/usr/bin/file conftest.$ac_objext` in
       *ELF-32*)
@@ -5848,11 +5915,11 @@ ia64-*-hpux*)
   ;;
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 5851 "configure"' > conftest.$ac_ext
+  echo '#line 5918 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
     if test "$lt_cv_prog_gnu_ld" = yes; then
       case `/usr/bin/file conftest.$ac_objext` in
@@ -5890,7 +5957,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
     case `/usr/bin/file conftest.o` in
       *32-bit*)
@@ -5940,10 +6007,10 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
-  { echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
 if test "${lt_cv_cc_needs_belf+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5972,26 +6039,30 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   lt_cv_cc_needs_belf=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	lt_cv_cc_needs_belf=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
      ac_ext=c
@@ -6001,8 +6072,8 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
   if test x"$lt_cv_cc_needs_belf" != x"yes"; then
     # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
     CFLAGS="$SAVE_CFLAGS"
@@ -6014,7 +6085,7 @@ sparc*-*solaris*)
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
     case `/usr/bin/file conftest.o` in
     *64-bit*)
@@ -6041,10 +6112,10 @@ need_locks="$enable_libtool_lock"
     if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
 set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_DSYMUTIL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$DSYMUTIL"; then
   ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
@@ -6057,7 +6128,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6068,11 +6139,11 @@ fi
 fi
 DSYMUTIL=$ac_cv_prog_DSYMUTIL
 if test -n "$DSYMUTIL"; then
-  { echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
-echo "${ECHO_T}$DSYMUTIL" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -6081,10 +6152,10 @@ if test -z "$ac_cv_prog_DSYMUTIL"; then
   ac_ct_DSYMUTIL=$DSYMUTIL
   # Extract the first word of "dsymutil", so it can be a program name with args.
 set dummy dsymutil; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_DSYMUTIL"; then
   ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
@@ -6097,7 +6168,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6108,11 +6179,11 @@ fi
 fi
 ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
 if test -n "$ac_ct_DSYMUTIL"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
-echo "${ECHO_T}$ac_ct_DSYMUTIL" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_DSYMUTIL" = x; then
@@ -6120,12 +6191,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     DSYMUTIL=$ac_ct_DSYMUTIL
@@ -6137,10 +6204,10 @@ fi
     if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
 set dummy ${ac_tool_prefix}nmedit; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_NMEDIT+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$NMEDIT"; then
   ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
@@ -6153,7 +6220,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6164,11 +6231,11 @@ fi
 fi
 NMEDIT=$ac_cv_prog_NMEDIT
 if test -n "$NMEDIT"; then
-  { echo "$as_me:$LINENO: result: $NMEDIT" >&5
-echo "${ECHO_T}$NMEDIT" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -6177,10 +6244,10 @@ if test -z "$ac_cv_prog_NMEDIT"; then
   ac_ct_NMEDIT=$NMEDIT
   # Extract the first word of "nmedit", so it can be a program name with args.
 set dummy nmedit; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_NMEDIT"; then
   ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
@@ -6193,7 +6260,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_NMEDIT="nmedit"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6204,11 +6271,11 @@ fi
 fi
 ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
 if test -n "$ac_ct_NMEDIT"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
-echo "${ECHO_T}$ac_ct_NMEDIT" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_NMEDIT" = x; then
@@ -6216,12 +6283,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     NMEDIT=$ac_ct_NMEDIT
@@ -6233,10 +6296,10 @@ fi
     if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
 set dummy ${ac_tool_prefix}lipo; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_LIPO+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$LIPO"; then
   ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
@@ -6249,7 +6312,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6260,11 +6323,11 @@ fi
 fi
 LIPO=$ac_cv_prog_LIPO
 if test -n "$LIPO"; then
-  { echo "$as_me:$LINENO: result: $LIPO" >&5
-echo "${ECHO_T}$LIPO" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -6273,10 +6336,10 @@ if test -z "$ac_cv_prog_LIPO"; then
   ac_ct_LIPO=$LIPO
   # Extract the first word of "lipo", so it can be a program name with args.
 set dummy lipo; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_LIPO"; then
   ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
@@ -6289,7 +6352,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_LIPO="lipo"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6300,11 +6363,11 @@ fi
 fi
 ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
 if test -n "$ac_ct_LIPO"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5
-echo "${ECHO_T}$ac_ct_LIPO" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_LIPO" = x; then
@@ -6312,12 +6375,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     LIPO=$ac_ct_LIPO
@@ -6329,10 +6388,10 @@ fi
     if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
 set dummy ${ac_tool_prefix}otool; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_OTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$OTOOL"; then
   ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
@@ -6345,7 +6404,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6356,11 +6415,11 @@ fi
 fi
 OTOOL=$ac_cv_prog_OTOOL
 if test -n "$OTOOL"; then
-  { echo "$as_me:$LINENO: result: $OTOOL" >&5
-echo "${ECHO_T}$OTOOL" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -6369,10 +6428,10 @@ if test -z "$ac_cv_prog_OTOOL"; then
   ac_ct_OTOOL=$OTOOL
   # Extract the first word of "otool", so it can be a program name with args.
 set dummy otool; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OTOOL"; then
   ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
@@ -6385,7 +6444,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_OTOOL="otool"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6396,11 +6455,11 @@ fi
 fi
 ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
 if test -n "$ac_ct_OTOOL"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5
-echo "${ECHO_T}$ac_ct_OTOOL" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_OTOOL" = x; then
@@ -6408,12 +6467,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     OTOOL=$ac_ct_OTOOL
@@ -6425,10 +6480,10 @@ fi
     if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
 set dummy ${ac_tool_prefix}otool64; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_OTOOL64+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$OTOOL64"; then
   ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
@@ -6441,7 +6496,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6452,11 +6507,11 @@ fi
 fi
 OTOOL64=$ac_cv_prog_OTOOL64
 if test -n "$OTOOL64"; then
-  { echo "$as_me:$LINENO: result: $OTOOL64" >&5
-echo "${ECHO_T}$OTOOL64" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -6465,10 +6520,10 @@ if test -z "$ac_cv_prog_OTOOL64"; then
   ac_ct_OTOOL64=$OTOOL64
   # Extract the first word of "otool64", so it can be a program name with args.
 set dummy otool64; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_OTOOL64"; then
   ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
@@ -6481,7 +6536,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_OTOOL64="otool64"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -6492,11 +6547,11 @@ fi
 fi
 ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
 if test -n "$ac_ct_OTOOL64"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5
-echo "${ECHO_T}$ac_ct_OTOOL64" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_OTOOL64" = x; then
@@ -6504,12 +6559,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     OTOOL64=$ac_ct_OTOOL64
@@ -6544,10 +6595,10 @@ fi
 
 
 
-    { echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
-echo $ECHO_N "checking for -single_module linker flag... $ECHO_C" >&6; }
+    { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
 if test "${lt_cv_apple_cc_single_mod+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_apple_cc_single_mod=no
       if test -z "${LT_MULTI_MODULE}"; then
@@ -6571,12 +6622,12 @@ else
 	rm -f conftest.*
       fi
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
-echo "${ECHO_T}$lt_cv_apple_cc_single_mod" >&6; }
-    { echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
-echo $ECHO_N "checking for -exported_symbols_list linker flag... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+    { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
 if test "${lt_cv_ld_exported_symbols_list+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_ld_exported_symbols_list=no
       save_LDFLAGS=$LDFLAGS
@@ -6603,33 +6654,37 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   lt_cv_ld_exported_symbols_list=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	lt_cv_ld_exported_symbols_list=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 	LDFLAGS="$save_LDFLAGS"
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
-echo "${ECHO_T}$lt_cv_ld_exported_symbols_list" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
     case $host_os in
     rhapsody* | darwin1.[012])
       _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
@@ -6670,15 +6725,15 @@ ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
 fi
 if test -z "$CPP"; then
   if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
       # Double quotes because CPP needs to be expanded
     for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
@@ -6710,20 +6765,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        }; then
   :
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
   # Broken: fails on valid input.
@@ -6747,13 +6803,14 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
@@ -6761,7 +6818,7 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
   # Broken: success on invalid input.
 continue
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
   # Passes both tests.
@@ -6786,8 +6843,8 @@ fi
 else
   ac_cv_prog_CPP=$CPP
 fi
-{ echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $CPP" >&5
+$as_echo "$CPP" >&6; }
 ac_preproc_ok=false
 for ac_c_preproc_warn_flag in '' yes
 do
@@ -6815,20 +6872,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        }; then
   :
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
   # Broken: fails on valid input.
@@ -6852,13 +6910,14 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
@@ -6866,7 +6925,7 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
   # Broken: success on invalid input.
 continue
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
   # Passes both tests.
@@ -6882,11 +6941,13 @@ rm -f conftest.err conftest.$ac_ext
 if $ac_preproc_ok; then
   :
 else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+  { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
 See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 fi
 
 ac_ext=c
@@ -6896,10 +6957,10 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
-{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -6926,20 +6987,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_header_stdc=no
@@ -7031,37 +7093,40 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
   { (case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   :
 else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
+rm -rf conftest.dSYM
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
 
 fi
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -7083,11 +7148,11 @@ fi
 for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
 		  inttypes.h stdint.h unistd.h
 do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
 if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -7105,20 +7170,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	eval "$as_ac_Header=no"
@@ -7126,12 +7192,15 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -7142,11 +7211,11 @@ done
 
 for ac_header in dlfcn.h
 do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
 if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -7164,20 +7233,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   eval "$as_ac_Header=yes"
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	eval "$as_ac_Header=no"
@@ -7185,12 +7255,15 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -7368,10 +7441,10 @@ if test -n "${ZSH_VERSION+set}" ; then
    setopt NO_GLOB_SUBST
 fi
 
-{ echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
 if test "${lt_cv_objdir+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   rm -f .libs 2>/dev/null
 mkdir .libs 2>/dev/null
@@ -7383,8 +7456,8 @@ else
 fi
 rmdir .libs 2>/dev/null
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
-echo "${ECHO_T}$lt_cv_objdir" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
 objdir=$lt_cv_objdir
 
 
@@ -7476,10 +7549,10 @@ test -z "$MAGIC_CMD" && MAGIC_CMD=file
 case $deplibs_check_method in
 file_magic*)
   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-    { echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6; }
+    { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
@@ -7529,11 +7602,11 @@ fi
 
 MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
 if test -n "$MAGIC_CMD"; then
-  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -7542,10 +7615,10 @@ fi
 
 if test -z "$lt_cv_path_MAGIC_CMD"; then
   if test -n "$ac_tool_prefix"; then
-    { echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6; }
+    { $as_echo "$as_me:$LINENO: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
 if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   case $MAGIC_CMD in
 [\\/*] |  ?:[\\/]*)
@@ -7595,11 +7668,11 @@ fi
 
 MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
 if test -n "$MAGIC_CMD"; then
-  { echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -7679,10 +7752,10 @@ lt_prog_compiler_no_builtin_flag=
 if test "$GCC" = yes; then
   lt_prog_compiler_no_builtin_flag=' -fno-builtin'
 
-  { echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
 if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_rtti_exceptions=no
    ac_outfile=conftest.$ac_objext
@@ -7697,11 +7770,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:7700: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:7773: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:7704: \$? = $ac_status" >&5
+   echo "$as_me:7777: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -7714,8 +7787,8 @@ else
    $RM conftest*
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
 
 if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
     lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
@@ -7734,8 +7807,8 @@ fi
 lt_prog_compiler_pic=
 lt_prog_compiler_static=
 
-{ echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
 
   if test "$GCC" = yes; then
     lt_prog_compiler_wl='-Wl,'
@@ -7991,8 +8064,8 @@ case $host_os in
     lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
     ;;
 esac
-{ echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
-echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+$as_echo "$lt_prog_compiler_pic" >&6; }
 
 
 
@@ -8003,10 +8076,10 @@ echo "${ECHO_T}$lt_prog_compiler_pic" >&6; }
 # Check to make sure the PIC flag actually works.
 #
 if test -n "$lt_prog_compiler_pic"; then
-  { echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
 if test "${lt_cv_prog_compiler_pic_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_pic_works=no
    ac_outfile=conftest.$ac_objext
@@ -8021,11 +8094,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8024: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8097: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>conftest.err)
    ac_status=$?
    cat conftest.err >&5
-   echo "$as_me:8028: \$? = $ac_status" >&5
+   echo "$as_me:8101: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s "$ac_outfile"; then
      # The compiler can only warn and ignore the option if not recognized
      # So say no if there are warnings other than the usual output.
@@ -8038,8 +8111,8 @@ else
    $RM conftest*
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_pic_works" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
 
 if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
     case $lt_prog_compiler_pic in
@@ -8062,10 +8135,10 @@ fi
 # Check to make sure the static flag actually works.
 #
 wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
-{ echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
 if test "${lt_cv_prog_compiler_static_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_static_works=no
    save_LDFLAGS="$LDFLAGS"
@@ -8090,8 +8163,8 @@ else
    LDFLAGS="$save_LDFLAGS"
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_static_works" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
 
 if test x"$lt_cv_prog_compiler_static_works" = xyes; then
     :
@@ -8105,10 +8178,10 @@ fi
 
 
 
-  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
 if test "${lt_cv_prog_compiler_c_o+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_c_o=no
    $RM -r conftest 2>/dev/null
@@ -8126,11 +8199,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8129: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8202: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8133: \$? = $ac_status" >&5
+   echo "$as_me:8206: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -8152,18 +8225,18 @@ else
    $RM conftest*
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
 
 
 
-  { echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
 if test "${lt_cv_prog_compiler_c_o+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   lt_cv_prog_compiler_c_o=no
    $RM -r conftest 2>/dev/null
@@ -8181,11 +8254,11 @@ else
    -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
    -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
    -e 's:$: $lt_compiler_flag:'`
-   (eval echo "\"\$as_me:8184: $lt_compile\"" >&5)
+   (eval echo "\"\$as_me:8257: $lt_compile\"" >&5)
    (eval "$lt_compile" 2>out/conftest.err)
    ac_status=$?
    cat out/conftest.err >&5
-   echo "$as_me:8188: \$? = $ac_status" >&5
+   echo "$as_me:8261: \$? = $ac_status" >&5
    if (exit $ac_status) && test -s out/conftest2.$ac_objext
    then
      # The compiler can only warn and ignore the option if not recognized
@@ -8207,8 +8280,8 @@ else
    $RM conftest*
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
-echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
 
 
 
@@ -8216,19 +8289,19 @@ echo "${ECHO_T}$lt_cv_prog_compiler_c_o" >&6; }
 hard_links="nottested"
 if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
   # do not overwrite the value of need_locks provided by the user
-  { echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
   hard_links=yes
   $RM conftest*
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
   touch conftest.a
   ln conftest.a conftest.b 2>&5 || hard_links=no
   ln conftest.a conftest.b 2>/dev/null && hard_links=no
-  { echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
   if test "$hard_links" = no; then
-    { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
     need_locks=warn
   fi
 else
@@ -8240,8 +8313,8 @@ fi
 
 
 
-  { echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
 
   runpath_var=
   allow_undefined_flag=
@@ -8700,18 +8773,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
 
 lt_aix_libpath_sed='
     /Import File Strings/,/^$/ {
@@ -8726,12 +8802,13 @@ if test -z "$aix_libpath"; then
   aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
 fi
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
@@ -8767,18 +8844,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
 
 lt_aix_libpath_sed='
     /Import File Strings/,/^$/ {
@@ -8793,12 +8873,13 @@ if test -z "$aix_libpath"; then
   aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
 fi
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
@@ -9017,27 +9098,31 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && $ECHO "X${wl}-set_version ${wl}$verstring" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
 
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
         LDFLAGS="$save_LDFLAGS"
@@ -9295,8 +9380,8 @@ rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
     fi
   fi
 
-{ echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
 test "$ld_shlibs" = no && can_build_shared=no
 
 with_gnu_ld=$with_gnu_ld
@@ -9332,15 +9417,15 @@ x|xyes)
       # Test whether the compiler implicitly links with -lc since on some
       # systems, -lgcc has to come before -lc. If gcc already passes -lc
       # to ld, don't add -lc before -lgcc.
-      { echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6; }
+      { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
       $RM conftest*
       echo "$lt_simple_compile_test_code" > conftest.$ac_ext
 
       if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } 2>conftest.err; then
         soname=conftest
         lib=conftest
@@ -9358,7 +9443,7 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&
         if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5
   (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
         then
 	  archive_cmds_need_lc=no
@@ -9370,8 +9455,8 @@ echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&
         cat conftest.err 1>&5
       fi
       $RM conftest*
-      { echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
-echo "${ECHO_T}$archive_cmds_need_lc" >&6; }
+      { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+$as_echo "$archive_cmds_need_lc" >&6; }
       ;;
     esac
   fi
@@ -9534,8 +9619,8 @@ esac
 
 
 
-  { echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
 
 if test "$GCC" = yes; then
   case $host_os in
@@ -9977,29 +10062,33 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then
   shlibpath_overrides_runpath=yes
 fi
 
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
   LDFLAGS=$save_LDFLAGS
@@ -10225,8 +10314,8 @@ uts4*)
   dynamic_linker=no
   ;;
 esac
-{ echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
 test "$dynamic_linker" = no && can_build_shared=no
 
 variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
@@ -10327,8 +10416,8 @@ fi
 
 
 
-  { echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
 hardcode_action=
 if test -n "$hardcode_libdir_flag_spec" ||
    test -n "$runpath_var" ||
@@ -10352,8 +10441,8 @@ else
   # directories.
   hardcode_action=unsupported
 fi
-{ echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
 
 if test "$hardcode_action" = relink ||
    test "$inherit_rpath" = yes; then
@@ -10397,10 +10486,10 @@ else
 
   darwin*)
   # if libdl is installed we need to link against it
-    { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+    { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldl  $LIBS"
@@ -10432,33 +10521,37 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_lib_dl_dlopen=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_lib_dl_dlopen=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
-if test $ac_cv_lib_dl_dlopen = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
 
@@ -10471,10 +10564,10 @@ fi
     ;;
 
   *)
-    { echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6; }
+    { $as_echo "$as_me:$LINENO: checking for shl_load" >&5
+$as_echo_n "checking for shl_load... " >&6; }
 if test "${ac_cv_func_shl_load+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10527,38 +10620,42 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_func_shl_load=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_func_shl_load=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6; }
-if test $ac_cv_func_shl_load = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+$as_echo "$ac_cv_func_shl_load" >&6; }
+if test "x$ac_cv_func_shl_load" = x""yes; then
   lt_cv_dlopen="shl_load"
 else
-  { echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
 if test "${ac_cv_lib_dld_shl_load+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldld  $LIBS"
@@ -10590,39 +10687,43 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_lib_dld_shl_load=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_lib_dld_shl_load=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6; }
-if test $ac_cv_lib_dld_shl_load = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = x""yes; then
   lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
 else
-  { echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for dlopen" >&5
+$as_echo_n "checking for dlopen... " >&6; }
 if test "${ac_cv_func_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -10675,38 +10776,42 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_func_dlopen=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_func_dlopen=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6; }
-if test $ac_cv_func_dlopen = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+$as_echo "$ac_cv_func_dlopen" >&6; }
+if test "x$ac_cv_func_dlopen" = x""yes; then
   lt_cv_dlopen="dlopen"
 else
-  { echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
 if test "${ac_cv_lib_dl_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldl  $LIBS"
@@ -10738,39 +10843,43 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_lib_dl_dlopen=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_lib_dl_dlopen=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6; }
-if test $ac_cv_lib_dl_dlopen = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = x""yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
 else
-  { echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
 if test "${ac_cv_lib_svld_dlopen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-lsvld  $LIBS"
@@ -10802,39 +10911,43 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_lib_svld_dlopen=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_lib_svld_dlopen=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6; }
-if test $ac_cv_lib_svld_dlopen = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = x""yes; then
   lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
 else
-  { echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
 if test "${ac_cv_lib_dld_dld_link+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_check_lib_save_LIBS=$LIBS
 LIBS="-ldld  $LIBS"
@@ -10866,33 +10979,37 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_lib_dld_dld_link=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_lib_dld_dld_link=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 LIBS=$ac_check_lib_save_LIBS
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6; }
-if test $ac_cv_lib_dld_dld_link = yes; then
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = x""yes; then
   lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
 fi
 
@@ -10931,10 +11048,10 @@ fi
     save_LIBS="$LIBS"
     LIBS="$lt_cv_dlopen_libs $LIBS"
 
-    { echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6; }
+    { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
 if test "${lt_cv_dlopen_self+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   	  if test "$cross_compiling" = yes; then :
   lt_cv_dlopen_self=cross
@@ -10942,7 +11059,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 10945 "configure"
+#line 11062 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11008,7 +11125,7 @@ _LT_EOF
   if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
@@ -11026,15 +11143,15 @@ rm -fr conftest*
 
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
 
     if test "x$lt_cv_dlopen_self" = xyes; then
       wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-      { echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6; }
+      { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
 if test "${lt_cv_dlopen_self_static+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   	  if test "$cross_compiling" = yes; then :
   lt_cv_dlopen_self_static=cross
@@ -11042,7 +11159,7 @@ else
   lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<_LT_EOF
-#line 11045 "configure"
+#line 11162 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -11108,7 +11225,7 @@ _LT_EOF
   if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
   (eval $ac_link) 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
     (./conftest; exit; ) >&5 2>/dev/null
     lt_status=$?
@@ -11126,8 +11243,8 @@ rm -fr conftest*
 
 
 fi
-{ echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
     fi
 
     CPPFLAGS="$save_CPPFLAGS"
@@ -11165,13 +11282,13 @@ fi
 
 striplib=
 old_striplib=
-{ echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
 if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
   test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
   test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 else
 # FIXME - insert some real tests, host_os isn't really good enough
   case $host_os in
@@ -11179,16 +11296,16 @@ else
     if test -n "$STRIP" ; then
       striplib="$STRIP -x"
       old_striplib="$STRIP -S"
-      { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+      { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
     else
-      { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+      { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
     fi
     ;;
   *)
-    { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+    { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
     ;;
   esac
 fi
@@ -11205,13 +11322,13 @@ fi
 
 
   # Report which library types will actually be built
-  { echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6; }
-  { echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6; }
+  { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
 
-  { echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
   test "$can_build_shared" = "no" && enable_shared=no
 
   # On AIX, shared libraries and static libraries use the same namespace, and
@@ -11231,15 +11348,15 @@ echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6; }
     fi
     ;;
   esac
-  { echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
 
-  { echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
   # Make sure either enable_shared or enable_static is yes.
   test "$enable_shared" = yes || enable_static=yes
-  { echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
 
 
 
@@ -11281,7 +11398,6 @@ SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
 version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
 
 
-release="ver-svn-03"
 case "$host_os" in
    mingw32ce* | cegcc*)
       ;;
@@ -11305,13 +11421,33 @@ case "$host_os" in
       ;;
 esac
 
-want_edje_program_cache="no"
-
 requirement_edje=""
 
 
 ### Additional options to configure
 
+# Check whether --enable-amalgamation was given.
+if test "${enable_amalgamation+set}" = set; then
+  enableval=$enable_amalgamation; if test "x${enableval}" = "xyes"; then
+       do_amalgamation="yes"
+    else
+       do_amalgamation="no"
+    fi
+
+else
+  do_amalgamation="no"
+
+fi
+
+ if test "x${do_amalgamation}" = "xyes"; then
+  EDJE_AMALGAMATION_TRUE=
+  EDJE_AMALGAMATION_FALSE='#'
+else
+  EDJE_AMALGAMATION_TRUE='#'
+  EDJE_AMALGAMATION_FALSE=
+fi
+
+
 # Check whether --enable-edje-cc was given.
 if test "${enable_edje_cc+set}" = set; then
   enableval=$enable_edje_cc;
@@ -11324,10 +11460,10 @@ if test "${enable_edje_cc+set}" = set; then
 
 fi
 
-{ echo "$as_me:$LINENO: checking whether to build edje_cc" >&5
-echo $ECHO_N "checking whether to build edje_cc... $ECHO_C" >&6; }
-{ echo "$as_me:$LINENO: result: ${have_edje_cc}" >&5
-echo "${ECHO_T}${have_edje_cc}" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether to build edje_cc" >&5
+$as_echo_n "checking whether to build edje_cc... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: ${have_edje_cc}" >&5
+$as_echo "${have_edje_cc}" >&6; }
 
  if test "x${have_edje_cc}" = "xyes"; then
   BUILD_EDJE_CC_TRUE=
@@ -11359,6 +11495,8 @@ fi
 
 
 # Optional EDJE_PROGRAM_CACHE (use much more ram, but increase speed in some cases)
+want_edje_program_cache="no"
+
 # Check whether --enable-edje-program-cache was given.
 if test "${enable_edje_program_cache+set}" = set; then
   enableval=$enable_edje_program_cache; want_edje_program_cache=$enableval
@@ -11382,6 +11520,32 @@ _ACEOF
 
 fi
 
+# Optional EDJE_CALC_CACHE (use more ram, but increase speed by reducing the need to recalculate static stuff)
+want_edje_calc_cache="yes"
+
+# Check whether --enable-edje-calc-cache was given.
+if test "${enable_edje_calc_cache+set}" = set; then
+  enableval=$enable_edje_calc_cache; want_edje_calc_cache=$enableval
+
+fi
+
+ if test "x${want_edje_calc_cache}" = "xyes"; then
+  EDJE_CALC_CACHE_TRUE=
+  EDJE_CALC_CACHE_FALSE='#'
+else
+  EDJE_CALC_CACHE_TRUE='#'
+  EDJE_CALC_CACHE_FALSE=
+fi
+
+
+if test "x${want_edje_calc_cache}" = "xyes" ; then
+
+cat >>confdefs.h <<\_ACEOF
+#define EDJE_CALC_CACHE 1
+_ACEOF
+
+fi
+
 install_vim="yes"
 
 # Check whether --with-vim was given.
@@ -11409,15 +11573,15 @@ if test "x${vimdir}" = "x" ; then
    fi
 fi
 
-{ echo "$as_me:$LINENO: checking for location of Vim data files" >&5
-echo $ECHO_N "checking for location of Vim data files... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for location of Vim data files" >&5
+$as_echo_n "checking for location of Vim data files... " >&6; }
 
 if test "${install_vim}" = "yes"; then
-   { echo "$as_me:$LINENO: result: $vimdir" >&5
-echo "${ECHO_T}$vimdir" >&6; }
+   { $as_echo "$as_me:$LINENO: result: $vimdir" >&5
+$as_echo "$vimdir" >&6; }
 else
-   { echo "$as_me:$LINENO: result: Not found, EDC syntax file will not be installed" >&5
-echo "${ECHO_T}Not found, EDC syntax file will not be installed" >&6; }
+   { $as_echo "$as_me:$LINENO: result: Not found, EDC syntax file will not be installed" >&5
+$as_echo "Not found, EDC syntax file will not be installed" >&6; }
 fi
 
 
@@ -11431,10 +11595,10 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -11447,7 +11611,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -11458,11 +11622,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -11471,10 +11635,10 @@ if test -z "$ac_cv_prog_CC"; then
   ac_ct_CC=$CC
   # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
@@ -11487,7 +11651,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -11498,11 +11662,11 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_ct_CC" = x; then
@@ -11510,12 +11674,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -11528,10 +11688,10 @@ if test -z "$CC"; then
           if test -n "$ac_tool_prefix"; then
     # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
 set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -11544,7 +11704,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -11555,11 +11715,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -11568,10 +11728,10 @@ fi
 if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -11589,7 +11749,7 @@ do
        continue
      fi
     ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -11612,11 +11772,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -11627,10 +11787,10 @@ if test -z "$CC"; then
   do
     # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
 set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$CC"; then
   ac_cv_prog_CC="$CC" # Let the user override the test.
@@ -11643,7 +11803,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -11654,11 +11814,11 @@ fi
 fi
 CC=$ac_cv_prog_CC
 if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $CC" >&5
+$as_echo "$CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -11671,10 +11831,10 @@ if test -z "$CC"; then
 do
   # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$ac_ct_CC"; then
   ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
@@ -11687,7 +11847,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -11698,11 +11858,11 @@ fi
 fi
 ac_ct_CC=$ac_cv_prog_ac_ct_CC
 if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -11714,12 +11874,8 @@ done
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     CC=$ac_ct_CC
@@ -11729,50 +11885,56 @@ fi
 fi
 
 
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
 See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
+$as_echo "$as_me: error: no acceptable C compiler found in \$PATH
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 
 # Provide some information about the compiler.
-echo "$as_me:$LINENO: checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
+$as_echo "$as_me:$LINENO: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
 { (ac_try="$ac_compiler --version >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compiler --version >&5") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 { (ac_try="$ac_compiler -v >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compiler -v >&5") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 { (ac_try="$ac_compiler -V >&5"
 case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compiler -V >&5") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
 
-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
 if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -11798,20 +11960,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_compiler_gnu=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_compiler_gnu=no
@@ -11821,15 +11984,19 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 ac_cv_c_compiler_gnu=$ac_compiler_gnu
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
-GCC=`test $ac_compiler_gnu = yes && echo yes`
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
 ac_test_CFLAGS=${CFLAGS+set}
 ac_save_CFLAGS=$CFLAGS
-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
 if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_save_c_werror_flag=$ac_c_werror_flag
    ac_c_werror_flag=yes
@@ -11856,20 +12023,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	CFLAGS=""
@@ -11894,20 +12062,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   :
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_c_werror_flag=$ac_save_c_werror_flag
@@ -11933,20 +12102,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_g=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
@@ -11961,8 +12131,8 @@ fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    ac_c_werror_flag=$ac_save_c_werror_flag
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$ac_cv_prog_cc_g" >&6; }
 if test "$ac_test_CFLAGS" = set; then
   CFLAGS=$ac_save_CFLAGS
 elif test $ac_cv_prog_cc_g = yes; then
@@ -11978,10 +12148,10 @@ else
     CFLAGS=
   fi
 fi
-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
 if test "${ac_cv_prog_cc_c89+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
@@ -12052,20 +12222,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_c89=$ac_arg
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
@@ -12081,15 +12252,15 @@ fi
 # AC_CACHE_VAL
 case "x$ac_cv_prog_cc_c89" in
   x)
-    { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
   xno)
-    { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
   *)
     CC="$CC $ac_cv_prog_cc_c89"
-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 
 
@@ -12118,10 +12289,10 @@ else
 fi
 
 
-{ echo "$as_me:$LINENO: checking whether to build documentation" >&5
-echo $ECHO_N "checking whether to build documentation... $ECHO_C" >&6; }
-{ echo "$as_me:$LINENO: result: ${efl_enable_doc}" >&5
-echo "${ECHO_T}${efl_enable_doc}" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether to build documentation" >&5
+$as_echo_n "checking whether to build documentation... " >&6; }
+{ $as_echo "$as_me:$LINENO: result: ${efl_enable_doc}" >&5
+$as_echo "${efl_enable_doc}" >&6; }
 
 if test "x${efl_enable_doc}" = "xyes" ; then
 
@@ -12135,10 +12306,10 @@ if test "${with_doxygen+set}" = set; then
       efl_doxygen=${withval}
        # Extract the first word of "${efl_doxygen}", so it can be a program name with args.
 set dummy ${efl_doxygen}; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_efl_have_doxygen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$efl_have_doxygen"; then
   ac_cv_prog_efl_have_doxygen="$efl_have_doxygen" # Let the user override the test.
@@ -12151,7 +12322,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_efl_have_doxygen="yes"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -12163,11 +12334,11 @@ fi
 fi
 efl_have_doxygen=$ac_cv_prog_efl_have_doxygen
 if test -n "$efl_have_doxygen"; then
-  { echo "$as_me:$LINENO: result: $efl_have_doxygen" >&5
-echo "${ECHO_T}$efl_have_doxygen" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $efl_have_doxygen" >&5
+$as_echo "$efl_have_doxygen" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -12177,17 +12348,17 @@ fi
           echo "${efl_doxygen}"
           echo "was not found.  Please check the path and make sure "
           echo "the program exists and is executable."
-          { echo "$as_me:$LINENO: WARNING: no doxygen detected. Documentation will not be built" >&5
-echo "$as_me: WARNING: no doxygen detected. Documentation will not be built" >&2;}
+          { $as_echo "$as_me:$LINENO: WARNING: no doxygen detected. Documentation will not be built" >&5
+$as_echo "$as_me: WARNING: no doxygen detected. Documentation will not be built" >&2;}
        fi
 
 else
   # Extract the first word of "${efl_doxygen}", so it can be a program name with args.
 set dummy ${efl_doxygen}; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_prog_efl_have_doxygen+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test -n "$efl_have_doxygen"; then
   ac_cv_prog_efl_have_doxygen="$efl_have_doxygen" # Let the user override the test.
@@ -12200,7 +12371,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_prog_efl_have_doxygen="yes"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -12212,11 +12383,11 @@ fi
 fi
 efl_have_doxygen=$ac_cv_prog_efl_have_doxygen
 if test -n "$efl_have_doxygen"; then
-  { echo "$as_me:$LINENO: result: $efl_have_doxygen" >&5
-echo "${ECHO_T}$efl_have_doxygen" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $efl_have_doxygen" >&5
+$as_echo "$efl_have_doxygen" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -12229,8 +12400,8 @@ fi
           echo "that the doxygen program is in your execute path (see your"
           echo "shell manual page on setting the \$PATH environment variable), OR"
           echo "alternatively, specify the program to use with --with-doxygen."
-          { echo "$as_me:$LINENO: WARNING: no doxygen detected. Documentation will not be built" >&5
-echo "$as_me: WARNING: no doxygen detected. Documentation will not be built" >&2;}
+          { $as_echo "$as_me:$LINENO: WARNING: no doxygen detected. Documentation will not be built" >&5
+$as_echo "$as_me: WARNING: no doxygen detected. Documentation will not be built" >&2;}
        fi
 
 fi
@@ -12268,8 +12439,8 @@ fi
 
         if test -n "$PYTHON"; then
       # If the user set $PYTHON, use it and don't search something else.
-      { echo "$as_me:$LINENO: checking whether $PYTHON version >= 2.5" >&5
-echo $ECHO_N "checking whether $PYTHON version >= 2.5... $ECHO_C" >&6; }
+      { $as_echo "$as_me:$LINENO: checking whether $PYTHON version >= 2.5" >&5
+$as_echo_n "checking whether $PYTHON version >= 2.5... " >&6; }
       prog="import sys, string
 # split strings by '.' and convert to numeric.  Append some zeros
 # because we need at least 4 digits for the hex conversion.
@@ -12282,11 +12453,11 @@ sys.exit(sys.hexversion < minverhex)"
    ac_status=$?
    echo "$as_me:$LINENO: \$? = $ac_status" >&5
    (exit $ac_status); }; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 else
-  { { echo "$as_me:$LINENO: error: too old" >&5
-echo "$as_me: error: too old" >&2;}
+  { { $as_echo "$as_me:$LINENO: error: too old" >&5
+$as_echo "$as_me: error: too old" >&2;}
    { (exit 1); exit 1; }; }
 fi
 
@@ -12294,10 +12465,10 @@ fi
     else
       # Otherwise, try each interpreter until we find one that satisfies
       # VERSION.
-      { echo "$as_me:$LINENO: checking for a Python interpreter with version >= 2.5" >&5
-echo $ECHO_N "checking for a Python interpreter with version >= 2.5... $ECHO_C" >&6; }
+      { $as_echo "$as_me:$LINENO: checking for a Python interpreter with version >= 2.5" >&5
+$as_echo_n "checking for a Python interpreter with version >= 2.5... " >&6; }
 if test "${am_cv_pathless_PYTHON+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
 
 	for am_cv_pathless_PYTHON in python python2 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5 none; do
@@ -12319,18 +12490,18 @@ fi
 
 	done
 fi
-{ echo "$as_me:$LINENO: result: $am_cv_pathless_PYTHON" >&5
-echo "${ECHO_T}$am_cv_pathless_PYTHON" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $am_cv_pathless_PYTHON" >&5
+$as_echo "$am_cv_pathless_PYTHON" >&6; }
       # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
       if test "$am_cv_pathless_PYTHON" = none; then
 	PYTHON=:
       else
         # Extract the first word of "$am_cv_pathless_PYTHON", so it can be a program name with args.
 set dummy $am_cv_pathless_PYTHON; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_path_PYTHON+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   case $PYTHON in
   [\\/]* | ?:[\\/]*)
@@ -12345,7 +12516,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -12357,11 +12528,11 @@ esac
 fi
 PYTHON=$ac_cv_path_PYTHON
 if test -n "$PYTHON"; then
-  { echo "$as_me:$LINENO: result: $PYTHON" >&5
-echo "${ECHO_T}$PYTHON" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -12375,15 +12546,15 @@ fi
   else
 
 
-  { echo "$as_me:$LINENO: checking for $am_display_PYTHON version" >&5
-echo $ECHO_N "checking for $am_display_PYTHON version... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON version" >&5
+$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
 if test "${am_cv_python_version+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   am_cv_python_version=`$PYTHON -c "import sys; print sys.version[:3]"`
 fi
-{ echo "$as_me:$LINENO: result: $am_cv_python_version" >&5
-echo "${ECHO_T}$am_cv_python_version" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_version" >&5
+$as_echo "$am_cv_python_version" >&6; }
   PYTHON_VERSION=$am_cv_python_version
 
 
@@ -12394,30 +12565,43 @@ echo "${ECHO_T}$am_cv_python_version" >&6; }
 
 
 
-  { echo "$as_me:$LINENO: checking for $am_display_PYTHON platform" >&5
-echo $ECHO_N "checking for $am_display_PYTHON platform... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON platform" >&5
+$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
 if test "${am_cv_python_platform+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   am_cv_python_platform=`$PYTHON -c "import sys; print sys.platform"`
 fi
-{ echo "$as_me:$LINENO: result: $am_cv_python_platform" >&5
-echo "${ECHO_T}$am_cv_python_platform" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_platform" >&5
+$as_echo "$am_cv_python_platform" >&6; }
   PYTHON_PLATFORM=$am_cv_python_platform
 
 
 
 
-                { echo "$as_me:$LINENO: checking for $am_display_PYTHON script directory" >&5
-echo $ECHO_N "checking for $am_display_PYTHON script directory... $ECHO_C" >&6; }
+                { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON script directory" >&5
+$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
 if test "${am_cv_python_pythondir+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
-  am_cv_python_pythondir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(0,0,prefix='$PYTHON_PREFIX')" 2>/dev/null ||
+  if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null ||
      echo "$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     esac
+
 fi
-{ echo "$as_me:$LINENO: result: $am_cv_python_pythondir" >&5
-echo "${ECHO_T}$am_cv_python_pythondir" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_pythondir" >&5
+$as_echo "$am_cv_python_pythondir" >&6; }
   pythondir=$am_cv_python_pythondir
 
 
@@ -12425,16 +12609,29 @@ echo "${ECHO_T}$am_cv_python_pythondir" >&6; }
   pkgpythondir=\${pythondir}/$PACKAGE
 
 
-            { echo "$as_me:$LINENO: checking for $am_display_PYTHON extension module directory" >&5
-echo $ECHO_N "checking for $am_display_PYTHON extension module directory... $ECHO_C" >&6; }
+            { $as_echo "$as_me:$LINENO: checking for $am_display_PYTHON extension module directory" >&5
+$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
 if test "${am_cv_python_pyexecdir+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
-  am_cv_python_pyexecdir=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_lib(1,0,prefix='$PYTHON_EXEC_PREFIX')" 2>/dev/null ||
-     echo "${PYTHON_EXEC_PREFIX}/lib/python${PYTHON_VERSION}/site-packages"`
+  if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null ||
+     echo "$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages"`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     esac
+
 fi
-{ echo "$as_me:$LINENO: result: $am_cv_python_pyexecdir" >&5
-echo "${ECHO_T}$am_cv_python_pyexecdir" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $am_cv_python_pyexecdir" >&5
+$as_echo "$am_cv_python_pyexecdir" >&6; }
   pyexecdir=$am_cv_python_pyexecdir
 
 
@@ -12463,10 +12660,10 @@ if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
 	if test -n "$ac_tool_prefix"; then
   # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
 set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_path_PKG_CONFIG+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   case $PKG_CONFIG in
   [\\/]* | ?:[\\/]*)
@@ -12481,7 +12678,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -12493,11 +12690,11 @@ esac
 fi
 PKG_CONFIG=$ac_cv_path_PKG_CONFIG
 if test -n "$PKG_CONFIG"; then
-  { echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
-echo "${ECHO_T}$PKG_CONFIG" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5
+$as_echo "$PKG_CONFIG" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
 
@@ -12506,10 +12703,10 @@ if test -z "$ac_cv_path_PKG_CONFIG"; then
   ac_pt_PKG_CONFIG=$PKG_CONFIG
   # Extract the first word of "pkg-config", so it can be a program name with args.
 set dummy pkg-config; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
 if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   case $ac_pt_PKG_CONFIG in
   [\\/]* | ?:[\\/]*)
@@ -12524,7 +12721,7 @@ do
   for ac_exec_ext in '' $ac_executable_extensions; do
   if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
     ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+    $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
     break 2
   fi
 done
@@ -12536,11 +12733,11 @@ esac
 fi
 ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
 if test -n "$ac_pt_PKG_CONFIG"; then
-  { echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
-echo "${ECHO_T}$ac_pt_PKG_CONFIG" >&6; }
+  { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5
+$as_echo "$ac_pt_PKG_CONFIG" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 fi
 
   if test "x$ac_pt_PKG_CONFIG" = x; then
@@ -12548,12 +12745,8 @@ fi
   else
     case $cross_compiling:$ac_tool_warned in
 yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf at gnu.org." >&2;}
+{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
 ac_tool_warned=yes ;;
 esac
     PKG_CONFIG=$ac_pt_PKG_CONFIG
@@ -12565,19 +12758,28 @@ fi
 fi
 if test -n "$PKG_CONFIG"; then
 	_pkg_min_version=0.9.0
-	{ echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
-echo $ECHO_N "checking pkg-config is at least version $_pkg_min_version... $ECHO_C" >&6; }
+	{ $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5
+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
 	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
-		{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+		{ $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 	else
-		{ echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+		{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 		PKG_CONFIG=""
 	fi
 
 fi
 
+# Check whether pkg-config supports Requires.private
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.22; then
+   pkgconfig_requires_private="Requires.private"
+else
+   pkgconfig_requires_private="Requires"
+fi
+
+
 
 ### Checks for libraries
 
@@ -12588,18 +12790,18 @@ case "$host_os" in
    mingw* | cegcc*)
 
 pkg_failed=no
-{ echo "$as_me:$LINENO: checking for EVIL" >&5
-echo $ECHO_N "checking for EVIL... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for EVIL" >&5
+$as_echo_n "checking for EVIL... " >&6; }
 
 if test -n "$PKG_CONFIG"; then
     if test -n "$EVIL_CFLAGS"; then
         pkg_cv_EVIL_CFLAGS="$EVIL_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"evil\"") >&5
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"evil\"") >&5
   ($PKG_CONFIG --exists --print-errors "evil") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_EVIL_CFLAGS=`$PKG_CONFIG --cflags "evil" 2>/dev/null`
 else
@@ -12614,10 +12816,10 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_EVIL_LIBS="$EVIL_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"evil\"") >&5
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"evil\"") >&5
   ($PKG_CONFIG --exists --print-errors "evil") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_EVIL_LIBS=`$PKG_CONFIG --libs "evil" 2>/dev/null`
 else
@@ -12645,7 +12847,7 @@ fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$EVIL_PKG_ERRORS" >&5
 
-	{ { echo "$as_me:$LINENO: error: Package requirements (evil) were not met:
+	{ { $as_echo "$as_me:$LINENO: error: Package requirements (evil) were not met:
 
 $EVIL_PKG_ERRORS
 
@@ -12656,7 +12858,7 @@ Alternatively, you may set the environment variables EVIL_CFLAGS
 and EVIL_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 " >&5
-echo "$as_me: error: Package requirements (evil) were not met:
+$as_echo "$as_me: error: Package requirements (evil) were not met:
 
 $EVIL_PKG_ERRORS
 
@@ -12669,7 +12871,9 @@ See the pkg-config man page for more details.
 " >&2;}
    { (exit 1); exit 1; }; }
 elif test $pkg_failed = untried; then
-	{ { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -12679,7 +12883,7 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+$as_echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -12689,12 +12893,12 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 else
 	EVIL_CFLAGS=$pkg_cv_EVIL_CFLAGS
 	EVIL_LIBS=$pkg_cv_EVIL_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 	:
 fi
 
@@ -12710,22 +12914,1139 @@ esac
 
 # Dependencies for the library
 
+# Lua pkg-config hack for different naming conventions
+requirement_lua=""
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua5.1 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua5.1 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+elif test $pkg_failed = untried; then
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua-5.1"
+fi
+
+elif test $pkg_failed = untried; then
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+elif test $pkg_failed = untried; then
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua-5.1"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua5.1"
+fi
+
+elif test $pkg_failed = untried; then
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua5.1 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua5.1 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+elif test $pkg_failed = untried; then
 
 pkg_failed=no
-{ echo "$as_me:$LINENO: checking for EDJE" >&5
-echo $ECHO_N "checking for EDJE... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua-5.1"
+fi
+
+elif test $pkg_failed = untried; then
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua-5.1 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua-5.1 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua-5.1 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua-5.1 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+elif test $pkg_failed = untried; then
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for LUA" >&5
+$as_echo_n "checking for LUA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_CFLAGS"; then
+        pkg_cv_LUA_CFLAGS="$LUA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_CFLAGS=`$PKG_CONFIG --cflags "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$LUA_LIBS"; then
+        pkg_cv_LUA_LIBS="$LUA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"lua51 >= 5.1.0\"") >&5
+  ($PKG_CONFIG --exists --print-errors "lua51 >= 5.1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; then
+  pkg_cv_LUA_LIBS=`$PKG_CONFIG --libs "lua51 >= 5.1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        else
+	        LUA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lua51 >= 5.1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LUA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+                { { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:$LINENO: error: unable to find Lua" >&5
+$as_echo "$as_me: error: unable to find Lua" >&2;}
+   { (exit 1); exit 1; }; }
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua51"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua-5.1"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua5.1"
+fi
+
+else
+	LUA_CFLAGS=$pkg_cv_LUA_CFLAGS
+	LUA_LIBS=$pkg_cv_LUA_LIBS
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+	requirement_lua="lua"
+fi
+
+
+pkg_failed=no
+{ $as_echo "$as_me:$LINENO: checking for EDJE" >&5
+$as_echo_n "checking for EDJE... " >&6; }
 
 if test -n "$PKG_CONFIG"; then
     if test -n "$EDJE_CFLAGS"; then
         pkg_cv_EDJE_CFLAGS="$EDJE_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
     eina-0
     eet >= 1.0.1
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    \"") >&5
   ($PKG_CONFIG --exists --print-errors "
@@ -12734,10 +14055,11 @@ if test -n "$PKG_CONFIG"; then
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    ") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_EDJE_CFLAGS=`$PKG_CONFIG --cflags "
     eina-0
@@ -12745,6 +14067,7 @@ if test -n "$PKG_CONFIG"; then
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    " 2>/dev/null`
 else
@@ -12759,12 +14082,13 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_EDJE_LIBS="$EDJE_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
     eina-0
     eet >= 1.0.1
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    \"") >&5
   ($PKG_CONFIG --exists --print-errors "
@@ -12773,10 +14097,11 @@ if test -n "$PKG_CONFIG"; then
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    ") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_EDJE_LIBS=`$PKG_CONFIG --libs "
     eina-0
@@ -12784,6 +14109,7 @@ if test -n "$PKG_CONFIG"; then
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    " 2>/dev/null`
 else
@@ -12810,6 +14136,7 @@ fi
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    "`
         else
@@ -12819,18 +14146,20 @@ fi
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    "`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$EDJE_PKG_ERRORS" >&5
 
-	{ { echo "$as_me:$LINENO: error: Package requirements (
+	{ { $as_echo "$as_me:$LINENO: error: Package requirements (
     eina-0
     eet >= 1.0.1
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    ) were not met:
 
@@ -12843,12 +14172,13 @@ Alternatively, you may set the environment variables EDJE_CFLAGS
 and EDJE_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 " >&5
-echo "$as_me: error: Package requirements (
+$as_echo "$as_me: error: Package requirements (
     eina-0
     eet >= 1.0.1
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    ) were not met:
 
@@ -12863,7 +14193,9 @@ See the pkg-config man page for more details.
 " >&2;}
    { (exit 1); exit 1; }; }
 elif test $pkg_failed = untried; then
-	{ { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -12873,7 +14205,7 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+$as_echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -12883,29 +14215,33 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 else
 	EDJE_CFLAGS=$pkg_cv_EDJE_CFLAGS
 	EDJE_LIBS=$pkg_cv_EDJE_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 	:
 fi
 
+EDJE_LIBS="$EDJE_LIBS $LUA_LIBS"
+EDJE_CFLAGS="$EDJE_CFLAGS $LUA_CFLAGS"
+
 requirement_edje="embryo ecore-job ecore evas eet eina-0 ${requirement_edje}"
+requirement_edje="${requirement_lua} ${requirement_edje}"
 
 have_ecore_imf="no"
 
 pkg_failed=no
-{ echo "$as_me:$LINENO: checking for ECORE_IMF" >&5
-echo $ECHO_N "checking for ECORE_IMF... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for ECORE_IMF" >&5
+$as_echo_n "checking for ECORE_IMF... " >&6; }
 
 if test -n "$PKG_CONFIG"; then
     if test -n "$ECORE_IMF_CFLAGS"; then
         pkg_cv_ECORE_IMF_CFLAGS="$ECORE_IMF_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
     ecore-imf >= 0.9.9
     ecore-imf-evas >= 0.9.9
    \"") >&5
@@ -12914,7 +14250,7 @@ if test -n "$PKG_CONFIG"; then
     ecore-imf-evas >= 0.9.9
    ") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_ECORE_IMF_CFLAGS=`$PKG_CONFIG --cflags "
     ecore-imf >= 0.9.9
@@ -12932,7 +14268,7 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_ECORE_IMF_LIBS="$ECORE_IMF_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"
     ecore-imf >= 0.9.9
     ecore-imf-evas >= 0.9.9
    \"") >&5
@@ -12941,7 +14277,7 @@ if test -n "$PKG_CONFIG"; then
     ecore-imf-evas >= 0.9.9
    ") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_ECORE_IMF_LIBS=`$PKG_CONFIG --libs "
     ecore-imf >= 0.9.9
@@ -12978,16 +14314,16 @@ fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$ECORE_IMF_PKG_ERRORS" >&5
 
-	{ echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+	{ $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
                 have_ecore_imf="no"
 elif test $pkg_failed = untried; then
 	have_ecore_imf="no"
 else
 	ECORE_IMF_CFLAGS=$pkg_cv_ECORE_IMF_CFLAGS
 	ECORE_IMF_LIBS=$pkg_cv_ECORE_IMF_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 
 
 cat >>confdefs.h <<\_ACEOF
@@ -12995,7 +14331,7 @@ cat >>confdefs.h <<\_ACEOF
 _ACEOF
 
     have_ecore_imf="yes"
-    requirement_edje="ecore-imf ecore-imf-evas ${requirement_edje}"
+    requirement_edje="ecore-imf-evas ecore-imf ${requirement_edje}"
 
 fi
 
@@ -13004,18 +14340,18 @@ fi
 if test "x$have_edje_cc" = "xyes"; then
 
 pkg_failed=no
-{ echo "$as_me:$LINENO: checking for ECORE_FILE" >&5
-echo $ECHO_N "checking for ECORE_FILE... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for ECORE_FILE" >&5
+$as_echo_n "checking for ECORE_FILE... " >&6; }
 
 if test -n "$PKG_CONFIG"; then
     if test -n "$ECORE_FILE_CFLAGS"; then
         pkg_cv_ECORE_FILE_CFLAGS="$ECORE_FILE_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-file >= 0.9.9\"") >&5
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-file >= 0.9.9\"") >&5
   ($PKG_CONFIG --exists --print-errors "ecore-file >= 0.9.9") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_ECORE_FILE_CFLAGS=`$PKG_CONFIG --cflags "ecore-file >= 0.9.9" 2>/dev/null`
 else
@@ -13030,10 +14366,10 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_ECORE_FILE_LIBS="$ECORE_FILE_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-file >= 0.9.9\"") >&5
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-file >= 0.9.9\"") >&5
   ($PKG_CONFIG --exists --print-errors "ecore-file >= 0.9.9") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_ECORE_FILE_LIBS=`$PKG_CONFIG --libs "ecore-file >= 0.9.9" 2>/dev/null`
 else
@@ -13061,7 +14397,7 @@ fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$ECORE_FILE_PKG_ERRORS" >&5
 
-	{ { echo "$as_me:$LINENO: error: Package requirements (ecore-file >= 0.9.9) were not met:
+	{ { $as_echo "$as_me:$LINENO: error: Package requirements (ecore-file >= 0.9.9) were not met:
 
 $ECORE_FILE_PKG_ERRORS
 
@@ -13072,7 +14408,7 @@ Alternatively, you may set the environment variables ECORE_FILE_CFLAGS
 and ECORE_FILE_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 " >&5
-echo "$as_me: error: Package requirements (ecore-file >= 0.9.9) were not met:
+$as_echo "$as_me: error: Package requirements (ecore-file >= 0.9.9) were not met:
 
 $ECORE_FILE_PKG_ERRORS
 
@@ -13085,7 +14421,9 @@ See the pkg-config man page for more details.
 " >&2;}
    { (exit 1); exit 1; }; }
 elif test $pkg_failed = untried; then
-	{ { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -13095,7 +14433,7 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+$as_echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -13105,28 +14443,28 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 else
 	ECORE_FILE_CFLAGS=$pkg_cv_ECORE_FILE_CFLAGS
 	ECORE_FILE_LIBS=$pkg_cv_ECORE_FILE_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 	:
 fi
 
 pkg_failed=no
-{ echo "$as_me:$LINENO: checking for ECORE_EVAS" >&5
-echo $ECHO_N "checking for ECORE_EVAS... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for ECORE_EVAS" >&5
+$as_echo_n "checking for ECORE_EVAS... " >&6; }
 
 if test -n "$PKG_CONFIG"; then
     if test -n "$ECORE_EVAS_CFLAGS"; then
         pkg_cv_ECORE_EVAS_CFLAGS="$ECORE_EVAS_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-evas >= 0.9.9\"") >&5
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-evas >= 0.9.9\"") >&5
   ($PKG_CONFIG --exists --print-errors "ecore-evas >= 0.9.9") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_ECORE_EVAS_CFLAGS=`$PKG_CONFIG --cflags "ecore-evas >= 0.9.9" 2>/dev/null`
 else
@@ -13141,10 +14479,10 @@ if test -n "$PKG_CONFIG"; then
         pkg_cv_ECORE_EVAS_LIBS="$ECORE_EVAS_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { (echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-evas >= 0.9.9\"") >&5
+    { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"ecore-evas >= 0.9.9\"") >&5
   ($PKG_CONFIG --exists --print-errors "ecore-evas >= 0.9.9") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; then
   pkg_cv_ECORE_EVAS_LIBS=`$PKG_CONFIG --libs "ecore-evas >= 0.9.9" 2>/dev/null`
 else
@@ -13172,7 +14510,7 @@ fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$ECORE_EVAS_PKG_ERRORS" >&5
 
-	{ { echo "$as_me:$LINENO: error: Package requirements (ecore-evas >= 0.9.9) were not met:
+	{ { $as_echo "$as_me:$LINENO: error: Package requirements (ecore-evas >= 0.9.9) were not met:
 
 $ECORE_EVAS_PKG_ERRORS
 
@@ -13183,7 +14521,7 @@ Alternatively, you may set the environment variables ECORE_EVAS_CFLAGS
 and ECORE_EVAS_LIBS to avoid the need to call pkg-config.
 See the pkg-config man page for more details.
 " >&5
-echo "$as_me: error: Package requirements (ecore-evas >= 0.9.9) were not met:
+$as_echo "$as_me: error: Package requirements (ecore-evas >= 0.9.9) were not met:
 
 $ECORE_EVAS_PKG_ERRORS
 
@@ -13196,7 +14534,9 @@ See the pkg-config man page for more details.
 " >&2;}
    { (exit 1); exit 1; }; }
 elif test $pkg_failed = untried; then
-	{ { echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
+	{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+{ { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -13206,7 +14546,7 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&5
-echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
+$as_echo "$as_me: error: The pkg-config script could not be found or is too old.  Make sure it
 is in your PATH or set the PKG_CONFIG environment variable to the full
 path to pkg-config.
 
@@ -13216,12 +14556,12 @@ See the pkg-config man page for more details.
 
 To get pkg-config, see <http://pkg-config.freedesktop.org/>.
 See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
+   { (exit 1); exit 1; }; }; }
 else
 	ECORE_EVAS_CFLAGS=$pkg_cv_ECORE_EVAS_CFLAGS
 	ECORE_EVAS_LIBS=$pkg_cv_ECORE_EVAS_LIBS
-        { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+        { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 	:
 fi
 fi
@@ -13231,20 +14571,21 @@ fi
 
 for ac_header in locale.h
 do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
 if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  { echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
 if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
 else
   # Is the header compilable?
-{ echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5
+$as_echo_n "checking $ac_header usability... " >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -13260,32 +14601,33 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_header_compiler=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_header_compiler=no
 fi
 
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+$as_echo "$ac_header_compiler" >&6; }
 
 # Is the header present?
-{ echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5
+$as_echo_n "checking $ac_header presence... " >&6; }
 cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
 _ACEOF
@@ -13299,51 +14641,52 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } >/dev/null && {
 	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        }; then
   ac_header_preproc=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
   ac_header_preproc=no
 fi
 
 rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+$as_echo "$ac_header_preproc" >&6; }
 
 # So?  What about this header?
 case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
   yes:no: )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
     ac_header_preproc=yes
     ;;
   no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     check for missing prerequisite headers?" >&5
+$as_echo "$as_me: WARNING: $ac_header:     check for missing prerequisite headers?" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&5
+$as_echo "$as_me: WARNING: $ac_header:     section \"Present But Cannot Be Compiled\"" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
     ( cat <<\_ASBOX
 ## -------------------------------------------------------- ##
 ## Report this to enlightenment-devel at lists.sourceforge.net ##
@@ -13352,21 +14695,24 @@ _ASBOX
      ) | sed "s/^/$as_me: WARNING:     /" >&2
     ;;
 esac
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5
+$as_echo_n "checking for $ac_header... " >&6; }
 if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   eval "$as_ac_Header=\$ac_header_preproc"
 fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
+ac_res=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
 
 fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
+as_val=`eval 'as_val=${'$as_ac_Header'}
+		 $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -13383,16 +14729,16 @@ done
 
 ### Checks for compiler characteristics
 if test "x$CC" != xcc; then
-  { echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5
-echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5
+$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
 else
-  { echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5
-echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5
+$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
 fi
-set dummy $CC; ac_cc=`echo $2 |
+set dummy $CC; ac_cc=`$as_echo "$2" |
 		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
 if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -13418,19 +14764,21 @@ if { (case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
    test -f conftest2.$ac_objext && { (case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); };
 then
   eval ac_cv_prog_cc_${ac_cc}_c_o=yes
@@ -13441,10 +14789,11 @@ then
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
       ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
       rm -f conftest2.*
@@ -13452,19 +14801,21 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } &&
 	 test -f conftest2.$ac_objext && { (case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); };
       then
 	# cc works too.
@@ -13482,11 +14833,11 @@ rm -f core conftest*
 
 fi
 if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
+  { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
 else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
+  { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
 
 cat >>confdefs.h <<\_ACEOF
 #define NO_MINUS_C_MINUS_O 1
@@ -13497,8 +14848,9 @@ fi
 # FIXME: we rely on the cache variable name because
 # there is no other way.
 set dummy $CC
-ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
+am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
+eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
+if test "$am_t" != yes; then
    # Losing compiler, so override with the script.
    # FIXME: It is wrong to rewrite CC.
    # But if we don't then we get into trouble of one sort or another.
@@ -13508,10 +14860,10 @@ if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
 fi
 
 
-{ echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
-echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+$as_echo_n "checking for an ANSI C-conforming const... " >&6; }
 if test "${ac_cv_c_const+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -13583,20 +14935,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_c_const=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_c_const=no
@@ -13604,22 +14957,22 @@ fi
 
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
-echo "${ECHO_T}$ac_cv_c_const" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+$as_echo "$ac_cv_c_const" >&6; }
 if test $ac_cv_c_const = no; then
 
 cat >>confdefs.h <<\_ACEOF
-#define const
+#define const /**/
 _ACEOF
 
 fi
 
    case $ac_cv_prog_cc_stdc in
   no) ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;;
-  *) { echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C99... $ECHO_C" >&6; }
+  *) { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5
+$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
 if test "${ac_cv_prog_cc_c99+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c99=no
 ac_save_CC=$CC
@@ -13766,7 +15119,7 @@ main ()
   return 0;
 }
 _ACEOF
-for ac_arg in '' -std=gnu99 -c99 -qlanglvl=extc99
+for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99
 do
   CC="$ac_save_CC $ac_arg"
   rm -f conftest.$ac_objext
@@ -13775,20 +15128,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_c99=$ac_arg
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
@@ -13804,23 +15158,23 @@ fi
 # AC_CACHE_VAL
 case "x$ac_cv_prog_cc_c99" in
   x)
-    { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
   xno)
-    { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
   *)
     CC="$CC $ac_cv_prog_cc_c99"
-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c99" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5
+$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
 esac
 if test "x$ac_cv_prog_cc_c99" != xno; then
   ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
 else
-  { echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
 if test "${ac_cv_prog_cc_c89+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   ac_cv_prog_cc_c89=no
 ac_save_CC=$CC
@@ -13891,20 +15245,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_prog_cc_c89=$ac_arg
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 
@@ -13920,15 +15275,15 @@ fi
 # AC_CACHE_VAL
 case "x$ac_cv_prog_cc_c89" in
   x)
-    { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
   xno)
-    { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
   *)
     CC="$CC $ac_cv_prog_cc_c89"
-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
+    { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
 esac
 if test "x$ac_cv_prog_cc_c89" != xno; then
   ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
@@ -13941,26 +15296,26 @@ fi
 
  ;;
 esac
-  { echo "$as_me:$LINENO: checking for $CC option to accept ISO Standard C" >&5
-echo $ECHO_N "checking for $CC option to accept ISO Standard C... $ECHO_C" >&6; }
+  { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO Standard C" >&5
+$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; }
   if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 fi
 
   case $ac_cv_prog_cc_stdc in
-  no) { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
-  '') { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
-  *) { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6; } ;;
+  no) { $as_echo "$as_me:$LINENO: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  '') { $as_echo "$as_me:$LINENO: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  *) { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;;
 esac
 
 
-{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -13987,20 +15342,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv_header_stdc=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_header_stdc=no
@@ -14092,37 +15448,40 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
   { (case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   :
 else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
+rm -rf conftest.dSYM
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
 
 fi
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
 if test $ac_cv_header_stdc = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -14133,11 +15492,11 @@ fi
 
 
 
-{ echo "$as_me:$LINENO: checking for __attribute__" >&5
-echo $ECHO_N "checking for __attribute__... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for __attribute__" >&5
+$as_echo_n "checking for __attribute__... " >&6; }
 
 if test "${ac_cv___attribute__+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -14168,20 +15527,21 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_compile") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
        } && test -s conftest.$ac_objext; then
   ac_cv___attribute__="yes"
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv___attribute__="no"
@@ -14192,8 +15552,8 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 fi
 
 
-{ echo "$as_me:$LINENO: result: $ac_cv___attribute__" >&5
-echo "${ECHO_T}$ac_cv___attribute__" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv___attribute__" >&5
+$as_echo "$ac_cv___attribute__" >&6; }
 
 if test "x${ac_cv___attribute__}" = "xyes" ; then
 
@@ -14209,7 +15569,7 @@ _ACEOF
   else
 
 cat >>confdefs.h <<\_ACEOF
-#define __UNUSED__
+#define __UNUSED__ /**/
 _ACEOF
 
 fi
@@ -14240,10 +15600,10 @@ esac
 ### Checks for library functions
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
-{ echo "$as_me:$LINENO: checking for working alloca.h" >&5
-echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for working alloca.h" >&5
+$as_echo_n "checking for working alloca.h... " >&6; }
 if test "${ac_cv_working_alloca_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -14267,31 +15627,35 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_working_alloca_h=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_working_alloca_h=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
-echo "${ECHO_T}$ac_cv_working_alloca_h" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5
+$as_echo "$ac_cv_working_alloca_h" >&6; }
 if test $ac_cv_working_alloca_h = yes; then
 
 cat >>confdefs.h <<\_ACEOF
@@ -14300,10 +15664,10 @@ _ACEOF
 
 fi
 
-{ echo "$as_me:$LINENO: checking for alloca" >&5
-echo $ECHO_N "checking for alloca... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking for alloca" >&5
+$as_echo_n "checking for alloca... " >&6; }
 if test "${ac_cv_func_alloca_works+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -14347,31 +15711,35 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   ac_cv_func_alloca_works=yes
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	ac_cv_func_alloca_works=no
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
-echo "${ECHO_T}$ac_cv_func_alloca_works" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5
+$as_echo "$ac_cv_func_alloca_works" >&6; }
 
 if test $ac_cv_func_alloca_works = yes; then
 
@@ -14392,10 +15760,10 @@ cat >>confdefs.h <<\_ACEOF
 _ACEOF
 
 
-{ echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
-echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5
+$as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; }
 if test "${ac_cv_os_cray+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -14419,15 +15787,15 @@ fi
 rm -f conftest*
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
-echo "${ECHO_T}$ac_cv_os_cray" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5
+$as_echo "$ac_cv_os_cray" >&6; }
 if test $ac_cv_os_cray = yes; then
   for ac_func in _getb67 GETB67 getb67; do
-    as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+    as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -14480,33 +15848,40 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   eval "$as_ac_var=yes"
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	eval "$as_ac_var=no"
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-ac_res=`eval echo '${'$as_ac_var'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+ac_res=`eval 'as_val=${'$as_ac_var'}
+		 $as_echo "$as_val"'`
+	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_var'}
+		 $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
 
 cat >>confdefs.h <<_ACEOF
 #define CRAY_STACKSEG_END $ac_func
@@ -14518,10 +15893,10 @@ fi
   done
 fi
 
-{ echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
-echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6; }
+{ $as_echo "$as_me:$LINENO: checking stack direction for C alloca" >&5
+$as_echo_n "checking stack direction for C alloca... " >&6; }
 if test "${ac_cv_c_stack_direction+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   if test "$cross_compiling" = yes; then
   ac_cv_c_stack_direction=0
@@ -14559,36 +15934,39 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
   { (case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_try") 2>&5
   ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
   ac_cv_c_stack_direction=1
 else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+$as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 ( exit $ac_status )
 ac_cv_c_stack_direction=-1
 fi
+rm -rf conftest.dSYM
 rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 
 
 fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
-echo "${ECHO_T}$ac_cv_c_stack_direction" >&6; }
+{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5
+$as_echo "$ac_cv_c_stack_direction" >&6; }
 
 cat >>confdefs.h <<_ACEOF
 #define STACK_DIRECTION $ac_cv_c_stack_direction
@@ -14610,11 +15988,11 @@ _ACEOF
 
 for ac_func in realpath
 do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; }
+as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5
+$as_echo_n "checking for $ac_func... " >&6; }
 if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
+  $as_echo_n "(cached) " >&6
 else
   cat >conftest.$ac_ext <<_ACEOF
 /* confdefs.h.  */
@@ -14667,35 +16045,42 @@ case "(($ac_try" in
   *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
   *) ac_try_echo=$ac_try;;
 esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
+$as_echo "$ac_try_echo") >&5
   (eval "$ac_link") 2>conftest.er1
   ac_status=$?
   grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && {
 	 test -z "$ac_c_werror_flag" ||
 	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then
   eval "$as_ac_var=yes"
 else
-  echo "$as_me: failed program was:" >&5
+  $as_echo "$as_me: failed program was:" >&5
 sed 's/^/| /' conftest.$ac_ext >&5
 
 	eval "$as_ac_var=no"
 fi
 
+rm -rf conftest.dSYM
 rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
       conftest$ac_exeext conftest.$ac_ext
 fi
-ac_res=`eval echo '${'$as_ac_var'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_var'}'` = yes; then
+ac_res=`eval 'as_val=${'$as_ac_var'}
+		 $as_echo "$as_val"'`
+	       { $as_echo "$as_me:$LINENO: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+as_val=`eval 'as_val=${'$as_ac_var'}
+		 $as_echo "$as_val"'`
+   if test "x$as_val" = x""yes; then
   cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 fi
@@ -14736,11 +16121,12 @@ _ACEOF
     case $ac_val in #(
     *${as_nl}*)
       case $ac_var in #(
-      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
+      *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
       esac
       case $ac_var in #(
       _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
       *) $as_unset $ac_var ;;
       esac ;;
     esac
@@ -14773,12 +16159,12 @@ echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
 if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
   if test -w "$cache_file"; then
     test "x$cache_file" != "x/dev/null" &&
-      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
-echo "$as_me: updating cache $cache_file" >&6;}
+      { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
     cat confcache >$cache_file
   else
-    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
-echo "$as_me: not updating unwritable cache $cache_file" >&6;}
+    { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
+$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
@@ -14794,7 +16180,7 @@ ac_ltlibobjs=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`echo "$ac_i" | sed "$ac_script"`
+  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
   # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
   #    will be set to the directory where LIBOBJS objects are built.
   ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
@@ -14806,61 +16192,76 @@ LTLIBOBJS=$ac_ltlibobjs
 
 
 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"AMDEP\" was never defined.
+$as_echo "$as_me: error: conditional \"AMDEP\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${EDJE_AMALGAMATION_TRUE}" && test -z "${EDJE_AMALGAMATION_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"EDJE_AMALGAMATION\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+$as_echo "$as_me: error: conditional \"EDJE_AMALGAMATION\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 if test -z "${BUILD_EDJE_CC_TRUE}" && test -z "${BUILD_EDJE_CC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_EDJE_CC\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_EDJE_CC\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_EDJE_CC\" was never defined.
+$as_echo "$as_me: error: conditional \"BUILD_EDJE_CC\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 if test -z "${BUILD_EDJE_DECC_TRUE}" && test -z "${BUILD_EDJE_DECC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"BUILD_EDJE_DECC\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_EDJE_DECC\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"BUILD_EDJE_DECC\" was never defined.
+$as_echo "$as_me: error: conditional \"BUILD_EDJE_DECC\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 if test -z "${EDJE_PROGRAM_CACHE_TRUE}" && test -z "${EDJE_PROGRAM_CACHE_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"EDJE_PROGRAM_CACHE\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"EDJE_PROGRAM_CACHE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+$as_echo "$as_me: error: conditional \"EDJE_PROGRAM_CACHE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
+if test -z "${EDJE_CALC_CACHE_TRUE}" && test -z "${EDJE_CALC_CACHE_FALSE}"; then
+  { { $as_echo "$as_me:$LINENO: error: conditional \"EDJE_CALC_CACHE\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"EDJE_PROGRAM_CACHE\" was never defined.
+$as_echo "$as_me: error: conditional \"EDJE_CALC_CACHE\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 if test -z "${EFL_BUILD_DOC_TRUE}" && test -z "${EFL_BUILD_DOC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"EFL_BUILD_DOC\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"EFL_BUILD_DOC\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"EFL_BUILD_DOC\" was never defined.
+$as_echo "$as_me: error: conditional \"EFL_BUILD_DOC\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"HAVE_PYTHON\" was never defined.
+  { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_PYTHON\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"HAVE_PYTHON\" was never defined.
+$as_echo "$as_me: error: conditional \"HAVE_PYTHON\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
 
 : ${CONFIG_STATUS=./config.status}
+ac_write_fail=0
 ac_clean_files_save=$ac_clean_files
 ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
+{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 #! $SHELL
 # Generated by $as_me.
 # Run this file to recreate the current configuration.
@@ -14873,7 +16274,7 @@ ac_cs_silent=false
 SHELL=\${CONFIG_SHELL-$SHELL}
 _ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
@@ -14883,7 +16284,7 @@ DUALCASE=1; export DUALCASE # for MKS sh
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
   emulate sh
   NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
   # is contrary to our usage.  Disable this feature.
   alias -g '${1+"$@"}'='"$@"'
   setopt NO_GLOB_SUBST
@@ -14905,17 +16306,45 @@ as_cr_Letters=$as_cr_letters$as_cr_LETTERS
 as_cr_digits='0123456789'
 as_cr_alnum=$as_cr_Letters$as_cr_digits
 
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
+as_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
   else
-    PATH_SEPARATOR=:
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
   fi
-  rm -f conf$$.sh
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
 fi
 
 # Support unset when possible.
@@ -14931,8 +16360,6 @@ fi
 # there to prevent editors from complaining about space-tab.
 # (If _AS_PATH_WALK were called with IFS unset, it would disable word
 # splitting by setting IFS to empty value.)
-as_nl='
-'
 IFS=" ""	$as_nl"
 
 # Find who we are.  Look in the path if we contain no directory separator.
@@ -14955,7 +16382,7 @@ if test "x$as_myself" = x; then
   as_myself=$0
 fi
 if test ! -f "$as_myself"; then
-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
   { (exit 1); exit 1; }
 fi
 
@@ -14968,17 +16395,10 @@ PS2='> '
 PS4='+ '
 
 # NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-  fi
-done
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
 
 # Required to use basename.
 if expr a : '\(a\)' >/dev/null 2>&1 &&
@@ -15000,7 +16420,7 @@ as_me=`$as_basename -- "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
+$as_echo X/"$0" |
     sed '/^.*\/\([^/][^/]*\)\/*$/{
 	    s//\1/
 	    q
@@ -15051,7 +16471,7 @@ $as_unset CDPATH
       s/-\n.*//
     ' >$as_me.lineno &&
   chmod +x "$as_me.lineno" ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
    { (exit 1); exit 1; }; }
 
   # Don't try to exec as it changes $[0], causing all sort of problems
@@ -15079,7 +16499,6 @@ case `echo -n x` in
 *)
   ECHO_N='-n';;
 esac
-
 if expr a : '\(a\)' >/dev/null 2>&1 &&
    test "X`expr 00001 : '.*\(...\)'`" = X001; then
   as_expr=expr
@@ -15092,19 +16511,22 @@ if test -d conf$$.dir; then
   rm -f conf$$.dir/conf$$.file
 else
   rm -f conf$$.dir
-  mkdir conf$$.dir
-fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s='ln -s'
-  # ... but there are two gotchas:
-  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-  # In both cases, we have to default to `cp -p'.
-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+  mkdir conf$$.dir 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  if ln -s conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s='ln -s'
+    # ... but there are two gotchas:
+    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
+    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
+    # In both cases, we have to default to `cp -p'.
+    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
+      as_ln_s='cp -p'
+  elif ln conf$$.file conf$$ 2>/dev/null; then
+    as_ln_s=ln
+  else
     as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
+  fi
 else
   as_ln_s='cp -p'
 fi
@@ -15129,10 +16551,10 @@ else
   as_test_x='
     eval sh -c '\''
       if test -d "$1"; then
-        test -d "$1/.";
+	test -d "$1/.";
       else
 	case $1 in
-        -*)set "./$1";;
+	-*)set "./$1";;
 	esac;
 	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
 	???[sx]*):;;*)false;;esac;fi
@@ -15154,8 +16576,8 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by edje $as_me 0.9.92.062, which was
-generated by GNU Autoconf 2.61.  Invocation command line was
+This file was extended by edje $as_me 0.9.93.063, which was
+generated by GNU Autoconf 2.63.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -15168,7 +16590,16 @@ on `(hostname || uname -n) 2>/dev/null | sed 1q`
 
 _ACEOF
 
-cat >>$CONFIG_STATUS <<_ACEOF
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 # Files that config.status was made for.
 config_files="$ac_config_files"
 config_headers="$ac_config_headers"
@@ -15176,22 +16607,23 @@ config_commands="$ac_config_commands"
 
 _ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 ac_cs_usage="\
 \`$as_me' instantiates files from templates according to the
 current configuration.
 
-Usage: $0 [OPTIONS] [FILE]...
+Usage: $0 [OPTION]... [FILE]...
 
   -h, --help       print this help, then exit
   -V, --version    print version number and configuration settings, then exit
-  -q, --quiet      do not print progress messages
+  -q, --quiet, --silent
+                   do not print progress messages
   -d, --debug      don't remove temporary files
       --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
+      --file=FILE[:TEMPLATE]
+                   instantiate the configuration file FILE
+      --header=FILE[:TEMPLATE]
+                   instantiate the configuration header FILE
 
 Configuration files:
 $config_files
@@ -15205,13 +16637,13 @@ $config_commands
 Report bugs to <bug-autoconf at gnu.org>."
 
 _ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_version="\\
-edje config.status 0.9.92.062
-configured by $0, generated by GNU Autoconf 2.61,
-  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
+edje config.status 0.9.93.063
+configured by $0, generated by GNU Autoconf 2.63,
+  with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
-Copyright (C) 2006 Free Software Foundation, Inc.
+Copyright (C) 2008 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -15219,11 +16651,12 @@ ac_pwd='$ac_pwd'
 srcdir='$srcdir'
 INSTALL='$INSTALL'
 MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
 _ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
 ac_need_defaults=:
 while test $# != 0
 do
@@ -15245,30 +16678,36 @@ do
   -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
     ac_cs_recheck=: ;;
   --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    echo "$ac_cs_version"; exit ;;
+    $as_echo "$ac_cs_version"; exit ;;
   --debug | --debu | --deb | --de | --d | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
     $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_FILES="$CONFIG_FILES '$ac_optarg'"
     ac_need_defaults=false;;
   --header | --heade | --head | --hea )
     $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'"
     ac_need_defaults=false;;
   --he | --h)
     # Conflict between --help and --header
-    { echo "$as_me: error: ambiguous option: $1
+    { $as_echo "$as_me: error: ambiguous option: $1
 Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; };;
   --help | --hel | -h )
-    echo "$ac_cs_usage"; exit ;;
+    $as_echo "$ac_cs_usage"; exit ;;
   -q | -quiet | --quiet | --quie | --qui | --qu | --q \
   | -silent | --silent | --silen | --sile | --sil | --si | --s)
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) { echo "$as_me: error: unrecognized option: $1
+  -*) { $as_echo "$as_me: error: unrecognized option: $1
 Try \`$0 --help' for more information." >&2
    { (exit 1); exit 1; }; } ;;
 
@@ -15287,27 +16726,29 @@ if $ac_cs_silent; then
 fi
 
 _ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 if \$ac_cs_recheck; then
-  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  CONFIG_SHELL=$SHELL
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
   export CONFIG_SHELL
-  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  exec "\$@"
 fi
 
 _ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 exec 5>>config.log
 {
   echo
   sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
 ## Running $as_me. ##
 _ASBOX
-  echo "$ac_log"
+  $as_echo "$ac_log"
 } >&5
 
 _ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 #
 # INIT-COMMANDS
 #
@@ -15441,6 +16882,47 @@ enable_dlopen_self='`$ECHO "X$enable_dlopen_self" | $Xsed -e "$delay_single_quot
 enable_dlopen_self_static='`$ECHO "X$enable_dlopen_self_static" | $Xsed -e "$delay_single_quote_subst"`'
 old_striplib='`$ECHO "X$old_striplib" | $Xsed -e "$delay_single_quote_subst"`'
 striplib='`$ECHO "X$striplib" | $Xsed -e "$delay_single_quote_subst"`'
+LD_='`$ECHO "X$LD_" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_cmds_='`$ECHO "X$old_archive_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_='`$ECHO "X$compiler_" | $Xsed -e "$delay_single_quote_subst"`'
+GCC_='`$ECHO "X$GCC_" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_='`$ECHO "X$lt_prog_compiler_no_builtin_flag_" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_='`$ECHO "X$lt_prog_compiler_wl_" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_='`$ECHO "X$lt_prog_compiler_pic_" | $Xsed -e "$delay_single_quote_subst"`'
+lt_prog_compiler_static_='`$ECHO "X$lt_prog_compiler_static_" | $Xsed -e "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_='`$ECHO "X$lt_cv_prog_compiler_c_o_" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_need_lc_='`$ECHO "X$archive_cmds_need_lc_" | $Xsed -e "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_='`$ECHO "X$enable_shared_with_static_runtimes_" | $Xsed -e "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_='`$ECHO "X$export_dynamic_flag_spec_" | $Xsed -e "$delay_single_quote_subst"`'
+whole_archive_flag_spec_='`$ECHO "X$whole_archive_flag_spec_" | $Xsed -e "$delay_single_quote_subst"`'
+compiler_needs_object_='`$ECHO "X$compiler_needs_object_" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_='`$ECHO "X$old_archive_from_new_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_='`$ECHO "X$old_archive_from_expsyms_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+archive_cmds_='`$ECHO "X$archive_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+archive_expsym_cmds_='`$ECHO "X$archive_expsym_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+module_cmds_='`$ECHO "X$module_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+module_expsym_cmds_='`$ECHO "X$module_expsym_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+with_gnu_ld_='`$ECHO "X$with_gnu_ld_" | $Xsed -e "$delay_single_quote_subst"`'
+allow_undefined_flag_='`$ECHO "X$allow_undefined_flag_" | $Xsed -e "$delay_single_quote_subst"`'
+no_undefined_flag_='`$ECHO "X$no_undefined_flag_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_='`$ECHO "X$hardcode_libdir_flag_spec_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_ld_='`$ECHO "X$hardcode_libdir_flag_spec_ld_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_libdir_separator_='`$ECHO "X$hardcode_libdir_separator_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_='`$ECHO "X$hardcode_direct_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_direct_absolute_='`$ECHO "X$hardcode_direct_absolute_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_minus_L_='`$ECHO "X$hardcode_minus_L_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_='`$ECHO "X$hardcode_shlibpath_var_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_automatic_='`$ECHO "X$hardcode_automatic_" | $Xsed -e "$delay_single_quote_subst"`'
+inherit_rpath_='`$ECHO "X$inherit_rpath_" | $Xsed -e "$delay_single_quote_subst"`'
+link_all_deplibs_='`$ECHO "X$link_all_deplibs_" | $Xsed -e "$delay_single_quote_subst"`'
+fix_srcfile_path_='`$ECHO "X$fix_srcfile_path_" | $Xsed -e "$delay_single_quote_subst"`'
+always_export_symbols_='`$ECHO "X$always_export_symbols_" | $Xsed -e "$delay_single_quote_subst"`'
+export_symbols_cmds_='`$ECHO "X$export_symbols_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+exclude_expsyms_='`$ECHO "X$exclude_expsyms_" | $Xsed -e "$delay_single_quote_subst"`'
+include_expsyms_='`$ECHO "X$include_expsyms_" | $Xsed -e "$delay_single_quote_subst"`'
+prelink_cmds_='`$ECHO "X$prelink_cmds_" | $Xsed -e "$delay_single_quote_subst"`'
+file_list_spec_='`$ECHO "X$file_list_spec_" | $Xsed -e "$delay_single_quote_subst"`'
+hardcode_action_='`$ECHO "X$hardcode_action_" | $Xsed -e "$delay_single_quote_subst"`'
 
 LTCC='$LTCC'
 LTCFLAGS='$LTCFLAGS'
@@ -15503,7 +16985,27 @@ library_names_spec \
 soname_spec \
 finish_eval \
 old_striplib \
-striplib; do
+striplib \
+LD_ \
+compiler_ \
+lt_prog_compiler_no_builtin_flag_ \
+lt_prog_compiler_wl_ \
+lt_prog_compiler_pic_ \
+lt_prog_compiler_static_ \
+lt_cv_prog_compiler_c_o_ \
+export_dynamic_flag_spec_ \
+whole_archive_flag_spec_ \
+compiler_needs_object_ \
+with_gnu_ld_ \
+allow_undefined_flag_ \
+no_undefined_flag_ \
+hardcode_libdir_flag_spec_ \
+hardcode_libdir_flag_spec_ld_ \
+hardcode_libdir_separator_ \
+fix_srcfile_path_ \
+exclude_expsyms_ \
+include_expsyms_ \
+file_list_spec_; do
     case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
     *[\\\\\\\`\\"\\\$]*)
       eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
@@ -15532,7 +17034,16 @@ postinstall_cmds \
 postuninstall_cmds \
 finish_cmds \
 sys_lib_search_path_spec \
-sys_lib_dlsearch_path_spec; do
+sys_lib_dlsearch_path_spec \
+old_archive_cmds_ \
+old_archive_from_new_cmds_ \
+old_archive_from_expsyms_cmds_ \
+archive_cmds_ \
+archive_expsym_cmds_ \
+module_cmds_ \
+module_expsym_cmds_ \
+export_symbols_cmds_ \
+prelink_cmds_; do
     case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
     *[\\\\\\\`\\"\\\$]*)
       eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
@@ -15571,7 +17082,7 @@ fi
 
 _ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 
 # Handling of arguments.
 for ac_config_target in $ac_config_targets
@@ -15592,8 +17103,8 @@ do
     "src/bin/Makefile") CONFIG_FILES="$CONFIG_FILES src/bin/Makefile" ;;
     "utils/Makefile") CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
 
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+  *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
 done
@@ -15634,255 +17145,144 @@ $debug ||
   (umask 077 && mkdir "$tmp")
 } ||
 {
-   echo "$me: cannot create a temporary directory in ." >&2
+   $as_echo "$as_me: cannot create a temporary directory in ." >&2
    { (exit 1); exit 1; }
 }
 
-#
-# Set up the sed scripts for CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
 if test -n "$CONFIG_FILES"; then
 
-_ACEOF
 
-
-
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  cat >conf$$subs.sed <<_ACEOF
-SHELL!$SHELL$ac_delim
-PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
-PACKAGE_NAME!$PACKAGE_NAME$ac_delim
-PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
-PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
-PACKAGE_STRING!$PACKAGE_STRING$ac_delim
-PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
-exec_prefix!$exec_prefix$ac_delim
-prefix!$prefix$ac_delim
-program_transform_name!$program_transform_name$ac_delim
-bindir!$bindir$ac_delim
-sbindir!$sbindir$ac_delim
-libexecdir!$libexecdir$ac_delim
-datarootdir!$datarootdir$ac_delim
-datadir!$datadir$ac_delim
-sysconfdir!$sysconfdir$ac_delim
-sharedstatedir!$sharedstatedir$ac_delim
-localstatedir!$localstatedir$ac_delim
-includedir!$includedir$ac_delim
-oldincludedir!$oldincludedir$ac_delim
-docdir!$docdir$ac_delim
-infodir!$infodir$ac_delim
-htmldir!$htmldir$ac_delim
-dvidir!$dvidir$ac_delim
-pdfdir!$pdfdir$ac_delim
-psdir!$psdir$ac_delim
-libdir!$libdir$ac_delim
-localedir!$localedir$ac_delim
-mandir!$mandir$ac_delim
-DEFS!$DEFS$ac_delim
-ECHO_C!$ECHO_C$ac_delim
-ECHO_N!$ECHO_N$ac_delim
-ECHO_T!$ECHO_T$ac_delim
-LIBS!$LIBS$ac_delim
-build_alias!$build_alias$ac_delim
-host_alias!$host_alias$ac_delim
-target_alias!$target_alias$ac_delim
-build!$build$ac_delim
-build_cpu!$build_cpu$ac_delim
-build_vendor!$build_vendor$ac_delim
-build_os!$build_os$ac_delim
-host!$host$ac_delim
-host_cpu!$host_cpu$ac_delim
-host_vendor!$host_vendor$ac_delim
-host_os!$host_os$ac_delim
-CC!$CC$ac_delim
-CFLAGS!$CFLAGS$ac_delim
-LDFLAGS!$LDFLAGS$ac_delim
-CPPFLAGS!$CPPFLAGS$ac_delim
-ac_ct_CC!$ac_ct_CC$ac_delim
-EXEEXT!$EXEEXT$ac_delim
-OBJEXT!$OBJEXT$ac_delim
-INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
-INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
-INSTALL_DATA!$INSTALL_DATA$ac_delim
-am__isrc!$am__isrc$ac_delim
-CYGPATH_W!$CYGPATH_W$ac_delim
-PACKAGE!$PACKAGE$ac_delim
-VERSION!$VERSION$ac_delim
-ACLOCAL!$ACLOCAL$ac_delim
-AUTOCONF!$AUTOCONF$ac_delim
-AUTOMAKE!$AUTOMAKE$ac_delim
-AUTOHEADER!$AUTOHEADER$ac_delim
-MAKEINFO!$MAKEINFO$ac_delim
-install_sh!$install_sh$ac_delim
-STRIP!$STRIP$ac_delim
-INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
-mkdir_p!$mkdir_p$ac_delim
-AWK!$AWK$ac_delim
-SET_MAKE!$SET_MAKE$ac_delim
-am__leading_dot!$am__leading_dot$ac_delim
-AMTAR!$AMTAR$ac_delim
-am__tar!$am__tar$ac_delim
-am__untar!$am__untar$ac_delim
-DEPDIR!$DEPDIR$ac_delim
-am__include!$am__include$ac_delim
-am__quote!$am__quote$ac_delim
-AMDEP_TRUE!$AMDEP_TRUE$ac_delim
-AMDEP_FALSE!$AMDEP_FALSE$ac_delim
-AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
-CCDEPMODE!$CCDEPMODE$ac_delim
-am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
-am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
-AS!$AS$ac_delim
-DLLTOOL!$DLLTOOL$ac_delim
-OBJDUMP!$OBJDUMP$ac_delim
-LIBTOOL!$LIBTOOL$ac_delim
-SED!$SED$ac_delim
-GREP!$GREP$ac_delim
-EGREP!$EGREP$ac_delim
-FGREP!$FGREP$ac_delim
-LD!$LD$ac_delim
-DUMPBIN!$DUMPBIN$ac_delim
-ac_ct_DUMPBIN!$ac_ct_DUMPBIN$ac_delim
-NM!$NM$ac_delim
-LN_S!$LN_S$ac_delim
-AR!$AR$ac_delim
-_ACEOF
-
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
-    break
-  elif $ac_last_try; then
-    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
-if test -n "$ac_eof"; then
-  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
-  ac_eof=`expr $ac_eof + 1`
+ac_cr='
'
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
 fi
 
-cat >>$CONFIG_STATUS <<_ACEOF
-cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-_ACEOF
-sed '
-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
-s/^/s,@/; s/!/@,|#_!!_#|/
-:n
-t n
-s/'"$ac_delim"'$/,g/; t
-s/$/\\/; p
-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
-' >>$CONFIG_STATUS <conf$$subs.sed
-rm -f conf$$subs.sed
-cat >>$CONFIG_STATUS <<_ACEOF
-CEOF$ac_eof
+echo 'BEGIN {' >"$tmp/subs1.awk" &&
 _ACEOF
 
 
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
-  cat >conf$$subs.sed <<_ACEOF
-RANLIB!$RANLIB$ac_delim
-lt_ECHO!$lt_ECHO$ac_delim
-DSYMUTIL!$DSYMUTIL$ac_delim
-NMEDIT!$NMEDIT$ac_delim
-LIPO!$LIPO$ac_delim
-OTOOL!$OTOOL$ac_delim
-OTOOL64!$OTOOL64$ac_delim
-CPP!$CPP$ac_delim
-version_info!$version_info$ac_delim
-release_info!$release_info$ac_delim
-BUILD_EDJE_CC_TRUE!$BUILD_EDJE_CC_TRUE$ac_delim
-BUILD_EDJE_CC_FALSE!$BUILD_EDJE_CC_FALSE$ac_delim
-BUILD_EDJE_DECC_TRUE!$BUILD_EDJE_DECC_TRUE$ac_delim
-BUILD_EDJE_DECC_FALSE!$BUILD_EDJE_DECC_FALSE$ac_delim
-EDJE_CC_PRG!$EDJE_CC_PRG$ac_delim
-EDJE_DECC_PRG!$EDJE_DECC_PRG$ac_delim
-EDJE_RECC_PRG!$EDJE_RECC_PRG$ac_delim
-EDJE_PROGRAM_CACHE_TRUE!$EDJE_PROGRAM_CACHE_TRUE$ac_delim
-EDJE_PROGRAM_CACHE_FALSE!$EDJE_PROGRAM_CACHE_FALSE$ac_delim
-vimdir!$vimdir$ac_delim
-efl_have_doxygen!$efl_have_doxygen$ac_delim
-efl_doxygen!$efl_doxygen$ac_delim
-EFL_BUILD_DOC_TRUE!$EFL_BUILD_DOC_TRUE$ac_delim
-EFL_BUILD_DOC_FALSE!$EFL_BUILD_DOC_FALSE$ac_delim
-PYTHON!$PYTHON$ac_delim
-PYTHON_VERSION!$PYTHON_VERSION$ac_delim
-PYTHON_PREFIX!$PYTHON_PREFIX$ac_delim
-PYTHON_EXEC_PREFIX!$PYTHON_EXEC_PREFIX$ac_delim
-PYTHON_PLATFORM!$PYTHON_PLATFORM$ac_delim
-pythondir!$pythondir$ac_delim
-pkgpythondir!$pkgpythondir$ac_delim
-pyexecdir!$pyexecdir$ac_delim
-pkgpyexecdir!$pkgpyexecdir$ac_delim
-HAVE_PYTHON_TRUE!$HAVE_PYTHON_TRUE$ac_delim
-HAVE_PYTHON_FALSE!$HAVE_PYTHON_FALSE$ac_delim
-PKG_CONFIG!$PKG_CONFIG$ac_delim
-EVIL_CFLAGS!$EVIL_CFLAGS$ac_delim
-EVIL_LIBS!$EVIL_LIBS$ac_delim
-EFL_EDJE_BUILD!$EFL_EDJE_BUILD$ac_delim
-EDJE_CFLAGS!$EDJE_CFLAGS$ac_delim
-EDJE_LIBS!$EDJE_LIBS$ac_delim
-ECORE_IMF_CFLAGS!$ECORE_IMF_CFLAGS$ac_delim
-ECORE_IMF_LIBS!$ECORE_IMF_LIBS$ac_delim
-ECORE_FILE_CFLAGS!$ECORE_FILE_CFLAGS$ac_delim
-ECORE_FILE_LIBS!$ECORE_FILE_LIBS$ac_delim
-ECORE_EVAS_CFLAGS!$ECORE_EVAS_CFLAGS$ac_delim
-ECORE_EVAS_LIBS!$ECORE_EVAS_LIBS$ac_delim
-lt_enable_auto_import!$lt_enable_auto_import$ac_delim
-ALLOCA!$ALLOCA$ac_delim
-requirement_edje!$requirement_edje$ac_delim
-LIBOBJS!$LIBOBJS$ac_delim
-LTLIBOBJS!$LTLIBOBJS$ac_delim
-_ACEOF
+  . ./conf$$subs.sh ||
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
 
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 52; then
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
     break
   elif $ac_last_try; then
-    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
    { (exit 1); exit 1; }; }
   else
     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
 done
+rm -f conf$$subs.sh
 
-ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
-if test -n "$ac_eof"; then
-  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
-  ac_eof=`expr $ac_eof + 1`
-fi
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\).*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\).*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
 
-cat >>$CONFIG_STATUS <<_ACEOF
-cat >"\$tmp/subs-2.sed" <<\CEOF$ac_eof
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
+_ACAWK
 _ACEOF
-sed '
-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
-s/^/s,@/; s/!/@,|#_!!_#|/
-:n
-t n
-s/'"$ac_delim"'$/,g/; t
-s/$/\\/; p
-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
-' >>$CONFIG_STATUS <conf$$subs.sed
-rm -f conf$$subs.sed
-cat >>$CONFIG_STATUS <<_ACEOF
-:end
-s/|#_!!_#|//g
-CEOF$ac_eof
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
+  || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5
+$as_echo "$as_me: error: could not setup config files machinery" >&2;}
+   { (exit 1); exit 1; }; }
 _ACEOF
 
-
 # VPATH may cause trouble with some makes, so we remove $(srcdir),
 # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
 # trailing colons and then remove the whole line if VPATH becomes empty
@@ -15898,19 +17298,133 @@ s/^[^=]*=[	 ]*$//
 }'
 fi
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 fi # test -n "$CONFIG_FILES"
 
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
 
-for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_t=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_t"; then
+    break
+  elif $ac_last_try; then
+    { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5
+$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;}
+   { (exit 1); exit 1; }; }
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # Replace #undef with comments.  This is necessary, for example,
+    # in the case of _POSIX_SOURCE, which is predefined and required
+    # on some systems where configure will not decide to define it.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5
+$as_echo "$as_me: error: could not setup config headers machinery" >&2;}
+   { (exit 1); exit 1; }; }
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
 do
   case $ac_tag in
   :[FHLC]) ac_mode=$ac_tag; continue;;
   esac
   case $ac_mode$ac_tag in
   :[FHL]*:*);;
-  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
-echo "$as_me: error: Invalid tag $ac_tag." >&2;}
+  :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5
+$as_echo "$as_me: error: invalid tag $ac_tag" >&2;}
    { (exit 1); exit 1; }; };;
   :[FH]-) ac_tag=-:-;;
   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
@@ -15939,26 +17453,38 @@ echo "$as_me: error: Invalid tag $ac_tag." >&2;}
 	   [\\/$]*) false;;
 	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
 	   esac ||
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
-echo "$as_me: error: cannot find input file: $ac_f" >&2;}
+	   { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
+$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;}
    { (exit 1); exit 1; }; };;
       esac
-      ac_file_inputs="$ac_file_inputs $ac_f"
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      ac_file_inputs="$ac_file_inputs '$ac_f'"
     done
 
     # Let's still pretend it is `configure' which instantiates (i.e., don't
     # use $as_me), people would be surprised to read:
     #    /* config.h.  Generated by config.status.  */
-    configure_input="Generated from "`IFS=:
-	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
+    configure_input='Generated from '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
     if test x"$ac_file" != x-; then
       configure_input="$ac_file.  $configure_input"
-      { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
+      { $as_echo "$as_me:$LINENO: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
     fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
 
     case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin";;
+    *:-:* | *:-) cat >"$tmp/stdin" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; } ;;
     esac
     ;;
   esac
@@ -15968,7 +17494,7 @@ $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$ac_file" : 'X\(//\)[^/]' \| \
 	 X"$ac_file" : 'X\(//\)$' \| \
 	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$ac_file" |
+$as_echo X"$ac_file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -15994,7 +17520,7 @@ echo X"$ac_file" |
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -16003,7 +17529,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$as_dir" |
+$as_echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -16024,17 +17550,17 @@ echo X"$as_dir" |
       test -d "$as_dir" && break
     done
     test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-echo "$as_me: error: cannot create directory $as_dir" >&2;}
+  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
   ac_builddir=.
 
 case "$ac_dir" in
 .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
 *)
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
   # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
+  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
   case $ac_top_builddir_sub in
   "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
   *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
@@ -16079,12 +17605,13 @@ ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
   esac
 _ACEOF
 
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # If the template does not know about datarootdir, expand it.
 # FIXME: This hack should be removed a few years after 2.60.
 ac_datarootdir_hack=; ac_datarootdir_seen=
 
-case `sed -n '/datarootdir/ {
+ac_sed_dataroot='
+/datarootdir/ {
   p
   q
 }
@@ -16093,13 +17620,14 @@ case `sed -n '/datarootdir/ {
 /@infodir@/p
 /@localedir@/p
 /@mandir@/p
-' $ac_file_inputs` in
+'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
 *datarootdir*) ac_datarootdir_seen=yes;;
 *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
 _ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
   ac_datarootdir_hack='
   s&@datadir@&$datadir&g
   s&@docdir@&$docdir&g
@@ -16113,15 +17641,16 @@ _ACEOF
 # Neutralize VPATH when `$srcdir' = `.'.
 # Shell code in configure.ac might set extrasub.
 # FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
 $extrasub
 _ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 :t
 /@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s&@configure_input@&$configure_input&;t t
+s|@configure_input@|$ac_sed_conf_input|;t t
 s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;t t
 s&@srcdir@&$ac_srcdir&;t t
 s&@abs_srcdir@&$ac_abs_srcdir&;t t
 s&@top_srcdir@&$ac_top_srcdir&;t t
@@ -16132,121 +17661,60 @@ s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
 s&@INSTALL@&$ac_INSTALL&;t t
 s&@MKDIR_P@&$ac_MKDIR_P&;t t
 $ac_datarootdir_hack
-" $ac_file_inputs | sed -f "$tmp/subs-1.sed" | sed -f "$tmp/subs-2.sed" >$tmp/out
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
 
 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
   { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
   { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+  { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined." >&5
-echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
 which seems to be undefined.  Please make sure it is defined." >&2;}
 
   rm -f "$tmp/stdin"
   case $ac_file in
-  -) cat "$tmp/out"; rm -f "$tmp/out";;
-  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
-  esac
+  -) cat "$tmp/out" && rm -f "$tmp/out";;
+  *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
+  esac \
+  || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
  ;;
   :H)
   #
   # CONFIG_HEADER
   #
-_ACEOF
-
-# Transform confdefs.h into a sed script `conftest.defines', that
-# substitutes the proper values into config.h.in to produce config.h.
-rm -f conftest.defines conftest.tail
-# First, append a space to every undef/define line, to ease matching.
-echo 's/$/ /' >conftest.defines
-# Then, protect against being on the right side of a sed subst, or in
-# an unquoted here document, in config.status.  If some macros were
-# called several times there might be several #defines for the same
-# symbol, which is useless.  But do not sort them, since the last
-# AC_DEFINE must be honored.
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
-# NAME is the cpp macro being defined, VALUE is the value it is being given.
-# PARAMS is the parameter list in the macro definition--in most cases, it's
-# just an empty string.
-ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
-ac_dB='\\)[	 (].*,\\1define\\2'
-ac_dC=' '
-ac_dD=' ,'
-
-uniq confdefs.h |
-  sed -n '
-	t rset
-	:rset
-	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
-	t ok
-	d
-	:ok
-	s/[\\&,]/\\&/g
-	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
-	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
-  ' >>conftest.defines
-
-# Remove the space that was appended to ease matching.
-# Then replace #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-# (The regexp can be short, since the line contains either #define or #undef.)
-echo 's/ $//
-s,^[	 #]*u.*,/* & */,' >>conftest.defines
-
-# Break up conftest.defines:
-ac_max_sed_lines=50
-
-# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
-# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
-# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
-# et cetera.
-ac_in='$ac_file_inputs'
-ac_out='"$tmp/out1"'
-ac_nxt='"$tmp/out2"'
-
-while :
-do
-  # Write a here document:
-    cat >>$CONFIG_STATUS <<_ACEOF
-    # First, check the format of the line:
-    cat >"\$tmp/defines.sed" <<\\CEOF
-/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
-/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
-b
-:def
-_ACEOF
-  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
-  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
-  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
-  grep . conftest.tail >/dev/null || break
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines conftest.tail
-
-echo "ac_result=$ac_in" >>$CONFIG_STATUS
-cat >>$CONFIG_STATUS <<\_ACEOF
   if test x"$ac_file" != x-; then
-    echo "/* $configure_input  */" >"$tmp/config.h"
-    cat "$ac_result" >>"$tmp/config.h"
-    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs"
+    } >"$tmp/config.h" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
+    if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
     else
-      rm -f $ac_file
-      mv "$tmp/config.h" $ac_file
+      rm -f "$ac_file"
+      mv "$tmp/config.h" "$ac_file" \
+	|| { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5
+$as_echo "$as_me: error: could not create $ac_file" >&2;}
+   { (exit 1); exit 1; }; }
     fi
   else
-    echo "/* $configure_input  */"
-    cat "$ac_result"
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \
+      || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5
+$as_echo "$as_me: error: could not create -" >&2;}
+   { (exit 1); exit 1; }; }
   fi
-  rm -f "$tmp/out12"
-# Compute $ac_file's index in $config_headers.
-_am_arg=$ac_file
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
 _am_stamp_count=1
 for _am_header in $config_headers :; do
   case $_am_header in
@@ -16261,7 +17729,7 @@ $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$_am_arg" : 'X\(//\)[^/]' \| \
 	 X"$_am_arg" : 'X\(//\)$' \| \
 	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$_am_arg" |
+$as_echo X"$_am_arg" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -16281,30 +17749,40 @@ echo X"$_am_arg" |
 	  s/.*/./; q'`/stamp-h$_am_stamp_count
  ;;
 
-  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
-echo "$as_me: executing $ac_file commands" >&6;}
+  :C)  { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
  ;;
   esac
 
 
   case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
-    dirpart=`$as_dirname -- "$mf" ||
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  do
+    # Strip MF so we end up with the name of the file.
+    mf=`echo "$mf" | sed -e 's/:.*$//'`
+    # Check whether this is an Automake generated Makefile or not.
+    # We used to match only the files named `Makefile.in', but
+    # some people rename them; so instead we look at the file content.
+    # Grep'ing the first line is not enough: some people post-process
+    # each Makefile.in and add a new line on top of each file to say so.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
+      dirpart=`$as_dirname -- "$mf" ||
 $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$mf" : 'X\(//\)[^/]' \| \
 	 X"$mf" : 'X\(//\)$' \| \
 	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$mf" |
+$as_echo X"$mf" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -16322,33 +17800,33 @@ echo X"$mf" |
 	    q
 	  }
 	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`$as_dirname -- "$file" ||
+    else
+      continue
+    fi
+    # Extract the definition of DEPDIR, am__include, and am__quote
+    # from the Makefile without running `make'.
+    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+    test -z "$DEPDIR" && continue
+    am__include=`sed -n 's/^am__include = //p' < "$mf"`
+    test -z "am__include" && continue
+    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+    # When using ansi2knr, U may be empty or an underscore; expand it
+    U=`sed -n 's/^U = //p' < "$mf"`
+    # Find all dependency output files, they are included files with
+    # $(DEPDIR) in their names.  We invoke sed twice because it is the
+    # simplest approach to changing $(DEPDIR) to its actual value in the
+    # expansion.
+    for file in `sed -n "
+      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+      # Make sure the directory exists.
+      test -f "$dirpart/$file" && continue
+      fdir=`$as_dirname -- "$file" ||
 $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$file" : 'X\(//\)[^/]' \| \
 	 X"$file" : 'X\(//\)$' \| \
 	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$file" |
+$as_echo X"$file" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -16366,7 +17844,7 @@ echo X"$file" |
 	    q
 	  }
 	  s/.*/./; q'`
-    { as_dir=$dirpart/$fdir
+      { as_dir=$dirpart/$fdir
   case $as_dir in #(
   -*) as_dir=./$as_dir;;
   esac
@@ -16374,7 +17852,7 @@ echo X"$file" |
     as_dirs=
     while :; do
       case $as_dir in #(
-      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
+      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
       *) as_qdir=$as_dir;;
       esac
       as_dirs="'$as_qdir' $as_dirs"
@@ -16383,7 +17861,7 @@ $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
 	 X"$as_dir" : 'X\(//\)[^/]' \| \
 	 X"$as_dir" : 'X\(//\)$' \| \
 	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$as_dir" |
+$as_echo X"$as_dir" |
     sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
 	    s//\1/
 	    q
@@ -16404,13 +17882,14 @@ echo X"$as_dir" |
       test -d "$as_dir" && break
     done
     test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-echo "$as_me: error: cannot create directory $as_dir" >&2;}
+  } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
+$as_echo "$as_me: error: cannot create directory $as_dir" >&2;}
    { (exit 1); exit 1; }; }; }
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
   done
-done
+}
  ;;
     "libtool":C)
 
@@ -17063,6 +18542,11 @@ _ACEOF
 chmod +x $CONFIG_STATUS
 ac_clean_files=$ac_clean_files_save
 
+test $ac_write_fail = 0 ||
+  { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;}
+   { (exit 1); exit 1; }; }
+
 
 # configure is writing to config.log, and then calls config.status.
 # config.status does its own redirection, appending to config.log.
@@ -17084,6 +18568,10 @@ if test "$no_create" != yes; then
   # would make configure fail if this is the last instruction.
   $ac_cs_success || { (exit 1); exit 1; }
 fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
 
 
 
@@ -17099,9 +18587,10 @@ echo "------------------------------------------------------------------------"
 echo
 echo "Configuration Options Summary:"
 echo
+echo "  Amalgamation.........: ${do_amalgamation}"
 echo "  Ecore IMF............: $have_ecore_imf"
-echo
 echo "  EDJE_PROGRAM_CACHE...: $want_edje_program_cache"
+echo "  EDJE_CALC_CACHE......: $want_edje_calc_cache"
 echo
 echo "  Build binaries.......: $have_edje_cc"
 echo
diff --git a/configure.ac b/configure.ac
index 90933dc..8907b16 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,9 +1,8 @@
-dnl Process this file with autoconf to produce a configure script.
-
 # get rid of that stupid cache mechanism
 rm -f config.cache
 
-AC_INIT([edje], [0.9.92.062], [enlightenment-devel at lists.sourceforge.net])
+AC_INIT([edje], [0.9.93.063], [enlightenment-devel at lists.sourceforge.net])
+release="ver-svn-05"
 AC_PREREQ([2.52])
 AC_CONFIG_SRCDIR([configure.ac])
 AC_CONFIG_MACRO_DIR([m4])
@@ -11,8 +10,9 @@ AC_CANONICAL_BUILD
 AC_CANONICAL_HOST
 AC_ISC_POSIX
 
-AM_INIT_AUTOMAKE(1.6 dist-bzip2)
-AM_CONFIG_HEADER(config.h)
+AM_INIT_AUTOMAKE([1.6 dist-bzip2])
+AM_CONFIG_HEADER([config.h])
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
 
 AC_LIBTOOL_WIN32_DLL
 define([AC_LIBTOOL_LANG_CXX_CONFIG], [:])dnl
@@ -26,7 +26,6 @@ SNAP=`echo $PACKAGE_VERSION | awk -F. '{printf("%s", $4);}'`
 version_info=`expr $VMAJ + $VMIN`":$VMIC:$VMIN"
 AC_SUBST(version_info)
 
-release="ver-svn-03"
 case "$host_os" in
    mingw32ce* | cegcc*)
       ;;
@@ -50,13 +49,23 @@ case "$host_os" in
       ;;
 esac
 
-want_edje_program_cache="no"
-
 requirement_edje=""
 
 
 ### Additional options to configure
 
+AC_ARG_ENABLE([amalgamation],
+   [AC_HELP_STRING([--enable-amalgamation], [enable generation of one single file with all source code in it, helps compiler optimizations.])],
+   [if test "x${enableval}" = "xyes"; then
+       do_amalgamation="yes"
+    else
+       do_amalgamation="no"
+    fi
+   ],
+   [do_amalgamation="no"]
+)
+AM_CONDITIONAL(EDJE_AMALGAMATION, test "x${do_amalgamation}" = "xyes")
+
 AC_ARG_ENABLE([edje-cc],
    [AC_HELP_STRING([--disable-edje-cc], [disable building of edje_cc])],
    [
@@ -86,6 +95,8 @@ AC_SUBST(EDJE_DECC_PRG)
 AC_SUBST(EDJE_RECC_PRG)
 
 # Optional EDJE_PROGRAM_CACHE (use much more ram, but increase speed in some cases)
+want_edje_program_cache="no"
+
 AC_ARG_ENABLE([edje-program-cache],
    [AC_HELP_STRING(
        [--enable-edje-program-cache],
@@ -99,6 +110,22 @@ if test "x${want_edje_program_cache}" = "xyes" ; then
    AC_DEFINE(EDJE_PROGRAM_CACHE, 1, [Cache result of program glob matches - this uses up extra ram with the gain of faster program matching])
 fi
 
+# Optional EDJE_CALC_CACHE (use more ram, but increase speed by reducing the need to recalculate static stuff)
+want_edje_calc_cache="yes"
+
+AC_ARG_ENABLE([edje-calc-cache],
+   [AC_HELP_STRING(
+       [--enable-edje-calc-cache],
+       [enable EDJE_CALC_CACHE support. [[default=disabled]]]
+    )],
+   [want_edje_calc_cache=$enableval]
+)
+AM_CONDITIONAL(EDJE_CALC_CACHE, test "x${want_edje_calc_cache}" = "xyes")
+
+if test "x${want_edje_calc_cache}" = "xyes" ; then
+   AC_DEFINE(EDJE_CALC_CACHE, 1, [Cache result of edje_part_recalc - this uses up extra ram with the gain of reducing CPU usage when edje object are not resized])
+fi
+
 install_vim="yes"
 AC_ARG_WITH([vim],
     [AC_HELP_STRING([--with-vim=DIR], [Location of Vim data files [[autodetect]]])],
@@ -149,6 +176,15 @@ AM_CONDITIONAL([HAVE_PYTHON], [test "$PYTHON" != : ])
 
 PKG_PROG_PKG_CONFIG
 
+# Check whether pkg-config supports Requires.private
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.22; then
+   pkgconfig_requires_private="Requires.private"
+else
+   pkgconfig_requires_private="Requires"
+fi
+AC_SUBST(pkgconfig_requires_private)
+
 
 ### Checks for libraries
 
@@ -167,6 +203,18 @@ AC_SUBST(EFL_EDJE_BUILD)
 
 # Dependencies for the library
 
+# Lua pkg-config hack for different naming conventions
+requirement_lua=""
+PKG_CHECK_MODULES([LUA], [lua >= 5.1.0], requirement_lua="lua",
+	[PKG_CHECK_MODULES([LUA], [lua5.1 >= 5.1.0], requirement_lua="lua5.1",
+		[PKG_CHECK_MODULES([LUA], [lua-5.1 >= 5.1.0], requirement_lua="lua-5.1",
+			[PKG_CHECK_MODULES([LUA], [lua51 >= 5.1.0], requirement_lua="lua51",
+				AC_MSG_ERROR([unable to find Lua])
+			)
+		])
+	])
+])
+
 PKG_CHECK_MODULES([EDJE],
    [
     eina-0
@@ -174,10 +222,15 @@ PKG_CHECK_MODULES([EDJE],
     evas >= 0.9.9
     ecore >= 0.9.9
     ecore-job >= 0.9.9
+    ecore-file >= 0.9.9
     embryo >= 0.9.1
    ])
 
+EDJE_LIBS="$EDJE_LIBS $LUA_LIBS"
+EDJE_CFLAGS="$EDJE_CFLAGS $LUA_CFLAGS"
+
 requirement_edje="embryo ecore-job ecore evas eet eina-0 ${requirement_edje}"
+requirement_edje="${requirement_lua} ${requirement_edje}"
 
 have_ecore_imf="no"
 PKG_CHECK_MODULES([ECORE_IMF],
@@ -188,7 +241,7 @@ PKG_CHECK_MODULES([ECORE_IMF],
    [
     AC_DEFINE(HAVE_ECORE_IMF, 1, [Input Method Support for Edje Entry])
     have_ecore_imf="yes"
-    requirement_edje="ecore-imf ecore-imf-evas ${requirement_edje}"
+    requirement_edje="ecore-imf-evas ecore-imf ${requirement_edje}"
    ],
    [have_ecore_imf="no"])
 
@@ -280,9 +333,10 @@ echo "------------------------------------------------------------------------"
 echo
 echo "Configuration Options Summary:"
 echo
+echo "  Amalgamation.........: ${do_amalgamation}"
 echo "  Ecore IMF............: $have_ecore_imf"
-echo
 echo "  EDJE_PROGRAM_CACHE...: $want_edje_program_cache"
+echo "  EDJE_CALC_CACHE......: $want_edje_calc_cache"
 echo
 echo "  Build binaries.......: $have_edje_cc"
 echo
diff --git a/data/Makefile.in b/data/Makefile.in
index 4936b4e..c84547a 100644
--- a/data/Makefile.in
+++ b/data/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -113,6 +113,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -184,6 +186,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -198,6 +201,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -212,8 +216,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
@@ -319,7 +323,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
diff --git a/data/edc.vim b/data/edc.vim
index 7e470b4..f4407c6 100644
--- a/data/edc.vim
+++ b/data/edc.vim
@@ -15,7 +15,7 @@ endif
 syn keyword	cStructure	images data fonts collections group
 syn keyword	cStructure	part parts dragable description rel1 rel2
 syn keyword	cStatement	text image font fill origin size tag
-syn keyword	cStructure	programs program script styles style base
+syn keyword	cStructure	programs program script script_only lua_script lua_script_only styles style base
 syn keyword	cStructure	spectra spectrum
 syn match	cType		"+ + +;" contained 
 
@@ -35,6 +35,7 @@ syn keyword	cConstant 	TEXT IMAGE RECT SWALLOW
 syn keyword	cConstant 	NONE PLAIN OUTLINE SOFT_OUTLINE SHADOW
 syn keyword	cConstant 	SOFT_SHADOW OUTLINE_SHADOW OUTLINE_SOFT_SHADOW
 syn keyword	cConstant 	STATE_SET ACTION_STOP SIGNAL_EMIT
+syn keyword	cConstant 	SCRIPT LUA_SCRIPT
 syn keyword	cConstant	DRAG_VAL_SET DRAG_VAL_STEP DRAG_VAL_PAGE
 syn keyword	cConstant	LINEAR SINUSOIDAL ACCELERATE DECELERATE
 syn keyword	cConstant	"default"
diff --git a/data/include/Makefile.in b/data/include/Makefile.in
index 7799199..18b4f65 100644
--- a/data/include/Makefile.in
+++ b/data/include/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -111,6 +111,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -182,6 +184,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -196,6 +199,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -212,8 +216,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
diff --git a/doc/Doxyfile b/doc/Doxyfile
index ce8de76..fd78dba 100644
--- a/doc/Doxyfile
+++ b/doc/Doxyfile
@@ -1,56 +1,184 @@
+# Doxyfile 1.6.1
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
 PROJECT_NAME           = Edje
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
 PROJECT_NUMBER         =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
 OUTPUT_DIRECTORY       = .
-INPUT                  = edje.dox ../src/bin/edje_cc_handlers.c ../src/lib/Edje_Edit.h
-IMAGE_PATH             = img
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional,
+# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German,
+# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English
+# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak,
+# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+
 OUTPUT_LANGUAGE        = English
-GENERATE_HTML          = YES
-HTML_OUTPUT            = html
-HTML_FILE_EXTENSION    = .html
-HTML_HEADER            = head.html
-HTML_FOOTER            = foot.html
-HTML_STYLESHEET        = e.css
-HTML_ALIGN_MEMBERS     = YES
-ENUM_VALUES_PER_LINE   = 1
-GENERATE_HTMLHELP      = NO
-CHM_FILE               = 
-HHC_LOCATION           = 
-GENERATE_CHI           = NO
-BINARY_TOC             = NO
-TOC_EXPAND             = NO
-DISABLE_INDEX          = YES
-EXTRACT_ALL            = NO
-EXTRACT_PRIVATE        = NO
-EXTRACT_STATIC         = NO
-EXTRACT_LOCAL_CLASSES  = NO
-HIDE_UNDOC_MEMBERS     = YES
-HIDE_UNDOC_CLASSES     = YES
-HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
 BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
 REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
 ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
 INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
 FULL_PATH_NAMES        = NO
-STRIP_FROM_PATH        = 
-INTERNAL_DOCS          = NO
-STRIP_CODE_COMMENTS    = YES
-CASE_SENSE_NAMES       = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH        =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
 SHORT_NAMES            = NO
-HIDE_SCOPE_NAMES       = NO
-VERBATIM_HEADERS       = NO
-SHOW_INCLUDE_FILES     = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like regular Qt-style comments
+# (thus requiring an explicit @brief command for a brief description.)
+
 JAVADOC_AUTOBRIEF      = YES
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
+# interpret the first line (until the first dot) of a Qt-style
+# comment as the brief description. If set to NO, the comments
+# will behave just like regular Qt-style comments (thus requiring
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
 MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP         = YES
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
 INHERIT_DOCS           = YES
-INLINE_INFO            = YES
-SORT_MEMBER_DOCS       = YES
-DISTRIBUTE_GROUP_DOC   = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
 TAB_SIZE               = 2
-GENERATE_TODOLIST      = YES
-GENERATE_TESTLIST      = YES
-GENERATE_BUGLIST       = YES
-GENERATE_DEPRECATEDLIST= YES
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
 ALIASES                = block="<tr><td class=\"block\"><b>"
 ALIASES               += context="</b></td><td class=\"context\" colspan=2>\code"
 ALIASES               += description="\endcode</td></tr><tr><td>&nbsp;</td><td class=\"description\" colspan=2>"
@@ -59,88 +187,1335 @@ ALIASES               += property="<tr><td>&nbsp;</td><td><table class=\"edcref\
 ALIASES               += parameters="</tt></td><td class=\"parameters\"><tt>"
 ALIASES               += effect="</tt></td></tr><tr><td>&nbsp;</td><td class=\"effect\">"
 ALIASES               += endproperty="</td></tr></table></td></tr>"
-ENABLED_SECTIONS       = 
-MAX_INITIALIZER_LINES  = 30
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
 OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for
+# Java. For instance, namespaces will be presented as packages, qualified
+# scopes will look different, etc.
+
 OPTIMIZE_OUTPUT_JAVA   = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources only. Doxygen will then generate output that is more tailored for
+# Fortran.
+
+OPTIMIZE_FOR_FORTRAN   = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for
+# VHDL.
+
+OPTIMIZE_OUTPUT_VHDL   = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it parses.
+# With this tag you can assign which parser to use for a given extension.
+# Doxygen has a built-in mapping, but you can override or extend it using this tag.
+# The format is ext=language, where ext is a file extension, and language is one of
+# the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP,
+# Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat
+# .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C. Note that for custom extensions you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only.
+# Doxygen will parse them like normal C++ but will assume all classes use public
+# instead of private inheritance when no explicit protection keyword is present.
+
+SIP_SUPPORT            = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate getter
+# and setter methods for a property. Setting this option to YES (the default)
+# will make doxygen to replace the get and set methods by a property in the
+# documentation. This will only work if the methods are indeed getting or
+# setting a simple type. If this is not the case, or you want to show the
+# methods anyway, you should set this option to NO.
+
+IDL_PROPERTY_SUPPORT   = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum
+# is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically
+# be useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+
+TYPEDEF_HIDES_STRUCT   = NO
+
+# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to
+# determine which symbols to keep in memory and which to flush to disk.
+# When the cache is full, less often used symbols will be written to disk.
+# For small to medium size projects (<1000 input files) the default value is
+# probably good enough. For larger projects a too small cache size can cause
+# doxygen to be busy swapping symbols to and from disk most of the time
+# causing a significant performance penality.
+# If the system has enough physical memory increasing the cache will improve the
+# performance by keeping more symbols in memory. Note that the value works on
+# a logarithmic scale so increasing the size by one will rougly double the
+# memory usage. The cache size is given by this formula:
+# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0,
+# corresponding to a cache size of 2^16 = 65536 symbols
+
+SYMBOL_CACHE_SIZE      = 0
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base
+# name of the file that contains the anonymous namespace. By default
+# anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = YES
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES     = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the (brief and detailed) documentation of class members so that constructors and destructors are listed first. If set to NO (the default) the constructors will appear in the respective orders defined by SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the
+# hierarchy of group names into alphabetical order. If set to NO (the default)
+# the group names will appear in their defined order.
+
+SORT_GROUP_NAMES       = YES
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
 SHOW_USED_FILES        = NO
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page.
+# This will remove the Files entry from the Quick Index and from the
+# Folder Tree View (if specified). The default is YES.
+
+SHOW_FILES             = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the
+# Namespaces page.
+# This will remove the Namespaces entry from the Quick Index
+# and from the Folder Tree View (if specified). The default is YES.
+
+SHOW_NAMESPACES        = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by
+# doxygen. The layout file controls the global structure of the generated output files
+# in an output format independent way. The create the layout file that represents
+# doxygen's defaults, run doxygen with the -l option. You can optionally specify a
+# file name after the option, if omitted DoxygenLayout.xml will be used as the name
+# of the layout file.
+
+LAYOUT_FILE            =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
 QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
 WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
 WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC       = YES
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
 WARN_FORMAT            = "$file:$line: $text"
-WARN_LOGFILE           = 
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE           =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT                  = edje.dox ../src/bin/edje_cc_handlers.c ../src/lib
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
+# also the default input encoding. Doxygen uses libiconv (or the iconv built
+# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for
+# the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90
+
 FILE_PATTERNS          =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
 RECURSIVE              = NO
-EXCLUDE                = 
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
 EXCLUDE_SYMLINKS       = NO
-EXCLUDE_PATTERNS       = 
-EXAMPLE_PATH           = 
-EXAMPLE_PATTERNS       = 
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH           =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS       =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
 EXAMPLE_RECURSIVE      = NO
-INPUT_FILTER           = 
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH             = img
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output.
+# If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis.
+# Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match.
+# The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS        =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
 FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
 SOURCE_BROWSER         = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
 INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES
+# then for each documented function all documented
+# functions referencing it will be listed.
+
 REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
 REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.
+# Otherwise they will link to the documentation.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
 ALPHABETICAL_INDEX     = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
 COLS_IN_ALPHA_INDEX    = 2
-IGNORE_PREFIX          = 
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER            = head.html
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER            = foot.html
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = e.css
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded. For this to work a browser that supports
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files
+# will be generated that can be used as input for Apple's Xcode 3
+# integrated development environment, introduced with OSX 10.5 (Leopard).
+# To create a documentation set, doxygen will generate a Makefile in the
+# HTML output directory. Running make will produce the docset in that
+# directory and running "make install" will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find
+# it at startup.
+# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information.
+
+GENERATE_DOCSET        = NO
+
+# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the
+# feed. A documentation feed provides an umbrella under which multiple
+# documentation sets from a single provider (such as a company or product suite)
+# can be grouped.
+
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+
+# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that
+# should uniquely identify the documentation set bundle. This should be a
+# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen
+# will append .docset to the name.
+
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compiled HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE               =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING
+# is used to encode HtmlHelp index (hhk), content (hhc) and project file
+# content.
+
+CHM_INDEX_ENCODING     =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER
+# are set, an additional index file will be generated that can be used as input for
+# Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated
+# HTML documentation.
+
+GENERATE_QHP           = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can
+# be used to specify the file name of the resulting .qch file.
+# The path specified is relative to the HTML output folder.
+
+QCH_FILE               =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#namespace
+
+QHP_NAMESPACE          =
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating
+# Qt Help Project output. For more information please see
+# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+
+QHP_VIRTUAL_FOLDER     = doc
+
+# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add.
+# For more information please see
+# http://doc.trolltech.com/qthelpproject.html#custom-filters
+
+QHP_CUST_FILTER_NAME   =
+
+# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see
+# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters">Qt Help Project / Custom Filters</a>.
+
+QHP_CUST_FILTER_ATTRS  =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's
+# filter section matches.
+# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes">Qt Help Project / Filter Attributes</a>.
+
+QHP_SECT_FILTER_ATTRS  =
+
+# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can
+# be used to specify the location of Qt's qhelpgenerator.
+# If non-empty doxygen will try to run qhelpgenerator on the generated
+# .qhp file.
+
+QHG_LOCATION           =
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX          = YES
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 1
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information.
+# If the tag value is set to YES, a side panel will be generated
+# containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
+# Windows users are probably better off using the HTML help feature.
+
 GENERATE_TREEVIEW      = NO
+
+# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
+# and Class Hierarchy pages using a tree view instead of an ordered list.
+
+USE_INLINE_TREES       = NO
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
 TREEVIEW_WIDTH         = 250
+
+# Use this tag to change the font size of Latex formulas included
+# as images in the HTML documentation. The default is 10. Note that
+# when you change the font size after a successful doxygen run you need
+# to manually remove any form_*.png images from the HTML output directory
+# to force them to be regenerated.
+
+FORMULA_FONTSIZE       = 10
+
+# When the SEARCHENGINE tag is enable doxygen will generate a search box for the HTML output. The underlying search engine uses javascript
+# and DHTML and should work on any modern browser. Note that when using HTML help (GENERATE_HTMLHELP) or Qt help (GENERATE_QHP)
+# there is already a search function so this one should typically
+# be disabled.
+
+SEARCHENGINE           = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
 GENERATE_LATEX         = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
 LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
 LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
 MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
 COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
 PAPER_TYPE             = a4wide
-EXTRA_PACKAGES         = 
-LATEX_HEADER           = 
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
 PDF_HYPERLINKS         = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
 USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
 LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+# If LATEX_SOURCE_CODE is set to YES then doxygen will include source code with syntax highlighting in the LaTeX output. Note that which sources are shown also depends on other settings such as SOURCE_BROWSER.
+
+LATEX_SOURCE_CODE      = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
 GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
 RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
 COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
 RTF_HYPERLINKS         = NO
-RTF_STYLESHEET_FILE    = 
-RTF_EXTENSIONS_FILE    = 
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
 GENERATE_MAN           = YES
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
 MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
 MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
 MAN_LINKS              = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
 GENERATE_XML           = NO
-XML_SCHEMA             = 
-XML_DTD                = 
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA             =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD                =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
 GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader.
+# This is useful
+# if you want to understand what is going on.
+# On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
 ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
 MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
 EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
 SEARCH_INCLUDES        = NO
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
 INCLUDE_PATH           =
-INCLUDE_FILE_PATTERNS  = 
-PREDEFINED             = 
-EXPAND_AS_DEFINED      = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS  =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED             =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
 SKIP_FUNCTION_MACROS   = YES
-TAGFILES               = 
-GENERATE_TAGFILE       = 
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+#
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+#
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
 ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
 EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
 PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
 CLASS_DIAGRAMS         = NO
+
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see
+# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
+# default search path.
+
+MSCGEN_PATH            =
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
 HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
 HAVE_DOT               = NO
-CLASS_GRAPH            = NO
-COLLABORATION_GRAPH    = NO
+
+# By default doxygen will write a font called FreeSans.ttf to the output
+# directory and reference it in all dot files that doxygen generates. This
+# font does not include all possible unicode characters however, so when you need
+# these (or just want a differently looking font) you can specify the font name
+# using DOT_FONTNAME. You need need to make sure dot is able to find the font,
+# which can be done by putting it in a standard location or by setting the
+# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory
+# containing the font.
+
+DOT_FONTNAME           = FreeSans
+
+# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs.
+# The default size is 10pt.
+
+DOT_FONTSIZE           = 10
+
+# By default doxygen will tell dot to use the output directory to look for the
+# FreeSans.ttf font (which doxygen will put there itself). If you specify a
+# different font using DOT_FONTNAME you can set the path where dot
+# can find it using this tag.
+
+DOT_FONTPATH           =
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK               = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
 TEMPLATE_RELATIONS     = NO
-INCLUDE_GRAPH          = NO
-INCLUDED_BY_GRAPH      = NO
-GRAPHICAL_HIERARCHY    = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT options are set to YES then
+# doxygen will generate a call dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable call graphs
+# for selected functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then
+# doxygen will generate a caller dependency graph for every global function
+# or class method. Note that enabling this option will significantly increase
+# the time of a run. So in most cases it will be better to enable caller
+# graphs for selected functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
 DOT_IMAGE_FORMAT       = png
-DOT_PATH               = 
-DOTFILE_DIRS           = 
-MAX_DOT_GRAPH_WIDTH    = 512
-MAX_DOT_GRAPH_HEIGHT   = 512
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS           =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
+# nodes that will be shown in the graph. If the number of nodes in a graph
+# becomes larger than this value, doxygen will truncate the graph, which is
+# visualized by representing a node as a red box. Note that doxygen if the
+# number of direct children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not
+# seem to support this out of the box. Warning: Depending on the platform used,
+# enabling this option may lead to badly anti-aliased labels on the edges of
+# a graph (i.e. they become hard to read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
 GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
 DOT_CLEANUP            = YES
-SEARCHENGINE           = NO
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 4a3b39f..f816e7d 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -11,8 +11,6 @@ doc-clean:
 	rm -rf html/ latex/ man/ xml/ $(PACKAGE_DOCNAME).tar*
 
 doc: all doc-clean
-	cat ../src/lib/Edje.h >> ./edje.dox
-	cat `find ../src/lib -name "*.c" -fprint /dev/stdout | grep -v edje_edit.c` >> edje.dox
 	$(efl_doxygen)
 	cp img/* html/
 	rm -rf $(PACKAGE_DOCNAME).tar*
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 133d056..9b7886e 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -102,6 +102,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -173,6 +175,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -187,6 +190,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -201,8 +205,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
@@ -372,8 +376,6 @@ uninstall-am:
 @EFL_BUILD_DOC_TRUE@	rm -rf html/ latex/ man/ xml/ $(PACKAGE_DOCNAME).tar*
 
 @EFL_BUILD_DOC_TRUE at doc: all doc-clean
- at EFL_BUILD_DOC_TRUE@	cat ../src/lib/Edje.h >> ./edje.dox
- at EFL_BUILD_DOC_TRUE@	cat `find ../src/lib -name "*.c" -fprint /dev/stdout | grep -v edje_edit.c` >> edje.dox
 @EFL_BUILD_DOC_TRUE@	$(efl_doxygen)
 @EFL_BUILD_DOC_TRUE@	cp img/* html/
 @EFL_BUILD_DOC_TRUE@	rm -rf $(PACKAGE_DOCNAME).tar*
diff --git a/doc/e.css b/doc/e.css
index 604ee7f..2dd6b44 100644
--- a/doc/e.css
+++ b/doc/e.css
@@ -1,161 +1,273 @@
+/*
+    Author:
+        Andres Blanc <andresblanc at gmail.com>
+	DaveMDS Andreoli <dave at gurumeditation.it>
+
+    Supported Browsers:
+        ie7, opera9, konqueror4 and firefox3
+
+        Please use a different file for ie6, ie5, etc. hacks.
+*/
+
+
+/* Necessary to place the footer at the bottom of the page */
+html, body {
+	height: 100%;
+	margin: 0px;
+	padding: 0px;
+}
+
+#container {
+	min-height: 100%;
+	height: auto !important;
+	height: 100%;
+	margin: 0 auto -53px;
+}
+
+#footer, #push {
+	height: 53px;
+}
+
+
+* html #container {
+	height: 100%;
+}
+
+/* Prevent floating elements overflowing containers */
+.clear {
+	clear: both;
+	width: 0px;
+	height: 0px;
+}
+
+/* Flexible & centered layout from 750 to 960 pixels */
+.layout {
+	max-width: 960px;
+	min-width: 760px;
+	margin-left: auto;
+	margin-right: auto;
+}
+
 body {
-    background: url("b.png");
-    background-repeat: repeat-x;
-    background-position: top left;
-    background-color: #f4f4f4;
-    text-align: center;
-    font-family: sans-serif;
-    padding: 0;
-    margin: 0;
-}
-
-div.main {
-    margin: 1em auto;
-    vertical-align: top;
-    font-family: "Bitstream Vera", "Vera", "Trebuchet MS", Trebuchet, Tahoma, sans-serif;
-    color: #444444;
-    font-size: 0.8em;
-    text-align: justify;
-    width: 80%;
-}
-
-td.t { background-image:url("t.gif"); }
-td.t[class] { background-image:url("t.png"); }
-td.tl { background-image:url("tl.gif"); }
-td.tl[class] { background-image:url("tl.png"); }
-
-td.nav, td.lnav,  td.rnav {
-   align: middle;
-   text-align: center;
-   vertical-align: middle;
-   width: 100px;
-   height: 25px;
-   font-family: "Bitstream Vera", "Vera", "Trebuchet MS", Trebuchet, Tahoma, sans-serif;
-   color: #000000;
-   font-size: 9px;
-   font-weight: bold;
-   white-space: no-wrap;
-}  
-
-td.lnav[class] { background-image:url("n.png"); }
-td.lnav[class] { background-image:url("n.png"); }
-td.rnav { background-image:url("n.gif"); }
-td.rnav[class] { background-image:url("n.png"); }
-
-hr {
-    width: 200px;
-    height: 1px;
-    background: #dddddd;
-    border: 0;
-}
-
-p { color: #444444 ;}
-p.tiny, small {
-    color: #888888;
-    font-size: 0.5em;
-}
-
-h1 { 
-    text-align: center;
-    font-size: 1.3em; 
-}
-
-h2 { font-size: 1.1em; }
-h3 { font-size: 0.9em; }
-
-span.keyword { color: #008000; }
-span.keywordtype { color: #604020; }
-span.keywordflow { color: #e08000; }
-span.comment { color: #800000; }
-span.preprocessor { color: #806020; }
-span.stringliteral { color: #002080; }
-span.charliteral { color: #008080; }
-
-a:link {
-    color: #445566;
-    text-decoration: underline;
-}  
-   
-a:visited {
-    color: #667788;
-    text-decoration: underline;
-}  
-
-a:active {                
-    color: #88cccc;
-    text-decoration: none;
-}
-
-a:hover {
-    color: #112266;
-    text-decoration: underline;
-}  
-
-a.nav {
-    text-decoration: none;
-    display: block;
-}
- 
-a.nav:link, a.nav:visited { color: #888888; }
-a.nav:active { color: #000000; }
-a.nav:hover { color: #444444; }
-a.code:link, a.code:visited { text-decoration: none; }
-
-div.fragment {
-    font-size: 1em;
-    border: 1px dotted #cccccc;
-    background-color: #ffffff;
-    text-align: left;
-    vertical-align: middle;
-    padding: 2px;
-    margin-left: 25px;
-    margin-right: 25px;
-    overflow: auto;
-}
-
-td.indexkey {
-    font-weight: bold;
-    padding-left: 10px;
-    padding-right: 0;
-    padding-top: 2px;
-    padding-bottom: 0px;
-    margin: 0;
-    margin-top: 2px;
-    margin-bottom: 2px;
-    border: 1px dotted #cccccc;
-    border-right: 0px dotted #cccccc;
-}
-
-td.indexvalue {
-    font-style: italic;
-    padding-right: 10px;
-    padding-left: 0;
-    padding-top: 2px;
-    padding-bottom: 2px;
-    margin: 0;
-    margin-top: 2px;
-    margin-bottom: 2px;
-    border: 1px dotted #cccccc;
-    border-left: 0px dotted #cccccc;
-}
-
-.mdescRight { font-style: italic; }
-.memitem {
-    padding-left: 2px;
-    padding-right: 2px;
-    border: 1px dotted #cccccc;
-    background-color: #ffffff;
-}
-.memname {
-    white-space: nowrap;
-    font-weight: bold;
-}
-.paramname { font-weight: normal; }
-
-div.ah {
-    border: thin solid #888888;
-    font-weight: bold;
-    margin-bottom: 3px;
-    margin-top: 3px;
+	/*font-family: Lucida Grande, Helvetica, sans-serif;*/
+	font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif
+}
+
+/* Prevent design overflowing the viewport in small resolutions */
+#container {
+	padding-right: 17px;
+	padding-left: 17px;
+	background-image: url(head_bg.png);
+	background-repeat: repeat-x;
+}
+
+/****************************/
+/* Top main menu            */
+/****************************/
+#header_logo {
+   background-image        : url(logo.png);
+   width                   : 61px;
+}
+
+#header_logo a {
+   position                : absolute;
+   border                  : 0px;
+   background-color        : transparent;
+   top                     : 0px;
+   width                   : 60px;
+   height                  : 60px;
+}
+
+#header_menu {
+   background-image        : url(header_menu_background.png);
+   font                    : normal 10pt verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
+   text-align              : right;
+}
+
+#header_last {
+   background-image        : url(header_menu_background_last.png);
+   width                   : 15px;
+}
+
+td.nav_passive {
+   background              : url(header_menu_unselected_background.png) 0 0 no-repeat;
+   height                  : 63px;
+   font-family             : "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+   font-size               : 11px;
+   padding                 : 20px 10px 20px 10px;
+   vertical-align          : middle;
+}
+
+td.nav_active {
+   background              : url(header_menu_current_background.png) 0 0 no-repeat;
+   height                  : 63px;
+   color                   : #646464;
+   font-family             : "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+   font-size               : 11px;
+   font-weight             : bold;
+   padding                 : 20px 10px 20px 10px;
+   vertical-align          : middle;
+}
+
+#header_menu a {
+   display                 : block;
+   text-decoration         : none;
+   cursor                  : pointer;
+   color                   : #cdcdcd;
+}
+
+
+
+#header {
+	width: 100%;
+	height: 102px;
+}
+
+#header h1 {
+	width: 63px;
+	height: 63px;
+	position: absolute;
+	margin: 0px;
+}
+
+#header h1 span {
+	display: none;
+}
+
+#header h2 {
+	display: none;
+}
+
+/* .menu-container is used to set properties common to .menu and .submenu */
+#header .menu-container {
+}
+
+#header .menu-container ul {
+	list-style-type: none;
+	list-style-position: inside;
+	margin: 0;
+}
+
+#header .menu-container li {
+	display: block;
+	float: right;
+}
+
+#header .menu {
+	height: 63px;
+	display: block;
+	background-image: url(menu_bg.png);
+	background-repeat: repeat-x;
+}
+
+#header .menu ul {
+	height: 100%;
+	display: block;
+	background-image: url(menu_bg_last.png);
+	background-repeat: no-repeat;
+	background-position: top right;
+	padding-right: 17px;
+}
+
+#header .menu li {
+	height: 100%;
+	text-align: center;
+	background-image: url(menu_bg_unsel.png);
+	background-repeat: no-repeat;
+}
+
+#header .menu a {
+	height: 100%;
+	display: block;
+	color: #cdcdcd;
+	text-decoration: none;
+	font-size: 10pt;
+	line-height: 59px;
+	text-align: center;
+	padding: 0px 15px 0px 15px;
+}
+
+#header .menu li:hover {
+	background-image: url(menu_bg_hover.png);
+	background-repeat: no-repeat;
+}
+
+#header .menu li:hover a {
+	color: #FFFFFF;
+}
+
+#header .menu li.current {
+	background-image: url(menu_bg_current.png);
+	background-repeat: no-repeat;
+}
+
+#header .menu li.current a {
+	color: #646464;
+}
+
+
+/* Hide all the submenus but the current */
+#header .submenu ul {
+	display: none;
+}
+
+#header .submenu .current {
+	display: block;
+}
+
+#header .submenu {
+	font: bold 10px verdana,'Bitstream Vera Sans',helvetica,arial,sans-serif;
+	margin-top: 10px;
+}
+
+#header .submenu a {
+	color: #888888;
+	text-decoration: none;
+	font-size: 0.9em;
+	line-height: 15px;
+	padding:0px 5px 0px 5px;
+}
+
+#header .submenu a:hover {
+	color: #444444;
+}
+
+#header .submenu li {
+	border-left: 1px solid #DDDDDD;
+}
+
+#header .submenu li:last-child {
+	border-left: 0;
+}
+
+#header .doxytitle {
+	position: absolute;
+	font-size: 1.8em;
+	font-weight: bold;
+	color: #444444;
+	line-height: 35px;
+}
+
+#header small {
+	font-size: 0.4em;
+}
+
+#footer {
+	background-image: url(foot_bg.png);
+	width: 100%;
+}
+
+#footer table {
+	width: 100%;
+	text-align: center;
+	white-space: nowrap;
+	padding: 5px 30px 5px 30px;
+	font-size: 0.8em;
+	font-family: "Bitstream Vera","Vera","Trebuchet MS",Trebuchet,Tahoma,sans-serif;
+	color: #888888;
+}
+
+#footer td.copyright {
+	width: 100%;
 }
 
diff --git a/doc/edje.dox.in b/doc/edje.dox.in
index f86c310..c00bedd 100644
--- a/doc/edje.dox.in
+++ b/doc/edje.dox.in
@@ -8,7 +8,7 @@ These routines are used for Edje.
 /**
 
 @mainpage Edje Library Documentation
- at image html  edje.png
+ at image html  e.png
 @version @PACKAGE_VERSION@
 @author Carsten Haitzler <raster\@rasterman.com>
 @date 2003-2008
diff --git a/doc/foot.html b/doc/foot.html
index 0d3303d..d43cf8f 100644
--- a/doc/foot.html
+++ b/doc/foot.html
@@ -1,6 +1,18 @@
+ 
+ <div id="push"></div>
+ </div> <!-- #content -->
+  </div> <!-- .layout -->
+ 
+ </div> <!-- #container -->
+ 
+ 
+  <div id="footer">
+    <table><tr>
+      <td class="copyright">Copyright &copy;$year Enlightenment</td>
+      <td class="generated">Docs generated $datetime</td>
+    </tr></table>
   </div>
-  <hr />
-  <p class="tiny">Copyright &copy; Enlightenment.org</p>
-  <p class="tiny">$projectname Documentation Generated: $datetime</p>
- </body>
+
+
+</body>
 </html>
diff --git a/doc/head.html b/doc/head.html
index 7a4e61c..33a100f 100644
--- a/doc/head.html
+++ b/doc/head.html
@@ -1,45 +1,68 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
 <html>
- <head>
-  <title>$title</title>
-  <link href="e.css" rel="stylesheet" type="text/css" />
- </head>
+<head>
+    <title>$title</title>
+    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
+    <meta name="author" content="Andres Blanc" >
+    
+    <link rel="icon" href="img/favicon.png" type="image/x-icon">
+    <link rel="shortcut icon" href="img/favicon.png" type="image/x-icon">
+    <link rel="icon" href="img/favicon.png" type="image/ico">
+    <link rel="shortcut icon" href="img/favicon.png" type="image/ico">
+
+    <link rel="stylesheet" type="text/css" href="e.css">
+    <link rel="stylesheet" type="text/css" href="edoxy.css">
+</head>
 
 <body>
- <table width="100%" border="0" cellpadding="0" cellspacing="0">
-  <tr>
-   <td class="t" width="50%" valign="top" align="left">
-     <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=index">Home</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=news">News</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=about">About</a></td></tr>
-     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=download">Download</a></td></tr>
-    </table>
-   </td>
-   <td class="tl" width="612" height="250" valign="bottom" align="center">
-    <img src="_.gif" width="612" height="1" />
-    <table border="0" cellpadding="0" cellspacing="4px">
-     <tr>
-      <td class='nav'><a class='nav' href="index.html">Main Page</a></td>
-      <td class="nav"><a class="nav" href="edje_8dox.html">Edje API</a></td>
-      <td class="nav"><a class="nav" href="edcref.html">EDC Reference</a></td>
-      <td class="nav"><a class="nav" href="Edje__Edit_8h.html">Edje Edit API</a></td>
-      <td class="nav"><a class="nav" href="todo.html">Todo</a></td>
-     </tr>
-    </table>
-    <hr />
-   </td>
-   <td class="t" width="50%" valign="top" align="right">
-    <table width="100px" height="100px" border="0" cellpadding="0" cellspacing="0">
-     <tr><td class="rnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=support">Support</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contribute">Contribute</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://web.enlightenment.org/p.php?p=contact">Contact</a></td></tr>
-     <tr><td class="lnav"><a class="nav" href="http://trac.enlightenment.org/e">Tracker</a></td></tr>
-    </table>
-   </td>
-  </tr>
- </table>
-
- <div class="main">
+
+<div id="container">
+
+<div id="header">
+<div class="layout">
+    
+    <h1><span>Enlightenment</span></h1>
+    <h2><span>Beauty at your fingertips</span></h2>
+
+    <table cellspacing="0" cellpadding="0" width="100%"><tr>
+      <td id="header_logo">
+        <a href="http://www.enlightenment.org"></a>
+      </td>
+      <td id="header_menu">
+        <table cellspacing="0" cellpadding="0" align="right"><tr>
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=home">Home</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=news">News</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=about">About</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=download">Download</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=support">Support</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=contribute">Contribute</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=contact">Contact</a></td> 
+          <td class="nav_passive"><a class="nav_passive" href="http://trac.enlightenment.org/e">Tracker</a></td>
+          <td class="nav_passive"><a class="nav_passive" href="http://www.enlightenment.org/p.php?p=docs">Docs</a></td> 
+        </tr></table>          
+      </td>
+      <td id="header_last"></td>
+    </tr></table>
+
+    <div class="doxytitle">
+        $projectname Documentation <small>at $date</small>
+    </div>
+
+    <div class="menu-container">
+        <div class="submenu">
+            <ul class="current">
+                <li><a href="files.html">Files</a></li>
+                <li><a href="Edje_8h.html">Edje API</a></li>
+                <li><a href="Edje__Edit_8h.html">Edje Edit API</a></li>
+                <li><a href="edcref.html">EDC Reference</a></li>
+	        <li class="current"><a  href="index.html">Main Page</a></li>
+            </ul>
+        </div>
+    </div>
+
+
+    <div class="clear"></div>
+</div>
+</div>
+
+<div id="content">
+<div class="layout">
diff --git a/doc/img/_.gif b/doc/img/_.gif
deleted file mode 100644
index 60fa7a1..0000000
Binary files a/doc/img/_.gif and /dev/null differ
diff --git a/doc/img/b.png b/doc/img/b.png
deleted file mode 100644
index 6fbfc2b..0000000
Binary files a/doc/img/b.png and /dev/null differ
diff --git a/doc/img/e.png b/doc/img/e.png
new file mode 100644
index 0000000..d42aeb4
Binary files /dev/null and b/doc/img/e.png differ
diff --git a/doc/img/edje.png b/doc/img/edje.png
deleted file mode 100644
index 47597a8..0000000
Binary files a/doc/img/edje.png and /dev/null differ
diff --git a/doc/img/edje_big.png b/doc/img/edje_big.png
deleted file mode 100644
index cd818f7..0000000
Binary files a/doc/img/edje_big.png and /dev/null differ
diff --git a/doc/img/edje_mini.png b/doc/img/edje_mini.png
deleted file mode 100644
index f4f99f0..0000000
Binary files a/doc/img/edje_mini.png and /dev/null differ
diff --git a/doc/img/edje_small.png b/doc/img/edje_small.png
deleted file mode 100644
index 8bea367..0000000
Binary files a/doc/img/edje_small.png and /dev/null differ
diff --git a/doc/img/edoxy.css b/doc/img/edoxy.css
new file mode 100644
index 0000000..311ca23
--- /dev/null
+++ b/doc/img/edoxy.css
@@ -0,0 +1,486 @@
+/*
+ * This file contain a custom doxygen style to match e.org graphics
+ */
+
+
+
+/* BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
+	font-family: Geneva, Arial, Helvetica, sans-serif;
+}*/ 
+BODY, TD {
+	font-size: 12px;
+}
+H1 {
+	text-align: center;
+	font-size: 160%;
+}
+H2 {
+	font-size: 120%;
+}
+H3 {
+	font-size: 100%;
+}
+CAPTION { 
+	font-weight: bold 
+}
+DIV.qindex {
+	width: 100%;
+	background-color: #e8eef2;
+	border: 1px solid #84b0c7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+	line-height: 140%;
+}
+DIV.navpath {
+	width: 100%;
+	background-color: #e8eef2;
+	border: 1px solid #84b0c7;
+	text-align: center;
+	margin: 2px;
+	padding: 2px;
+	line-height: 140%;
+}
+DIV.navtab {
+       background-color: #e8eef2;
+       border: 1px solid #84b0c7;
+       text-align: center;
+       margin: 2px;
+       margin-right: 15px;
+       padding: 2px;
+}
+TD.navtab {
+       font-size: 70%;
+}
+A.qindex {
+       text-decoration: none;
+       font-weight: bold;
+       color: #1A419D;
+}
+A.qindex:visited {
+       text-decoration: none;
+       font-weight: bold;
+       color: #1A419D
+}
+A.qindex:hover {
+	text-decoration: none;
+	background-color: #ddddff;
+}
+A.qindexHL {
+	text-decoration: none;
+	font-weight: bold;
+	background-color: #6666cc;
+	color: #ffffff;
+	border: 1px double #9295C2;
+}
+A.qindexHL:hover {
+	text-decoration: none;
+	background-color: #6666cc;
+	color: #ffffff;
+}
+A.qindexHL:visited { 
+	text-decoration: none; 
+	background-color: #6666cc; 
+	color: #ffffff 
+}
+A.el { 
+	text-decoration: none; 
+	font-weight: bold 
+}
+A.elRef { 
+	font-weight: bold 
+}
+A.code:link { 
+	text-decoration: none; 
+	font-weight: normal; 
+	color: #0000FF
+}
+A.code:visited { 
+	text-decoration: none; 
+	font-weight: normal; 
+	color: #0000FF
+}
+A.codeRef:link { 
+	font-weight: normal; 
+	color: #0000FF
+}
+A.codeRef:visited { 
+	font-weight: normal; 
+	color: #0000FF
+}
+A:hover, A:visited:hover { 
+	text-decoration: none; 	
+	/* background-color: #f2f2ff; */
+	color: #000055;
+}
+A.anchor {
+	color: #000;
+}
+DL.el { 
+	margin-left: -1cm 
+}
+.fragment {
+       font-family: monospace, fixed;
+       font-size: 95%;
+}
+PRE.fragment {
+	border: 1px solid #CCCCCC;
+	background-color: #f5f5f5;
+	margin-top: 4px;
+	margin-bottom: 4px;
+	margin-left: 2px;
+	margin-right: 8px;
+	padding-left: 6px;
+	padding-right: 6px;
+	padding-top: 4px;
+	padding-bottom: 4px;
+}
+DIV.ah { 
+	background-color: black; 
+	font-weight: bold; 
+	color: #ffffff; 
+	margin-bottom: 3px; 
+	margin-top: 3px 
+}
+
+DIV.groupHeader {
+       margin-left: 16px;
+       margin-top: 12px;
+       margin-bottom: 6px;
+       font-weight: bold;
+}
+DIV.groupText { 
+	margin-left: 16px; 
+	font-style: italic; 
+	font-size: 90% 
+}
+/*BODY {
+	background: white;
+	color: black;
+	margin-right: 20px;
+	margin-left: 20px;
+}*/
+TD.indexkey {
+	background-color: #e8eef2;
+	font-weight: bold;
+	padding-right  : 10px;
+	padding-top    : 2px;
+	padding-left   : 10px;
+	padding-bottom : 2px;
+	margin-left    : 0px;
+	margin-right   : 0px;
+	margin-top     : 2px;
+	margin-bottom  : 2px;
+	border: 1px solid #CCCCCC;
+}
+TD.indexvalue {
+	background-color: #e8eef2;
+	font-style: italic;
+	padding-right  : 10px;
+	padding-top    : 2px;
+	padding-left   : 10px;
+	padding-bottom : 2px;
+	margin-left    : 0px;
+	margin-right   : 0px;
+	margin-top     : 2px;
+	margin-bottom  : 2px;
+	border: 1px solid #CCCCCC;
+}
+TR.memlist {
+	background-color: #f0f0f0; 
+}
+P.formulaDsp { 
+	text-align: center; 
+}
+IMG.formulaDsp {
+}
+IMG.formulaInl { 
+	vertical-align: middle; 
+}
+SPAN.keyword       { color: #008000 }
+SPAN.keywordtype   { color: #604020 }
+SPAN.keywordflow   { color: #e08000 }
+SPAN.comment       { color: #800000 }
+SPAN.preprocessor  { color: #806020 }
+SPAN.stringliteral { color: #002080 }
+SPAN.charliteral   { color: #008080 }
+SPAN.vhdldigit     { color: #ff00ff }
+SPAN.vhdlchar      { color: #000000 }
+SPAN.vhdlkeyword   { color: #700070 }
+SPAN.vhdllogic     { color: #ff0000 }
+
+.mdescLeft {
+	padding: 0px 8px 4px 8px;
+	font-size: 80%;
+	font-style: italic;
+	background-color: #FAFAFA;
+	border-top: 1px none #E0E0E0;
+	border-right: 1px none #E0E0E0;
+	border-bottom: 1px none #E0E0E0;
+	border-left: 1px none #E0E0E0;
+	margin: 0px;
+}
+.mdescRight {
+        padding: 0px 8px 4px 8px;
+	font-size: 80%;
+	font-style: italic;
+	background-color: #FAFAFA;
+	border-top: 1px none #E0E0E0;
+	border-right: 1px none #E0E0E0;
+	border-bottom: 1px none #E0E0E0;
+	border-left: 1px none #E0E0E0;
+	margin: 0px;
+}
+.memItemLeft {
+	padding: 1px 0px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: solid;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memItemRight {
+	padding: 1px 8px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: solid;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memTemplItemLeft {
+	padding: 1px 0px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: none;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memTemplItemRight {
+	padding: 1px 8px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: none;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.memTemplParams {
+	padding: 1px 0px 0px 8px;
+	margin: 4px;
+	border-top-width: 1px;
+	border-right-width: 1px;
+	border-bottom-width: 1px;
+	border-left-width: 1px;
+	border-top-color: #E0E0E0;
+	border-right-color: #E0E0E0;
+	border-bottom-color: #E0E0E0;
+	border-left-color: #E0E0E0;
+	border-top-style: solid;
+	border-right-style: none;
+	border-bottom-style: none;
+	border-left-style: none;
+	color: #606060;
+	background-color: #FAFAFA;
+	font-size: 80%;
+}
+.search { 
+	color: #003399;
+	font-weight: bold;
+}
+FORM.search {
+	margin-bottom: 0px;
+	margin-top: 0px;
+}
+INPUT.search { 
+	font-size: 75%;
+	color: #000080;
+	font-weight: normal;
+	background-color: #e8eef2;
+}
+TD.tiny { 
+	font-size: 75%;
+}
+a {
+	color: #1A41A8;
+}
+a:visited {
+	color: #2A3798;
+}
+.dirtab { 
+	padding: 4px;
+	border-collapse: collapse;
+	border: 1px solid #84b0c7;
+}
+TH.dirtab { 
+	background: #e8eef2;
+	font-weight: bold;
+}
+HR { 
+	height: 1px;
+	border: none;
+	border-top: 1px solid black;
+}
+
+/* Style for detailed member documentation */
+.memtemplate {
+	font-size: 80%;
+	color: #606060;
+	font-weight: normal;
+	margin-left: 3px;
+} 
+.memnav { 
+	background-color: #eeeeee;
+	border: 1px solid #dddddd;
+	text-align: center;
+	margin: 2px;
+	margin-right: 15px;
+	padding: 2px;
+}
+.memitem {
+	padding: 4px;
+	background-color: #eeeeee;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #dddddd;
+	-moz-border-radius: 4px 4px 4px 4px;
+}
+.memname {
+	white-space: nowrap;
+	font-weight: bold;
+        color: #ffffff;
+}
+.memdoc{
+	padding-left: 10px;
+}
+.memproto {
+	background-color: #111111;
+	width: 100%;
+	border-width: 1px;
+	border-style: solid;
+	border-color: #000000;
+	font-weight: bold;
+	-moz-border-radius: 4px 4px 4px 4px;
+}
+.paramkey {
+	text-align: right;
+	color: #ffffff;
+}
+.paramtype {
+	white-space: nowrap;
+	color: #aaaaaa;
+}
+.paramname {
+	color: #ff0000;
+	font-style: italic;
+	white-space: nowrap;
+}
+/* End Styling for detailed member documentation */
+
+/* for the tree view */
+.ftvtree {
+	font-family: sans-serif;
+	margin:0.5em;
+}
+/* these are for tree view when used as main index */
+.directory { 
+	font-size: 9pt; 
+	font-weight: bold; 
+}
+.directory h3 { 
+	margin: 0px; 
+	margin-top: 1em; 
+	font-size: 11pt; 
+}
+
+/* The following two styles can be used to replace the root node title */
+/* with an image of your choice.  Simply uncomment the next two styles, */
+/* specify the name of your image and be sure to set 'height' to the */
+/* proper pixel height of your image. */
+
+/* .directory h3.swap { */
+/* 	height: 61px; */
+/* 	background-repeat: no-repeat; */
+/* 	background-image: url("yourimage.gif"); */
+/* } */
+/* .directory h3.swap span { */
+/* 	display: none; */
+/* } */
+
+.directory > h3 { 
+	margin-top: 0; 
+}
+.directory p { 
+	margin: 0px; 
+	white-space: nowrap; 
+}
+.directory div { 
+	display: none; 
+	margin: 0px; 
+}
+.directory img { 
+	vertical-align: -30%; 
+}
+/* these are for tree view when not used as main index */
+.directory-alt { 
+	font-size: 100%; 
+	font-weight: bold; 
+}
+.directory-alt h3 { 
+	margin: 0px; 
+	margin-top: 1em; 
+	font-size: 11pt; 
+}
+.directory-alt > h3 { 
+	margin-top: 0; 
+}
+.directory-alt p { 
+	margin: 0px; 
+	white-space: nowrap; 
+}
+.directory-alt div { 
+	display: none; 
+	margin: 0px; 
+}
+.directory-alt img { 
+	vertical-align: -30%; 
+}
+
diff --git a/doc/img/elementary.png b/doc/img/elementary.png
new file mode 100644
index 0000000..7975489
Binary files /dev/null and b/doc/img/elementary.png differ
diff --git a/doc/img/foot_bg.png b/doc/img/foot_bg.png
new file mode 100644
index 0000000..b24f3a4
Binary files /dev/null and b/doc/img/foot_bg.png differ
diff --git a/doc/img/head_bg.png b/doc/img/head_bg.png
new file mode 100644
index 0000000..081dc13
Binary files /dev/null and b/doc/img/head_bg.png differ
diff --git a/doc/img/header_menu_background.png b/doc/img/header_menu_background.png
new file mode 100644
index 0000000..e978743
Binary files /dev/null and b/doc/img/header_menu_background.png differ
diff --git a/doc/img/header_menu_background_last.png b/doc/img/header_menu_background_last.png
new file mode 100644
index 0000000..88c116c
Binary files /dev/null and b/doc/img/header_menu_background_last.png differ
diff --git a/doc/img/header_menu_current_background.png b/doc/img/header_menu_current_background.png
new file mode 100644
index 0000000..de97c92
Binary files /dev/null and b/doc/img/header_menu_current_background.png differ
diff --git a/doc/img/header_menu_unselected_background.png b/doc/img/header_menu_unselected_background.png
new file mode 100644
index 0000000..50e5fd8
Binary files /dev/null and b/doc/img/header_menu_unselected_background.png differ
diff --git a/doc/img/hilite.png b/doc/img/hilite.png
deleted file mode 100644
index 88a4381..0000000
Binary files a/doc/img/hilite.png and /dev/null differ
diff --git a/doc/img/logo.png b/doc/img/logo.png
new file mode 100644
index 0000000..b3884a5
Binary files /dev/null and b/doc/img/logo.png differ
diff --git a/doc/img/n.gif b/doc/img/n.gif
deleted file mode 100644
index 8c3148f..0000000
Binary files a/doc/img/n.gif and /dev/null differ
diff --git a/doc/img/n.png b/doc/img/n.png
deleted file mode 100644
index 6d80004..0000000
Binary files a/doc/img/n.png and /dev/null differ
diff --git a/doc/img/t.gif b/doc/img/t.gif
deleted file mode 100644
index cff3068..0000000
Binary files a/doc/img/t.gif and /dev/null differ
diff --git a/doc/img/t.png b/doc/img/t.png
deleted file mode 100644
index 5a40479..0000000
Binary files a/doc/img/t.png and /dev/null differ
diff --git a/doc/img/tl.gif b/doc/img/tl.gif
deleted file mode 100644
index c5e973a..0000000
Binary files a/doc/img/tl.gif and /dev/null differ
diff --git a/doc/img/tl.png b/doc/img/tl.png
deleted file mode 100644
index b14a7f1..0000000
Binary files a/doc/img/tl.png and /dev/null differ
diff --git a/edje.pc.in b/edje.pc.in
index 7d2d4bf..48412ff 100644
--- a/edje.pc.in
+++ b/edje.pc.in
@@ -7,8 +7,8 @@ datadir=@datadir@/edje
 
 Name: edje
 Description: Enlightened graphical design and layout engine.
-Requires: @requirement_edje@
+ at pkgconfig_requires_private@: @requirement_edje@
 Version: @VERSION@
 Libs: -L${libdir} -ledje
-Libs.private: @EDJE_LIBS@ @EVIL_LIBS@ @ECORE_IMF_LIBS@
+Libs.private:
 Cflags: -I${includedir}
diff --git a/edje.spec b/edje.spec
index b8c1bb6..29d4616 100644
--- a/edje.spec
+++ b/edje.spec
@@ -2,7 +2,7 @@
 
 Summary: Complex Graphical Design/Layout Engine
 Name: edje
-Version: 0.9.92.062
+Version: 0.9.93.063
 Release: 0.%(date '+%Y%m%d')
 License: BSD
 Group: System Environment/Libraries
diff --git a/ltmain.sh b/ltmain.sh
index 6d056ec..b612e9a 100755
--- a/ltmain.sh
+++ b/ltmain.sh
@@ -1,6 +1,6 @@
 # Generated from ltmain.m4sh.
 
-# ltmain.sh (GNU libtool) 2.2.4
+# ltmain.sh (GNU libtool) 2.2.6
 # Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
 
 # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.
@@ -65,7 +65,7 @@
 #       compiler:		$LTCC
 #       compiler flags:		$LTCFLAGS
 #       linker:		$LD (gnu? $with_gnu_ld)
-#       $progname:		(GNU libtool) 2.2.4 Debian-2.2.4-0ubuntu4
+#       $progname:		(GNU libtool) 2.2.6 Debian-2.2.6a-1ubuntu1
 #       automake:		$automake_version
 #       autoconf:		$autoconf_version
 #
@@ -73,9 +73,9 @@
 
 PROGRAM=ltmain.sh
 PACKAGE=libtool
-VERSION="2.2.4 Debian-2.2.4-0ubuntu4"
+VERSION="2.2.6 Debian-2.2.6a-1ubuntu1"
 TIMESTAMP=""
-package_revision=1.2976
+package_revision=1.3012
 
 # Be Bourne compatible
 if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
@@ -805,7 +805,7 @@ func_enable_tag ()
 
 
   case $host in
-    *cygwin* | *mingw* | *pw32*)
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
       # don't eliminate duplications in $postdeps and $predeps
       opt_duplicate_compiler_generated_deps=:
       ;;
@@ -893,8 +893,9 @@ $opt_help || {
 # determined imposters.
 func_lalib_p ()
 {
-    $SED -e 4q "$1" 2>/dev/null \
-      | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
 }
 
 # func_lalib_unsafe_p file
@@ -907,7 +908,7 @@ func_lalib_p ()
 func_lalib_unsafe_p ()
 {
     lalib_p=no
-    if test -r "$1" && exec 5<&0 <"$1"; then
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
 	for lalib_p_l in 1 2 3 4
 	do
 	    read lalib_p_line
@@ -1275,7 +1276,7 @@ func_mode_compile ()
 
     # On Cygwin there's no "real" PIC flag so we must build both object types
     case $host_os in
-    cygwin* | mingw* | pw32* | os2*)
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
       pic_mode=default
       ;;
     esac
@@ -2046,7 +2047,7 @@ func_mode_install ()
 	      'exit $?'
 	  tstripme="$stripme"
 	  case $host_os in
-	  cygwin* | mingw* | pw32*)
+	  cygwin* | mingw* | pw32* | cegcc*)
 	    case $realname in
 	    *.dll.a)
 	      tstripme=""
@@ -2152,7 +2153,7 @@ func_mode_install ()
 
 	# Do a test to see if this is really a libtool program.
 	case $host in
-	*cygwin*|*mingw*)
+	*cygwin* | *mingw*)
 	    if func_ltwrapper_executable_p "$file"; then
 	      func_ltwrapper_scriptname "$file"
 	      wrapper=$func_ltwrapper_scriptname_result
@@ -2358,7 +2359,7 @@ extern \"C\" {
 	      $RM $export_symbols
 	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
 	      case $host in
-	      *cygwin* | *mingw* )
+	      *cygwin* | *mingw* | *cegcc* )
                 eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
                 eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
 	        ;;
@@ -2370,7 +2371,7 @@ extern \"C\" {
 	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
 	      eval '$MV "$nlist"T "$nlist"'
 	      case $host in
-	        *cygwin | *mingw* )
+	        *cygwin | *mingw* | *cegcc* )
 	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
 	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
 	          ;;
@@ -2426,7 +2427,7 @@ typedef struct {
 } lt_dlsymlist;
 "
 	  case $host in
-	  *cygwin* | *mingw* )
+	  *cygwin* | *mingw* | *cegcc* )
 	    $ECHO >> "$output_objdir/$my_dlsyms" "\
 /* DATA imports from DLLs on WIN32 con't be const, because
    runtime relocations are performed -- see ld's documentation
@@ -2512,7 +2513,7 @@ static const void *lt_preloaded_setup() {
 	# Transform the symbol file into the correct name.
 	symfileobj="$output_objdir/${my_outputname}S.$objext"
 	case $host in
-	*cygwin* | *mingw* )
+	*cygwin* | *mingw* | *cegcc* )
 	  if test -f "$output_objdir/$my_outputname.def"; then
 	    compile_command=`$ECHO "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
 	    finalize_command=`$ECHO "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
@@ -2691,25 +2692,16 @@ func_extract_archives ()
 
 
 
-# func_emit_wrapper arg
+# func_emit_wrapper_part1 [arg=no]
 #
-# emit a libtool wrapper script on stdout
-# don't directly open a file because we may want to
-# incorporate the script contents within a cygwin/mingw
-# wrapper executable.  Must ONLY be called from within
-# func_mode_link because it depends on a number of variable
-# set therein.
-#
-# arg is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
-# variable will take.  If 'yes', then the emitted script
-# will assume that the directory in which it is stored is
-# the '.lib' directory.  This is a cygwin/mingw-specific
-# behavior.
-func_emit_wrapper ()
+# Emit the first part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part1 ()
 {
-	func_emit_wrapper_arg1=no
+	func_emit_wrapper_part1_arg1=no
 	if test -n "$1" ; then
-	  func_emit_wrapper_arg1=$1
+	  func_emit_wrapper_part1_arg1=$1
 	fi
 
 	$ECHO "\
@@ -2794,10 +2786,27 @@ else
     file=\`\$ECHO \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
     file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
   done
+"
+}
+# end: func_emit_wrapper_part1
+
+# func_emit_wrapper_part2 [arg=no]
+#
+# Emit the second part of a libtool wrapper script on stdout.
+# For more information, see the description associated with
+# func_emit_wrapper(), below.
+func_emit_wrapper_part2 ()
+{
+	func_emit_wrapper_part2_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_part2_arg1=$1
+	fi
+
+	$ECHO "\
 
   # Usually 'no', except on cygwin/mingw when embedded into
   # the cwrapper.
-  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1
   if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
     # special case for '.'
     if test \"\$thisdir\" = \".\"; then
@@ -2888,7 +2897,7 @@ else
 "
 	case $host in
 	# Backslashes separate directories on plain windows
-	*-*-mingw | *-*-os2*)
+	*-*-mingw | *-*-os2* | *-cegcc*)
 	  $ECHO "\
       exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
 "
@@ -2914,7 +2923,207 @@ else
 fi\
 "
 }
-# end: func_emit_wrapper
+# end: func_emit_wrapper_part2
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=no
+	if test -n "$1" ; then
+	  func_emit_wrapper_arg1=$1
+	fi
+
+	# split this up so that func_emit_cwrapperexe_src
+	# can call each part independently.
+	func_emit_wrapper_part1 "${func_emit_wrapper_arg1}"
+	func_emit_wrapper_part2 "${func_emit_wrapper_arg1}"
+}
+
+
+# func_to_host_path arg
+#
+# Convert paths to host format when used with build tools.
+# Intended for use with "native" mingw (where libtool itself
+# is running under the msys shell), or in the following cross-
+# build environments:
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+# where wine is equipped with the `winepath' executable.
+# In the native mingw case, the (msys) shell automatically
+# converts paths for any non-msys applications it launches,
+# but that facility isn't available from inside the cwrapper.
+# Similar accommodations are necessary for $host mingw and
+# $build cygwin.  Calling this function does no harm for other
+# $host/$build combinations not listed above.
+#
+# ARG is the path (on $build) that should be converted to
+# the proper representation for $host. The result is stored
+# in $func_to_host_path_result.
+func_to_host_path ()
+{
+  func_to_host_path_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        case $build in
+          *mingw* ) # actually, msys
+            # awkward: cmd appends spaces to result
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_path_tmp1=`( cmd //c echo "$1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_path_tmp1=`cygpath -w "$1"`
+            func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # Unfortunately, winepath does not exit with a non-zero
+            # error code, so we are forced to check the contents of
+            # stdout. On the other hand, if the command is not
+            # found, the shell will set an exit code of 127 and print
+            # *an error message* to stdout. So we must check for both
+            # error code of zero AND non-empty stdout, which explains
+            # the odd construction:
+            func_to_host_path_tmp1=`winepath -w "$1" 2>/dev/null`
+            if test "$?" -eq 0 && test -n "${func_to_host_path_tmp1}"; then
+              func_to_host_path_result=`echo "$func_to_host_path_tmp1" |\
+                $SED -e "$lt_sed_naive_backslashify"`
+            else
+              # Allow warning below.
+              func_to_host_path_result=""
+            fi
+            ;;
+        esac
+        if test -z "$func_to_host_path_result" ; then
+          func_error "Could not determine host path corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback:
+          func_to_host_path_result="$1"
+        fi
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_path
+
+# func_to_host_pathlist arg
+#
+# Convert pathlists to host format when used with build tools.
+# See func_to_host_path(), above. This function supports the
+# following $build/$host combinations (but does no harm for
+# combinations not listed here):
+#    $build          $host
+#    mingw (msys)    mingw  [e.g. native]
+#    cygwin          mingw
+#    *nix + wine     mingw
+#
+# Path separators are also converted from $build format to
+# $host format. If ARG begins or ends with a path separator
+# character, it is preserved (but converted to $host format)
+# on output.
+#
+# ARG is a pathlist (on $build) that should be converted to
+# the proper representation on $host. The result is stored
+# in $func_to_host_pathlist_result.
+func_to_host_pathlist ()
+{
+  func_to_host_pathlist_result="$1"
+  if test -n "$1" ; then
+    case $host in
+      *mingw* )
+        lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+        # Remove leading and trailing path separator characters from
+        # ARG. msys behavior is inconsistent here, cygpath turns them
+        # into '.;' and ';.', and winepath ignores them completely.
+        func_to_host_pathlist_tmp2="$1"
+        # Once set for this call, this variable should not be
+        # reassigned. It is used in tha fallback case.
+        func_to_host_pathlist_tmp1=`echo "$func_to_host_pathlist_tmp2" |\
+          $SED -e 's|^:*||' -e 's|:*$||'`
+        case $build in
+          *mingw* ) # Actually, msys.
+            # Awkward: cmd appends spaces to result.
+            lt_sed_strip_trailing_spaces="s/[ ]*\$//"
+            func_to_host_pathlist_tmp2=`( cmd //c echo "$func_to_host_pathlist_tmp1" |\
+              $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo ""`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          *cygwin* )
+            func_to_host_pathlist_tmp2=`cygpath -w -p "$func_to_host_pathlist_tmp1"`
+            func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp2" |\
+              $SED -e "$lt_sed_naive_backslashify"`
+            ;;
+          * )
+            # unfortunately, winepath doesn't convert pathlists
+            func_to_host_pathlist_result=""
+            func_to_host_pathlist_oldIFS=$IFS
+            IFS=:
+            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do
+              IFS=$func_to_host_pathlist_oldIFS
+              if test -n "$func_to_host_pathlist_f" ; then
+                func_to_host_path "$func_to_host_pathlist_f"
+                if test -n "$func_to_host_path_result" ; then
+                  if test -z "$func_to_host_pathlist_result" ; then
+                    func_to_host_pathlist_result="$func_to_host_path_result"
+                  else
+                    func_to_host_pathlist_result="$func_to_host_pathlist_result;$func_to_host_path_result"
+                  fi
+                fi
+              fi
+              IFS=:
+            done
+            IFS=$func_to_host_pathlist_oldIFS
+            ;;
+        esac
+        if test -z "$func_to_host_pathlist_result" ; then
+          func_error "Could not determine the host path(s) corresponding to"
+          func_error "  '$1'"
+          func_error "Continuing, but uninstalled executables may not work."
+          # Fallback. This may break if $1 contains DOS-style drive
+          # specifications. The fix is not to complicate the expression
+          # below, but for the user to provide a working wine installation
+          # with winepath so that path translation in the cross-to-mingw
+          # case works properly.
+          lt_replace_pathsep_nix_to_dos="s|:|;|g"
+          func_to_host_pathlist_result=`echo "$func_to_host_pathlist_tmp1" |\
+            $SED -e "$lt_replace_pathsep_nix_to_dos"`
+        fi
+        # Now, add the leading and trailing path separators back
+        case "$1" in
+          :* ) func_to_host_pathlist_result=";$func_to_host_pathlist_result"
+            ;;
+        esac
+        case "$1" in
+          *: ) func_to_host_pathlist_result="$func_to_host_pathlist_result;"
+            ;;
+        esac
+        ;;
+    esac
+  fi
+}
+# end: func_to_host_pathlist
 
 # func_emit_cwrapperexe_src
 # emit the source code for a wrapper executable on stdout
@@ -2951,6 +3160,12 @@ EOF
 # include <stdint.h>
 # ifdef __CYGWIN__
 #  include <io.h>
+#  define HAVE_SETENV
+#  ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+#  endif
 # endif
 #endif
 #include <malloc.h>
@@ -3057,29 +3272,105 @@ int make_executable (const char *path);
 int check_executable (const char *path);
 char *strendzap (char *str, const char *pat);
 void lt_fatal (const char *message, ...);
-
-static const char *script_text =
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_opt_process_env_set (const char *arg);
+void lt_opt_process_env_prepend (const char *arg);
+void lt_opt_process_env_append (const char *arg);
+int lt_split_name_value (const char *arg, char** name, char** value);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+
+static const char *script_text_part1 =
 EOF
 
-	    func_emit_wrapper yes |
+	    func_emit_wrapper_part1 yes |
+	        $SED -e 's/\([\\"]\)/\\\1/g' \
+	             -e 's/^/  "/' -e 's/$/\\n"/'
+	    echo ";"
+	    cat <<EOF
+
+static const char *script_text_part2 =
+EOF
+	    func_emit_wrapper_part2 yes |
 	        $SED -e 's/\([\\"]\)/\\\1/g' \
 	             -e 's/^/  "/' -e 's/$/\\n"/'
 	    echo ";"
 
 	    cat <<EOF
 const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_pathlist "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_pathlist "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_pathlist_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+#define LTWRAPPER_OPTION_PREFIX_LENGTH  5
+
+static const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+
+static const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;
+static const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX "env-set";
+  /* argument is putenv-style "foo=bar", value of foo is set to bar */
+
+static const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;
+static const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX "env-prepend";
+  /* argument is putenv-style "foo=bar", new value of foo is bar${foo} */
+
+static const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;
+static const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX "env-append";
+  /* argument is putenv-style "foo=bar", new value of foo is ${foo}bar */
 
 int
 main (int argc, char *argv[])
 {
   char **newargz;
+  int  newargc;
   char *tmp_pathspec;
   char *actual_cwrapper_path;
-  char *shwrapper_name;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
   intptr_t rval = 127;
-  FILE *shwrapper;
 
-  const char *dumpscript_opt = "--lt-dump-script";
   int i;
 
   program_name = (char *) xstrdup (base_name (argv[0]));
@@ -3099,38 +3390,14 @@ EOF
 		;;
 	      esac
 
-	    cat <<EOF
-	  printf ("%s", script_text);
+	    cat <<"EOF"
+	  printf ("%s", script_text_part1);
+	  printf ("%s", script_text_part2);
 	  return 0;
 	}
     }
 
-  newargz = XMALLOC (char *, argc + 2);
-EOF
-
-	    if test -n "$TARGETSHELL" ; then
-	      # no path translation at all
-	      lt_newargv0=$TARGETSHELL
-	    else
-	      case "$host" in
-		*mingw* )
-		  # awkward: cmd appends spaces to result
-		  lt_sed_strip_trailing_spaces="s/[ ]*\$//"
-		  lt_newargv0=`( cmd //c echo $SHELL | $SED -e "$lt_sed_strip_trailing_spaces" ) 2>/dev/null || echo $SHELL`
-		  case $lt_newargv0 in
-		    *.exe | *.EXE) ;;
-		    *) lt_newargv0=$lt_newargv0.exe ;;
-		  esac
-		  ;;
-		* ) lt_newargv0=$SHELL ;;
-	      esac
-	    fi
-
-		cat <<EOF
-  newargz[0] = (char *) xstrdup ("$lt_newargv0");
-EOF
-
-	    cat <<"EOF"
+  newargz = XMALLOC (char *, argc + 1);
   tmp_pathspec = find_executable (argv[0]);
   if (tmp_pathspec == NULL)
     lt_fatal ("Couldn't find %s", argv[0]);
@@ -3142,39 +3409,60 @@ EOF
 			  actual_cwrapper_path));
   XFREE (tmp_pathspec);
 
-  shwrapper_name = (char *) xstrdup (base_name (actual_cwrapper_path));
-  strendzap (actual_cwrapper_path, shwrapper_name);
-
-  /* shwrapper_name transforms */
-  strendzap (shwrapper_name, ".exe");
-  tmp_pathspec = XMALLOC (char, (strlen (shwrapper_name) +
-				 strlen ("_ltshwrapperTMP") + 1));
-  strcpy (tmp_pathspec, shwrapper_name);
-  strcat (tmp_pathspec, "_ltshwrapperTMP");
-  XFREE (shwrapper_name);
-  shwrapper_name = tmp_pathspec;
+  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
   tmp_pathspec = 0;
-  LTWRAPPER_DEBUGPRINTF (("(main) libtool shell wrapper name: %s\n",
-			  shwrapper_name));
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  LTWRAPPER_DEBUGPRINTF (("(main) libtool target name: %s\n",
+			  target_name));
 EOF
 
 	    cat <<EOF
-  newargz[1] =
+  newargz[0] =
     XMALLOC (char, (strlen (actual_cwrapper_path) +
-		    strlen ("$objdir") + 1 + strlen (shwrapper_name) + 1));
-  strcpy (newargz[1], actual_cwrapper_path);
-  strcat (newargz[1], "$objdir");
-  strcat (newargz[1], "/");
-  strcat (newargz[1], shwrapper_name);
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
 EOF
 
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
 
 	    case $host_os in
 	      mingw*)
 	    cat <<"EOF"
   {
     char* p;
-    while ((p = strchr (newargz[1], '\\')) != NULL)
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
       {
 	*p = '/';
       }
@@ -3184,55 +3472,114 @@ EOF
 	    esac
 
 	    cat <<"EOF"
-  XFREE (shwrapper_name);
+  XFREE (target_name);
   XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
 
-  /* always write in binary mode */
-  if ((shwrapper = fopen (newargz[1], FOPEN_WB)) == 0)
-    {
-      lt_fatal ("Could not open %s for writing", newargz[1]);
-    }
-  fprintf (shwrapper, "%s", script_text);
-  fclose (shwrapper);
-
-  make_executable (newargz[1]);
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
 
+  newargc=0;
   for (i = 1; i < argc; i++)
-    newargz[i + 1] = xstrdup (argv[i]);
-  newargz[argc + 1] = NULL;
+    {
+      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)
+        {
+          if (argv[i][env_set_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_set_opt_len + 1;
+              lt_opt_process_env_set (p);
+            }
+          else if (argv[i][env_set_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_set (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_set_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)
+        {
+          if (argv[i][env_prepend_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_prepend_opt_len + 1;
+              lt_opt_process_env_prepend (p);
+            }
+          else if (argv[i][env_prepend_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_prepend (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_prepend_opt);
+          continue;
+        }
+      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)
+        {
+          if (argv[i][env_append_opt_len] == '=')
+            {
+              const char *p = argv[i] + env_append_opt_len + 1;
+              lt_opt_process_env_append (p);
+            }
+          else if (argv[i][env_append_opt_len] == '\0' && i + 1 < argc)
+            {
+              lt_opt_process_env_append (argv[++i]); /* don't copy */
+            }
+          else
+            lt_fatal ("%s missing required argument", env_append_opt);
+          continue;
+        }
+      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal ("Unrecognized option in %s namespace: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
 
-  for (i = 0; i < argc + 1; i++)
+  LTWRAPPER_DEBUGPRINTF     (("(main) lt_argv_zero : %s\n", (lt_argv_zero ? lt_argv_zero : "<NULL>")));
+  for (i = 0; i < newargc; i++)
     {
-      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, newargz[i]));
+      LTWRAPPER_DEBUGPRINTF (("(main) newargz[%d]   : %s\n", i, (newargz[i] ? newargz[i] : "<NULL>")));
     }
 
 EOF
 
 	    case $host_os in
 	      mingw*)
-		cat <<EOF
+		cat <<"EOF"
   /* execv doesn't actually work on mingw as expected on unix */
-  rval = _spawnv (_P_WAIT, "$lt_newargv0", (const char * const *) newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
   if (rval == -1)
     {
       /* failed to start process */
-      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"$lt_newargv0\": errno = %d\n", errno));
+      LTWRAPPER_DEBUGPRINTF (("(main) failed to launch target \"%s\": errno = %d\n", lt_argv_zero, errno));
       return 127;
     }
   return rval;
-}
 EOF
 		;;
 	      *)
-		cat <<EOF
-  execv ("$lt_newargv0", newargz);
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
   return rval; /* =127, but avoids unused variable warning */
-}
 EOF
 		;;
 	    esac
 
 	    cat <<"EOF"
+}
 
 void *
 xmalloc (size_t num)
@@ -3506,6 +3853,177 @@ lt_fatal (const char *message, ...)
   lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
   va_end (ap);
 }
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_setenv) setting '%s' to '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+int
+lt_split_name_value (const char *arg, char** name, char** value)
+{
+  const char *p;
+  int len;
+  if (!arg || !*arg)
+    return 1;
+
+  p = strchr (arg, (int)'=');
+
+  if (!p)
+    return 1;
+
+  *value = xstrdup (++p);
+
+  len = strlen (arg) - strlen (*value);
+  *name = XMALLOC (char, len);
+  strncpy (*name, arg, len-1);
+  (*name)[len - 1] = '\0';
+
+  return 0;
+}
+
+void
+lt_opt_process_env_set (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_set_opt, arg);
+    }
+
+  lt_setenv (name, value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_prepend (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_prepend_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 0);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_opt_process_env_append (const char *arg)
+{
+  char *name = NULL;
+  char *value = NULL;
+  char *new_value = NULL;
+
+  if (lt_split_name_value (arg, &name, &value) != 0)
+    {
+      XFREE (name);
+      XFREE (value);
+      lt_fatal ("bad argument for %s: '%s'", env_append_opt, arg);
+    }
+
+  new_value = lt_extend_str (getenv (name), value, 1);
+  lt_setenv (name, new_value);
+  XFREE (new_value);
+  XFREE (name);
+  XFREE (value);
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  LTWRAPPER_DEBUGPRINTF (("(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                          (name ? name : "<NULL>"),
+                          (value ? value : "<NULL>")));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+
 EOF
 }
 # end: func_emit_cwrapperexe_src
@@ -3515,7 +4033,7 @@ func_mode_link ()
 {
     $opt_debug
     case $host in
-    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
       # It is impossible to link a dll without this setting, and
       # we shouldn't force the makefile maintainer to figure out
       # which system we are compiling for in order to pass an extra
@@ -3959,6 +4477,13 @@ func_mode_link ()
       -L*)
 	func_stripname '-L' '' "$arg"
 	dir=$func_stripname_result
+	if test -z "$dir"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
 	# We need an absolute path.
 	case $dir in
 	[\\/]* | [A-Za-z]:[\\/]*) ;;
@@ -3977,14 +4502,16 @@ func_mode_link ()
 	  ;;
 	esac
 	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
 	  testbindir=`$ECHO "X$dir" | $Xsed -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
 	  *) dllsearchpath="$dllsearchpath:$dir";;
 	  esac
 	  case :$dllsearchpath: in
 	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
 	  *) dllsearchpath="$dllsearchpath:$testbindir";;
 	  esac
 	  ;;
@@ -3995,7 +4522,7 @@ func_mode_link ()
       -l*)
 	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
 	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*)
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)
 	    # These systems don't actually have a C or math library (as such)
 	    continue
 	    ;;
@@ -4072,7 +4599,7 @@ func_mode_link ()
 
       -no-install)
 	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*)
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
 	  # The PATH hackery in wrapper scripts is required on Windows
 	  # and Darwin in order for the loader to find any dlls it needs.
 	  func_warning "\`-no-install' is ignored for $host"
@@ -5032,7 +5559,7 @@ func_mode_link ()
 	if test -n "$library_names" &&
 	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
 	  case $host in
-	  *cygwin* | *mingw*)
+	  *cygwin* | *mingw* | *cegcc*)
 	      # No point in relinking DLLs because paths are not encoded
 	      notinst_deplibs="$notinst_deplibs $lib"
 	      need_relink=no
@@ -5102,7 +5629,7 @@ func_mode_link ()
 	    elif test -n "$soname_spec"; then
 	      # bleh windows
 	      case $host in
-	      *cygwin* | mingw*)
+	      *cygwin* | mingw* | *cegcc*)
 	        func_arith $current - $age
 		major=$func_arith_result
 		versuffix="-$major"
@@ -5884,7 +6411,7 @@ func_mode_link ()
 	tempremovelist=`$ECHO "$output_objdir/*"`
 	for p in $tempremovelist; do
 	  case $p in
-	    *.$objext)
+	    *.$objext | *.gcno)
 	       ;;
 	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
 	       if test "X$precious_files_regex" != "X"; then
@@ -5955,7 +6482,7 @@ func_mode_link ()
       if test "$build_libtool_libs" = yes; then
 	if test -n "$rpath"; then
 	  case $host in
-	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)
 	    # these systems don't actually have a c library (as such)!
 	    ;;
 	  *-*-rhapsody* | *-*-darwin1.[012])
@@ -6454,7 +6981,7 @@ EOF
 
 	orig_export_symbols=
 	case $host_os in
-	cygwin* | mingw*)
+	cygwin* | mingw* | cegcc*)
 	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
 	    # exporting using user supplied symfile
 	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
@@ -7079,14 +7606,16 @@ EOF
 	  esac
 	fi
 	case $host in
-	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
 	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
 	  case :$dllsearchpath: in
 	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
 	  *) dllsearchpath="$dllsearchpath:$libdir";;
 	  esac
 	  case :$dllsearchpath: in
 	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
 	  *) dllsearchpath="$dllsearchpath:$testbindir";;
 	  esac
 	  ;;
@@ -7156,6 +7685,10 @@ EOF
           wrappers_required=no
         fi
         ;;
+      *cegcc)
+        # Disable wrappers for cegcc, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
       *)
         if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
           wrappers_required=no
@@ -7308,11 +7841,10 @@ EOF
 
 	    func_emit_cwrapperexe_src > $cwrappersource
 
-	    # we should really use a build-platform specific compiler
-	    # here, but OTOH, the wrappers (shell script and this C one)
-	    # are only useful if you want to execute the "real" binary.
-	    # Since the "real" binary is built for $host, then this
-	    # wrapper might as well be built for $host, too.
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
 	    $opt_dry_run || {
 	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
 	      $STRIP $cwrapper
@@ -7597,7 +8129,7 @@ EOF
 	  # place dlname in correct position for cygwin
 	  tdlname=$dlname
 	  case $host,$output,$installed,$module,$dlname in
-	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
 	  esac
 	  $ECHO > $output "\
 # $outputname - a libtool library file
diff --git a/m4/ltsugar.m4 b/m4/ltsugar.m4
index 0d258e0..9000a05 100644
--- a/m4/ltsugar.m4
+++ b/m4/ltsugar.m4
@@ -1,13 +1,13 @@
 # ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
 #
-#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
-#   Written by Gary V. Vaughan, 2004
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
 #
 # This file is free software; the Free Software Foundation gives
 # unlimited permission to copy and/or distribute it, with or without
 # modifications, as long as this notice is preserved.
 
-# serial 5 ltsugar.m4
+# serial 6 ltsugar.m4
 
 # This is to help aclocal find these macros, as it can't see m4_define.
 AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
@@ -63,14 +63,14 @@ m4_define([lt_append],
 # Produce a SEP delimited list of all paired combinations of elements of
 # PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
 # has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
 m4_define([lt_combine],
-[m4_if([$2], [], [],
-  [m4_if([$4], [], [],
-    [lt_join(m4_quote(m4_default([$1], [[, ]])),
-      lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_prefix, [$2],
-		   [m4_foreach(_Lt_suffix, lt_car([m4_shiftn(3, $@)]),
-			       [_Lt_prefix[]$3[]_Lt_suffix ])])))))])])dnl
-])
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
 
 
 # lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
diff --git a/m4/ltversion.m4 b/m4/ltversion.m4
index 45cb155..b8e154f 100644
--- a/m4/ltversion.m4
+++ b/m4/ltversion.m4
@@ -9,15 +9,15 @@
 
 # Generated from ltversion.in.
 
-# serial 2976 ltversion.m4
+# serial 3012 ltversion.m4
 # This file is part of GNU Libtool
 
-m4_define([LT_PACKAGE_VERSION], [2.2.4])
-m4_define([LT_PACKAGE_REVISION], [1.2976])
+m4_define([LT_PACKAGE_VERSION], [2.2.6])
+m4_define([LT_PACKAGE_REVISION], [1.3012])
 
 AC_DEFUN([LTVERSION_VERSION],
-[macro_version='2.2.4'
-macro_revision='1.2976'
+[macro_version='2.2.6'
+macro_revision='1.3012'
 _LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
 _LT_DECL(, macro_revision, 0)
 ])
diff --git a/src/Makefile.in b/src/Makefile.in
index 7c35f20..287d58c 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -113,6 +113,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -184,6 +186,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -198,6 +201,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -210,8 +214,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
@@ -317,7 +321,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
diff --git a/src/bin/Makefile.in b/src/bin/Makefile.in
index 7391432..f274158 100644
--- a/src/bin/Makefile.in
+++ b/src/bin/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -145,6 +145,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -216,6 +218,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -230,6 +233,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -283,8 +287,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
@@ -409,7 +413,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
diff --git a/src/bin/edje_cc.c b/src/bin/edje_cc.c
index 5b3ade7..92b740a 100644
--- a/src/bin/edje_cc.c
+++ b/src/bin/edje_cc.c
@@ -2,6 +2,10 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <string.h>
 #include <locale.h>
 #include <limits.h>
@@ -16,6 +20,7 @@ Eina_List *img_dirs = NULL;
 Eina_List *fnt_dirs = NULL;
 Eina_List *defines = NULL;
 char      *file_in = NULL;
+char      *tmp_dir = NULL;
 char      *file_out = NULL;
 char      *progname = NULL;
 int        verbose = 0;
@@ -37,6 +42,7 @@ main_help(void)
       "\n"
       "-id image/directory      Add a directory to look in for relative path images\n"
       "-fd font/directory       Add a directory to look in for relative path fonts\n"
+      "-td temp/directory       Directory to store temporary files\n"
       "-v                       Verbose output\n"
       "-no-lossy                Do NOT allow images to be lossy\n"
       "-no-comp                 Do NOT allow images to be stored with lossless compression\n"
@@ -58,6 +64,9 @@ main(int argc, char **argv)
 
    eina_init();
 
+   tmp_dir = getenv("TMPDIR");
+
+
    progname = argv[0];
    for (i = 1; i < argc; i++)
      {
@@ -92,6 +101,12 @@ main(int argc, char **argv)
 	     i++;
 	     fnt_dirs = eina_list_append(fnt_dirs, argv[i]);
 	  }
+	else if ((!strcmp(argv[i], "-td") || !strcmp(argv[i], "--tmp_dir")) && (i < (argc - 1)))
+	  {
+	     i++;
+             if (!tmp_dir)
+               tmp_dir = argv[i];
+	  }
 	else if ((!strcmp(argv[i], "-min-quality")) && (i < (argc - 1)))
 	  {
 	     i++;
diff --git a/src/bin/edje_cc.h b/src/bin/edje_cc.h
index 117a1bc..dd37f6e 100644
--- a/src/bin/edje_cc.h
+++ b/src/bin/edje_cc.h
@@ -15,6 +15,8 @@
 /* types */
 typedef struct _New_Object_Handler    New_Object_Handler;
 typedef struct _New_Statement_Handler New_Statement_Handler;
+typedef struct _External_List         External_List;
+typedef struct _External              External;
 typedef struct _Font_List             Font_List;
 typedef struct _Font                  Font;
 typedef struct _Code                  Code;
@@ -34,6 +36,16 @@ struct _New_Statement_Handler
    void (*func)(void);
 };
 
+struct _External_List
+{
+   Eina_List *list;
+};
+
+struct _External
+{
+    char *name;
+};
+
 struct _Font_List
 {
    Eina_List *list;
@@ -50,6 +62,7 @@ struct _Code
    int       l1, l2;
    char      *shared;
    Eina_List *programs;
+   int		is_lua;
 };
 
 struct _Code_Program
@@ -120,9 +133,11 @@ char   *mem_strdup(const char *s);
 #define SZ sizeof
 
 /* global vars */
+extern Eina_List             *ext_dirs;
 extern Eina_List             *img_dirs;
 extern Eina_List             *fnt_dirs;
 extern char                  *file_in;
+extern char                  *tmp_dir;
 extern char                  *file_out;
 extern char                  *progname;
 extern int                    verbose;
@@ -136,6 +151,7 @@ extern Eina_List             *stack;
 extern Eina_List             *params;
 extern Edje_File             *edje_file;
 extern Eina_List             *edje_collections;
+extern Eina_List             *externals;
 extern Eina_List             *fonts;
 extern Eina_List             *codes;
 extern Eina_List             *defines;
diff --git a/src/bin/edje_cc_handlers.c b/src/bin/edje_cc_handlers.c
index c68a4e3..ca1cb45 100644
--- a/src/bin/edje_cc_handlers.c
+++ b/src/bin/edje_cc_handlers.c
@@ -28,6 +28,19 @@
     \@endproperty
 */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#include "edje_cc.h"
+
 /**
  * @page edcref Edje Data Collection reference
  * An Edje Data Collection, it's a plain text file (normally identified with the
@@ -41,14 +54,7 @@
  * <table class="edcref" border="0">
  */
 
-#include <string.h>
-#include <errno.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <unistd.h>
-
-#include "edje_cc.h"
+static void st_externals_external(void);
 
 static void st_images_image(void);
 
@@ -78,12 +84,14 @@ static void ob_collections(void);
 static void ob_collections_group(void);
 static void st_collections_group_name(void);
 static void st_collections_group_script_only(void);
+static void st_collections_group_lua_script_only(void);
 static void st_collections_group_alias(void);
 static void st_collections_group_min(void);
 static void st_collections_group_max(void);
 static void st_collections_group_data_item(void);
 
 static void ob_collections_group_script(void);
+static void ob_collections_group_lua_script(void);
 
 static void ob_collections_group_parts_part(void);
 static void st_collections_group_parts_part_name(void);
@@ -194,10 +202,15 @@ static void st_collections_group_parts_part_description_table_homogeneous(void);
 static void st_collections_group_parts_part_description_table_align(void);
 static void st_collections_group_parts_part_description_table_padding(void);
 
+/* external part parameters */
+static void st_collections_group_parts_part_description_params_int(void);
 static void ob_collections_group_programs_program(void);
+static void st_collections_group_parts_part_description_params_double(void);
+
 static void st_collections_group_programs_program_name(void);
+static void st_collections_group_parts_part_description_params_string(void);
 static void st_collections_group_programs_program_signal(void);
-static void st_collections_group_programs_program_source(void);
+ static void st_collections_group_programs_program_source(void);
 static void st_collections_group_programs_program_in(void);
 static void st_collections_group_programs_program_action(void);
 static void st_collections_group_programs_program_transition(void);
@@ -205,11 +218,13 @@ static void st_collections_group_programs_program_target(void);
 static void st_collections_group_programs_program_after(void);
 
 static void ob_collections_group_programs_program_script(void);
+static void ob_collections_group_programs_program_lua_script(void);
 
 /*****/
 
 New_Statement_Handler statement_handlers[] =
 {
+     {"externals.external", st_externals_external},
      {"images.image", st_images_image},
      {"fonts.font", st_fonts_font},
      {"data.item", st_data_item},
@@ -224,6 +239,7 @@ New_Statement_Handler statement_handlers[] =
      /*{"spectra.spectrum", st_spectrum},*/
      {"spectra.spectrum.name", st_spectrum_name},
      {"spectra.spectrum.color", st_spectrum_color},
+     {"collections.externals.external", st_externals_external}, /* dup */
      {"collections.image", st_images_image}, /* dup */
      {"collections.images.image", st_images_image}, /* dup */
      {"collections.font", st_fonts_font}, /* dup */
@@ -237,10 +253,12 @@ New_Statement_Handler statement_handlers[] =
      {"collections.color_classes.color_class.color3", st_color_class_color3}, /* dup */
      {"collections.group.name", st_collections_group_name},
      {"collections.group.script_only", st_collections_group_script_only},
+     {"collections.group.lua_script_only", st_collections_group_lua_script_only},
      {"collections.group.alias", st_collections_group_alias},
      {"collections.group.min", st_collections_group_min},
      {"collections.group.max", st_collections_group_max},
      {"collections.group.data.item", st_collections_group_data_item},
+     {"collections.group.externals.external", st_externals_external}, /* dup */
      {"collections.group.image", st_images_image}, /* dup */
      {"collections.group.images.image", st_images_image}, /* dup */
      {"collections.group.font", st_fonts_font}, /* dup */
@@ -391,6 +409,9 @@ New_Statement_Handler statement_handlers[] =
      {"collections.group.parts.part.description.table.homogeneous", st_collections_group_parts_part_description_table_homogeneous},
      {"collections.group.parts.part.description.table.align", st_collections_group_parts_part_description_table_align},
      {"collections.group.parts.part.description.table.padding", st_collections_group_parts_part_description_table_padding},
+     {"collections.group.parts.part.description.params.int", st_collections_group_parts_part_description_params_int},
+     {"collections.group.parts.part.description.params.double", st_collections_group_parts_part_description_params_double},
+     {"collections.group.parts.part.description.params.string", st_collections_group_parts_part_description_params_string},
      {"collections.group.parts.part.description.images.image", st_images_image}, /* dup */
      {"collections.group.parts.part.description.font", st_fonts_font}, /* dup */
      {"collections.group.parts.part.description.fonts.font", st_fonts_font}, /* dup */
@@ -485,6 +506,7 @@ New_Statement_Handler statement_handlers[] =
 
 New_Object_Handler object_handlers[] =
 {
+     {"externals", NULL},
      {"images", NULL},
      {"fonts", NULL},
      {"data", NULL},
@@ -495,6 +517,7 @@ New_Object_Handler object_handlers[] =
      {"spectra", NULL},
      {"spectra.spectrum", ob_spectrum},
      {"collections", ob_collections},
+     {"collections.externals", NULL}, /* dup */
      {"collections.images", NULL}, /* dup */
      {"collections.fonts", NULL}, /* dup */
      {"collections.styles", NULL}, /* dup */
@@ -504,6 +527,8 @@ New_Object_Handler object_handlers[] =
      {"collections.group", ob_collections_group},
      {"collections.group.data", NULL},
      {"collections.group.script", ob_collections_group_script},
+     {"collections.group.lua_script", ob_collections_group_lua_script},
+     {"collections.group.externals", NULL}, /* dup */
      {"collections.group.images", NULL}, /* dup */
      {"collections.group.fonts", NULL}, /* dup */
      {"collections.group.styles", NULL}, /* dup */
@@ -550,40 +575,53 @@ New_Object_Handler object_handlers[] =
      {"collections.group.parts.part.description.gradient.rel2", NULL},
      {"collections.group.parts.part.description.box", NULL},
      {"collections.group.parts.part.description.table", NULL},
+     {"collections.group.parts.part.description.params", NULL},
      {"collections.group.parts.part.description.color_classes", NULL}, /* dup */
      {"collections.group.parts.part.description.color_classes.color_class", ob_color_class}, /* dup */
      {"collections.group.parts.part.description.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.parts.part.description.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.parts.part.description.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.parts.part.description.programs", NULL}, /* dup */
      {"collections.group.parts.part.description.programs.images", NULL}, /* dup */
      {"collections.group.parts.part.description.programs.fonts", NULL}, /* dup */
      {"collections.group.parts.part.description.programs.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.parts.part.description.programs.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.parts.part.description.programs.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.parts.part.description.script", ob_collections_group_script}, /* dup */
+     {"collections.group.parts.part.description.lua_script", ob_collections_group_lua_script}, /* dup */
      {"collections.group.parts.part.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.parts.part.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.parts.part.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.parts.part.programs", NULL}, /* dup */
      {"collections.group.parts.part.programs.images", NULL}, /* dup */
      {"collections.group.parts.part.programs.fonts", NULL}, /* dup */
      {"collections.group.parts.part.programs.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.parts.part.programs.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.parts.part.programs.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.parts.part.script", ob_collections_group_script}, /* dup */
+     {"collections.group.parts.part.lua_script", ob_collections_group_lua_script}, /* dup */
      {"collections.group.parts.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.parts.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.parts.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.parts.programs", NULL}, /* dup */
      {"collections.group.parts.programs.images", NULL}, /* dup */
      {"collections.group.parts.programs.fonts", NULL}, /* dup */
      {"collections.group.parts.programs.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.parts.programs.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.parts.programs.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.parts.script", ob_collections_group_script}, /* dup */
+     {"collections.group.parts.lua_script", ob_collections_group_lua_script}, /* dup */
      {"collections.group.program", ob_collections_group_programs_program}, /* dup */
      {"collections.group.program.script", ob_collections_group_programs_program_script}, /* dup */
+     {"collections.group.program.lua_script", ob_collections_group_programs_program_lua_script}, /* dup */
      {"collections.group.programs", NULL},
      {"collections.group.programs.images", NULL}, /* dup */
      {"collections.group.programs.fonts", NULL}, /* dup */
      {"collections.group.programs.program", ob_collections_group_programs_program},
      {"collections.group.programs.program.script", ob_collections_group_programs_program_script},
-     {"collections.group.programs.script", ob_collections_group_script} /* dup */
+     {"collections.group.programs.program.lua_script", ob_collections_group_programs_program_lua_script},
+     {"collections.group.programs.script", ob_collections_group_script}, /* dup */
+     {"collections.group.programs.lua_script", ob_collections_group_lua_script} /* dup */
 };
 
 /*****/
@@ -606,6 +644,63 @@ statement_handler_num(void)
     @page edcref
 
     @block
+        externals
+    @context
+        externals {
+           external: "name";
+        }
+    @description
+        The "externals" block is used to list each external module file that will be used in others
+	programs.
+    @endblock
+
+    @property
+        external
+    @parameters
+        [external filename]
+    @endproperty
+ */
+static void
+st_externals_external(void)
+{
+   External *ex;
+   Edje_External_Directory_Entry *ext;
+
+   check_arg_count(1);
+
+   if (!edje_file->external_dir)
+     edje_file->external_dir = mem_alloc(SZ(Edje_External_Directory));
+
+   ex = mem_alloc(SZ(External));
+   ex->name = parse_str(0);
+     {
+	Eina_List *l;
+	External *lex;
+
+	EINA_LIST_FOREACH(externals, l, lex)
+	  {
+	     if (!strcmp(lex->name, ex->name))
+	       {
+		  free(ex->name);
+		  free(ex);
+		  return;
+	       }
+	  }
+     }
+   externals = eina_list_append(externals, ex);
+
+   if (edje_file->external_dir)
+     {
+	ext = mem_alloc(SZ(Edje_External_Directory_Entry));
+	ext->entry = mem_strdup(ex->name);
+	edje_file->external_dir->entries = eina_list_append(edje_file->external_dir->entries, ext);
+     }
+}
+
+/**
+    @page edcref
+
+    @block
         images
     @context
         images {
@@ -1368,6 +1463,17 @@ st_collections_group_script_only(void)
    pc->script_only = parse_bool(0);
 }
 
+static void
+st_collections_group_lua_script_only(void)
+{
+   Edje_Part_Collection *pc;
+
+   check_arg_count(1);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   pc->lua_script_only = parse_bool(0);
+}
+
 /**
     @page edcref
     @property
@@ -1494,6 +1600,39 @@ ob_collections_group_script(void)
 		  exit(-1);
 	       }
 	     cd->shared = s;
+	     cd->is_lua = 0;
+	     set_verbatim(NULL, 0, 0);
+	  }
+     }
+}
+
+static void
+ob_collections_group_lua_script(void)
+{
+   Edje_Part_Collection *pc;
+   Code *cd;
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   cd = eina_list_data_get(eina_list_last(codes));
+
+   if (!is_verbatim()) track_verbatim(1);
+   else
+     {
+	char *s;
+
+	s = get_verbatim();
+	if (s)
+	  {
+	     cd->l1 = get_verbatim_line1();
+	     cd->l2 = get_verbatim_line2();
+	     if (cd->shared)
+	       {
+		  fprintf(stderr, "%s: Error. parse error %s:%i. There is already an existing script section for the group\n",
+			  progname, file_in, line - 1);
+		  exit(-1);
+	       }
+	     cd->shared = s;
+	     cd->is_lua = 1;
 	     set_verbatim(NULL, 0, 0);
 	  }
      }
@@ -1628,6 +1767,7 @@ st_collections_group_parts_part_name(void)
             @li GROUP
             @li BOX
             @li TABLE
+            @li EXTERNAL
     @endproperty
 */
 static void
@@ -1651,6 +1791,7 @@ st_collections_group_parts_part_type(void)
 			 "GROUP", EDJE_PART_TYPE_GROUP,
 			 "BOX", EDJE_PART_TYPE_BOX,
 			 "TABLE", EDJE_PART_TYPE_TABLE,
+			 "EXTERNAL", EDJE_PART_TYPE_EXTERNAL,
 			 NULL);
 }
 
@@ -2910,6 +3051,7 @@ ob_collections_group_parts_part_description(void)
    ed->table.align.y = 0.5;
    ed->table.padding.x = 0;
    ed->table.padding.y = 0;
+   ed->external_params = NULL;
 }
 
 /**
@@ -3044,6 +3186,20 @@ st_collections_group_parts_part_description_inherit(void)
 
    data_queue_part_slave_lookup(&(parent->text.id_source), &(ed->text.id_source));
    data_queue_part_slave_lookup(&(parent->text.id_text_source), &(ed->text.id_text_source));
+
+   if (parent->external_params)
+     {
+	Eina_List *l;
+	Edje_External_Param *param, *new_param;
+
+	ed->external_params = NULL;
+	EINA_LIST_FOREACH(parent->external_params, l, param)
+	  {
+	     new_param = mem_alloc(SZ(Edje_External_Param));
+	     *new_param = *param;
+	     ed->external_params = eina_list_append(ed->external_params, new_param);
+	  }
+     }
 }
 
 /**
@@ -5415,6 +5571,121 @@ static void st_collections_group_parts_part_description_table_padding(void)
    ed->table.padding.y = parse_int_range(1, 0, 0x7fffffff);
 }
 
+static void
+_st_collections_group_parts_part_description_params(Edje_External_Param_Type type)
+{
+   Edje_Part_Collection *pc;
+   Edje_Part *ep;
+   Edje_Part_Description *ed;
+   Edje_External_Param *param;
+   Eina_List *l;
+   const char *name;
+   int found = 0;
+
+   check_arg_count(2);
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->parts));
+
+   if (ep->type != EDJE_PART_TYPE_EXTERNAL)
+     {
+	fprintf(stderr, "%s: Error. parse error %s:%i. "
+		"params in non-EXTERNAL part.\n",
+		progname, file_in, line - 1);
+	exit(-1);
+     }
+
+   ed = ep->default_desc;
+   if (ep->other_desc) ed = eina_list_data_get(eina_list_last(ep->other_desc));
+
+   name = parse_str(0);
+
+   /* if a param with this name already exists, overwrite it */
+   EINA_LIST_FOREACH(ed->external_params, l, param)
+     {
+	if (!strcmp(param->name, name))
+	  {
+	     found = 1;
+	     break;
+	  }
+     }
+
+   if (!found)
+     {
+	param = mem_alloc(SZ(Edje_External_Param));
+	param->name = name;
+     }
+
+   param->type = type;
+   param->i = 0;
+   param->d = 0;
+   param->s = NULL;
+
+   switch (type)
+     {
+      case EDJE_EXTERNAL_PARAM_TYPE_INT:
+	 param->i = parse_int(1);
+	 break;
+      case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+	 param->d = parse_float(1);
+	 break;
+      case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+	 param->s = parse_str(1);
+	 break;
+     }
+
+   if (!found)
+     ed->external_params = eina_list_append(ed->external_params, param);
+}
+
+/**
+    @page edcref
+    @property
+        inherit
+    @parameters
+        [param_name] [int_value]
+    @effect
+	Adds an integer parameter for an external object
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_description_params_int(void)
+{
+   _st_collections_group_parts_part_description_params(EDJE_EXTERNAL_PARAM_TYPE_INT);
+}
+
+/**
+    @page edcref
+    @property
+        inherit
+    @parameters
+        [param_name] [double_value]
+    @effect
+	Adds a double parameter for an external object
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_description_params_double(void)
+{
+   _st_collections_group_parts_part_description_params(EDJE_EXTERNAL_PARAM_TYPE_DOUBLE);
+}
+
+/**
+    @page edcref
+    @property
+        inherit
+    @parameters
+        [param_name] [string_value]
+    @effect
+	Adds a string parameter for an external object
+    @endproperty
+*/
+static void
+st_collections_group_parts_part_description_params_string(void)
+{
+   _st_collections_group_parts_part_description_params(EDJE_EXTERNAL_PARAM_TYPE_STRING);
+}
+
 /**
     @page edcref
     @block
@@ -5604,6 +5875,7 @@ st_collections_group_programs_program_action(void)
 			   "DRAG_VAL_STEP", EDJE_ACTION_TYPE_DRAG_VAL_STEP,
 			   "DRAG_VAL_PAGE", EDJE_ACTION_TYPE_DRAG_VAL_PAGE,
 			   "SCRIPT", EDJE_ACTION_TYPE_SCRIPT,
+			   "LUA_SCRIPT", EDJE_ACTION_TYPE_LUA_SCRIPT,
 			   "FOCUS_SET", EDJE_ACTION_TYPE_FOCUS_SET,
 			   NULL);
    if (ep->action == EDJE_ACTION_TYPE_STATE_SET)
@@ -5641,6 +5913,10 @@ st_collections_group_programs_program_action(void)
 	/* this is implicitly set by script {} so this is here just for
 	 * completeness */
 	break;
+      case EDJE_ACTION_TYPE_LUA_SCRIPT:
+	/* this is implicitly set by lua_script {} so this is here just for
+	 * completeness */
+	break;
       case EDJE_ACTION_TYPE_FOCUS_SET:
 	check_arg_count(1);
 	break;
@@ -5797,12 +6073,59 @@ ob_collections_group_programs_program_script(void)
 	     cp->l2 = get_verbatim_line2();
 	     cp->id = ep->id;
 	     cp->script = s;
+	     if (cd->shared && cd->is_lua)
+	       {
+		  fprintf(stderr, "%s: Error. parse error %s:%i. You're trying to mix Embryo and Lua scripting in the same group\n",
+			progname, file_in, line - 1);
+		  exit(-1);
+	       }
+	     cd->is_lua = 0;
 	     cd->programs = eina_list_append(cd->programs, cp);
 	     set_verbatim(NULL, 0, 0);
 	     ep->action = EDJE_ACTION_TYPE_SCRIPT;
 	  }
      }
 }
+
+static void
+ob_collections_group_programs_program_lua_script(void)
+{
+   Edje_Part_Collection *pc;
+   Edje_Program *ep;
+   Code *cd;
+
+   pc = eina_list_data_get(eina_list_last(edje_collections));
+   ep = eina_list_data_get(eina_list_last(pc->programs));
+   cd = eina_list_data_get(eina_list_last(codes));
+
+   if (!is_verbatim()) track_verbatim(1);
+   else
+     {
+	char *s;
+
+	s = get_verbatim();
+	if (s)
+	  {
+	     Code_Program *cp;
+
+	     cp = mem_alloc(SZ(Code_Program));
+	     cp->l1 = get_verbatim_line1();
+	     cp->l2 = get_verbatim_line2();
+	     cp->id = ep->id;
+	     cp->script = s;
+	     if (cd->shared && !cd->is_lua)
+	       {
+		  fprintf(stderr, "%s: Error. parse error %s:%i. You're trying to mix Embryo and Lua scripting in the same group\n",
+			progname, file_in, line - 1);
+		  exit(-1);
+	       }
+	     cd->is_lua = 1;
+	     cd->programs = eina_list_append(cd->programs, cp);
+	     set_verbatim(NULL, 0, 0);
+	     ep->action = EDJE_ACTION_TYPE_LUA_SCRIPT;
+	  }
+     }
+}
 /**
     @page edcref
     </table>
diff --git a/src/bin/edje_cc_mem.c b/src/bin/edje_cc_mem.c
index a4c2cf8..be611ce 100644
--- a/src/bin/edje_cc_mem.c
+++ b/src/bin/edje_cc_mem.c
@@ -2,6 +2,10 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <string.h>
 #include <errno.h>
 
diff --git a/src/bin/edje_cc_out.c b/src/bin/edje_cc_out.c
index 2db802f..745c722 100644
--- a/src/bin/edje_cc_out.c
+++ b/src/bin/edje_cc_out.c
@@ -6,11 +6,6 @@
 # include "config.h"
 #endif
 
-#include <string.h>
-#include <limits.h>
-#include <unistd.h>
-#include <sys/stat.h>
-
 #ifdef HAVE_ALLOCA_H
 # include <alloca.h>
 #elif defined __GNUC__
@@ -28,11 +23,20 @@ extern "C"
 void *alloca (size_t);
 #endif
 
+#include <string.h>
+#include <limits.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
 #include <Ecore_Evas.h>
 
 #include "edje_cc.h"
 #include "edje_prefix.h"
 
+#include <lua.h>
+#include <lauxlib.h>
+
+typedef struct _External_Lookup External_Lookup;
 typedef struct _Part_Lookup Part_Lookup;
 typedef struct _Program_Lookup Program_Lookup;
 typedef struct _Group_Lookup Group_Lookup;
@@ -41,6 +45,12 @@ typedef struct _String_Lookup Spectrum_Lookup;
 typedef struct _Slave_Lookup Slave_Lookup;
 typedef struct _Code_Lookup Code_Lookup;
 
+
+struct _External_Lookup
+{
+   char *name;
+};
+
 struct _Part_Lookup
 {
    Edje_Part_Collection *pc;
@@ -83,6 +93,7 @@ static void data_process_string(Edje_Part_Collection *pc, const char *prefix, ch
 
 Edje_File *edje_file = NULL;
 Eina_List *edje_collections = NULL;
+Eina_List *externals = NULL;
 Eina_List *fonts = NULL;
 Eina_List *codes = NULL;
 Eina_List *code_lookups = NULL;
@@ -522,7 +533,7 @@ data_write_images(Eet_File *ef, int *image_num, int *input_bytes, int *input_raw
 			    const char *file = NULL;
 
 			    evas_object_image_file_get(im, &file, NULL);
-			    if ((file) && (stat(file, &st) != 0))
+			    if (!file || (stat(file, &st) != 0))
 			      st.st_size = 0;
 			    *input_bytes += st.st_size;
 			    *input_raw_bytes += im_w * im_h * 4;
@@ -759,22 +770,26 @@ data_write_scripts(Eet_File *ef)
    Eina_List *l;
    int i;
 
+   if (!tmp_dir)
 #ifdef HAVE_EVIL
-   char *tmpdir = evil_tmpdir_get();
+     tmp_dir = (char *)evil_tmpdir_get();
 #else
-   char *tmpdir = "/tmp";
+     tmp_dir = "/tmp";
 #endif
 
    for (i = 0, l = codes; l; l = eina_list_next(l), i++)
      {
+	char tmpn[4096];
+	char tmpo[4096];
 	int fd;
 	Code *cd = eina_list_data_get(l);
-
+	
+	if (cd->is_lua)
+	  continue;
 	if ((!cd->shared) && (!cd->programs))
 	  continue;
 
-	char tmpn[4096];
-	snprintf(tmpn, PATH_MAX, "%s/edje_cc.sma-tmp-XXXXXX", tmpdir);
+	snprintf(tmpn, PATH_MAX, "%s/edje_cc.sma-tmp-XXXXXX", tmp_dir);
 	fd = mkstemp(tmpn);
 	if (fd < 0)
 	  error_and_abort(ef, "Unable to open temp file \"%s\" for script "
@@ -783,8 +798,7 @@ data_write_scripts(Eet_File *ef)
 	create_script_file(ef, tmpn, cd);
 	close(fd);
 
-	char tmpo[4096];
-	snprintf(tmpo, PATH_MAX, "%s/edje_cc.amx-tmp-XXXXXX", tmpdir);
+	snprintf(tmpo, PATH_MAX, "%s/edje_cc.amx-tmp-XXXXXX", tmp_dir);
 	fd = mkstemp(tmpo);
 	if (fd < 0)
 	  {
@@ -801,6 +815,154 @@ data_write_scripts(Eet_File *ef)
      }
 }
 
+typedef struct _Edje_Lua_Script_Writer_Struct Edje_Lua_Script_Writer_Struct;
+
+struct _Edje_Lua_Script_Writer_Struct {
+   char *buf;
+   int size;
+};
+
+#ifdef LUA_BINARY
+static int
+_edje_lua_script_writer (lua_State *L __UNUSED__, const void* chunk_buf, size_t chunk_size, void* _data)
+{
+   Edje_Lua_Script_Writer_Struct *data;
+   void *old;
+
+   data = (Edje_Lua_Script_Writer_Struct *)_data;
+   old = data->buf;
+   data->buf = malloc (data->size + chunk_size);
+   memcpy (data->buf, old, data->size);
+   memcpy (&((data->buf)[data->size]), chunk_buf, chunk_size);
+   if (old)
+     free (old);
+   data->size += chunk_size;
+
+   return 0;
+}
+#endif
+
+void
+_edje_lua_error_and_abort(lua_State * L, int err_code, Eet_File *ef)
+{
+   char *err_type;
+
+   switch (err_code)
+     {
+     case LUA_ERRRUN:
+	err_type = "runtime";
+	break;
+     case LUA_ERRSYNTAX:
+	err_type = "syntax";
+	break;
+     case LUA_ERRMEM:
+	err_type = "memory allocation";
+	break;
+     case LUA_ERRERR:
+	err_type = "error handler";
+	break;
+     default:
+	err_type = "unknown";
+	break;
+     }
+   error_and_abort(ef, "Lua %s error: %s\n", err_type, lua_tostring(L, -1));
+}
+
+
+static void
+data_write_lua_scripts(Eet_File *ef)
+{
+   Eina_List *l;
+   Eina_List *ll;
+   Code_Program *cp;
+   int i;
+
+   for (i = 0, l = codes; l; l = eina_list_next(l), i++)
+     {
+	char buf[4096];
+	Code *cd;
+	lua_State *L;
+	int ln = 1;
+	luaL_Buffer b;
+	Edje_Lua_Script_Writer_Struct data;
+#ifdef LUA_BINARY
+	int err_code;
+#endif
+
+	cd = (Code *)eina_list_data_get(l);
+	if (!cd->is_lua)
+	  continue;
+	if ((!cd->shared) && (!cd->programs))
+	  continue;
+	
+	L = luaL_newstate();
+	if (!L)
+	  error_and_abort(ef, "Lua error: Lua state could not be initialized\n");
+
+	luaL_buffinit(L, &b);
+
+	data.buf = NULL;
+	data.size = 0;
+	if (cd->shared)
+	  {
+	     while (ln < (cd->l1 - 1))
+	       {
+		  luaL_addchar(&b, '\n');
+		  ln++;
+	       }
+	     luaL_addstring(&b, cd->shared);
+	     ln += cd->l2 - cd->l1;
+	  }
+
+	EINA_LIST_FOREACH(cd->programs, ll, cp)
+	  {
+	     if (cp->script)
+	       {
+		  while (ln < (cp->l1 - 1))
+		    {
+		       luaL_addchar(&b, '\n');
+		       ln++;
+		    }
+		  luaL_addstring(&b, "_G[");
+		  lua_pushnumber(L, cp->id);
+		  luaL_addvalue(&b);
+		  luaL_addstring(&b, "] = function (ed, signal, source)");
+		  luaL_addstring(&b, cp->script);
+		  luaL_addstring(&b, "end\n");
+		  ln += cp->l2 - cp->l1 + 1;
+	       }
+	  }
+	luaL_pushresult(&b);
+#ifdef LUA_BINARY
+	if (err_code = luaL_loadstring(L, lua_tostring (L, -1)))
+	  _edje_lua_error_and_abort(L, err_code, ef);
+	lua_dump(L, _edje_lua_script_writer, &data);
+#else // LUA_PLAIN_TEXT
+	data.buf = lua_tostring(L, -1);
+	data.size = strlen(data.buf);
+#endif
+	//printf("lua chunk size: %d\n", data.size);
+
+	/* 
+	 * TODO load and test Lua chunk
+	 */
+
+	/*
+	   if (luaL_loadbuffer(L, globbuf, globbufsize, "edje_lua_script"))
+	   printf("lua load error: %s\n", lua_tostring (L, -1));
+	   if (lua_pcall(L, 0, 0, 0))
+	   printf("lua call error: %s\n", lua_tostring (L, -1));
+	 */
+	
+	snprintf(buf, sizeof(buf), "lua_scripts/%i", i);
+	eet_write(ef, buf, data.buf, data.size, 1);
+#ifdef LUA_BINARY
+	free(data.buf);
+#endif
+	lua_close(L);
+     }
+}
+
 void
 data_write(void)
 {
@@ -834,6 +996,7 @@ data_write(void)
 
    total_bytes += data_write_groups(ef, &collection_num);
    data_write_scripts(ef);
+   data_write_lua_scripts(ef);
 
    src_bytes = source_append(ef);
    total_bytes += src_bytes;
@@ -1282,6 +1445,7 @@ static void
 _data_queue_program_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
+
    cl = mem_alloc(SZ(Code_Lookup));
    cl->ptr = ptr;
    cl->len = len;
@@ -1291,14 +1455,15 @@ _data_queue_program_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int
    code_lookups = eina_list_append(code_lookups, cl);
 }
 static void
-_data_queue_group_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
+_data_queue_group_lookup(Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr __UNUSED__, int len __UNUSED__)
 {
    data_queue_group_lookup(name);	
 }
 static void
-_data_queue_image_pc_lookup(Edje_Part_Collection *pc, char *name, char *ptr, int len)
+_data_queue_image_pc_lookup(Edje_Part_Collection *pc __UNUSED__, char *name, char *ptr, int len)
 {
    Code_Lookup *cl;
+
    cl = mem_alloc(SZ(Code_Lookup));
    cl->ptr = ptr;
    cl->len = len;
@@ -1325,7 +1490,7 @@ data_process_scripts(void)
 	     Eina_List *ll;
 	     Code_Program *cp;
 
-	     if (cd->shared)
+	     if ((cd->shared) && (!cd->is_lua))
 	       {
 		  data_process_string(pc, "PART",    cd->shared, _data_queue_part_lookup);
 		  data_process_string(pc, "PROGRAM", cd->shared, _data_queue_program_lookup);
diff --git a/src/bin/edje_cc_parse.c b/src/bin/edje_cc_parse.c
index ad492ce..0b515c7 100644
--- a/src/bin/edje_cc_parse.c
+++ b/src/bin/edje_cc_parse.c
@@ -6,15 +6,6 @@
 # include <config.h>
 #endif
 
-#include <string.h>
-#include <ctype.h>
-#include <limits.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <fcntl.h>
-
 #ifdef HAVE_ALLOCA_H
 # include <alloca.h>
 #elif defined __GNUC__
@@ -32,6 +23,15 @@ extern "C"
 void *alloca (size_t);
 #endif
 
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <fcntl.h>
+
 #include "edje_cc.h"
 
 static void  new_object(void);
@@ -641,12 +641,12 @@ compile(void)
    int fd;
    off_t size;
    char *data, *p;
-   const char *tmpdir;
 
+   if (!tmp_dir)
 #ifdef HAVE_EVIL
-   tmpdir = evil_tmpdir_get();
+     tmp_dir = (char *)evil_tmpdir_get();
 #else
-   tmpdir = "/tmp";
+     tmp_dir = "/tmp";
 #endif
 
    strncpy(inc, file_in, 4000);
@@ -654,7 +654,7 @@ compile(void)
    p = strrchr(inc, '/');
    if (!p) strcpy(inc, "./");
    else *p = 0;
-   snprintf (tmpn, PATH_MAX, "%s/edje_cc.edc-tmp-XXXXXX", tmpdir);
+   snprintf (tmpn, PATH_MAX, "%s/edje_cc.edc-tmp-XXXXXX", tmp_dir);
    fd = mkstemp(tmpn);
    if (fd >= 0)
      {
diff --git a/src/bin/edje_cc_sources.c b/src/bin/edje_cc_sources.c
index e25d63a..e060a98 100644
--- a/src/bin/edje_cc_sources.c
+++ b/src/bin/edje_cc_sources.c
@@ -2,6 +2,10 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <string.h>
 #include <ctype.h>
 #include <limits.h>
@@ -11,74 +15,43 @@
 static Eet_Data_Descriptor *_srcfile_edd = NULL;
 static Eet_Data_Descriptor *_srcfile_list_edd = NULL;
 
+static Eet_Data_Descriptor *_external_edd = NULL;
+static Eet_Data_Descriptor *_external_list_edd = NULL;
+
 static Eet_Data_Descriptor *_font_edd = NULL;
 static Eet_Data_Descriptor *_font_list_edd = NULL;
 
 static SrcFile_List srcfiles = {NULL};
 
-#define NEWD(str, typ) \
-      { eddc.name = str; eddc.size = sizeof(typ); }
-
-static char *
-_edje_str_direct_alloc(const char *str)
-{
-   return (char *)str;
-}
-
-static void
-_edje_str_direct_free(const char *str)
-{
-}
-
-static void *
-_edje_eina_hash_add_alloc(void *hash, const char *key, void *data)
-{
-   Eina_Hash *result = hash;
-
-   if (!result) result = eina_hash_string_small_new(NULL);
-   if (!result) return NULL;
-
-   eina_hash_add(result, key, data);
-
-   return result;
-}
-
 void
 source_edd(void)
 {
    Eet_Data_Descriptor_Class eddc;
 
-   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
-   eddc.func.mem_alloc = NULL;
-   eddc.func.mem_free = NULL;
-   eddc.func.str_alloc = eina_stringshare_add;
-   eddc.func.str_free = eina_stringshare_del;
-   eddc.func.list_next = eina_list_next;
-   eddc.func.list_append = eina_list_append;
-   eddc.func.list_data = eina_list_data_get;
-   eddc.func.list_free = eina_list_free;
-   eddc.func.hash_foreach = eina_hash_foreach;
-   eddc.func.hash_add = _edje_eina_hash_add_alloc;
-   eddc.func.hash_free = eina_hash_free;
-   eddc.func.str_direct_alloc = _edje_str_direct_alloc;
-   eddc.func.str_direct_free = _edje_str_direct_free;
-
-   NEWD("srcfile", SrcFile);
-   _srcfile_edd = eet_data_descriptor3_new(&eddc);
+   eet_eina_stream_data_descriptor_class_set(&eddc, "srcfile", sizeof (SrcFile));
+   _srcfile_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_srcfile_edd, SrcFile, "name", name, EET_T_INLINED_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_srcfile_edd, SrcFile, "file", file, EET_T_INLINED_STRING);
 
-   NEWD("srcfile_list", SrcFile_List);
-   _srcfile_list_edd = eet_data_descriptor3_new(&eddc);
+   eet_eina_stream_data_descriptor_class_set(&eddc, "srcfile_list", sizeof (SrcFile_List));
+   _srcfile_list_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_srcfile_list_edd, SrcFile_List, "list", list, _srcfile_edd);
 
-   NEWD("font", Font);
-   _font_edd = eet_data_descriptor3_new(&eddc);
+   eet_eina_stream_data_descriptor_class_set(&eddc, "external", sizeof (External));
+   _external_edd = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_external_edd, External, "name", name, EET_T_INLINED_STRING);
+
+   eet_eina_stream_data_descriptor_class_set(&eddc, "external_list", sizeof (External_List));
+   _external_list_edd = eet_data_descriptor_stream_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_external_list_edd, External_List, "list", list, _external_edd);
+
+   eet_eina_stream_data_descriptor_class_set(&eddc, "font", sizeof (Font));
+   _font_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font, "file", file, EET_T_INLINED_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_font_edd, Font, "name", name, EET_T_INLINED_STRING);
 
-   NEWD("font_list", Font_List);
-   _font_list_edd = eet_data_descriptor3_new(&eddc);
+   eet_eina_stream_data_descriptor_class_set(&eddc, "font_list", sizeof (Font_List));
+   _font_list_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_font_list_edd, Font_List, "list", list, _font_edd);
 }
 
@@ -90,6 +63,7 @@ source_fetch_file(const char *fil, const char *filname)
    FILE *f;
    char buf[16 * 1024], *dir = NULL;
    long sz;
+   size_t tmp;
    ssize_t dir_len = 0;
    SrcFile *sf;
 
@@ -107,7 +81,17 @@ source_fetch_file(const char *fil, const char *filname)
    sf = mem_alloc(SZ(SrcFile));
    sf->name = mem_strdup(filname);
    sf->file = mem_alloc(sz + 1);
-   fread(sf->file, sz, 1, f);
+   if (sz > 0)
+     {
+	tmp = fread(sf->file, sz, 1, f);
+	if (tmp != 1)
+	  {
+	     fprintf(stderr, "%s: Warning file length for (%s) doesn't match !\n",
+		     progname, filname);
+	     exit(-1);
+	  }
+     }
+
    sf->file[sz] = '\0';
    fseek(f, 0, SEEK_SET);
    srcfiles.list = eina_list_append(srcfiles.list, sf);
diff --git a/src/bin/edje_decc.c b/src/bin/edje_decc.c
index 40e6179..e4d0955 100644
--- a/src/bin/edje_decc.c
+++ b/src/bin/edje_decc.c
@@ -30,6 +30,8 @@ SrcFile_List *srcfiles = NULL;
 Font_List *fontlist = NULL;
 
 int line = 0;
+int build_sh = 1;
+int new_dir = 1;
 
 int        decomp(void);
 void       output(void);
@@ -41,7 +43,7 @@ main_help(void)
 {
    printf
      ("Usage:\n"
-      "\t%s input_file.edj [-main-out file.edc]\n"
+      "\t%s input_file.edj [-main-out file.edc] [-no-build-sh] [-current-dir]\n"
       "\n"
       ,progname);
 }
@@ -66,6 +68,10 @@ main(int argc, char **argv)
 	     i++;
 	     file_out = argv[i];
 	  }
+	else if (!strcmp(argv[i], "-no-build-sh"))
+	  build_sh = 0;
+	else if (!strcmp(argv[i], "-current-dir"))
+	  new_dir = 0;
      }
    if (!file_in)
      {
@@ -138,15 +144,20 @@ output(void)
    SrcFile *sf;
    char *outdir, *p;
 
-   p = strrchr(file_in, '/');
-   if (p)
-     outdir = strdup(p + 1);
+   if (!new_dir)
+     outdir = strdup(".");
    else
-     outdir = strdup(file_in);
-   p = strrchr(outdir, '.');
-   if (p) *p = 0;
+     {
+	p = strrchr(file_in, '/');
+	if (p)
+	  outdir = strdup(p + 1);
+	else
+	  outdir = strdup(file_in);
+	p = strrchr(outdir, '.');
+	if (p) *p = 0;
+	ecore_file_mkpath(outdir);
+     }
 
-   ecore_file_mkpath(outdir);
 
    ef = eet_open(file_in, EET_FILE_MODE_READ);
 
@@ -292,17 +303,25 @@ output(void)
 	FILE *f;
 	SrcFile *sf = eina_list_data_get(srcfiles->list);
 
-	snprintf(out, sizeof(out), "%s/build.sh", outdir);
-	printf("Output Build Script: %s\n", out);
-	if (strstr(out, "../"))
+
+	if (build_sh)
 	  {
-	     printf("ERROR: potential security violation. attempt to write in parent dir.\n");
-	     exit (-1);
+	     snprintf(out, sizeof(out), "%s/build.sh", outdir);
+	     printf("Output Build Script: %s\n", out);
+	     if (strstr(out, "../"))
+	       {
+		  printf("ERROR: potential security violation. attempt to write in parent dir.\n");
+		  exit (-1);
+	       }
+	     f = fopen(out, "wb");
+	     fprintf(f, "#!/bin/sh\n");
+	     fprintf(f, "%s $@ -id . -fd . %s -o %s.edj\n", edje_file->compiler, sf->name, outdir);
+	     fclose(f);
+
+	     printf("\n*** CAUTION ***\n"
+		    "Please check the build script for anything malicious "
+		    "before running it!\n\n");
 	  }
-	f = fopen(out, "wb");
-	fprintf(f, "#!/bin/sh\n");
-	fprintf(f, "%s $@ -id . -fd . %s -o %s.edj\n", edje_file->compiler, sf->name, outdir);
-	fclose(f);
 
 	if (file_out)
 	  {
@@ -312,9 +331,6 @@ output(void)
 
 	chmod(out, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP);
 
-	printf("\n*** CAUTION ***\n"
-	      "Please check the build script for anything malicious "
-	      "before running it!\n\n");
      }
    eet_close(ef);
 }
diff --git a/src/bin/edje_prefix.c b/src/bin/edje_prefix.c
index 18f45b9..9a8fb21 100644
--- a/src/bin/edje_prefix.c
+++ b/src/bin/edje_prefix.c
@@ -21,6 +21,10 @@
 #include <time.h>
 #include <dirent.h>
 
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
 #include "edje_prefix.h"
 
 #ifdef _WIN32
diff --git a/src/lib/Edje.h b/src/lib/Edje.h
index a064af4..fbd794e 100644
--- a/src/lib/Edje.h
+++ b/src/lib/Edje.h
@@ -1,6 +1,9 @@
 #ifndef _EDJE_H
 #define _EDJE_H
 
+#include <stdint.h>
+#include <math.h>
+
 #include <Evas.h>
 
 #ifdef EAPI
@@ -29,6 +32,14 @@
 # endif
 #endif
 
+/** 
+ * @file Edje.h
+ * @brief Edje Graphical Design Library
+ *
+ * These routines are used for Edje.
+ */
+
+
 /* FIXDOC: Define these? */
 enum _Edje_Message_Type
 {
@@ -70,6 +81,72 @@ enum _Edje_Object_Table_Homogeneous_Mode
 };
 typedef enum _Edje_Object_Table_Homogeneous_Mode Edje_Object_Table_Homogeneous_Mode;
 
+typedef enum _Edje_Part_Type
+{
+   EDJE_PART_TYPE_NONE      = 0,
+   EDJE_PART_TYPE_RECTANGLE = 1,
+   EDJE_PART_TYPE_TEXT      = 2,
+   EDJE_PART_TYPE_IMAGE     = 3,
+   EDJE_PART_TYPE_SWALLOW   = 4,
+   EDJE_PART_TYPE_TEXTBLOCK = 5,
+   EDJE_PART_TYPE_GRADIENT  = 6,
+   EDJE_PART_TYPE_GROUP     = 7,
+   EDJE_PART_TYPE_BOX       = 8,
+   EDJE_PART_TYPE_TABLE     = 9,
+   EDJE_PART_TYPE_EXTERNAL  = 10,
+   EDJE_PART_TYPE_LAST      = 11
+} Edje_Part_Type;
+
+typedef enum _Edje_Text_Effect
+{
+   EDJE_TEXT_EFFECT_NONE                = 0,
+   EDJE_TEXT_EFFECT_PLAIN               = 1,
+   EDJE_TEXT_EFFECT_OUTLINE             = 2,
+   EDJE_TEXT_EFFECT_SOFT_OUTLINE        = 3,
+   EDJE_TEXT_EFFECT_SHADOW              = 4,
+   EDJE_TEXT_EFFECT_SOFT_SHADOW         = 5,
+   EDJE_TEXT_EFFECT_OUTLINE_SHADOW      = 6,
+   EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW = 7,
+   EDJE_TEXT_EFFECT_FAR_SHADOW          = 8,
+   EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW     = 9,
+   EDJE_TEXT_EFFECT_GLOW                = 10,
+   EDJE_TEXT_EFFECT_LAST                = 11
+} Edje_Text_Effect;
+
+typedef enum _Edje_Action_Type
+{
+   EDJE_ACTION_TYPE_NONE          = 0,
+   EDJE_ACTION_TYPE_STATE_SET     = 1,
+   EDJE_ACTION_TYPE_ACTION_STOP   = 2,
+   EDJE_ACTION_TYPE_SIGNAL_EMIT   = 3,
+   EDJE_ACTION_TYPE_DRAG_VAL_SET  = 4,
+   EDJE_ACTION_TYPE_DRAG_VAL_STEP = 5,
+   EDJE_ACTION_TYPE_DRAG_VAL_PAGE = 6,
+   EDJE_ACTION_TYPE_SCRIPT        = 7,
+   EDJE_ACTION_TYPE_FOCUS_SET     = 8,
+   EDJE_ACTION_TYPE_LUA_SCRIPT    = 9,
+   EDJE_ACTION_TYPE_LAST          = 10
+} Edje_Action_Type;
+
+typedef enum _Edje_Tween_Mode
+{
+   EDJE_TWEEN_MODE_NONE       = 0,
+   EDJE_TWEEN_MODE_LINEAR     = 1,
+   EDJE_TWEEN_MODE_SINUSOIDAL = 2,
+   EDJE_TWEEN_MODE_ACCELERATE = 3,
+   EDJE_TWEEN_MODE_DECELERATE = 4,
+   EDJE_TWEEN_MODE_LAST       = 5
+} Edje_Tween_Mode;
+
+enum _Edje_Cursor
+{
+   EDJE_CURSOR_MAIN,
+   EDJE_CURSOR_SELECTION_BEGIN,
+   EDJE_CURSOR_SELECTION_END
+   // more later
+};
+typedef enum _Edje_Cursor Edje_Cursor;
+
 typedef struct _Edje_Message_String           Edje_Message_String;
 typedef struct _Edje_Message_Int              Edje_Message_Int;
 typedef struct _Edje_Message_Float            Edje_Message_Float;
@@ -162,6 +239,112 @@ enum
      EDJE_LOAD_ERROR_RECURSIVE_REFERENCE = 9
 };
 
+enum _Edje_External_Param_Type
+{
+  EDJE_EXTERNAL_PARAM_TYPE_INT,
+  EDJE_EXTERNAL_PARAM_TYPE_DOUBLE,
+  EDJE_EXTERNAL_PARAM_TYPE_STRING,
+  EDJE_EXTERNAL_PARAM_TYPE_MAX
+};
+typedef enum _Edje_External_Param_Type Edje_External_Param_Type;
+
+struct _Edje_External_Param
+{
+  const char *name;
+  Edje_External_Param_Type type;
+  // XXX these could be in a union, but eet doesn't support them (or does it?)
+  int i;
+  double d;
+  const char *s;
+};
+typedef struct _Edje_External_Param Edje_External_Param;
+
+#define EDJE_EXTERNAL_INT_UNSET INT32_MAX
+#define EDJE_EXTERNAL_DOUBLE_UNSET NAN
+
+struct _Edje_External_Param_Info
+{
+   const char *name;
+   Edje_External_Param_Type type;
+   union
+   {
+      struct
+      {
+	 int def, min, max, step;
+      } i;
+      struct
+      {
+	 double def, min, max, step;
+      } d;
+      struct
+      {
+	 const char *def;
+	 const char *accept_fmt;
+	 const char *deny_fmt;
+      } s;
+   } info;
+};
+typedef struct _Edje_External_Param_Info Edje_External_Param_Info;
+
+#define EDJE_EXTERNAL_PARAM_INFO_INT_FULL(name, def, min, max, step) \
+  {name, EDJE_EXTERNAL_PARAM_TYPE_INT, {.i = {def, min, max, step}}}
+#define EDJE_EXTERNAL_PARAM_INFO_DOUBLE_FULL(name, def, min, max, step) \
+  {name, EDJE_EXTERNAL_PARAM_TYPE_DOUBLE, {.d = {def, min, max, step}}}
+#define EDJE_EXTERNAL_PARAM_INFO_STRING_FULL(name, def, accept, deny) \
+  {name, EDJE_EXTERNAL_PARAM_TYPE_STRING, {.s = {def, accept, deny}}}
+
+#define EDJE_EXTERNAL_PARAM_INFO_INT_DEFAULT(name, def) \
+   EDJE_EXTERNAL_PARAM_INFO_INT_FULL(name, def, EDJE_EXTERNAL_INT_UNSET, EDJE_EXTERNAL_INT_UNSET, EDJE_EXTERNAL_INT_UNSET)
+#define EDJE_EXTERNAL_PARAM_INFO_DOUBLE_DEFAULT(name, def) \
+   EDJE_EXTERNAL_PARAM_INFO_DOUBLE_FULL(name, def, EDJE_EXTERNAL_DOUBLE_UNSET, EDJE_EXTERNAL_DOUBLE_UNSET, EDJE_EXTERNAL_DOUBLE_UNSET)
+#define EDJE_EXTERNAL_PARAM_INFO_STRING_DEFAULT(name, def) \
+   EDJE_EXTERNAL_PARAM_INFO_STRING_FULL(name, def, NULL, NULL)
+
+#define EDJE_EXTERNAL_PARAM_INFO_INT(name) \
+   EDJE_EXTERNAL_PARAM_INFO_INT_DEFAULT(name, 0)
+#define EDJE_EXTERNAL_PARAM_INFO_DOUBLE(name) \
+   EDJE_EXTERNAL_PARAM_INFO_DOUBLE_DEFAULT(name, 0.0)
+#define EDJE_EXTERNAL_PARAM_INFO_STRING(name) \
+   EDJE_EXTERNAL_PARAM_INFO_STRING_DEFAULT(name, NULL)
+
+#define EDJE_EXTERNAL_PARAM_INFO_SENTINEL {NULL, 0, {.s = {NULL, NULL, NULL}}}
+
+struct _Edje_External_Type
+{
+#define EDJE_EXTERNAL_TYPE_ABI_VERSION (1)
+  unsigned int abi_version; /**< always use:
+			     *  - #EDJE_EXTERNAL_TYPE_ABI_VERSION to declare.
+			     *  - edje_external_type_abi_version_get() to check.
+			     */
+
+  const char *module;
+  Evas_Object *(*add) (void *data, Evas *evas, Evas_Object *parent, const Eina_List *params);
+  void (*state_set) (void *data, Evas_Object *obj, const void *from_params, const void *to_params, float pos);
+  void (*signal_emit) (void *data, Evas_Object *obj, const char *emission, const char *source);
+  void *(*params_parse) (void *data, Evas_Object *obj, const Eina_List *params);
+  void (*params_free) (void *params);
+
+  const char *(*label_get) (void *data);
+  const char *(*description_get) (void *data);
+  Evas_Object *(*icon_add) (void *data, Evas *e);
+  Evas_Object *(*preview_add) (void *data, Evas *e);
+
+  Edje_External_Param_Info *parameters_info;
+
+  void *data;
+};
+typedef struct _Edje_External_Type Edje_External_Type;
+
+
+struct _Edje_External_Type_Info
+{
+   const char *name;
+   const Edje_External_Type *info;
+};
+typedef struct _Edje_External_Type_Info Edje_External_Type_Info;
+
+
+
 typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source);
 typedef void (*Edje_Text_Change_Cb) (void *data, Evas_Object *obj, const char *part);
 typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg);
@@ -203,6 +386,7 @@ extern "C" {
 
    /* edje_util.c */
    EAPI void         edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3);
+   EAPI Eina_Bool    edje_color_class_get(const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3);
    EAPI void         edje_color_class_del(const char *color_class);
    EAPI Eina_List *  edje_color_class_list(void);
    EAPI void         edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size);
@@ -238,6 +422,7 @@ extern "C" {
    EAPI int          edje_object_freeze              (Evas_Object *obj);
    EAPI int          edje_object_thaw                (Evas_Object *obj);
    EAPI void         edje_object_color_class_set     (Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3);
+   EAPI Eina_Bool     edje_object_color_class_get    (const Evas_Object *o, const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3);
    EAPI void         edje_object_color_class_del     (Evas_Object *obj, const char *color_class);
    EAPI void         edje_object_text_class_set      (Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size);
    EAPI void         edje_object_size_min_get        (const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *minh);
@@ -254,16 +439,28 @@ extern "C" {
    EAPI void         edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape);
    EAPI char        *edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part);
 
-   EAPI const char  *edje_object_part_text_selection_get(const Evas_Object *obj, const char *part);
-   EAPI void         edje_object_part_text_select_none(const Evas_Object *obj, const char *part);
-   EAPI void         edje_object_part_text_select_all(const Evas_Object *obj, const char *part);
-       
-   EAPI void             edje_object_part_text_insert    (Evas_Object *obj, const char *part, const char *text);
-   EAPI const Eina_List *edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part);
-   EAPI const Eina_List *edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor);
-   EAPI void             edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
-   EAPI void             edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow);
-   EAPI void             edje_object_part_text_select_abort(const Evas_Object *obj, const char *part);
+   EAPI const char      *edje_object_part_text_selection_get           (const Evas_Object *obj, const char *part);
+   EAPI void             edje_object_part_text_select_none             (const Evas_Object *obj, const char *part);
+   EAPI void             edje_object_part_text_select_all              (const Evas_Object *obj, const char *part);
+   EAPI void             edje_object_part_text_insert                  (Evas_Object *obj, const char *part, const char *text);
+   EAPI const Eina_List *edje_object_part_text_anchor_list_get         (const Evas_Object *obj, const char *part);
+   EAPI const Eina_List *edje_object_part_text_anchor_geometry_get     (const Evas_Object *obj, const char *part, const char *anchor);
+   EAPI void             edje_object_part_text_cursor_geometry_get     (const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
+   EAPI void             edje_object_part_text_select_allow_set        (const Evas_Object *obj, const char *part, Eina_Bool allow);
+   EAPI void             edje_object_part_text_select_abort            (const Evas_Object *obj, const char *part);
+   
+   EAPI Eina_Bool        edje_object_part_text_cursor_next(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI Eina_Bool        edje_object_part_text_cursor_prev(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI Eina_Bool        edje_object_part_text_cursor_up(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI Eina_Bool        edje_object_part_text_cursor_down(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI void             edje_object_part_text_cursor_begin_set(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI void             edje_object_part_text_cursor_end_set(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI void             edje_object_part_text_cursor_copy(const Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst);
+   EAPI void             edje_object_part_text_cursor_line_begin_set(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI void             edje_object_part_text_cursor_line_end_set(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI Eina_Bool        edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI Eina_Bool        edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur);
+   EAPI const char      *edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur);
        
    EAPI void         edje_object_part_swallow        (Evas_Object *obj, const char *part, Evas_Object *obj_swallow);
    EAPI void         edje_object_part_unswallow      (Evas_Object *obj, Evas_Object *obj_swallow);
@@ -299,6 +496,28 @@ extern "C" {
 
    EAPI void         edje_message_signal_process        (void);
 
+   /* edje_external.c */
+  EAPI Eina_Bool edje_external_type_register(const char *type_name, const Edje_External_Type *type_info);
+  EAPI Eina_Bool edje_external_type_unregister(const char *type_name);
+
+  EAPI void      edje_external_type_array_register(const Edje_External_Type_Info *array);
+  EAPI void      edje_external_type_array_unregister(const Edje_External_Type_Info *array);
+
+  EAPI unsigned int edje_external_type_abi_version_get(void) EINA_CONST;
+
+
+  EAPI Eina_Iterator *edje_external_iterator_get(void);
+  EAPI Edje_External_Param *edje_external_param_find(const Eina_List *params, const char *key);
+  EAPI Eina_Bool edje_external_param_int_get(const Eina_List *params, const char *key, int *ret);
+  EAPI Eina_Bool edje_external_param_double_get(const Eina_List *params, const char *key, double *ret);
+  EAPI Eina_Bool edje_external_param_string_get(const Eina_List *params, const char *key, const char **ret);
+  EAPI const Edje_External_Param_Info *edje_external_param_info_get(const char *type_name);
+
+  /* edje_module.c */
+  EAPI Eina_Bool edje_module_load(const char *module);
+  EAPI const Eina_List *edje_available_modules_get(void);
+
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/lib/Edje_Edit.h b/src/lib/Edje_Edit.h
index a8525f1..2ccb827 100644
--- a/src/lib/Edje_Edit.h
+++ b/src/lib/Edje_Edit.h
@@ -1,7 +1,7 @@
 #ifndef _EDJE_EDIT_H
 #define _EDJE_EDIT_H
 
-#include <Evas.h>
+#include <Edje.h>
 
 #ifdef EAPI
 # undef EAPI
@@ -30,12 +30,13 @@
 #endif
 
 
-enum {
+typedef enum _Edje_Edit_Image_Comp
+{
    EDJE_EDIT_IMAGE_COMP_RAW,
    EDJE_EDIT_IMAGE_COMP_USER,
    EDJE_EDIT_IMAGE_COMP_COMP,
    EDJE_EDIT_IMAGE_COMP_LOSSY
-};
+} Edje_Edit_Image_Comp;
 
 /**
  * @file
@@ -146,7 +147,7 @@ edje_edit_print_internal_status(
 /**Create a new empty group in the given edje.
  * If a group with the same name exist none is created.
  */
-EAPI unsigned char         ///@return 1 on success, 0 on failure
+EAPI Eina_Bool         ///@return 1 on success, 0 on failure
 edje_edit_group_add(
    Evas_Object *obj,       ///< The edje object
    const char  *name       ///< The name for the new empty group
@@ -157,14 +158,14 @@ edje_edit_group_add(
  * All the parts and the programs inside the group will be deleted as well,
  * but not image or font embedded in the edje.
  */
-EAPI unsigned char         ///@return 1 on success, 0 on failure
+EAPI Eina_Bool         ///@return 1 on success, 0 on failure
 edje_edit_group_del(
    Evas_Object *obj        ///< The edje object
 );
 
 /**Check if a group with the given name exist in the edje.
  */
-EAPI unsigned char         ///< 1 if the group exist, 0 otherwise.
+EAPI Eina_Bool         ///< 1 if the group exist, 0 otherwise.
 edje_edit_group_exist(
    Evas_Object *obj,       ///< The edje object
    const char *group       ///< The name of the group
@@ -174,7 +175,7 @@ edje_edit_group_exist(
  * You can only rename a group that is currently loaded
  * Note that the relative getter function don't exist as it don't make sense ;)
  */
-EAPI unsigned char         ///@return 1 on success, 0 on failure
+EAPI Eina_Bool         ///@return 1 on success, 0 on failure
 edje_edit_group_name_set(
    Evas_Object *obj,       ///< The edje object
    const char  *new_name   ///< The new name for the group
@@ -241,7 +242,7 @@ edje_edit_data_list_get(
 /**Create a new data object in the given edje
  * If another data with the same name exists nothing is created and FALSE is returned.
  */
-EAPI unsigned char         ///@return TRUE on success
+EAPI Eina_Bool         ///@return TRUE on success
 edje_edit_data_add(
    Evas_Object *obj,       ///< The edje object
    const char *itemname,   ///< The name for the new data
@@ -249,7 +250,7 @@ edje_edit_data_add(
 );
 
 /**Delete the given data object from edje */
-EAPI unsigned char         ///@return TRUE on success
+EAPI Eina_Bool         ///@return TRUE on success
 edje_edit_data_del(
    Evas_Object *obj,       ///< The edje object
    const char *itemname    ///< The name of the data to remove
@@ -263,7 +264,7 @@ edje_edit_data_value_get(
 );
 
 /** Set the data associated with the given itemname **/
-EAPI unsigned char        ///@return TRUE on success
+EAPI Eina_Bool        ///@return TRUE on success
 edje_edit_data_value_set(
    Evas_Object * obj,     ///< The edje object
    const char *itemname,  ///< The name of the data item
@@ -271,7 +272,7 @@ edje_edit_data_value_set(
 );
 
 /** Change the name of the given data object */
-EAPI unsigned char        ///@return TRUE on success
+EAPI Eina_Bool        ///@return TRUE on success
 edje_edit_data_name_set(
    Evas_Object *obj,     ///< The edje object
    const char *itemname, ///< The name of the data item
@@ -297,14 +298,14 @@ edje_edit_color_classes_list_get(
 /** Create a new color class object in the given edje
  *  If another class with the same name exists nothing is created and FALSE is returned.
  */
-EAPI unsigned char        ///@return TRUE on success
+EAPI Eina_Bool        ///@return TRUE on success
 edje_edit_color_class_add(
    Evas_Object *obj,      ///< The edje object
    const char *name       ///< The name of the new color class
 );
 
 /** Delete the given class object from edje */
-EAPI unsigned char        ///@return TRUE on success
+EAPI Eina_Bool        ///@return TRUE on success
 edje_edit_color_class_del(
    Evas_Object *obj,      ///< The edje object
    const char *name       ///< The name of the color class to delete
@@ -313,7 +314,7 @@ edje_edit_color_class_del(
 /** Get all the colors that compose the class.
  *  You can pass NULL to colors you are not intrested in
  */
-EAPI unsigned char         ///@return TRUE on success
+EAPI Eina_Bool         ///@return TRUE on success
 edje_edit_color_class_colors_get(
    Evas_Object *obj,       ///< The edje object
    const char *class_name, ///< The name of the color class
@@ -334,7 +335,7 @@ edje_edit_color_class_colors_get(
 /** Set the colors for the given color class.
  *  If you set a color to -1 it will not be touched
  */
-EAPI unsigned char         ///@return TRUE on success
+EAPI Eina_Bool         ///@return TRUE on success
 edje_edit_color_class_colors_set(
    Evas_Object *obj,       ///< The edje object
    const char *class_name, ///< The name of the color class
@@ -353,7 +354,7 @@ edje_edit_color_class_colors_set(
 );
 
 /** Change the name of a color class */
-EAPI unsigned char        ///@return TRUE on success
+EAPI Eina_Bool        ///@return TRUE on success
 edje_edit_color_class_name_set(
    Evas_Object *obj,      ///< The edje object
    const char *name,      ///< The name of the color class
@@ -379,7 +380,7 @@ edje_edit_styles_list_get(
 /** Create a new text style object in the given edje
  *  If another style with the same name exists nothing is created and FALSE is returned.
  */
-EAPI unsigned char        ///@return TRUE on success, FALSE if the tag can't be created
+EAPI Eina_Bool        ///@return TRUE on success, FALSE if the tag can't be created
 edje_edit_style_add(
    Evas_Object *obj,      ///< The edje object
    const char *style      ///< The new name for the style
@@ -432,7 +433,7 @@ edje_edit_style_tag_name_set(
 /** Add a new tag to the given text style.
  *  If another tag with the same name exists nothing is created and FALSE is returned.
  */
-EAPI unsigned char         ///@return TRUE on success, FALSE if the tag can't be created
+EAPI Eina_Bool         ///@return TRUE on success, FALSE if the tag can't be created
 edje_edit_style_tag_add(
    Evas_Object *obj,       ///< The edje object
    const char *style,      ///< The name of the style
@@ -449,6 +450,38 @@ edje_edit_style_tag_del(
 
 //@}
 /******************************************************************************/
+/************************   EXTERNALS API   ***********************************/
+/******************************************************************************/
+/** @name Externals API
+ *  Functions to deal with list of external modules (see @ref edcref).
+ */ //@{
+
+/** Get the list of all the externals requested in the given edje object.
+ *  Use edje_edit_string_list_free() when you don't need it anymore.
+ */
+EAPI Eina_List *           ///@return An Eina_List* of string (char *)containing all the externals names.
+edje_edit_externals_list_get(
+   Evas_Object *obj        ///< The edje object
+);
+
+/** Add an external module to be requested on edje load
+ *  If one with the same name exists nothing is created and FALSE is returned.
+ */
+EAPI Eina_Bool        ///@return TRUE on success, FALSE otherwise
+edje_edit_external_add(
+   Evas_Object *obj,      ///< The edje object
+   const char *external   ///< The new name for the extermal
+);
+
+/** Delete the given external from the list. */
+EAPI void
+edje_edit_external_del(
+   Evas_Object *obj,      ///< The edje object
+   const char *external   ///< The name for the external to delete
+);
+
+//@}
+/******************************************************************************/
 /**************************   PARTS API   *************************************/
 /******************************************************************************/
 /** @name Parts API
@@ -467,11 +500,22 @@ edje_edit_parts_list_get(
  * If another part with the same name just exists nothing is created and FALSE is returned.
  * Note that this function also create a default description for the part.
  */
-EAPI unsigned char         ///@return TRUE on success, FALSE if the part can't be created
+EAPI Eina_Bool         ///@return TRUE on success, FALSE if the part can't be created
 edje_edit_part_add(
    Evas_Object *obj,       ///< The edje object
    const char *name,       ///< The name for the new part
-   unsigned char type      ///< The type of the part to create (One of: EDJE_PART_TYPE_NONE, EDJE_PART_TYPE_RECTANGLE, EDJE_PART_TYPE_TEXT,EDJE_PART_TYPE_IMAGE, EDJE_PART_TYPE_SWALLOW, EDJE_PART_TYPE_TEXTBLOCK,EDJE_PART_TYPE_GRADIENT or EDJE_PART_TYPE_GROUP)
+   Edje_Part_Type type      ///< The type of the part to create (One of: EDJE_PART_TYPE_NONE, EDJE_PART_TYPE_RECTANGLE, EDJE_PART_TYPE_TEXT,EDJE_PART_TYPE_IMAGE, EDJE_PART_TYPE_SWALLOW, EDJE_PART_TYPE_TEXTBLOCK,EDJE_PART_TYPE_GRADIENT or EDJE_PART_TYPE_GROUP)
+);
+
+/**Create a new part of type EXTERNAL in the given edje
+ * If another part with the same name just exists nothing is created and FALSE is returned.
+ * Note that this function also create a default description for the part.
+ */
+EAPI Eina_Bool         ///@return TRUE on success, FALSE if the part can't be created
+edje_edit_part_external_add(
+   Evas_Object *obj,       ///< The edje object
+   const char *name,       ///< The name for the new part
+   const char *source      ///< External type of the part
 );
 
 /**Delete the given part from the edje
@@ -479,7 +523,7 @@ edje_edit_part_add(
  * A group must have at least one part, so it's not possible to
  * remove the last remaining part.
  */
-EAPI unsigned char         ///@return 1 on success, 0 if the part can't be removed
+EAPI Eina_Bool         ///@return 1 on success, 0 if the part can't be removed
 edje_edit_part_del(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part to remove
@@ -487,21 +531,21 @@ edje_edit_part_del(
 
 /**Check if a part with the given name exist in the edje object.
  */
-EAPI unsigned char         ///< 1 if the part exist, 0 otherwise.
+EAPI Eina_Bool         ///< 1 if the part exist, 0 otherwise.
 edje_edit_part_exist(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part
 );
 
 /**Move the given part below the previous one.*/
-EAPI unsigned char         ///@return 1 on success, 0 on failure
+EAPI Eina_Bool         ///@return 1 on success, 0 on failure
 edje_edit_part_restack_below(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part to restack
 );
 
 /**Move the given part above the next one.*/
-EAPI unsigned char         ///@return 1 on success, 0 on failure
+EAPI Eina_Bool         ///@return 1 on success, 0 on failure
 edje_edit_part_restack_above(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part to restack
@@ -510,7 +554,7 @@ edje_edit_part_restack_above(
 /**Set a new name for part.
  * Note that the relative getter function don't exist as it don't make sense ;)
  */
-EAPI unsigned char         ///@return 1 on success, 0 on failure
+EAPI Eina_Bool         ///@return 1 on success, 0 on failure
 edje_edit_part_name_set(
    Evas_Object *obj,       ///< The edje object
    const char  *part,      ///< The name of the part to rename
@@ -518,7 +562,7 @@ edje_edit_part_name_set(
 );
 
 /**Get the type of a part */
-EAPI unsigned char         ///@return One of: EDJE_PART_TYPE_NONE, EDJE_PART_TYPE_RECTANGLE, EDJE_PART_TYPE_TEXT,EDJE_PART_TYPE_IMAGE, EDJE_PART_TYPE_SWALLOW, EDJE_PART_TYPE_TEXTBLOCK,EDJE_PART_TYPE_GRADIENT or EDJE_PART_TYPE_GROUP
+EAPI Edje_Part_Type         ///@return One of: EDJE_PART_TYPE_NONE, EDJE_PART_TYPE_RECTANGLE, EDJE_PART_TYPE_TEXT,EDJE_PART_TYPE_IMAGE, EDJE_PART_TYPE_SWALLOW, EDJE_PART_TYPE_TEXTBLOCK,EDJE_PART_TYPE_GRADIENT or EDJE_PART_TYPE_GROUP
 edje_edit_part_type_get(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part
@@ -536,7 +580,7 @@ edje_edit_part_clip_to_get(
 /**Set a part to clip part to.
  * If clip_to is NULL then the clipping value will be cancelled (unset clipping)
  */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise.
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise.
 edje_edit_part_clip_to_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -558,7 +602,7 @@ edje_edit_part_source_get(
  * 'autoswallow' inside the given part.
  * NOTE: This is not applied now. You must reload the edje to see the change.
  */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise.
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise.
 edje_edit_part_source_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -566,7 +610,7 @@ edje_edit_part_source_set(
 );
 
 /**Get the effect for a given part. */
-EAPI unsigned char         ///@return One of: EDJE_TEXT_EFFECT_NONE, _PLAIN, _OUTLINE, _SOFT_OUTLINE, _SHADOW, _SOFT_SHADOW, _OUTLINE_SHADOW, _OUTLINE_SOFT_SHADOW, _FAR_SHADOW, _FAR_SOFT_SHADOW, _GLOW.
+EAPI Edje_Text_Effect         ///@return One of: EDJE_TEXT_EFFECT_NONE, _PLAIN, _OUTLINE, _SOFT_OUTLINE, _SHADOW, _SOFT_SHADOW, _OUTLINE_SHADOW, _OUTLINE_SOFT_SHADOW, _FAR_SHADOW, _FAR_SOFT_SHADOW, _GLOW.
 edje_edit_part_effect_get(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part
@@ -577,7 +621,7 @@ EAPI void
 edje_edit_part_effect_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
-   unsigned char effect    ///< The effect to set. See edje_edit_part_effect_get() for possible value
+   Edje_Text_Effect effect    ///< The effect to set. See edje_edit_part_effect_get() for possible value
 );
 
 /**Get the current selected state in part. */
@@ -588,7 +632,7 @@ edje_edit_part_selected_state_get(
 );
 
 /**Set the current state in part.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise.
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise.
 edje_edit_part_selected_state_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -596,7 +640,7 @@ edje_edit_part_selected_state_set(
 );
 
 /**Get mouse_events for part.*/
-EAPI unsigned char         ///@return 1 if part accept mouse events, 0 if not
+EAPI Eina_Bool         ///@return 1 if part accept mouse events, 0 if not
 edje_edit_part_mouse_events_get(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part
@@ -607,11 +651,11 @@ EAPI void
 edje_edit_part_mouse_events_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
-   unsigned char mouse_events ///< If set to 1 part will accept mouse events, 0 to ignore all mouse events from part.
+   Eina_Bool mouse_events ///< If set to 1 part will accept mouse events, 0 to ignore all mouse events from part.
 );
 
 /**Get repeat_events for part.*/
-EAPI unsigned char         ///@return 1 if part will pass all events to the other parts, 0 if not
+EAPI Eina_Bool         ///@return 1 if part will pass all events to the other parts, 0 if not
 edje_edit_part_repeat_events_get(
    Evas_Object *obj,       ///< The edje object
    const char *part        ///< The name of the part
@@ -622,7 +666,7 @@ EAPI void
 edje_edit_part_repeat_events_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
-   unsigned char repeat_events /**< If set to 1 part will repeat
+   Eina_Bool repeat_events /**< If set to 1 part will repeat
                                  * all the received mouse events to other parts.
                                  * If set to 0 the events received will not propagate to other parts.*/
 );
@@ -810,13 +854,23 @@ edje_edit_state_del(
 
 /**Check if a part state with the given name exist.
  */
-EAPI unsigned char         ///< 1 if the part state exist, 0 otherwise.
+EAPI Eina_Bool         ///< 1 if the part state exist, 0 otherwise.
 edje_edit_state_exist(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
    const char *state       ///< The name of the state to check (including the state value)
 );
 
+/**Copies the state @p from into @p to. If @p to doesn't exist it will be created.
+ */
+EAPI Eina_Bool        ///< 1 if it could be copied, 0 if something went wrong.
+edje_edit_state_copy(
+   Evas_Object *obj,      ///< The edje object
+   const char *part,      ///< The name of the part
+   const char *from,      ///< State to copy from (including state value)
+   const char *to         ///< State to copy into (not including state value if new)
+);
+
 /**Get the rel1 relative x value of state*/
 EAPI double                ///@return The 'rel1 relative X' value of the part state
 edje_edit_state_rel1_relative_x_get(
@@ -1346,7 +1400,7 @@ edje_edit_state_fill_size_offset_y_set(
 );
 
 /**Get the visibility of a part state.*/
-EAPI unsigned char         ///@return TRUE if the state is visible
+EAPI Eina_Bool         ///@return TRUE if the state is visible
 edje_edit_state_visible_get(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1359,7 +1413,7 @@ edje_edit_state_visible_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
    const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
-   unsigned char visible   ///< TRUE to set the state visible
+   Eina_Bool visible   ///< TRUE to set the state visible
 );
 
 /**Get the color class of the given part state. Remember to free the string with edje_edit_string_free()*/
@@ -1379,6 +1433,96 @@ edje_edit_state_color_class_set(
    const char *color_class ///< The new color_class to assign
 );
 
+/**Get the list of parameters for an external part. DO NOT FREE THE LIST*/
+EAPI const Eina_List *
+edje_edit_state_external_params_list_get( ///@return The list of Edje_External_Param
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state       ///< The name of the 'part state' (ex. "default 0.00")
+);
+
+/**Get the type and value of the paramater given*/
+EAPI Eina_Bool
+edje_edit_state_external_param_get( ///@return True if the parameter was found, False otherwise
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter to look for
+   Edje_External_Param_Type *type, ///< Type will be stored here
+   void **value            ///< Pointer to value will be stored here. DO NOT FREE IT
+);
+
+/**Get external parameter of type INT*/
+EAPI Eina_Bool
+edje_edit_state_external_param_int_get( ///@return True if succesful, False if not found or is of different type
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   int *value
+);
+
+/**Get external parameter of type DOUBLE*/
+EAPI Eina_Bool
+edje_edit_state_external_param_double_get( ///@return True if succesful, False if not found or is of different type
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   double *value
+);
+
+/**Get external parameter of type STRING*/
+EAPI Eina_Bool
+edje_edit_state_external_param_string_get( ///@return True if succesful, False if not found or is of different type
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   const char **value
+);
+
+/**Set the external parameter type and value, adding it if it didn't exist before*/
+EAPI Eina_Bool
+edje_edit_state_external_param_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter to set
+   Edje_External_Param_Type type, ///< The type of the parameter
+   ...                     ///< Value(s) according to type
+);
+
+/**Set external parameter of type INT*/
+EAPI Eina_Bool
+edje_edit_state_external_param_int_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   int value
+);
+
+/**Set external parameter of type DOUBLE*/
+EAPI Eina_Bool
+edje_edit_state_external_param_double_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   double value
+);
+
+/**Set external parameter of type STRING*/
+EAPI Eina_Bool
+edje_edit_state_external_param_string_set( ///@return True if it was set
+   Evas_Object *obj,       ///< The edje object
+   const char *part,       ///< The name of the part
+   const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
+   const char *param,      ///< The name of the parameter
+   const char *value
+);
+
 
 //@}
 /******************************************************************************/
@@ -1474,7 +1618,7 @@ edje_edit_state_text_elipsis_set(
 );
 
 /**Get if the text part fit it's container horizontally */
-EAPI unsigned char         ///@return 1 If the part fit it's container horizontally
+EAPI Eina_Bool         ///@return 1 If the part fit it's container horizontally
 edje_edit_state_text_fit_x_get(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1487,11 +1631,11 @@ edje_edit_state_text_fit_x_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
    const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
-   unsigned char fit       ///< 1 to make the text fit it's container
+   Eina_Bool fit       ///< 1 to make the text fit it's container
 );
 
 /**Get if the text part fit it's container vertically */
-EAPI unsigned char         ///@return 1 If the part fit it's container vertically
+EAPI Eina_Bool         ///@return 1 If the part fit it's container vertically
 edje_edit_state_text_fit_y_get(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1504,7 +1648,7 @@ edje_edit_state_text_fit_y_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
    const char *state,      ///< The name of the 'part state' (ex. "default 0.00")
-   unsigned char fit       ///< 1 to make the text fit it's container
+   Eina_Bool fit       ///< 1 to make the text fit it's container
 );
 
 /**Get the list of all the fonts in the given edje.
@@ -1519,7 +1663,7 @@ edje_edit_fonts_list_get(
  * The newly created font will be available to all the groups in the edje, not only the current one.
  * If font can't be load FALSE is returned.
  */
-EAPI unsigned char         ///@return TRUE on success or FALSE on failure
+EAPI Eina_Bool         ///@return TRUE on success or FALSE on failure
 edje_edit_font_add(
    Evas_Object *obj,       ///< The edje object
    const char* path        ///< The file path to load the ttf font from
@@ -1569,7 +1713,7 @@ edje_edit_images_list_get(
  *
  * The format of the image files that can be loaded depend on the evas engine on your system
  */
-EAPI unsigned char         ///@return TRUE on success or FALSE on failure
+EAPI Eina_Bool         ///@return TRUE on success or FALSE on failure
 edje_edit_image_add(
    Evas_Object *obj,       ///< The edje object
    const char* path        ///< The name of the image file to include in the edje
@@ -1583,7 +1727,7 @@ edje_edit_image_add(
  * "name". Note that all the parts in the edje share the same image collection,
  * thus you can/must use the same image for different part.
  */
-EAPI unsigned char        /// @return TRUE on success or FALSE on failure
+EAPI Eina_Bool        /// @return TRUE on success or FALSE on failure
 edje_edit_image_data_add(
    Evas_Object *obj,      ///< The edje object
    const char *name,      ///< The image entry name
@@ -1611,11 +1755,11 @@ edje_edit_state_image_set(
 EAPI int                   ///< The ID of the givan image name
 edje_edit_image_id_get(
    Evas_Object *obj,       ///< The edje object
-   const char *image_name
+   const char *image_name  ///< The image name
 );
 
 /**Get compression type for the given image.*/
-EAPI int                  ///@return One of EDJE_EDIT_IMAGE_COMP_RAW, EDJE_EDIT_IMAGE_COMP_USER, EDJE_EDIT_IMAGE_COMP_COMP or EDJE_EDIT_IMAGE_COMP_LOSSY
+EAPI Edje_Edit_Image_Comp ///@return One of EDJE_EDIT_IMAGE_COMP_RAW, EDJE_EDIT_IMAGE_COMP_USER, EDJE_EDIT_IMAGE_COMP_COMP or EDJE_EDIT_IMAGE_COMP_LOSSY
 edje_edit_image_compression_type_get(
    Evas_Object *obj,      ///< The edje object
    const char *image      ///< The name of the image
@@ -1682,7 +1826,7 @@ edje_edit_state_tweens_list_get(
 /**Add a new tween frame to the given part state
  * The tween param must be the name of an existing image.
  */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_tween_add(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1694,7 +1838,7 @@ edje_edit_state_tween_add(
  * If none is removed the function return 0.
  * The image is not removed from the edje.
  */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_tween_del(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1719,21 +1863,21 @@ edje_edit_spectrum_list_get(
 );
 
 /**Add a new spectra in the given edje object.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_spectra_add(
    Evas_Object *obj,       ///< The edje object
    const char* name        ///< The name of the new spectra
 );
 
 /**Delete the given spectra from the edje object.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_spectra_del(
    Evas_Object *obj,       ///< The edje object
    const char* spectra     ///< The name of the spectra to delete
 );
 
 /**Change the name of the given spectra.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_spectra_name_set(
    Evas_Object *obj,       ///< The edje object
    const char* spectra,    ///< The current name of the spectra
@@ -1748,7 +1892,7 @@ edje_edit_spectra_stop_num_get(
 );
 
 /**Set the number of stops in the given spectra.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_spectra_stop_num_set(
    Evas_Object *obj,       ///< The edje object
    const char* spectra,    ///< The name of the spectra
@@ -1756,7 +1900,7 @@ edje_edit_spectra_stop_num_set(
 );
 
 /**Get the colors of the given stop.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_spectra_stop_color_get(
    Evas_Object *obj,       ///< The edje object
    const char* spectra,    ///< The name of the spectra
@@ -1769,7 +1913,7 @@ edje_edit_spectra_stop_color_get(
 );
 
 /**Set the colors of the given stop.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_spectra_stop_color_set(
    Evas_Object *obj,       ///< The edje object
    const char* spectra,    ///< The name of the spectra
@@ -1801,7 +1945,7 @@ edje_edit_state_gradient_type_get(
 /**Set the type of gradient.
  * Gradient type can be on of the following: linear, linear.diag, linear.codiag, radial, rectangular, angular, sinusoidal
  */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_type_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1810,7 +1954,7 @@ edje_edit_state_gradient_type_set(
 );
 
 /**Get if the current gradient use the fill properties or the gradient_rel as params.*/
-EAPI unsigned char         ///@return 1 if use fill, 0 if use gradient_rel
+EAPI Eina_Bool         ///@return 1 if use fill, 0 if use gradient_rel
 edje_edit_state_gradient_use_fill_get(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1826,7 +1970,7 @@ edje_edit_state_gradient_spectra_get(
 );
 
 /**Set the spectra used by part state.*/
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_spectra_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1884,7 +2028,7 @@ edje_edit_state_gradient_rel2_relative_y_get(
 );
 
 /**Set the gradien rel1 relative x value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel1_relative_x_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1893,7 +2037,7 @@ edje_edit_state_gradient_rel1_relative_x_set(
 );
 
 /**Set the gradien rel1 relative y value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel1_relative_y_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1902,7 +2046,7 @@ edje_edit_state_gradient_rel1_relative_y_set(
 );
 
 /**Set the gradien rel2 relative x value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel2_relative_x_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1911,7 +2055,7 @@ edje_edit_state_gradient_rel2_relative_x_set(
 );
 
 /**Set the gradien rel2 relative y value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel2_relative_y_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1952,7 +2096,7 @@ edje_edit_state_gradient_rel2_offset_y_get(
 );
 
 /**Set the gradien rel1 offset x value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel1_offset_x_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1961,7 +2105,7 @@ edje_edit_state_gradient_rel1_offset_x_set(
 );
 
 /**Set the gradien rel1 offset y value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel1_offset_y_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1970,7 +2114,7 @@ edje_edit_state_gradient_rel1_offset_y_set(
 );
 
 /**Set the gradien rel2 offset x value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel2_offset_x_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -1979,7 +2123,7 @@ edje_edit_state_gradient_rel2_offset_x_set(
 );
 
 /**Set the gradien rel2 offset y value */
-EAPI unsigned char         ///@return 1 on success, 0 otherwise
+EAPI Eina_Bool         ///@return 1 on success, 0 otherwise
 edje_edit_state_gradient_rel2_offset_y_set(
    Evas_Object *obj,       ///< The edje object
    const char *part,       ///< The name of the part
@@ -2008,7 +2152,7 @@ edje_edit_programs_list_get(
 /**Add a new program to the edje file
  * If a program with the same name just exist the function will fail.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_add(
    Evas_Object *obj,       ///< The edje object
    const char *name        ///< The name of the new program
@@ -2016,7 +2160,7 @@ edje_edit_program_add(
 
 /**Remove the given program from the edje file.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_del(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The name of the program to remove
@@ -2024,21 +2168,21 @@ edje_edit_program_del(
 
 /**Check if a program with the given name exist in the edje object.
  */
-EAPI unsigned char         ///< 1 if the program exist, 0 otherwise.
+EAPI Eina_Bool         ///< 1 if the program exist, 0 otherwise.
 edje_edit_program_exist(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The name of the program
 );
 
 /**Run the given program. */
-EAPI unsigned char         ///< 1 on success, 0 otherwise.
+EAPI Eina_Bool         ///< 1 on success, 0 otherwise.
 edje_edit_program_run(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The name of the program to execute
 );
 
 /**Set a new name for the given program */
-EAPI unsigned char        ///@return 1 on success or 0 on errors
+EAPI Eina_Bool        ///@return 1 on success or 0 on errors
 edje_edit_program_name_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2053,7 +2197,7 @@ edje_edit_program_source_get(
 );
 
 /**Set source of the given program. */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_source_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2068,7 +2212,7 @@ edje_edit_program_signal_get(
 );
 
 /**Set signal of the given program. */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_signal_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2083,7 +2227,7 @@ edje_edit_program_in_from_get(
 );
 
 /**Set in.from of a given program.*/
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_in_from_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2098,7 +2242,7 @@ edje_edit_program_in_range_get(
 );
 
 /**Set in.range of a given program.*/
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_in_range_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2108,7 +2252,7 @@ edje_edit_program_in_range_set(
 /**Get the action of a given program.
  * Action can be one of EDJE_ACTION_TYPE_NONE, _STATE_SET, ACTION_STOP, SIGNAL_EMIT, DRAG_VAL_SET, _DRAG_VAL_STEP, _DRAG_VAL_PAGE, _SCRIPT
  */
-EAPI int                   ///@return The action type, or -1 on errors
+EAPI Edje_Action_Type      ///@return The action type, or -1 on errors
 edje_edit_program_action_get(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The program name
@@ -2117,11 +2261,11 @@ edje_edit_program_action_get(
 /**Set the action of a given program.
  * Action can be one of EDJE_ACTION_TYPE_NONE, _STATE_SET, ACTION_STOP, SIGNAL_EMIT, DRAG_VAL_SET, _DRAG_VAL_STEP, _DRAG_VAL_PAGE, _SCRIPT
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_action_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
-   int action              ///< The new action type
+   Edje_Action_Type action ///< The new action type
 );
 
 /**Get the list of the targets for the given program
@@ -2138,7 +2282,7 @@ edje_edit_program_targets_get(
  * If program action is EDJE_ACTION_TYPE_ACTION_STOP then 'target' must be an existing program name.
  * If action is EDJE_ACTION_TYPE_STATE_SET then 'target' must be an existing part name.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_target_add(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2146,7 +2290,7 @@ edje_edit_program_target_add(
 );
 
 /**Clear the 'targets' list of the given program */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_targets_clear(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The program name
@@ -2165,7 +2309,7 @@ edje_edit_program_afters_get(
 /**Add a new program name to the list of 'afters' in the given program.
  * All the programs listed in 'afters' will be executed after program execution.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_after_add(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2173,7 +2317,7 @@ edje_edit_program_after_add(
 );
 
 /**Clear the 'afters' list of the given program */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_afters_clear(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The program name
@@ -2193,7 +2337,7 @@ edje_edit_program_state_get(
  * In a STATE_SET action this is the name of state to set.
  * In a SIGNAL_EMIT action is the name of the signal to emit.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_state_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2214,7 +2358,7 @@ edje_edit_program_value_get(
  * In a STATE_SET action this is the value of state to set.
  * Not used on SIGNAL_EMIT action.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_value_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2235,7 +2379,7 @@ edje_edit_program_state2_get(
  * In a STATE_SET action is not used
  * In a SIGNAL_EMIT action is the source of the emitted signal.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_state2_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2254,7 +2398,7 @@ edje_edit_program_value2_get(
 /**Set the value2 of state for the given program.
  * This is used in DRAG_ACTION
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_value2_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
@@ -2264,7 +2408,7 @@ edje_edit_program_value2_set(
 /**Get the type of transition to use when apply animations.
  * Can be one of: EDJE_TWEEN_MODE_NONE, EDJE_TWEEN_MODE_LINEAR, EDJE_TWEEN_MODE_SINUSOIDAL, EDJE_TWEEN_MODE_ACCELERATE or EDJE_TWEEN_MODE_DECELERATE.
  */
-EAPI int                   ///@return The type of transition used by program
+EAPI Edje_Tween_Mode       ///@return The type of transition used by program
 edje_edit_program_transition_get(
    Evas_Object *obj,       ///< The edje object
    const char *prog        ///< The program name
@@ -2273,11 +2417,11 @@ edje_edit_program_transition_get(
 /**Set the type of transition to use when apply animations.
  * Can be one of: EDJE_TWEEN_MODE_NONE, EDJE_TWEEN_MODE_LINEAR, EDJE_TWEEN_MODE_SINUSOIDAL, EDJE_TWEEN_MODE_ACCELERATE or EDJE_TWEEN_MODE_DECELERATE.
  */
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_transition_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
-   int transition          ///< The transition type to set
+   Edje_Tween_Mode transition ///< The transition type to set
 );
 
 /**Get the duration of the transition in seconds.*/
@@ -2288,7 +2432,7 @@ edje_edit_program_transition_time_get(
 );
 
 /**Set the duration of the transition in seconds.*/
-EAPI unsigned char         ///@return 1 on success or 0 on errors
+EAPI Eina_Bool         ///@return 1 on success or 0 on errors
 edje_edit_program_transition_time_set(
    Evas_Object *obj,       ///< The edje object
    const char *prog,       ///< The program name
diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am
index 0e6b159..be54e59 100644
--- a/src/lib/Makefile.am
+++ b/src/lib/Makefile.am
@@ -18,11 +18,12 @@ lib_LTLIBRARIES = libedje.la
 
 include_HEADERS = Edje.h Edje_Edit.h
 
-libedje_la_SOURCES  = \
+base_sources = \
 edje_calc.c \
 edje_callbacks.c \
 edje_data.c \
 edje_embryo.c \
+edje_lua.c \
 edje_load.c \
 edje_main.c \
 edje_misc.c \
@@ -32,15 +33,103 @@ edje_text.c \
 edje_util.c \
 edje_var.c \
 edje_container.c \
-edje_container.h \
 edje_message_queue.c \
-edje_private.h \
 edje_cache.c \
 edje_match.c \
 edje_textblock_styles.c \
 edje_edit.c \
 edje_script_only.c \
-edje_entry.c
+edje_lua_script_only.c \
+edje_entry.c \
+edje_external.c \
+edje_module.c
 
-libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ -lm
+if EDJE_AMALGAMATION
+nodist_libedje_la_SOURCES = edje_amalgamation.c
+
+edje_amalgamation.c: $(base_sources) Makefile
+	-rm -f edje_amalgamation.c
+
+	@echo "#ifdef HAVE_CONFIG_H" >> edje_amalgamation.c
+	@echo "# include \"config.h\"" >> edje_amalgamation.c
+	@echo "#endif" >> edje_amalgamation.c
+
+	@echo "#ifndef _WIN32" >> eina_amalgamation.c
+	@echo "#define _GNU_SOURCE" >> eina_amalgamation.c
+	@echo "#endif" >> eina_amalgamation.c
+
+	@echo "#ifdef HAVE_ALLOCA_H" >> edje_amalgamation.c
+	@echo "# include <alloca.h>" >> edje_amalgamation.c
+	@echo "#elif defined __GNUC__" >> edje_amalgamation.c
+	@echo "# define alloca __builtin_alloca" >> edje_amalgamation.c
+	@echo "#elif defined _AIX" >> edje_amalgamation.c
+	@echo "# define alloca __alloca" >> edje_amalgamation.c
+	@echo "#elif defined _MSC_VER" >> edje_amalgamation.c
+	@echo "# include <malloc.h>" >> edje_amalgamation.c
+	@echo "# define alloca _alloca" >> edje_amalgamation.c
+	@echo "#else" >> edje_amalgamation.c
+	@echo "# include <stddef.h>" >> edje_amalgamation.c
+	@echo "# ifdef __cplusplus" >> edje_amalgamation.c
+	@echo "#extern \"C\"" >> edje_amalgamation.c
+	@echo "# endif" >> edje_amalgamation.c
+	@echo "#void *alloca (size_t);" >> edje_amalgamation.c
+	@echo "#endif" >> edje_amalgamation.c
+
+	@echo "#include <string.h>" >> edje_amalgamation.c
+	@echo "#include <math.h>" >> edje_amalgamation.c
+	@echo "#include <time.h>" >> edje_amalgamation.c
+	@echo "#include <limits.h>" >> edje_amalgamation.c
+	@echo "#include <errno.h>" >> edje_amalgamation.c
+	@echo "#include <sys/stat.h>" >> edje_amalgamation.c
+
+	@echo "#ifndef _MSC_VER" >> edje_amalgamation.c
+	@echo "# include <unistd.h>" >> edje_amalgamation.c
+	@echo "#endif" >> edje_amalgamation.c
+
+	@echo "#ifdef HAVE_LOCALE_H" >> edje_amalgamation.c
+	@echo "# include <locale.h>" >> edje_amalgamation.c
+	@echo "#endif" >> edje_amalgamation.c
+
+	@echo "#include <lua.h>" >> edje_amalgamation.c
+	@echo "#include <lauxlib.h>" >> edje_amalgamation.c
+
+	@echo "#ifdef HAVE_EVIL" >> edje_amalgamation.c
+	@echo "# include <Evil.h>" >> edje_amalgamation.c
+	@echo "#endif" >> edje_amalgamation.c
+
+	@echo "#include <Eina.h>" >> edje_amalgamation.c
+	@echo "#include <Edje.h>" >> edje_amalgamation.c
+	@echo "#include <Evas.h>" >> edje_amalgamation.c
+	@echo "#include <Ecore.h>" >> edje_amalgamation.c
+	@echo "#include <Ecore_Str.h>" >> edje_amalgamation.c
+	@echo "#include <Ecore_Job.h>" >> edje_amalgamation.c
+	@echo "#include <Embryo.h>" >> edje_amalgamation.c
+
+	@echo "#ifdef HAVE_ECORE_IMF" >> edje_amalgamation.c
+	@echo "# include <Ecore_IMF.h>" >> edje_amalgamation.c
+	@echo "#endif" >> edje_amalgamation.c
+
+	@echo "#include <edje_private.h>" >> edje_amalgamation.c
+
+	@for f in $(base_sources); do \
+	   if [ `expr substr $$f 1 1` != '/' ]; then \
+		  file="$(srcdir)/$$f" ; \
+	   else \
+		  file="$$f" ; \
+	   fi ; \
+	   echo "/* file: $$file */" >> edje_amalgamation.c; \
+	   grep -v -e '^# *include \+.\(config\|\|Evil\|Eina\|Eet\|Evas\|Ecore\|Ecore_Str\|Ecore_Job\|Embryo\|Ecore_IMF\|string\|math\|limits\|sys/stat\|errno\|time\|unistd\|locale\|lua\|lauxlib\|edje_private\)[.]h.*' $$file >> edje_amalgamation.c; \
+	done
+	@echo "edje_amalgamation.c generated"
+
+else
+libedje_la_SOURCES = $(base_sources)
+endif
+
+libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ @EVIL_LIBS@ -lm
 libedje_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+
+EXTRA_DIST = edje_private.h edje_container.h
+
+clean-local:
+	@rm -rf  edje_amalgamation.c
diff --git a/src/lib/Makefile.in b/src/lib/Makefile.in
index 496f3dd..a6af554 100644
--- a/src/lib/Makefile.in
+++ b/src/lib/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -57,13 +57,26 @@ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
 libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 libedje_la_DEPENDENCIES =
-am_libedje_la_OBJECTS = edje_calc.lo edje_callbacks.lo edje_data.lo \
-	edje_embryo.lo edje_load.lo edje_main.lo edje_misc.lo \
-	edje_program.lo edje_smart.lo edje_text.lo edje_util.lo \
-	edje_var.lo edje_container.lo edje_message_queue.lo \
-	edje_cache.lo edje_match.lo edje_textblock_styles.lo \
-	edje_edit.lo edje_script_only.lo edje_entry.lo
-libedje_la_OBJECTS = $(am_libedje_la_OBJECTS)
+am__libedje_la_SOURCES_DIST = edje_calc.c edje_callbacks.c edje_data.c \
+	edje_embryo.c edje_lua.c edje_load.c edje_main.c edje_misc.c \
+	edje_program.c edje_smart.c edje_text.c edje_util.c edje_var.c \
+	edje_container.c edje_message_queue.c edje_cache.c \
+	edje_match.c edje_textblock_styles.c edje_edit.c \
+	edje_script_only.c edje_lua_script_only.c edje_entry.c \
+	edje_external.c edje_module.c
+am__objects_1 = edje_calc.lo edje_callbacks.lo edje_data.lo \
+	edje_embryo.lo edje_lua.lo edje_load.lo edje_main.lo \
+	edje_misc.lo edje_program.lo edje_smart.lo edje_text.lo \
+	edje_util.lo edje_var.lo edje_container.lo \
+	edje_message_queue.lo edje_cache.lo edje_match.lo \
+	edje_textblock_styles.lo edje_edit.lo edje_script_only.lo \
+	edje_lua_script_only.lo edje_entry.lo edje_external.lo \
+	edje_module.lo
+ at EDJE_AMALGAMATION_FALSE@am_libedje_la_OBJECTS = $(am__objects_1)
+ at EDJE_AMALGAMATION_TRUE@nodist_libedje_la_OBJECTS =  \
+ at EDJE_AMALGAMATION_TRUE@	edje_amalgamation.lo
+libedje_la_OBJECTS = $(am_libedje_la_OBJECTS) \
+	$(nodist_libedje_la_OBJECTS)
 libedje_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(libedje_la_LDFLAGS) $(LDFLAGS) -o $@
@@ -79,8 +92,8 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
 	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
-SOURCES = $(libedje_la_SOURCES)
-DIST_SOURCES = $(libedje_la_SOURCES)
+SOURCES = $(libedje_la_SOURCES) $(nodist_libedje_la_SOURCES)
+DIST_SOURCES = $(am__libedje_la_SOURCES_DIST)
 includeHEADERS_INSTALL = $(INSTALL_HEADER)
 HEADERS = $(include_HEADERS)
 ETAGS = etags
@@ -140,6 +153,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -211,6 +226,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -225,6 +241,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -245,11 +262,12 @@ AM_CPPFLAGS = \
 
 lib_LTLIBRARIES = libedje.la
 include_HEADERS = Edje.h Edje_Edit.h
-libedje_la_SOURCES = \
+base_sources = \
 edje_calc.c \
 edje_callbacks.c \
 edje_data.c \
 edje_embryo.c \
+edje_lua.c \
 edje_load.c \
 edje_main.c \
 edje_misc.c \
@@ -259,18 +277,22 @@ edje_text.c \
 edje_util.c \
 edje_var.c \
 edje_container.c \
-edje_container.h \
 edje_message_queue.c \
-edje_private.h \
 edje_cache.c \
 edje_match.c \
 edje_textblock_styles.c \
 edje_edit.c \
 edje_script_only.c \
-edje_entry.c
-
-libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ -lm
+edje_lua_script_only.c \
+edje_entry.c \
+edje_external.c \
+edje_module.c
+
+ at EDJE_AMALGAMATION_TRUE@nodist_libedje_la_SOURCES = edje_amalgamation.c
+ at EDJE_AMALGAMATION_FALSE@libedje_la_SOURCES = $(base_sources)
+libedje_la_LIBADD = @EDJE_LIBS@ @ECORE_IMF_LIBS@ @EVIL_LIBS@ -lm
 libedje_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@
+EXTRA_DIST = edje_private.h edje_container.h
 all: all-am
 
 .SUFFIXES:
@@ -279,8 +301,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \
@@ -340,6 +362,7 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_amalgamation.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_cache.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_calc.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_callbacks.Plo at am__quote@
@@ -348,11 +371,15 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_edit.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_embryo.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_entry.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_external.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_load.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_lua.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_lua_script_only.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_main.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_match.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_message_queue.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_misc.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_module.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_program.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_script_only.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/edje_smart.Plo at am__quote@
@@ -410,7 +437,7 @@ ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
 	unique=`for i in $$list; do \
 	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
 	  done | \
-	  $(AWK) '{ files[$$0] = 1; nonemtpy = 1; } \
+	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \
 	      END { if (nonempty) { for (i in files) print i; }; }'`; \
 	mkid -fID $$unique
 tags: TAGS
@@ -512,7 +539,7 @@ maintainer-clean-generic:
 	-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
 clean: clean-am
 
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool clean-local \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -572,7 +599,7 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 .MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
-	clean-libLTLIBRARIES clean-libtool ctags distclean \
+	clean-libLTLIBRARIES clean-libtool clean-local ctags distclean \
 	distclean-compile distclean-generic distclean-libtool \
 	distclean-tags distdir dvi dvi-am html html-am info info-am \
 	install install-am install-data install-data-am install-dvi \
@@ -586,6 +613,84 @@ uninstall-am: uninstall-includeHEADERS uninstall-libLTLIBRARIES
 	tags uninstall uninstall-am uninstall-includeHEADERS \
 	uninstall-libLTLIBRARIES
 
+
+ at EDJE_AMALGAMATION_TRUE@edje_amalgamation.c: $(base_sources) Makefile
+ at EDJE_AMALGAMATION_TRUE@	-rm -f edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifdef HAVE_CONFIG_H" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include \"config.h\"" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifndef _WIN32" >> eina_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#define _GNU_SOURCE" >> eina_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> eina_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifdef HAVE_ALLOCA_H" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <alloca.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#elif defined __GNUC__" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# define alloca __builtin_alloca" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#elif defined _AIX" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# define alloca __alloca" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#elif defined _MSC_VER" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <malloc.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# define alloca _alloca" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#else" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <stddef.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# ifdef __cplusplus" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#extern \"C\"" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# endif" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#void *alloca (size_t);" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <string.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <math.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <time.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <limits.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <errno.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <sys/stat.h>" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifndef _MSC_VER" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <unistd.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifdef HAVE_LOCALE_H" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <locale.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <lua.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <lauxlib.h>" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifdef HAVE_EVIL" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <Evil.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Eina.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Edje.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Evas.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Ecore.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Ecore_Str.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Ecore_Job.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <Embryo.h>" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#ifdef HAVE_ECORE_IMF" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "# include <Ecore_IMF.h>" >> edje_amalgamation.c
+ at EDJE_AMALGAMATION_TRUE@	@echo "#endif" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@echo "#include <edje_private.h>" >> edje_amalgamation.c
+
+ at EDJE_AMALGAMATION_TRUE@	@for f in $(base_sources); do \
+ at EDJE_AMALGAMATION_TRUE@	   if [ `expr substr $$f 1 1` != '/' ]; then \
+ at EDJE_AMALGAMATION_TRUE@		  file="$(srcdir)/$$f" ; \
+ at EDJE_AMALGAMATION_TRUE@	   else \
+ at EDJE_AMALGAMATION_TRUE@		  file="$$f" ; \
+ at EDJE_AMALGAMATION_TRUE@	   fi ; \
+ at EDJE_AMALGAMATION_TRUE@	   echo "/* file: $$file */" >> edje_amalgamation.c; \
+ at EDJE_AMALGAMATION_TRUE@	   grep -v -e '^# *include \+.\(config\|\|Evil\|Eina\|Eet\|Evas\|Ecore\|Ecore_Str\|Ecore_Job\|Embryo\|Ecore_IMF\|string\|math\|limits\|sys/stat\|errno\|time\|unistd\|locale\|lua\|lauxlib\|edje_private\)[.]h.*' $$file >> edje_amalgamation.c; \
+ at EDJE_AMALGAMATION_TRUE@	done
+ at EDJE_AMALGAMATION_TRUE@	@echo "edje_amalgamation.c generated"
+
+clean-local:
+	@rm -rf  edje_amalgamation.c
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/lib/edje_cache.c b/src/lib/edje_cache.c
index c505502..f235465 100644
--- a/src/lib/edje_cache.c
+++ b/src/lib/edje_cache.c
@@ -1,14 +1,30 @@
 /*
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
+/* EDJE - EFL graphical design and layout library based on Evas
+ * Copyright (C) 2008 Cedric Bail
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library;
+ * if not, see <http://www.gnu.org/licenses/>.
+ */
+
+
 
 #ifdef HAVE_CONFIG_H
 # include <config.h>
 #endif
 
-#include <string.h>
-#include <sys/stat.h>
-
 #ifdef HAVE_ALLOCA_H
 # include <alloca.h>
 #elif defined __GNUC__
@@ -26,8 +42,16 @@ extern "C"
 void *alloca (size_t);
 #endif
 
+#include <string.h>
+#include <sys/stat.h>
+
 #include "edje_private.h"
 
+
+/**
+ * @cond
+ */
+
 static Eina_Hash   *_edje_file_hash = NULL;
 static int          _edje_file_cache_size = 16;
 static Eina_List   *_edje_file_cache = NULL;
@@ -67,6 +91,29 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
 	free(data);
      }
 
+   snprintf(buf, sizeof(buf), "lua_scripts/%i", id);
+   data = eet_read(edf->ef, buf, &size);
+
+   if (data)
+     {
+	int err_code;
+
+	//printf("lua chunk size: %d\n", size);
+	edc->L = _edje_lua_new_thread(_edje_lua_state_get()); // gets freed in 'edje_load::_edje_collection_free'
+	_edje_lua_new_reg(edc->L, -1, edc); // gets freed in 'edje_load::_edje_collectoin_free'
+
+	if ((err_code = luaL_loadbuffer(edc->L, data, size, "edje_lua_script")))
+	  {
+	     if (err_code == LUA_ERRSYNTAX)
+	       printf("lua load syntax error: %s\n", lua_tostring(edc->L, -1));
+	     else if (err_code == LUA_ERRMEM)
+	       printf("lua load memory allocation error: %s\n", lua_tostring(edc->L, -1));
+	  }
+	if (lua_pcall(edc->L, 0, 0, 0))
+	  printf("lua call error: %s\n", lua_tostring(edc->L, -1));
+	free(data);
+     }
+   
    edc->part = eina_stringshare_add(coll);
    edc->references = 1;
    if (!edf->collection_hash)
@@ -415,8 +462,41 @@ _edje_file_cache_shutdown(void)
 
 
 
+/**
+ * @endcond
+ */
 
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Edje_cache_Group Cache
+ *
+ * @brief These functions provide an abstraction layer between the
+ * application code and the interface, while allowing extremely
+ * flexible dynamic layouts and animations.
+ *
+ * @{
+ */
 
+/**
+ * @brief Set the file cache size.
+ *
+ * @param count The file cache size in edje file units. Default is 16.
+ *
+ * This function sets the file cache size. Edje keeps this cache in
+ * order to prevent duplicates of edje file entries in memory. The
+ * file cache size can be retrieved with edje_file_cache_get().
+ *
+ * @see edje_file_cache_get()
+ * @see edje_file_cache_flush()
+ *
+ */
 
 EAPI void
 edje_file_cache_set(int count)
@@ -426,12 +506,38 @@ edje_file_cache_set(int count)
    _edje_cache_file_clean();
 }
 
+/**
+ * @brief Return the file cache size.
+ *
+ * @return The file cache size in edje file units. Default is 16.
+ *
+ * This function returns the file cache size set by
+ * edje_file_cache_set().
+ *
+ * @see edje_file_cache_set()
+ * @see edje_file_cache_flush()
+ *
+ */
+
 EAPI int
 edje_file_cache_get(void)
 {
    return _edje_file_cache_size;
 }
 
+/**
+ * @brief Clean the file cache.
+ *
+ * @return The file cache size.
+ *
+ * This function cleans the file cache entries, but keeps this cache's
+ * size to the last value set.
+ *
+ * @see edje_file_cache_set()
+ * @see edje_file_cache_get()
+ *
+ */
+
 EAPI void
 edje_file_cache_flush(void)
 {
@@ -443,6 +549,21 @@ edje_file_cache_flush(void)
    _edje_file_cache_size = ps;
 }
 
+/**
+ * @brief Set the collection cache size.
+ *
+ * @param count The collection cache size, in edje object units. Default is 16.
+ *
+ * This function sets the collection cache size. Edje keeps this cache
+ * in order to prevent duplicates of edje {collection,group,part}
+ * entries in memory. The collection cache size can be retrieved with
+ * edje_collection_cache_get().
+ *
+ * @see edje_collection_cache_get()
+ * @see edje_collection_cache_flush()
+ *
+ */
+
 EAPI void
 edje_collection_cache_set(int count)
 {
@@ -456,12 +577,38 @@ edje_collection_cache_set(int count)
    /* FIXME: freach in file hash too! */
 }
 
+/**
+ * @brief Return the collection cache size.
+ *
+ * @return The collection cache size, in edje object units. Default is 16.
+ *
+ * This function returns the collection cache size set by
+ * edje_collection_cache_set().
+ *
+ * @see edje_collection_cache_set()
+ * @see edje_collection_cache_flush()
+ *
+ */
+
 EAPI int
 edje_collection_cache_get(void)
 {
    return _edje_collection_cache_size;
 }
 
+/**
+ * @brief Clean the collection cache.
+ *
+ * @return The collection cache size.
+ *
+ * This function cleans the collection cache, but keeps this cache's
+ * size to the last value set.
+ *
+ * @see edje_collection_cache_set()
+ * @see edje_collection_cache_get()
+ *
+ */
+
 EAPI void
 edje_collection_cache_flush(void)
 {
@@ -476,3 +623,8 @@ edje_collection_cache_flush(void)
    /* FIXME: freach in file hash too! */
    _edje_collection_cache_size = ps;
 }
+
+/**
+ *
+ * @}
+ */
diff --git a/src/lib/edje_calc.c b/src/lib/edje_calc.c
index ff965bb..d32e89a 100644
--- a/src/lib/edje_calc.c
+++ b/src/lib/edje_calc.c
@@ -46,10 +46,13 @@ _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos)
    ep->description_pos = npos;
 
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ep->invalidate = 1;
+#endif
 }
 
 Edje_Part_Description *
-_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
+_edje_part_description_find(Edje *ed __UNUSED__, Edje_Real_Part *rp, const char *name,
                             double val)
 {
    Edje_Part *ep = rp->part;
@@ -62,7 +65,7 @@ _edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
      return ep->default_desc;
 
    if (!strcmp(name, "custom"))
-     return rp->custom.description;
+     return rp->custom ? rp->custom->description : NULL;
 
    if (!strcmp(name, "default"))
      {
@@ -90,14 +93,38 @@ _edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name,
 void
 _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, double v1, const char *d2, double v2)
 {
+   Edje_Part_Description *epd1;
+   Edje_Part_Description *epd2;
+
    if (!d1) d1 = "default";
    if (!d2) d2 = "default";
 
-   ep->param1.description = _edje_part_description_find(ed, ep, d1, v1);
-   if (!ep->param1.description)
-     ep->param1.description = ep->part->default_desc; /* never NULL */
+   epd1 = _edje_part_description_find(ed, ep, d1, v1);
+   if (!epd1)
+     epd1 = ep->part->default_desc; /* never NULL */
+
+   epd2 = _edje_part_description_find(ed, ep, d2, v2);
+
+   /* There is an animation if both description are different or if description is an image with tweens */
+   if (epd2 != NULL && (epd1 != epd2 || (ep->part->type == EDJE_PART_TYPE_IMAGE && epd2->image.tween_list)))
+     {
+	if (!ep->param2)
+	  ep->param2 = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
+	else if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
+	  _edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params);
+	ep->param2->external_params = NULL;
+     }
+   else
+     if (ep->param2)
+       {
+	  if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
+	    _edje_external_parsed_params_free(ep->swallowed_object, ep->param2->external_params);
+	  eina_mempool_free(_edje_real_part_state_mp, ep->param2);
+	  ep->param2 = NULL;
+       }
 
-   ep->param2.description = _edje_part_description_find(ed, ep, d2, v2);
+   ep->param1.description = epd1;
+   ep->chosen_description = epd1;
 
    ep->param1.rel1_to_x = ep->param1.rel1_to_y = NULL;
    ep->param1.rel2_to_x = ep->param1.rel2_to_y = NULL;
@@ -111,27 +138,43 @@ _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char *d1, doubl
    if (ep->param1.description->rel2.id_y >= 0)
      ep->param1.rel2_to_y = ed->table_parts[ep->param1.description->rel2.id_y % ed->table_parts_size];
 
-   ep->param2.rel1_to_x = ep->param2.rel1_to_y = NULL;
-   ep->param2.rel2_to_x = ep->param2.rel2_to_y = NULL;
-
-   if (ep->param2.description)
+   if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
      {
-	if (ep->param2.description->rel1.id_x >= 0)
-	  ep->param2.rel1_to_x = ed->table_parts[ep->param2.description->rel1.id_x % ed->table_parts_size];
-	if (ep->param2.description->rel1.id_y >= 0)
-	  ep->param2.rel1_to_y = ed->table_parts[ep->param2.description->rel1.id_y % ed->table_parts_size];
-	if (ep->param2.description->rel2.id_x >= 0)
-	  ep->param2.rel2_to_x = ed->table_parts[ep->param2.description->rel2.id_x % ed->table_parts_size];
-	if (ep->param2.description->rel2.id_y >= 0)
-	  ep->param2.rel2_to_y = ed->table_parts[ep->param2.description->rel2.id_y % ed->table_parts_size];
+	if (ep->param1.external_params)
+	  _edje_external_parsed_params_free(ep->swallowed_object, ep->param1.external_params);
+	ep->param1.external_params = _edje_external_params_parse(ep->swallowed_object, ep->param1.description->external_params);
      }
 
-   if (ep->description_pos == 0.0)
-     ep->chosen_description = ep->param1.description;
-   else
-     ep->chosen_description = ep->param2.description;
+   if (ep->param2)
+     {
+	ep->param2->description = epd2;
+
+	ep->param2->rel1_to_x = ep->param2->rel1_to_y = NULL;
+	ep->param2->rel2_to_x = ep->param2->rel2_to_y = NULL;
+
+	if (ep->param2->description)
+	  {
+	     if (ep->param2->description->rel1.id_x >= 0)
+	       ep->param2->rel1_to_x = ed->table_parts[ep->param2->description->rel1.id_x % ed->table_parts_size];
+	     if (ep->param2->description->rel1.id_y >= 0)
+	       ep->param2->rel1_to_y = ed->table_parts[ep->param2->description->rel1.id_y % ed->table_parts_size];
+	     if (ep->param2->description->rel2.id_x >= 0)
+	       ep->param2->rel2_to_x = ed->table_parts[ep->param2->description->rel2.id_x % ed->table_parts_size];
+	     if (ep->param2->description->rel2.id_y >= 0)
+	       ep->param2->rel2_to_y = ed->table_parts[ep->param2->description->rel2.id_y % ed->table_parts_size];
+
+	     if (ep->part->type == EDJE_PART_TYPE_EXTERNAL)
+	       ep->param2->external_params = _edje_external_params_parse(ep->swallowed_object, ep->param2->description->external_params);
+	  }
+
+	if (ep->description_pos != 0.0)
+	  ep->chosen_description = epd2;
+     }
 
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ep->invalidate = 1;
+#endif
 }
 
 void
@@ -163,6 +206,7 @@ _edje_recalc_do(Edje *ed)
 	return;
      }
    ed->dirty = 0;
+   ed->state++;
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *ep;
@@ -180,14 +224,18 @@ _edje_recalc_do(Edje *ed)
 	  _edje_part_recalc(ed, ep, (~ep->calculated) & FLAG_XY);
      }
    if (!ed->calc_only) ed->recalc = 0;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 0;
+   ed->text_part_change = 0;
+#endif
 }
 
 int
 _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y)
 {
-   if ((ep->part->dragable.x != 0) || (ep->part->dragable.y != 0))
+   if (ep->drag)
      {
-	if (ep->confine_to)
+	if (ep->drag->confine_to)
 	  {
 	     double dx, dy, dw, dh;
 	     int ret = 0;
@@ -197,13 +245,13 @@ _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y)
 	     else if (ep->part->dragable.x != 0) ret = 1;
 	     else if (ep->part->dragable.y != 0) ret = 2;
 
-	     dx = ep->x - ep->confine_to->x;
-	     dw = ep->confine_to->w - ep->w;
+	     dx = ep->x - ep->drag->confine_to->x;
+	     dw = ep->drag->confine_to->w - ep->w;
 	     if (dw != 0.0) dx /= dw;
 	     else dx = 0.0;
 
-	     dy = ep->y - ep->confine_to->y;
-	     dh = ep->confine_to->h - ep->h;
+	     dy = ep->y - ep->drag->confine_to->y;
+	     dh = ep->drag->confine_to->h - ep->h;
 	     if (dh != 0) dy /= dh;
 	     else dy = 0.0;
 
@@ -214,8 +262,8 @@ _edje_part_dragable_calc(Edje *ed, Edje_Real_Part *ep, double *x, double *y)
 	  }
 	else
 	  {
-	     if (x) *x = (double)(ep->drag.tmp.x + ep->drag.x);
-	     if (y) *y = (double)(ep->drag.tmp.y + ep->drag.y);
+	     if (x) *x = (double)(ep->drag->tmp.x + ep->drag->x);
+	     if (y) *y = (double)(ep->drag->tmp.y + ep->drag->y);
 	     return 0;
 	  }
      }
@@ -229,354 +277,278 @@ void
 _edje_dragable_pos_set(Edje *ed, Edje_Real_Part *ep, double x, double y)
 {
    /* check whether this part is dragable at all */
-   if (!ep->part->dragable.x && !ep->part->dragable.y) return;
+   if (!ep->drag) return ;
 
    /* instead of checking for equality, we really should check that
     * the difference is greater than foo, but I have no idea what
     * value we would set foo to, because it would depend on the
     * size of the dragable...
     */
-   if (ep->drag.x != x || ep->drag.tmp.x)
+   if (ep->drag->x != x || ep->drag->tmp.x)
      {
-	ep->drag.x = x;
-	ep->drag.tmp.x = 0;
-	ep->drag.need_reset = 0;
+	ep->drag->x = x;
+	ep->drag->tmp.x = 0;
+	ep->drag->need_reset = 0;
 	ed->dirty = 1;
      }
 
-   if (ep->drag.y != y || ep->drag.tmp.y)
+   if (ep->drag->y != y || ep->drag->tmp.y)
      {
-	ep->drag.y = y;
-	ep->drag.tmp.y = 0;
-	ep->drag.need_reset = 0;
+	ep->drag->y = y;
+	ep->drag->tmp.y = 0;
+	ep->drag->need_reset = 0;
 	ed->dirty = 1;
      }
 
+#ifdef EDJE_CALC_CACHE
+   ep->invalidate = 1;
+#endif
    _edje_recalc(ed); /* won't do anything if dirty flag isn't set */
 }
 
 static void
-_edje_part_recalc_single(Edje *ed,
-			 Edje_Real_Part *ep,
-			 Edje_Part_Description *desc,
-			 Edje_Part_Description *chosen_desc,
-			 Edje_Real_Part *rel1_to_x,
-			 Edje_Real_Part *rel1_to_y,
-			 Edje_Real_Part *rel2_to_x,
-			 Edje_Real_Part *rel2_to_y,
-			 Edje_Real_Part *confine_to,
-			 Edje_Calc_Params *params,
-			 int flags)
+_edje_part_recalc_single_rel(Edje *ed,
+			     Edje_Real_Part *ep __UNUSED__,
+			     Edje_Part_Description *desc,
+			     Edje_Real_Part *rel1_to_x,
+			     Edje_Real_Part *rel1_to_y,
+			     Edje_Real_Part *rel2_to_x,
+			     Edje_Real_Part *rel2_to_y,
+			     Edje_Calc_Params *params,
+			     int flags)
 {
-   int minw = 0, minh = 0, maxw = 0, maxh = 0;
-   double sc;
-
-   flags = FLAG_XY;
-
-   sc = ed->scale;
-   if (sc == 0.0) sc = _edje_scale;
-//   if (flags & FLAG_X)
-     {
-	minw = desc->min.w;
-	if (ep->part->scale) minw = (int)(((double)minw) * sc);
-	if (ep->swallow_params.min.w > desc->min.w)
-	  minw = ep->swallow_params.min.w;
-
-	/* XXX TODO: remove need of EDJE_INF_MAX_W, see edje_util.c */
-	if ((ep->swallow_params.max.w <= 0) ||
-	    (ep->swallow_params.max.w == EDJE_INF_MAX_W))
-	  {
-	     maxw = desc->max.w;
-	     if (maxw > 0)
-	       {
-		  if (ep->part->scale) maxw = (int)(((double)maxw) * sc);
-		  if (maxw < 1) maxw = 1;
-	       }
-	  }
-	else
-	  {
-	     if (desc->max.w <= 0)
-	       maxw = ep->swallow_params.max.w;
-	     else
-	       {
-		  maxw = desc->max.w;
-		  if (maxw > 0)
-		    {
-		       if (ep->part->scale) maxw = (int)(((double)maxw) * sc);
-		       if (maxw < 1) maxw = 1;
-		    }
-		  if (ep->swallow_params.max.w < maxw)
-		    maxw = ep->swallow_params.max.w;
-	       }
-	  }
-	if (maxw >= 0)
-	  {
-	     if (maxw < minw) maxw = minw;
-	  }
-     }
-//   if (flags & FLAG_Y)
-     {
-	minh = desc->min.h;
-	if (ep->part->scale) minh = (int)(((double)minh) * sc);
-	if (ep->swallow_params.min.h > desc->min.h)
-	  minh = ep->swallow_params.min.h;
-
-	/* XXX TODO: remove need of EDJE_INF_MAX_H, see edje_util.c */
-	if ((ep->swallow_params.max.h <= 0) ||
-	    (ep->swallow_params.max.h == EDJE_INF_MAX_H))
-	  {
-	     maxh = desc->max.h;
-	     if (maxh > 0)
-	       {
-		  if (ep->part->scale) maxh = (int)(((double)maxh) * sc);
-		  if (maxh < 1) maxh = 1;
-	       }
-	  }
-	else
-	  {
-	     if (desc->max.h <= 0)
-	       maxh = ep->swallow_params.max.h;
-	     else
-	       {
-		  maxh = desc->max.h;
-		  if (maxh > 0)
-		    {
-		       if (ep->part->scale) maxh = (int)(((double)maxh) * sc);
-		       if (maxh < 1) maxh = 1;
-		    }
-		  if (ep->swallow_params.max.h < maxh)
-		    maxh = ep->swallow_params.max.h;
-	       }
-	  }
-	if (maxh >= 0)
-	  {
-	     if (maxh < minh) maxh = minh;
-	  }
-     }
-   /* relative coords of top left & bottom right */
    if (flags & FLAG_X)
      {
 	if (rel1_to_x)
 	  params->x = desc->rel1.offset_x +
-	  rel1_to_x->x + (desc->rel1.relative_x * rel1_to_x->w);
+	    rel1_to_x->x + (desc->rel1.relative_x * rel1_to_x->w);
 	else
 	  params->x = desc->rel1.offset_x +
-	  (desc->rel1.relative_x * ed->w);
+	    (desc->rel1.relative_x * ed->w);
 	if (rel2_to_x)
 	  params->w = desc->rel2.offset_x +
-	  rel2_to_x->x + (desc->rel2.relative_x * rel2_to_x->w) -
-	  params->x + 1;
+	    rel2_to_x->x + (desc->rel2.relative_x * rel2_to_x->w) -
+	    params->x + 1;
 	else
 	  params->w = desc->rel2.offset_x +
-	  (desc->rel2.relative_x * ed->w) -
-	  params->x + 1;
+	    (desc->rel2.relative_x * ed->w) -
+	    params->x + 1;
      }
    if (flags & FLAG_Y)
      {
 	if (rel1_to_y)
 	  params->y = desc->rel1.offset_y +
-	  rel1_to_y->y + (desc->rel1.relative_y * rel1_to_y->h);
+	    rel1_to_y->y + (desc->rel1.relative_y * rel1_to_y->h);
 	else
 	  params->y = desc->rel1.offset_y +
-	  (desc->rel1.relative_y * ed->h);
+	    (desc->rel1.relative_y * ed->h);
 	if (rel2_to_y)
 	  params->h = desc->rel2.offset_y +
-	  rel2_to_y->y + (desc->rel2.relative_y * rel2_to_y->h) -
+	    rel2_to_y->y + (desc->rel2.relative_y * rel2_to_y->h) -
 	  params->y + 1;
 	else
 	  params->h = desc->rel2.offset_y +
-	  (desc->rel2.relative_y * ed->h) -
-	  params->y + 1;
+	    (desc->rel2.relative_y * ed->h) -
+	    params->y + 1;
      }
+}
 
-   /* aspect */
-   if (((flags | ep->calculated) & FLAG_XY) == FLAG_XY)
+static void
+_edje_part_recalc_single_aspect(Edje_Real_Part *ep,
+				Edje_Part_Description *desc,
+				Edje_Calc_Params *params,
+				int *minw, int *minh,
+				int *maxw, int *maxh)
+{
+   int apref = -10;
+   double aspect, amax, amin;
+   double new_w = 0, new_h = 0, want_x, want_y, want_w, want_h;
+
+   if (params->h <= 0) aspect = 999999.0;
+   else aspect = (double)params->w / (double)params->h;
+   amax = desc->aspect.max;
+   amin = desc->aspect.min;
+   if ((ep->swallow_params.aspect.w > 0) &&
+       (ep->swallow_params.aspect.h > 0))
+     amin = amax =
+       (double)ep->swallow_params.aspect.w /
+       (double)ep->swallow_params.aspect.h;
+   want_x = params->x;
+   want_w = new_w = params->w;
+
+   want_y = params->y;
+   want_h = new_h = params->h;
+
+   if ((amin > 0.0) && (amax > 0.0))
+     {
+	apref = desc->aspect.prefer;
+	if (ep->swallow_params.aspect.mode > EDJE_ASPECT_CONTROL_NONE)
+	  {
+	     switch (ep->swallow_params.aspect.mode)
+	       {
+		case EDJE_ASPECT_CONTROL_NEITHER:
+		   apref = EDJE_ASPECT_PREFER_NONE;
+		   break;
+		case EDJE_ASPECT_CONTROL_HORIZONTAL:
+		   apref = EDJE_ASPECT_PREFER_HORIZONTAL;
+		   break;
+		case EDJE_ASPECT_CONTROL_VERTICAL:
+		   apref = EDJE_ASPECT_PREFER_VERTICAL;
+		   break;
+		case EDJE_ASPECT_CONTROL_BOTH:
+		   apref = EDJE_ASPECT_PREFER_BOTH;
+		   break;
+		default:
+		   break;
+	       }
+	  }
+	switch (apref)
+	  {
+	   case EDJE_ASPECT_PREFER_NONE:
+	      /* keep both dimensions in check */
+	      /* adjust for min aspect (width / height) */
+	      if ((amin > 0.0) && (aspect < amin))
+		{
+		   new_h = (params->w / amin);
+		   new_w = (params->h * amin);
+		}
+	      /* adjust for max aspect (width / height) */
+	      if ((amax > 0.0) && (aspect > amax))
+		{
+		   new_h = (params->w / amax);
+		   new_w = (params->h * amax);
+		}
+	      if ((amax > 0.0) && (new_w < params->w))
+		{
+		   new_w = params->w;
+		   new_h = params->w / amax;
+		}
+	      if ((amax > 0.0) && (new_h < params->h))
+		{
+		   new_w = params->h * amax;
+		   new_h = params->h;
+		}
+	      break;
+	      /* prefer vertical size as determiner */
+	   case  EDJE_ASPECT_PREFER_VERTICAL:
+	      /* keep both dimensions in check */
+	      /* adjust for max aspect (width / height) */
+	      if ((amax > 0.0) && (aspect > amax))
+		new_w = (params->h * amax);
+	      /* adjust for min aspect (width / height) */
+	      if ((amin > 0.0) && (aspect < amin))
+		new_w = (params->h * amin);
+	      break;
+	      /* prefer horizontal size as determiner */
+	   case EDJE_ASPECT_PREFER_HORIZONTAL:
+	      /* keep both dimensions in check */
+	      /* adjust for max aspect (width / height) */
+	      if ((amax > 0.0) && (aspect > amax))
+		new_h = (params->w / amax);
+	      /* adjust for min aspect (width / height) */
+	      if ((amin > 0.0) && (aspect < amin))
+		new_h = (params->w / amin);
+	      break;
+	   case EDJE_ASPECT_PREFER_BOTH:
+	      /* keep both dimensions in check */
+	      /* adjust for max aspect (width / height) */
+	      if ((amax > 0.0) && (aspect > amax))
+		{
+		   new_w = (params->h * amax);
+		   new_h = (params->w / amax);
+		}
+	      /* adjust for min aspect (width / height) */
+	      if ((amin > 0.0) && (aspect < amin))
+		{
+		   new_w = (params->h * amin);
+		   new_h = (params->w / amin);
+		}
+	      break;
+	   default:
+	      break;
+	  }
+
+	if (!((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE)))
+	  {
+	     if ((*maxw >= 0) && (new_w > *maxw)) new_w = *maxw;
+	     if (new_w < *minw) new_w = *minw;
+
+	     if ((*maxh >= 0) && (new_h > *maxh)) new_h = *maxh;
+	     if (new_h < *minh) new_h = *minh;
+	  }
+
+	/* do real adjustment */
+	if (apref == EDJE_ASPECT_PREFER_BOTH)
+	  {
+	     if (amin == 0.0) amin = amax;
+	     if (amin != 0.0)
+	       {
+		  /* fix h and vary w */
+		  if (new_w > params->w)
+		    {
+		       //		  params->w = new_w;
+		       // EXCEEDS BOUNDS in W
+		       new_h = (params->w / amin);
+		       new_w = params->w;
+		       if (new_h > params->h)
+			 {
+			    new_h = params->h;
+			    new_w = (params->h * amin);
+			 }
+		    }
+		  /* fix w and vary h */
+		  else
+		    {
+		       //		  params->h = new_h;
+		       // EXCEEDS BOUNDS in H
+		       new_h = params->h;
+		       new_w = (params->h * amin);
+		       if (new_w > params->w)
+			 {
+			    new_h = (params->w / amin);
+			    new_w = params->w;
+			 }
+		    }
+		  params->w = new_w;
+		  params->h = new_h;
+	       }
+	  }
+     }
+   if (apref != EDJE_ASPECT_PREFER_BOTH)
      {
-	int apref = -10;
-	double aspect, amax, amin;
-	double new_w = 0, new_h = 0, want_x, want_y, want_w, want_h;
-
-        if (params->h <= 0) aspect = 999999.0;
-        else aspect = (double)params->w / (double)params->h;
-        amax = desc->aspect.max;
-        amin = desc->aspect.min;
-        if ((ep->swallow_params.aspect.w > 0) &&
-            (ep->swallow_params.aspect.h > 0))
-          amin = amax =
-          (double)ep->swallow_params.aspect.w /
-          (double)ep->swallow_params.aspect.h;
-        want_x = params->x;
-        want_w = new_w = params->w;
-        
-        want_y = params->y;
-        want_h = new_h = params->h;
-        
-        if ((amin > 0.0) && (amax > 0.0))
-          {
-             apref = desc->aspect.prefer;
-             if (ep->swallow_params.aspect.mode > EDJE_ASPECT_CONTROL_NONE)
-               {
-                  switch (ep->swallow_params.aspect.mode)
-                    {
-                    case EDJE_ASPECT_CONTROL_NEITHER:
-                       apref = EDJE_ASPECT_PREFER_NONE;
-                       break;
-                    case EDJE_ASPECT_CONTROL_HORIZONTAL:
-                       apref = EDJE_ASPECT_PREFER_HORIZONTAL;
-                       break;
-                    case EDJE_ASPECT_CONTROL_VERTICAL:
-                       apref = EDJE_ASPECT_PREFER_VERTICAL;
-                       break;
-                    case EDJE_ASPECT_CONTROL_BOTH:
-                       apref = EDJE_ASPECT_PREFER_BOTH;
-                       break;
-                    default:
-                       break;
-                    }
-               }
-             switch (apref)
-               {
-               case EDJE_ASPECT_PREFER_NONE:
-                  /* keep both dimensions in check */
-                  /* adjust for min aspect (width / height) */
-                  if ((amin > 0.0) && (aspect < amin))
-                    {
-                       new_h = (params->w / amin);
-                       new_w = (params->h * amin);
-                    }
-                  /* adjust for max aspect (width / height) */
-                  if ((amax > 0.0) && (aspect > amax))
-                    {
-                       new_h = (params->w / amax);
-                       new_w = (params->h * amax);
-                    }
-                  if ((amax > 0.0) && (new_w < params->w))
-                    {
-                       new_w = params->w;
-                       new_h = params->w / amax;
-                    }
-                  if ((amax > 0.0) && (new_h < params->h))
-                    {
-                       new_w = params->h * amax;
-                       new_h = params->h;
-                    }
-                  break;
-                  /* prefer vertical size as determiner */
-               case  EDJE_ASPECT_PREFER_VERTICAL:
-                  /* keep both dimensions in check */
-                  /* adjust for max aspect (width / height) */
-                  if ((amax > 0.0) && (aspect > amax))
-                    new_w = (params->h * amax);
-                  /* adjust for min aspect (width / height) */
-                  if ((amin > 0.0) && (aspect < amin))
-                    new_w = (params->h * amin);
-                  break;
-                  /* prefer horizontal size as determiner */
-               case EDJE_ASPECT_PREFER_HORIZONTAL:
-                  /* keep both dimensions in check */
-                  /* adjust for max aspect (width / height) */
-                  if ((amax > 0.0) && (aspect > amax))
-                    new_h = (params->w / amax);
-                  /* adjust for min aspect (width / height) */
-                  if ((amin > 0.0) && (aspect < amin))
-                    new_h = (params->w / amin);
-                  break;
-               case EDJE_ASPECT_PREFER_BOTH:
-                  /* keep both dimensions in check */
-                  /* adjust for max aspect (width / height) */
-                  if ((amax > 0.0) && (aspect > amax))
-                    {
-                       new_w = (params->h * amax);
-                       new_h = (params->w / amax);
-                    }
-                  /* adjust for min aspect (width / height) */
-                  if ((amin > 0.0) && (aspect < amin))
-                    {
-                       new_w = (params->h * amin);
-                       new_h = (params->w / amin);
-                    }
-                  break;
-               default:
-                  break;
-               }
-             
-             if (!((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE)))
-               {
-                  if ((maxw >= 0) && (new_w > maxw)) new_w = maxw;
-                  if (new_w < minw) new_w = minw;
-                  
-                  if ((maxh >= 0) && (new_h > maxh)) new_h = maxh;
-                  if (new_h < minh) new_h = minh;
-               }
-             
-             /* do real adjustment */
-             if (apref == EDJE_ASPECT_PREFER_BOTH)
-               {
-                  if (amin == 0.0) amin = amax;
-                  if (amin != 0.0)
-                    {
-                       /* fix h and vary w */
-                       if (new_w > params->w)
-                         {
-                            //		  params->w = new_w;
-                            // EXCEEDS BOUNDS in W
-                            new_h = (params->w / amin);
-                            new_w = params->w;
-                            if (new_h > params->h)
-                              {
-                                 new_h = params->h;
-                                 new_w = (params->h * amin);
-                              }
-                         }
-                       /* fix w and vary h */
-                       else
-                         {
-                            //		  params->h = new_h;
-                            // EXCEEDS BOUNDS in H
-                            new_h = params->h;
-                            new_w = (params->h * amin);
-                            if (new_w > params->w)
-                              {
-                                 new_h = (params->w / amin);
-                                 new_w = params->w;
-                              }
-                         }
-                       params->w = new_w;
-                       params->h = new_h;
-                    }
-               }
-          }
-        if (apref != EDJE_ASPECT_PREFER_BOTH)
-          {
-             if ((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE))
-               {
-                  params->w = new_w;
-                  params->h = new_h;
-               }
-             else if ((params->h - new_h) > (params->w - new_w))
-               {
-                  if (params->h < new_h)
-                    params->h = new_h;
-                  else if (params->h > new_h)
-                    params->h = new_h;
-                  if (apref == EDJE_ASPECT_PREFER_VERTICAL)
-                    params->w = new_w;
-               }
-             else
-               {
-                  if (params->w < new_w)
-                    params->w = new_w;
-                  else if (params->w > new_w)
-                    params->w = new_w;
-                  if (apref == EDJE_ASPECT_PREFER_HORIZONTAL)
-                    params->h = new_h;
-               }
-          }
-        params->x = want_x + ((want_w - params->w) * desc->align.x);
-        params->y = want_y + ((want_h - params->h) * desc->align.y);
+	if ((amin > 0.0) && (amax > 0.0) && (apref == EDJE_ASPECT_PREFER_NONE))
+	  {
+	     params->w = new_w;
+	     params->h = new_h;
+	  }
+	else if ((params->h - new_h) > (params->w - new_w))
+	  {
+	     if (params->h < new_h)
+	       params->h = new_h;
+	     else if (params->h > new_h)
+	       params->h = new_h;
+	     if (apref == EDJE_ASPECT_PREFER_VERTICAL)
+	       params->w = new_w;
+	  }
+	else
+	  {
+	     if (params->w < new_w)
+	       params->w = new_w;
+	     else if (params->w > new_w)
+	       params->w = new_w;
+	     if (apref == EDJE_ASPECT_PREFER_HORIZONTAL)
+	       params->h = new_h;
+	  }
      }
-   
-   /* size step */
+   params->x = want_x + ((want_w - params->w) * desc->align.x);
+   params->y = want_y + ((want_h - params->h) * desc->align.y);
+}
+
+static void
+_edje_part_recalc_single_step(Edje_Part_Description *desc,
+			      Edje_Calc_Params *params,
+			      int flags)
+{
    if (flags & FLAG_X)
      {
 	if (desc->step.x > 0)
@@ -588,8 +560,7 @@ _edje_part_recalc_single(Edje *ed,
 	     new_w = desc->step.x * steps;
 	     if (params->w > new_w)
 	       {
-		  params->x = params->x +
-		    ((params->w - new_w) * desc->align.x);
+		  params->x += ((params->w - new_w) * desc->align.x);
 		  params->w = new_w;
 	       }
 	  }
@@ -605,14 +576,23 @@ _edje_part_recalc_single(Edje *ed,
 	     new_h = desc->step.y * steps;
 	     if (params->h > new_h)
 	       {
-		  params->y = params->y +
-		    ((params->h - new_h) * desc->align.y);
+		  params->y += ((params->h - new_h) * desc->align.y);
 		  params->h = new_h;
 	       }
 	  }
      }
-   /* if we have text that wants to make the min size the text size... */
-   if ((chosen_desc) && (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
+}
+
+static void
+_edje_part_recalc_single_textblock(double sc,
+				   Edje *ed,
+				   Edje_Real_Part *ep,
+				   Edje_Part_Description *chosen_desc,
+				   Edje_Calc_Params *params,
+				   int *minw, int *minh,
+				   int *maxw, int *maxh)
+{
+   if (chosen_desc)
      {
 	Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b;
 	const char *text = "";
@@ -691,11 +671,11 @@ _edje_part_recalc_single(Edje *ed,
 		  mh = ins_t + th + ins_b;
 //		  if (chosen_desc->text.min_x)
 		    {
-		       if (mw > minw) minw = mw;
+		       if (mw > *minw) *minw = mw;
 		    }
 //		  if (chosen_desc->text.min_y)
 		    {
-		       if (mh > minh) minh = mh;
+		       if (mh > *minh) *minh = mh;
 		    }
 	       }
 	  }
@@ -716,19 +696,34 @@ _edje_part_recalc_single(Edje *ed,
 	     mh = ins_t + th + ins_b;
 	     if (chosen_desc->text.max_x)
 	       {
-		  if (mw > maxw) maxw = mw;
+		  if (mw > *maxw) *maxw = mw;
 	       }
 	     if (chosen_desc->text.max_y)
 	       {
-		  if (mh > maxw) maxh = mh;
+		  if (mh > *maxw) *maxh = mh;
 	       }
 	  }
      }
-   else if ((chosen_desc) && (ep->part->type == EDJE_PART_TYPE_TEXT))
+}
+
+static void
+_edje_part_recalc_single_text(double sc,
+			      Edje *ed,
+			      Edje_Real_Part *ep,
+			      Edje_Part_Description *desc,
+			      Edje_Part_Description *chosen_desc,
+			      Edje_Calc_Params *params,
+			      int *minw, int *minh,
+			      int *maxw, int *maxh)
+{
+   const char *font;
+   char *sfont = NULL;
+   int size;
+
+   if (chosen_desc)
      {
 	const char	*text;
 	const char	*font;
-	char            *sfont = NULL;
 	int		 size;
 	Evas_Coord	 tw, th;
 	int		 inlined_font = 0;
@@ -844,57 +839,53 @@ _edje_part_recalc_single(Edje *ed,
 		  int l, r;
 		  evas_object_text_style_pad_get(ep->object, &l, &r, NULL, NULL);
 		  mw = tw + l + r;
-		  if ((maxw < 0) || (mw < maxw)) maxw = mw;
+		  if ((*maxw < 0) || (mw < *maxw)) *maxw = mw;
 	       }
 	     if (chosen_desc->text.max_y)
 	       {
 		  int t, b;
 		  evas_object_text_style_pad_get(ep->object, NULL, NULL, &t, &b);
 		  mh = th + t + b;
-		  if ((maxh < 0) || (mh < maxh)) maxh = mh;
+		  if ((*maxh < 0) || (mh < *maxh)) *maxh = mh;
 	       }
 	     if (chosen_desc->text.min_x)
 	       {
 		  int l, r;
 		  evas_object_text_style_pad_get(ep->object, &l, &r, NULL, NULL);
 		  mw = tw + l + r;
-		  if (mw > minw) minw = mw;
+		  if (mw > *minw) *minw = mw;
 	       }
 	     if (chosen_desc->text.min_y)
 	       {
 		  int t, b;
 		  evas_object_text_style_pad_get(ep->object, NULL, NULL, &t, &b);
 		  mh = th + t + b;
-		  if (mh > minh) minh = mh;
+		  if (mh > *minh) *minh = mh;
 	       }
 	  }
 	if (sfont) free(sfont);
      }
 
-   if (ep->part->type == EDJE_PART_TYPE_TEXT)
-     {
-	const char *font;
-	char *sfont = NULL;
-	int size;
+   /* FIXME: Do we really need to call it twice if chosen_desc ? */
+   sfont = NULL;
+   font = _edje_text_class_font_get(ed, desc, &size, &sfont);
+   free(sfont);
+   params->type.text.size = size;
+}
 
-	font = _edje_text_class_font_get(ed, desc, &size, &sfont);
-	free(sfont);
-	params->text.size = size;
-     }
-   /* rememebr what our size is BEFORE we go limit it */
-   params->req.x = params->x;
-   params->req.y = params->y;
-   params->req.w = params->w;
-   params->req.h = params->h;
-   /* adjust for min size */
+static void
+_edje_part_recalc_single_min(Edje_Part_Description *desc,
+			     Edje_Calc_Params *params,
+			     int minw, int minh,
+			     int flags)
+{
    if (flags & FLAG_X)
      {
 	if (minw >= 0)
 	  {
 	     if (params->w < minw)
 	       {
-		  params->x = params->x +
-		    ((params->w - minw) * desc->align.x);
+		  params->x += ((params->w - minw) * desc->align.x);
 		  params->w = minw;
 	       }
 	  }
@@ -905,13 +896,19 @@ _edje_part_recalc_single(Edje *ed,
 	  {
 	     if (params->h < minh)
 	       {
-		  params->y = params->y +
-		    ((params->h - minh) * desc->align.y);
+		  params->y += ((params->h - minh) * desc->align.y);
 		  params->h = minh;
 	       }
 	  }
      }
-   /* adjust for max size */
+}
+
+static void
+_edje_part_recalc_single_max(Edje_Part_Description *desc,
+			     Edje_Calc_Params *params,
+			     int maxw, int maxh,
+			     int flags)
+{
    if (flags & FLAG_X)
      {
 	if (maxw >= 0)
@@ -936,6 +933,16 @@ _edje_part_recalc_single(Edje *ed,
 	       }
 	  }
      }
+}
+
+static void
+_edje_part_recalc_single_drag(Edje_Real_Part *ep,
+			      Edje_Real_Part *confine_to,
+			      Edje_Calc_Params *params,
+			      int minw, int minh,
+			      int maxw, int maxh,
+			      int flags)
+{
    /* confine */
    if (confine_to)
      {
@@ -946,14 +953,14 @@ _edje_part_recalc_single(Edje *ed,
 	/* complex dragable params */
 	if (flags & FLAG_X)
 	  {
-	     v = ep->drag.size.x * confine_to->w;
+	     v = ep->drag->size.x * confine_to->w;
 
 	     if ((minw > 0) && (v < minw)) params->w = minw;
 	     else if ((maxw >= 0) && (v > maxw)) params->w = maxw;
 	     else params->w = v;
 
-	     offset = (ep->drag.x * (confine_to->w - params->w)) +
-	       ep->drag.tmp.x;
+	     offset = (ep->drag->x * (confine_to->w - params->w)) +
+	       ep->drag->tmp.x;
 	     if (ep->part->dragable.step_x > 0)
 	       {
 		  params->x = confine_to->x +
@@ -971,14 +978,14 @@ _edje_part_recalc_single(Edje *ed,
 	  }
 	if (flags & FLAG_Y)
 	  {
-	     v = ep->drag.size.y * confine_to->h;
+	     v = ep->drag->size.y * confine_to->h;
 
 	     if ((minh > 0) && (v < minh)) params->h = minh;
 	     else if ((maxh >= 0) && (v > maxh)) params->h = maxh;
 	     else params->h = v;
 
-	     offset = (ep->drag.y * (confine_to->h - params->h)) +
-	       ep->drag.tmp.y;
+	     offset = (ep->drag->y * (confine_to->h - params->h)) +
+	       ep->drag->tmp.y;
 	     if (ep->part->dragable.step_y > 0)
 	       {
 		  params->y = confine_to->y +
@@ -1023,19 +1030,25 @@ _edje_part_recalc_single(Edje *ed,
 	/* simple dragable params */
 	if (flags & FLAG_X)
 	  {
-	     params->x += ep->drag.x + ep->drag.tmp.x;
+	     params->x += ep->drag->x + ep->drag->tmp.x;
 	     params->req_drag.x = params->x;
 	     params->req_drag.w = params->w;
 	  }
 	if (flags & FLAG_Y)
 	  {
-	     params->y += ep->drag.y + ep->drag.tmp.y;
+	     params->y += ep->drag->y + ep->drag->tmp.y;
 	     params->req_drag.y = params->y;
 	     params->req_drag.h = params->h;
 	  }
      }
-   /* fill */
+}
 
+static void
+_edje_part_recalc_single_fill(Edje_Real_Part *ep,
+			      Edje_Part_Description *desc,
+			      Edje_Calc_Params *params,
+			      int flags)
+{
    if (ep->part->type == EDJE_PART_TYPE_GRADIENT && desc->gradient.use_rel && (!desc->gradient.type || !strcmp(desc->gradient.type, "linear")))
      {
 	int x2, y2;
@@ -1043,19 +1056,19 @@ _edje_part_recalc_single(Edje *ed,
 	double m;
 	int angle;
 
-	params->fill.x = desc->gradient.rel1.offset_x + (params->w * desc->gradient.rel1.relative_x);
-	params->fill.y = desc->gradient.rel1.offset_y + (params->h * desc->gradient.rel1.relative_y);
+	params->type.common.fill.x = desc->gradient.rel1.offset_x + (params->w * desc->gradient.rel1.relative_x);
+	params->type.common.fill.y = desc->gradient.rel1.offset_y + (params->h * desc->gradient.rel1.relative_y);
 
 	x2 = desc->gradient.rel2.offset_x + (params->w * desc->gradient.rel2.relative_x);
 	y2 = desc->gradient.rel2.offset_y + (params->h * desc->gradient.rel2.relative_y);
 
-	params->fill.w = 1; /* doesn't matter for linear grads */
+	params->type.common.fill.w = 1; /* doesn't matter for linear grads */
 
-	dy = y2 - params->fill.y;
-	dx = x2 - params->fill.x;
-	params->fill.h = sqrt(dx * dx + dy * dy);
+	dy = y2 - params->type.common.fill.y;
+	dx = x2 - params->type.common.fill.x;
+	params->type.common.fill.h = sqrt(dx * dx + dy * dy);
 
-	params->fill.spread = desc->fill.spread;
+	params->type.common.fill.spread = desc->fill.spread;
 
 	if (dx == 0 && dy == 0)
 	  {
@@ -1080,7 +1093,7 @@ _edje_part_recalc_single(Edje *ed,
 	     else
 	       angle = 360 - angle;
 	  }
-	params->fill.angle = angle;
+	params->type.common.fill.angle = angle;
      }
    else
      {
@@ -1094,8 +1107,8 @@ _edje_part_recalc_single(Edje *ed,
 	     else
 	       fw = params->w;
 
-	     params->fill.x = desc->fill.pos_abs_x + (fw * desc->fill.pos_rel_x);
-	     params->fill.w = desc->fill.abs_x + (fw * desc->fill.rel_x);
+	     params->type.common.fill.x = desc->fill.pos_abs_x + (fw * desc->fill.pos_rel_x);
+	     params->type.common.fill.w = desc->fill.abs_x + (fw * desc->fill.rel_x);
 	  }
 	if (flags & FLAG_Y)
 	  {
@@ -1105,96 +1118,269 @@ _edje_part_recalc_single(Edje *ed,
 	     else
 	       fh = params->h;
 
-	     params->fill.y = desc->fill.pos_abs_y + (fh * desc->fill.pos_rel_y);
-	     params->fill.h = desc->fill.abs_y + (fh * desc->fill.rel_y);
+	     params->type.common.fill.y = desc->fill.pos_abs_y + (fh * desc->fill.pos_rel_y);
+	     params->type.common.fill.h = desc->fill.abs_y + (fh * desc->fill.rel_y);
 	  }
-	params->fill.angle = desc->fill.angle;
-	params->fill.spread = desc->fill.spread;
+	params->type.common.fill.angle = desc->fill.angle;
+	params->type.common.fill.spread = desc->fill.spread;
      }
-   /* colors */
 
-   params->color.r = desc->color.r;
-   params->color.g = desc->color.g;
-   params->color.b = desc->color.b;
-   params->color.a = desc->color.a;
-   params->color2.r = desc->color2.r;
-   params->color2.g = desc->color2.g;
-   params->color2.b = desc->color2.b;
-   params->color2.a = desc->color2.a;
-   params->color3.r = desc->color3.r;
-   params->color3.g = desc->color3.g;
-   params->color3.b = desc->color3.b;
-   params->color3.a = desc->color3.a;
+}
 
-   if ((desc->color_class) && (*desc->color_class))
-     {
-	Edje_Color_Class *cc;
+static void
+_edje_part_recalc_single_min_max(double sc,
+				 Edje_Real_Part *ep,
+				 Edje_Part_Description *desc,
+				 int *minw, int *minh,
+				 int *maxw, int *maxh,
+				 int flags __UNUSED__)
+{
+//   if (flags & FLAG_X)
+   {
+      *minw = desc->min.w;
+      if (ep->part->scale) *minw = (int)(((double)*minw) * sc);
+      if (ep->swallow_params.min.w > desc->min.w)
+	*minw = ep->swallow_params.min.w;
+
+      /* XXX TODO: remove need of EDJE_INF_MAX_W, see edje_util.c */
+      if ((ep->swallow_params.max.w <= 0) ||
+	  (ep->swallow_params.max.w == EDJE_INF_MAX_W))
+	{
+	   *maxw = desc->max.w;
+	   if (*maxw > 0)
+	     {
+		if (ep->part->scale) *maxw = (int)(((double)*maxw) * sc);
+		if (*maxw < 1) *maxw = 1;
+	     }
+	}
+      else
+	{
+	   if (desc->max.w <= 0)
+	     *maxw = ep->swallow_params.max.w;
+	   else
+	     {
+		*maxw = desc->max.w;
+		if (*maxw > 0)
+		  {
+		     if (ep->part->scale) *maxw = (int)(((double)*maxw) * sc);
+		     if (*maxw < 1) *maxw = 1;
+		  }
+		if (ep->swallow_params.max.w < *maxw)
+		  *maxw = ep->swallow_params.max.w;
+	     }
+	}
+      if (*maxw >= 0)
+	{
+	   if (*maxw < *minw) *maxw = *minw;
+	}
+   }
+//   if (flags & FLAG_Y)
+   {
+      *minh = desc->min.h;
+      if (ep->part->scale) *minh = (int)(((double)*minh) * sc);
+      if (ep->swallow_params.min.h > desc->min.h)
+	*minh = ep->swallow_params.min.h;
+
+      /* XXX TODO: remove need of EDJE_INF_MAX_H, see edje_util.c */
+      if ((ep->swallow_params.max.h <= 0) ||
+	  (ep->swallow_params.max.h == EDJE_INF_MAX_H))
+	{
+	   *maxh = desc->max.h;
+	   if (*maxh > 0)
+	     {
+		if (ep->part->scale) *maxh = (int)(((double)*maxh) * sc);
+		if (*maxh < 1) *maxh = 1;
+	     }
+	}
+      else
+	{
+	   if (desc->max.h <= 0)
+	     *maxh = ep->swallow_params.max.h;
+	   else
+	     {
+		*maxh = desc->max.h;
+		if (*maxh > 0)
+		  {
+		     if (ep->part->scale) *maxh = (int)(((double)*maxh) * sc);
+		     if (*maxh < 1) *maxh = 1;
+		  }
+		if (ep->swallow_params.max.h < *maxh)
+		  *maxh = ep->swallow_params.max.h;
+	     }
+	}
+      if (*maxh >= 0)
+	{
+	   if (*maxh < *minh) *maxh = *minh;
+	}
+   }
+}
 
-	cc = _edje_color_class_find(ed, desc->color_class);
-	if (cc)
-	  {
-	     params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8;
-	     params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8;
-	     params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8;
-	     params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8;
-	     params->color2.r = (((int)cc->r2 + 1) * desc->color2.r) >> 8;
-	     params->color2.g = (((int)cc->g2 + 1) * desc->color2.g) >> 8;
-	     params->color2.b = (((int)cc->b2 + 1) * desc->color2.b) >> 8;
-	     params->color2.a = (((int)cc->a2 + 1) * desc->color2.a) >> 8;
-	     params->color3.r = (((int)cc->r3 + 1) * desc->color3.r) >> 8;
-	     params->color3.g = (((int)cc->g3 + 1) * desc->color3.g) >> 8;
-	     params->color3.b = (((int)cc->b3 + 1) * desc->color3.b) >> 8;
-	     params->color3.a = (((int)cc->a3 + 1) * desc->color3.a) >> 8;
-	  }
-     }
+static void
+_edje_part_recalc_single(Edje *ed,
+			 Edje_Real_Part *ep,
+			 Edje_Part_Description *desc,
+			 Edje_Part_Description *chosen_desc,
+			 Edje_Real_Part *rel1_to_x,
+			 Edje_Real_Part *rel1_to_y,
+			 Edje_Real_Part *rel2_to_x,
+			 Edje_Real_Part *rel2_to_y,
+			 Edje_Real_Part *confine_to,
+			 Edje_Calc_Params *params,
+			 int flags)
+{
+   Edje_Color_Class *cc = NULL;
+   int minw = 0, minh = 0, maxw = 0, maxh = 0;
+   double sc;
 
+   flags = FLAG_XY;
 
-   /* visible */
-   params->visible = desc->visible;
-   /* border */
-   if (flags & FLAG_X)
-     {
-	params->border.l = desc->border.l;
-	params->border.r = desc->border.r;
-     }
-   if (flags & FLAG_Y)
+   sc = ed->scale;
+   if (sc == 0.0) sc = _edje_scale;
+   _edje_part_recalc_single_min_max(sc, ep, desc, &minw, &minh, &maxw, &maxh, flags);
+
+   /* relative coords of top left & bottom right */
+   _edje_part_recalc_single_rel(ed, ep, desc, rel1_to_x, rel1_to_y, rel2_to_x, rel2_to_y, params, flags);
+
+     /* aspect */
+   if (((flags | ep->calculated) & FLAG_XY) == FLAG_XY)
+     _edje_part_recalc_single_aspect(ep, desc, params, &minw, &minh, &maxw, &maxh);
+
+   /* size step */
+   _edje_part_recalc_single_step(desc, params, flags);
+
+   /* if we have text that wants to make the min size the text size... */
+   if (ep->part->type == EDJE_PART_TYPE_TEXTBLOCK)
+     _edje_part_recalc_single_textblock(sc, ed, ep, chosen_desc, params, &minw, &minh, &maxw, &maxh);
+   else if (ep->part->type == EDJE_PART_TYPE_TEXT)
+     _edje_part_recalc_single_text(sc, ed, ep, desc, chosen_desc, params, &minw, &minh, &maxw, &maxh);
+
+   /* remember what our size is BEFORE we go limit it */
+   params->req.x = params->x;
+   params->req.y = params->y;
+   params->req.w = params->w;
+   params->req.h = params->h;
+
+   /* adjust for min size */
+   _edje_part_recalc_single_min(desc, params, minw, minh, flags);
+
+   /* adjust for max size */
+   _edje_part_recalc_single_max(desc, params, maxw, maxh, flags);
+
+   /* take care of dragable part */
+   if (ep->drag)
+     _edje_part_recalc_single_drag(ep, confine_to, params, minw, minh, maxw, maxh, flags);
+
+   /* fill */
+   if (ep->part->type == EDJE_PART_TYPE_IMAGE ||
+       ep->part->type == EDJE_PART_TYPE_GRADIENT)
+     _edje_part_recalc_single_fill(ep, desc, params, flags);
+
+   /* colors */
+   if ((desc->color_class) && (*desc->color_class))
+     cc = _edje_color_class_find(ed, desc->color_class);
+
+   if (cc)
      {
-	params->border.t = desc->border.t;
-	params->border.b = desc->border.b;
+	params->color.r = (((int)cc->r + 1) * desc->color.r) >> 8;
+	params->color.g = (((int)cc->g + 1) * desc->color.g) >> 8;
+	params->color.b = (((int)cc->b + 1) * desc->color.b) >> 8;
+	params->color.a = (((int)cc->a + 1) * desc->color.a) >> 8;
      }
-   /* text.align */
-   if (flags & FLAG_X)
+   else
      {
-	params->text.align.x = desc->text.align.x;
+	params->color.r = desc->color.r;
+	params->color.g = desc->color.g;
+	params->color.b = desc->color.b;
+	params->color.a = desc->color.a;
      }
-   if (flags & FLAG_Y)
+
+   /* visible */
+   params->visible = desc->visible;
+
+   switch (ep->part->type)
      {
-	params->text.align.y = desc->text.align.y;
+      case EDJE_PART_TYPE_IMAGE:
+	 /* border */
+	 if (flags & FLAG_X)
+	   {
+	      params->type.common.spec.image.l = desc->border.l;
+	      params->type.common.spec.image.r = desc->border.r;
+	   }
+	 if (flags & FLAG_Y)
+	   {
+	      params->type.common.spec.image.t = desc->border.t;
+	      params->type.common.spec.image.b = desc->border.b;
+	   }
+	 break;
+      case EDJE_PART_TYPE_GRADIENT:
+	 params->type.common.spec.gradient.id = desc->gradient.id;
+	 params->type.common.spec.gradient.type = desc->gradient.type;
+	 break;
+      case EDJE_PART_TYPE_TEXT:
+      case EDJE_PART_TYPE_TEXTBLOCK:
+	 /* text.align */
+	 if (flags & FLAG_X)
+	   {
+	      params->type.text.align.x = desc->text.align.x;
+	   }
+	 if (flags & FLAG_Y)
+	   {
+	      params->type.text.align.y = desc->text.align.y;
+	   }
+	 params->type.text.elipsis = desc->text.elipsis;
+
+	 /* text colors */
+	 if (cc)
+	   {
+	     params->type.text.color2.r = (((int)cc->r2 + 1) * desc->color2.r) >> 8;
+	     params->type.text.color2.g = (((int)cc->g2 + 1) * desc->color2.g) >> 8;
+	     params->type.text.color2.b = (((int)cc->b2 + 1) * desc->color2.b) >> 8;
+	     params->type.text.color2.a = (((int)cc->a2 + 1) * desc->color2.a) >> 8;
+	     params->type.text.color3.r = (((int)cc->r3 + 1) * desc->color3.r) >> 8;
+	     params->type.text.color3.g = (((int)cc->g3 + 1) * desc->color3.g) >> 8;
+	     params->type.text.color3.b = (((int)cc->b3 + 1) * desc->color3.b) >> 8;
+	     params->type.text.color3.a = (((int)cc->a3 + 1) * desc->color3.a) >> 8;
+	   }
+	 else
+	   {
+	      params->type.text.color2.r = desc->color2.r;
+	      params->type.text.color2.g = desc->color2.g;
+	      params->type.text.color2.b = desc->color2.b;
+	      params->type.text.color2.a = desc->color2.a;
+	      params->type.text.color3.r = desc->color3.r;
+	      params->type.text.color3.g = desc->color3.g;
+	      params->type.text.color3.b = desc->color3.b;
+	      params->type.text.color3.a = desc->color3.a;
+	   }
+	 break;
+      case EDJE_PART_TYPE_RECTANGLE:
+      case EDJE_PART_TYPE_BOX:
+      case EDJE_PART_TYPE_TABLE:
+      case EDJE_PART_TYPE_SWALLOW:
+      case EDJE_PART_TYPE_GROUP:
+	 break;
      }
-   params->text.elipsis = desc->text.elipsis;
-   params->gradient.id = desc->gradient.id;
-   params->gradient.type = desc->gradient.type;
 }
 
 static void
-_edje_gradient_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc)
+_edje_gradient_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc __UNUSED__)
 {
-   evas_object_gradient_fill_angle_set(ep->object, p3->fill.angle);
-   evas_object_gradient_fill_spread_set(ep->object, p3->fill.spread);
-   evas_object_gradient_fill_set(ep->object, p3->fill.x, p3->fill.y,
-				 p3->fill.w, p3->fill.h);
+   evas_object_gradient_fill_angle_set(ep->object, p3->type.common.fill.angle);
+   evas_object_gradient_fill_spread_set(ep->object, p3->type.common.fill.spread);
+   evas_object_gradient_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y,
+				 p3->type.common.fill.w, p3->type.common.fill.h);
 
-   if (p3->gradient.type && p3->gradient.type[0])
-     evas_object_gradient_type_set(ep->object, p3->gradient.type, NULL);
+   if (p3->type.common.spec.gradient.type && p3->type.common.spec.gradient.type[0])
+     evas_object_gradient_type_set(ep->object, p3->type.common.spec.gradient.type, NULL);
 
    if (ed->file->spectrum_dir && ed->file->spectrum_dir->entries &&
-       p3->gradient.id != ep->gradient_id)
+       p3->type.common.spec.gradient.id != ep->gradient_id)
      {
 	Edje_Spectrum_Directory_Entry *se;
 	Edje_Spectrum_Color *sc;
 	Eina_List *l;
 
-	se = eina_list_nth(ed->file->spectrum_dir->entries, p3->gradient.id);
+	se = eina_list_nth(ed->file->spectrum_dir->entries, p3->type.common.spec.gradient.id);
 	if (se)
 	  {
 	     evas_object_gradient_clear(ep->object);
@@ -1206,13 +1392,13 @@ _edje_gradient_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3,
 		  evas_object_gradient_alpha_stop_add(ep->object,
 						      sc->a, sc->d);
 	       }
-	     ep->gradient_id = p3->gradient.id;
+	     ep->gradient_id = p3->type.common.spec.gradient.id;
 	  }
      }
 }
 
 static void
-_edje_box_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc)
+_edje_box_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc)
 {
    Evas_Object_Box_Layout layout;
    void (*free_data)(void *data);
@@ -1249,7 +1435,7 @@ _edje_box_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_
 }
 
 static void
-_edje_table_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edje_Part_Description *chosen_desc)
+_edje_table_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep, Edje_Calc_Params *p3 __UNUSED__, Edje_Part_Description *chosen_desc)
 {
    evas_object_table_homogeneous_set(ep->object, chosen_desc->table.homogeneous);
    evas_object_table_align_set(ep->object, chosen_desc->table.align.x, chosen_desc->table.align.y);
@@ -1267,11 +1453,11 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
    int image_id;
    int image_count, image_num;
 
-   evas_object_image_fill_set(ep->object, p3->fill.x, p3->fill.y,
-			      p3->fill.w, p3->fill.h);
+   evas_object_image_fill_set(ep->object, p3->type.common.fill.x, p3->type.common.fill.y,
+			      p3->type.common.fill.w, p3->type.common.fill.h);
    evas_object_image_smooth_scale_set(ep->object, p3->smooth);
-   evas_object_image_border_set(ep->object, p3->border.l, p3->border.r,
-				p3->border.t, p3->border.b);
+   evas_object_image_border_set(ep->object, p3->type.common.spec.image.l, p3->type.common.spec.image.r,
+				p3->type.common.spec.image.t, p3->type.common.spec.image.b);
    if (chosen_desc->border.no_fill == 0)
      evas_object_image_border_center_fill_set(ep->object, EVAS_BORDER_FILL_DEFAULT);
    else if (chosen_desc->border.no_fill == 1)
@@ -1295,23 +1481,27 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
    else
      {
 	image_count = 2;
-	if (ep->param2.description)
-	  image_count += eina_list_count(ep->param2.description->image.tween_list);
+	if (ep->param2)
+	  image_count += eina_list_count(ep->param2->description->image.tween_list);
 	image_num = (pos * ((double)image_count - 0.5));
 	if (image_num > (image_count - 1))
 	  image_num = image_count - 1;
 	if (image_num == 0)
 	  image_id = ep->param1.description->image.id;
-	else if (image_num == (image_count - 1))
-	  image_id = ep->param2.description->image.id;
 	else
-	  {
-	     Edje_Part_Image_Id *imid;
-
-	     imid = eina_list_nth(ep->param2.description->image.tween_list,
-				  image_num - 1);
-	     if (imid) image_id = imid->id;
-	  }
+	  if (ep->param2)
+	    {
+	       if (image_num == (image_count - 1))
+		 image_id = ep->param2->description->image.id;
+	       else
+		 {
+		    Edje_Part_Image_Id *imid;
+
+		    imid = eina_list_nth(ep->param2->description->image.tween_list,
+					 image_num - 1);
+		    if (imid) image_id = imid->id;
+		 }
+	    }
 	if (image_id < 0)
 	  {
 	     printf("EDJE ERROR: part \"%s\" has description, "
@@ -1365,9 +1555,18 @@ _edje_image_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *p3, Edj
 static void
 _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 {
-   Edje_Calc_Params p1, p2, p3, *pf;
+#ifdef EDJE_CALC_CACHE
+   int state1 = -1;
+   int state2 = -1;
+   int statec = -1;
+#else
+   Edje_Calc_Params lp1, lp2;
+#endif
+   Edje_Calc_Params *p1, *pf;
    Edje_Part_Description *chosen_desc;
+   Edje_Real_Part *confine_to = NULL;
    double pos = 0.0;
+   Edje_Calc_Params lp3;
 
    if ((ep->calculated & FLAG_XY) == FLAG_XY)
      {
@@ -1402,23 +1601,95 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 #endif
 	return;
      }
+#ifdef EDJE_CALC_CACHE
+   if (ep->state == ed->state)
+     return ;
+#endif
+
    if (flags & FLAG_X)
      {
 	ep->calculating |= flags & FLAG_X;
-	if (ep->param1.rel1_to_x)  _edje_part_recalc(ed, ep->param1.rel1_to_x, FLAG_X);
-	if (ep->param1.rel2_to_x)  _edje_part_recalc(ed, ep->param1.rel2_to_x, FLAG_X);
-	if (ep->param2.rel1_to_x)  _edje_part_recalc(ed, ep->param2.rel1_to_x, FLAG_X);
-	if (ep->param2.rel2_to_x)  _edje_part_recalc(ed, ep->param2.rel2_to_x, FLAG_X);
+	if (ep->param1.rel1_to_x)
+	  {
+	     _edje_part_recalc(ed, ep->param1.rel1_to_x, FLAG_X);
+#ifdef EDJE_CALC_CACHE
+	     state1 = ep->param1.rel1_to_x->state;
+#endif
+	  }
+	if (ep->param1.rel2_to_x)
+	  {
+	     _edje_part_recalc(ed, ep->param1.rel2_to_x, FLAG_X);
+#ifdef EDJE_CALC_CACHE
+	     if (state1 < ep->param1.rel2_to_x->state)
+	       state1 = ep->param1.rel2_to_x->state;
+#endif
+	  }
+	if (ep->param2)
+	  {
+	     if (ep->param2->rel1_to_x)
+	       {
+		  _edje_part_recalc(ed, ep->param2->rel1_to_x, FLAG_X);
+#ifdef EDJE_CALC_CACHE
+		  state2 = ep->param2->rel1_to_x->state;
+#endif
+	       }
+	     if (ep->param2->rel2_to_x)
+	       {
+		  _edje_part_recalc(ed, ep->param2->rel2_to_x, FLAG_X);
+#ifdef EDJE_CALC_CACHE
+		  if (state2 < ep->param2->rel2_to_x->state)
+		    state2 = ep->param2->rel2_to_x->state;
+#endif
+	       }
+	  }
      }
    if (flags & FLAG_Y)
      {
 	ep->calculating |= flags & FLAG_Y;
-	if (ep->param1.rel1_to_y)  _edje_part_recalc(ed, ep->param1.rel1_to_y, FLAG_Y);
-	if (ep->param1.rel2_to_y)  _edje_part_recalc(ed, ep->param1.rel2_to_y, FLAG_Y);
-	if (ep->param2.rel1_to_y)  _edje_part_recalc(ed, ep->param2.rel1_to_y, FLAG_Y);
-	if (ep->param2.rel2_to_y)  _edje_part_recalc(ed, ep->param2.rel2_to_y, FLAG_Y);
+	if (ep->param1.rel1_to_y)
+	  {
+	     _edje_part_recalc(ed, ep->param1.rel1_to_y, FLAG_Y);
+#ifdef EDJE_CALC_CACHE
+	     if (state1 < ep->param1.rel1_to_y->state)
+	       state1 = ep->param1.rel1_to_y->state;
+#endif
+	  }
+	if (ep->param1.rel2_to_y)
+	  {
+	     _edje_part_recalc(ed, ep->param1.rel2_to_y, FLAG_Y);
+#ifdef EDJE_CALC_CACHE
+	     if (state1 < ep->param1.rel2_to_y->state)
+	       state1 = ep->param1.rel2_to_y->state;
+#endif
+	  }
+	if (ep->param2)
+	  {
+	     if (ep->param2->rel1_to_y)
+	       {
+		  _edje_part_recalc(ed, ep->param2->rel1_to_y, FLAG_Y);
+#ifdef EDJE_CALC_CACHE
+		  if (state2 < ep->param2->rel1_to_y->state)
+		    state2 = ep->param2->rel1_to_y->state;
+#endif
+	       }
+	     if (ep->param2->rel2_to_y)
+	       {
+		  _edje_part_recalc(ed, ep->param2->rel2_to_y, FLAG_Y);
+#ifdef EDJE_CALC_CACHE
+		  if (state2 < ep->param2->rel2_to_y->state)
+		    state2 = ep->param2->rel2_to_y->state;
+#endif
+	       }
+	  }
+     }
+   if (ep->drag && ep->drag->confine_to)
+     {
+	confine_to = ep->drag->confine_to;
+	_edje_part_recalc(ed, confine_to, flags);
+#ifdef EDJE_CALC_CACHE
+	statec = confine_to->state;
+#endif
      }
-   if (ep->confine_to)        _edje_part_recalc(ed, ep->confine_to, flags);
 //   if (ep->text.source)       _edje_part_recalc(ed, ep->text.source, flags);
 //   if (ep->text.text_source)  _edje_part_recalc(ed, ep->text.text_source, flags);
 
@@ -1430,118 +1701,166 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 	ep->calculated |= flags;
 	return;
      }
+
+#ifndef EDJE_CALC_CACHE
+   p1 = &lp1;
+#else
+   p1 = &ep->param1.p;
+#endif
+
    if (ep->param1.description)
-     _edje_part_recalc_single(ed, ep, ep->param1.description, chosen_desc, ep->param1.rel1_to_x, ep->param1.rel1_to_y, ep->param1.rel2_to_x, ep->param1.rel2_to_y, ep->confine_to, &p1, flags);
-   if (ep->param2.description)
+     {
+#ifdef EDJE_CALC_CACHE
+	if (ed->all_part_change ||
+ 	    ep->invalidate ||
+ 	    state1 >= ep->param1.state ||
+ 	    statec >= ep->param1.state ||
+ 	    ((ep->part->type == EDJE_PART_TYPE_TEXT || ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) && ed->text_part_change))
+#endif
+ 	  {
+ 	     _edje_part_recalc_single(ed, ep, ep->param1.description, chosen_desc,
+ 				      ep->param1.rel1_to_x, ep->param1.rel1_to_y, ep->param1.rel2_to_x, ep->param1.rel2_to_y,
+ 				      confine_to,
+ 				      p1,
+ 				      flags);
+#ifdef EDJE_CALC_CACHE
+ 	     ep->param1.state = ed->state;
+#endif
+ 	  }
+     }
+   if (ep->param2 && ep->description_pos != 0.0)
      {
 	int beginning_pos, part_type;
+	Edje_Calc_Params *p2, *p3;
 
-	_edje_part_recalc_single(ed, ep, ep->param2.description, chosen_desc, ep->param2.rel1_to_x, ep->param2.rel1_to_y, ep->param2.rel2_to_x, ep->param2.rel2_to_y, ep->confine_to, &p2, flags);
+ 	p3 = &lp3;
 
-	pos = ep->description_pos;
-	beginning_pos = (pos < 0.5);
-	part_type = ep->part->type;
+#ifndef EDJE_CALC_CACHE
+ 	p2 = &lp2;
+#else
+ 	p2 = &ep->param2->p;
 
-	/* visible is special */
-	if ((p1.visible) && (!p2.visible))
-	  p3.visible = (pos != 1.0);
-	else if ((!p1.visible) && (p2.visible))
-	  p3.visible = (pos != 0.0);
-	else
-	  p3.visible = p1.visible;
+	if (ed->all_part_change ||
+ 	    ep->invalidate ||
+ 	    state2 >= ep->param2->state ||
+ 	    statec >= ep->param2->state ||
+ 	    ((ep->part->type == EDJE_PART_TYPE_TEXT || ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) && ed->text_part_change))
+#endif
+ 	  {
+ 	     _edje_part_recalc_single(ed, ep, ep->param2->description, chosen_desc,
+ 				      ep->param2->rel1_to_x, ep->param2->rel1_to_y, ep->param2->rel2_to_x, ep->param2->rel2_to_y,
+ 				      confine_to,
+				      p2,
+ 				      flags);
+#ifdef EDJE_CALC_CACHE
+ 	     ep->param2->state = ed->state;
+#endif
+ 	  }
 
-	p3.smooth = (beginning_pos) ? p1.smooth : p2.smooth;
+  	pos = ep->description_pos;
+  	beginning_pos = (pos < 0.5);
+  	part_type = ep->part->type;
 
-	/* FIXME: do x and y separately base on flag */
-#define INTP(_x1, _x2, _p) (((_x1) == (_x2)) ? (_x1) : ((_x1) + (((_x2) - (_x1)) * (_p))))
-	p3.x = INTP(p1.x, p2.x, pos);
-	p3.y = INTP(p1.y, p2.y, pos);
-	p3.w = INTP(p1.w, p2.w, pos);
-	p3.h = INTP(p1.h, p2.h, pos);
+  	/* visible is special */
+ 	if ((p1->visible) && (!p2->visible))
+ 	  p3->visible = (pos != 1.0);
+ 	else if ((!p1->visible) && (p2->visible))
+ 	  p3->visible = (pos != 0.0);
+  	else
+ 	  p3->visible = p1->visible;
 
-	p3.req.x = INTP(p1.req.x, p2.req.x, pos);
-	p3.req.y = INTP(p1.req.y, p2.req.y, pos);
-	p3.req.w = INTP(p1.req.w, p2.req.w, pos);
-	p3.req.h = INTP(p1.req.h, p2.req.h, pos);
+	p3->smooth = (beginning_pos) ? p1->smooth : p2->smooth;
 
-	if (ep->part->dragable.x)
-	  {
-	     p3.req_drag.x = INTP(p1.req_drag.x, p2.req_drag.x, pos);
-	     p3.req_drag.w = INTP(p1.req_drag.w, p2.req_drag.w, pos);
-	  }
-	if (ep->part->dragable.y)
-	  {
-	     p3.req_drag.y = INTP(p1.req_drag.y, p2.req_drag.y, pos);
-	     p3.req_drag.h = INTP(p1.req_drag.h, p2.req_drag.h, pos);
-	  }
+  	/* FIXME: do x and y separately base on flag */
+#define INTP(_x1, _x2, _p) (((_x1) == (_x2)) ? (_x1) : ((_x1) + (((_x2) - (_x1)) * (_p))))
+ 	p3->x = INTP(p1->x, p2->x, pos);
+ 	p3->y = INTP(p1->y, p2->y, pos);
+ 	p3->w = INTP(p1->w, p2->w, pos);
+ 	p3->h = INTP(p1->h, p2->h, pos);
 
-	p3.color.r = INTP(p1.color.r, p2.color.r, pos);
-	p3.color.g = INTP(p1.color.g, p2.color.g, pos);
-	p3.color.b = INTP(p1.color.b, p2.color.b, pos);
-	p3.color.a = INTP(p1.color.a, p2.color.a, pos);
+ 	p3->req.x = INTP(p1->req.x, p2->req.x, pos);
+ 	p3->req.y = INTP(p1->req.y, p2->req.y, pos);
+ 	p3->req.w = INTP(p1->req.w, p2->req.w, pos);
+ 	p3->req.h = INTP(p1->req.h, p2->req.h, pos);
 
-	switch (part_type)
+ 	if (ep->part->dragable.x)
 	  {
-	   case EDJE_PART_TYPE_IMAGE:
-	   case EDJE_PART_TYPE_GRADIENT:
-	      p3.fill.x = INTP(p1.fill.x, p2.fill.x, pos);
-	      p3.fill.y = INTP(p1.fill.y, p2.fill.y, pos);
-	      p3.fill.w = INTP(p1.fill.w, p2.fill.w, pos);
-	      p3.fill.h = INTP(p1.fill.h, p2.fill.h, pos);
-	      if (part_type == EDJE_PART_TYPE_GRADIENT)
-		{
-		   p3.fill.angle = INTP(p1.fill.angle, p2.fill.angle, pos);
-		   p3.fill.spread = (beginning_pos) ? p1.fill.spread : p2.fill.spread;
-		   p3.gradient = (beginning_pos) ? p1.gradient : p2.gradient;
-		}
-	      else
-		{
-		   p3.border.l = INTP(p1.border.l, p2.border.l, pos);
-		   p3.border.r = INTP(p1.border.r, p2.border.r, pos);
-		   p3.border.t = INTP(p1.border.t, p2.border.t, pos);
-		   p3.border.b = INTP(p1.border.b, p2.border.b, pos);
-		}
-	      break;
-	   case EDJE_PART_TYPE_TEXT:
-	      p3.text.size = INTP(p1.text.size, p2.text.size, pos);
-	   case EDJE_PART_TYPE_TEXTBLOCK:
-	      p3.color2.r = INTP(p1.color2.r, p2.color2.r, pos);
-	      p3.color2.g = INTP(p1.color2.g, p2.color2.g, pos);
-	      p3.color2.b = INTP(p1.color2.b, p2.color2.b, pos);
-	      p3.color2.a = INTP(p1.color2.a, p2.color2.a, pos);
-
-	      p3.color3.r = INTP(p1.color3.r, p2.color3.r, pos);
-	      p3.color3.g = INTP(p1.color3.g, p2.color3.g, pos);
-	      p3.color3.b = INTP(p1.color3.b, p2.color3.b, pos);
-	      p3.color3.a = INTP(p1.color3.a, p2.color3.a, pos);
-
-	      p3.text.align.x = INTP(p1.text.align.x, p2.text.align.x, pos);
-	      p3.text.align.y = INTP(p1.text.align.y, p2.text.align.y, pos);
-	      p3.text.elipsis = INTP(p1.text.elipsis, p2.text.elipsis, pos);
-	      break;
-	  }
-
-	pf = &p3;
+	     p3->req_drag.x = INTP(p1->req_drag.x, p2->req_drag.x, pos);
+ 	     p3->req_drag.w = INTP(p1->req_drag.w, p2->req_drag.w, pos);
+  	  }
+  	if (ep->part->dragable.y)
+  	  {
+ 	     p3->req_drag.y = INTP(p1->req_drag.y, p2->req_drag.y, pos);
+ 	     p3->req_drag.h = INTP(p1->req_drag.h, p2->req_drag.h, pos);
+  	  }
+
+	p3->color.r = INTP(p1->color.r, p2->color.r, pos);
+ 	p3->color.g = INTP(p1->color.g, p2->color.g, pos);
+ 	p3->color.b = INTP(p1->color.b, p2->color.b, pos);
+ 	p3->color.a = INTP(p1->color.a, p2->color.a, pos);
+
+  	switch (part_type)
+  	  {
+  	   case EDJE_PART_TYPE_IMAGE:
+  	   case EDJE_PART_TYPE_GRADIENT:
+ 	      p3->type.common.fill.x = INTP(p1->type.common.fill.x, p2->type.common.fill.x, pos);
+ 	      p3->type.common.fill.y = INTP(p1->type.common.fill.y, p2->type.common.fill.y, pos);
+ 	      p3->type.common.fill.w = INTP(p1->type.common.fill.w, p2->type.common.fill.w, pos);
+ 	      p3->type.common.fill.h = INTP(p1->type.common.fill.h, p2->type.common.fill.h, pos);
+  	      if (part_type == EDJE_PART_TYPE_GRADIENT)
+  		{
+ 		   p3->type.common.fill.angle = INTP(p1->type.common.fill.angle, p2->type.common.fill.angle, pos);
+ 		   p3->type.common.fill.spread = (beginning_pos) ? p1->type.common.fill.spread : p2->type.common.fill.spread;
+ 		   p3->type.common.spec.gradient = (beginning_pos) ? p1->type.common.spec.gradient : p2->type.common.spec.gradient;
+  		}
+  	      else
+  		{
+ 		   p3->type.common.spec.image.l = INTP(p1->type.common.spec.image.l, p2->type.common.spec.image.l, pos);
+ 		   p3->type.common.spec.image.r = INTP(p1->type.common.spec.image.r, p2->type.common.spec.image.r, pos);
+ 		   p3->type.common.spec.image.t = INTP(p1->type.common.spec.image.t, p2->type.common.spec.image.t, pos);
+ 		   p3->type.common.spec.image.b = INTP(p1->type.common.spec.image.b, p2->type.common.spec.image.b, pos);
+  		}
+  	      break;
+  	   case EDJE_PART_TYPE_TEXT:
+ 	      p3->type.text.size = INTP(p1->type.text.size, p2->type.text.size, pos);
+  	   case EDJE_PART_TYPE_TEXTBLOCK:
+ 	      p3->type.text.color2.r = INTP(p1->type.text.color2.r, p2->type.text.color2.r, pos);
+ 	      p3->type.text.color2.g = INTP(p1->type.text.color2.g, p2->type.text.color2.g, pos);
+	      p3->type.text.color2.b = INTP(p1->type.text.color2.b, p2->type.text.color2.b, pos);
+ 	      p3->type.text.color2.a = INTP(p1->type.text.color2.a, p2->type.text.color2.a, pos);
+
+ 	      p3->type.text.color3.r = INTP(p1->type.text.color3.r, p2->type.text.color3.r, pos);
+	      p3->type.text.color3.g = INTP(p1->type.text.color3.g, p2->type.text.color3.g, pos);
+	      p3->type.text.color3.b = INTP(p1->type.text.color3.b, p2->type.text.color3.b, pos);
+	      p3->type.text.color3.a = INTP(p1->type.text.color3.a, p2->type.text.color3.a, pos);
+
+	      p3->type.text.align.x = INTP(p1->type.text.align.x, p2->type.text.align.x, pos);
+	      p3->type.text.align.y = INTP(p1->type.text.align.y, p2->type.text.align.y, pos);
+	      p3->type.text.elipsis = INTP(p1->type.text.elipsis, p2->type.text.elipsis, pos);
+  	      break;
+  	  }
+
+	pf = p3;
      }
    else
      {
-	pf = &p1;
+ 	pf = p1;
      }
 
    ep->req = pf->req;
 
-   if (ep->drag.need_reset)
+   if (ep->drag && ep->drag->need_reset)
      {
 	double dx, dy;
 
 	dx = 0;
 	dy = 0;
 	_edje_part_dragable_calc(ed, ep, &dx, &dy);
-        ep->drag.x = dx;
-	ep->drag.y = dy;
-	ep->drag.tmp.x = 0;
-	ep->drag.tmp.y = 0;
-	ep->drag.need_reset = 0;
+        ep->drag->x = dx;
+	ep->drag->y = dy;
+	ep->drag->tmp.x = 0;
+	ep->drag->tmp.y = 0;
+	ep->drag->need_reset = 0;
      }
    if (!ed->calc_only)
      {
@@ -1570,6 +1889,7 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 	      /* move and resize are needed for all previous object => no break here. */
 	   case EDJE_PART_TYPE_SWALLOW:
 	   case EDJE_PART_TYPE_GROUP:
+	   case EDJE_PART_TYPE_EXTERNAL:
 	      /* visibility and color have no meaning on SWALLOW and GROUP part. */
 	      evas_object_move(ep->object, ed->x + pf->x, ed->y + pf->y);
 	      evas_object_resize(ep->object, pf->w, pf->h);
@@ -1599,6 +1919,9 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 	   case EDJE_PART_TYPE_TABLE:
 	      _edje_table_recalc_apply(ed, ep, pf, chosen_desc);
 	      break;
+	   case EDJE_PART_TYPE_EXTERNAL:
+	      _edje_external_recalc_apply(ed, ep, pf, chosen_desc);
+	      break;
 	   case EDJE_PART_TYPE_RECTANGLE:
 	   case EDJE_PART_TYPE_SWALLOW:
 	   case EDJE_PART_TYPE_GROUP:
@@ -1636,4 +1959,13 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags)
 
    ep->calculated |= flags;
    ep->calculating = FLAG_NONE;
+
+#ifdef EDJE_CALC_CACHE
+   if (ep->calculated == FLAG_XY)
+     {
+	ep->state = ed->state;
+	ep->invalidate = 0;
+     }
+#endif
+
 }
diff --git a/src/lib/edje_callbacks.c b/src/lib/edje_callbacks.c
index 3e584dc..058486b 100644
--- a/src/lib/edje_callbacks.c
+++ b/src/lib/edje_callbacks.c
@@ -101,13 +101,13 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
 	  {
 	     if (events->part->dragable.x)
 	       {
-		  events->drag.down.x = ev->canvas.x;
-		  events->drag.tmp.x = 0;
+		  events->drag->down.x = ev->canvas.x;
+		  events->drag->tmp.x = 0;
 	       }
 	     if (events->part->dragable.y)
 	       {
-		  events->drag.down.y = ev->canvas.y;
-		  events->drag.tmp.y = 0;
+		  events->drag->down.y = ev->canvas.y;
+		  events->drag->tmp.y = 0;
 	       }
 
 	     if (!ignored)
@@ -116,47 +116,54 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
 		  _edje_emit(ed, buf, events->part->name);
 	       }
 	     ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	     rp->invalidate = 1;
+#endif
 	  }
 	_edje_recalc_do(ed);
-/*
-	_edje_thaw(ed);
-	_edje_unref(ed);
-	_edje_ref(ed);
-	_edje_freeze(ed);
-*/
+	/*
+	  _edje_thaw(ed);
+	  _edje_unref(ed);
+	  _edje_ref(ed);
+	  _edje_freeze(ed);
+	*/
 	rp = events;
-	  {
-	     double dx = 0.0, dy = 0.0;
-	     int dir;
-
-	     dir = _edje_part_dragable_calc(ed, rp, &dx, &dy);
-	     
-	     if ((dx != rp->drag.val.x) || (dy != rp->drag.val.y))
-	       {
-		  rp->drag.val.x = dx;
-		  rp->drag.val.y = dy;
-		  if (!ignored)
-		    _edje_emit(ed, "drag", rp->part->name);
-		  ed->dirty = 1;
-		  rp->drag.need_reset = 1;
-		  _edje_recalc_do(ed);
-	       }
-	  }
+	{
+	   double dx = 0.0, dy = 0.0;
+	   int dir;
+
+	   dir = _edje_part_dragable_calc(ed, rp, &dx, &dy);
+
+	   if ((dx != rp->drag->val.x) || (dy != rp->drag->val.y))
+	     {
+		rp->drag->val.x = dx;
+		rp->drag->val.y = dy;
+		if (!ignored)
+		  _edje_emit(ed, "drag", rp->part->name);
+		ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+		rp->invalidate = 1;
+#endif
+		rp->drag->need_reset = 1;
+		_edje_recalc_do(ed);
+	     }
+	}
      }
 
-   if ((rp->part->dragable.x) || (rp->part->dragable.y))
+   if (rp->drag)
      {
-	if (rp->drag.down.count == 0)
+	if (rp->drag->down.count == 0)
 	  {
 	     if (rp->part->dragable.x)
-		 rp->drag.down.x = ev->canvas.x;
+	       rp->drag->down.x = ev->canvas.x;
 	     if (rp->part->dragable.y)
-		 rp->drag.down.y = ev->canvas.y;
+	       rp->drag->down.y = ev->canvas.y;
 	     if (!ignored)
 	       _edje_emit(ed, "drag,start", rp->part->name);
 	  }
-	rp->drag.down.count++;
+	rp->drag->down.count++;
      }
+
    if (rp->clicked_button == 0)
      {
 	rp->clicked_button = ev->button;
@@ -204,20 +211,24 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
 	  }
      }
 
-   if ((rp->part->dragable.x) || (rp->part->dragable.y))
+   if (rp->drag)
      {
-	if (rp->drag.down.count > 0)
+	if (rp->drag->down.count > 0)
 	  {
-	     rp->drag.down.count--;
-	     if (rp->drag.down.count == 0)
+	     rp->drag->down.count--;
+	     if (rp->drag->down.count == 0)
 	       {
-		  rp->drag.need_reset = 1;
+		  rp->drag->need_reset = 1;
 		  ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+		  rp->invalidate = 1;
+#endif
 		  if (!ignored)
 		    _edje_emit(ed, "drag,stop", rp->part->name);
 	       }
 	  }
      }
+
    if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ignored))
      {
 	snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button);
@@ -272,33 +283,37 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
 	  rp->still_in = 1;
      }
    _edje_freeze(ed);
-   if ((rp->part->dragable.x) || (rp->part->dragable.y))
+   if (rp->drag)
      {
-	if (rp->drag.down.count > 0)
+	if (rp->drag->down.count > 0)
 	  {
 	     if (rp->part->dragable.x)
-	       rp->drag.tmp.x = ev->cur.canvas.x - rp->drag.down.x;
+	       rp->drag->tmp.x = ev->cur.canvas.x - rp->drag->down.x;
 	     if (rp->part->dragable.y)
-	       rp->drag.tmp.y = ev->cur.canvas.y - rp->drag.down.y;
+	       rp->drag->tmp.y = ev->cur.canvas.y - rp->drag->down.y;
 	     ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	     rp->invalidate = 1;
+#endif
 	  }
 	_edje_recalc_do(ed);
-     }
-   if ((rp->part->dragable.x) || (rp->part->dragable.y))
-     {
-	if (rp->drag.down.count > 0)
+
+	if (rp->drag->down.count > 0)
 	  {
 	     double dx, dy;
 	     int dir;
 
 	     dir = _edje_part_dragable_calc(ed, rp, &dx, &dy);
-	     if ((dx != rp->drag.val.x) || (dy != rp->drag.val.y))
+	     if ((dx != rp->drag->val.x) || (dy != rp->drag->val.y))
 	       {
-		  rp->drag.val.x = dx;
-		  rp->drag.val.y = dy;
+		  rp->drag->val.x = dx;
+		  rp->drag->val.y = dy;
 		  if (!ignored)
 		    _edje_emit(ed, "drag", rp->part->name);
 		  ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+		  rp->invalidate = 1;
+#endif
 		  _edje_recalc_do(ed);
 	       }
 	  }
diff --git a/src/lib/edje_container.c b/src/lib/edje_container.c
index bf59bb1..6a6795d 100644
--- a/src/lib/edje_container.c
+++ b/src/lib/edje_container.c
@@ -168,6 +168,46 @@ _edje_item_recalc(Edje_Item *ei)
 
 
 /*****************************/
+/**
+ * @endcond
+ */
+
+/*============================================================================*
+ *                                 Global                                     *
+ *============================================================================*/
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Edje_container_Group Container
+ *
+ * @brief These functions provides an abstraction layer between the application
+ * code and the interface, while allowing extremely flexible dynamic layouts
+ * and animations.
+ *
+ * For more information, you can look at the @ref tutorial_list_page.
+ *
+ * @{
+ */
+
+/**
+ * @brief Create an edje item.
+ *
+ * @param cl The edje item of type Edje_Item_Class.
+ * @param data The edje item data.
+ *
+ * @return The new edje item created.
+ *
+ * This function creates an new edje item. The edje item data can be
+ * retrieved with edje_item_data_get().
+ *
+ * @see edje_item_del()
+ * @see edje_item_data_set()
+ * @see edje_item_data_get()
+ *
+ */
 
 Edje_Item *
 edje_item_add(Edje_Item_Class *cl, void *data)
@@ -182,6 +222,19 @@ edje_item_add(Edje_Item_Class *cl, void *data)
    return ei;
 }
 
+/**
+ * @brief Delete an edje item.
+ *
+ * @param ei The edje item to be deleted.
+ *
+ * This function deletes the edje item from memory.
+ *
+ * @see edje_item_add()
+ * @see edje_item_data_set()
+ * @see edje_item_data_get()
+ *
+ */
+
 void
 edje_item_del(Edje_Item *ei)
 {
@@ -197,6 +250,16 @@ edje_item_del(Edje_Item *ei)
    _edje_container_recalc(sd);
 }
 
+/**
+ * @brief Return the smart object of the edje item.
+ *
+ * @param ei The edje item wich the smart object of type Evas_Object is get
+ * from.
+ *
+ * This function returns the smart object in the edje item.
+ *
+ */
+
 Evas_Object *
 edje_item_container_get(Edje_Item *ei)
 {
@@ -205,6 +268,20 @@ edje_item_container_get(Edje_Item *ei)
 }
 
 /* an arbitary data pointer to use to track other data */
+/**
+ * @brief Set the edje item data.
+ *
+ * @param ei The edje item of type Edje_Item_Class.
+ * @param data The edje item data.
+ *
+ * This function set the data of the edje item. The edje item data can be
+ * retrieved with edje_item_data_get().
+ *
+ * @see edje_item_add()
+ * @see edje_item_del()
+ * @see edje_item_data_get()
+ *
+ */
 
 void
 edje_item_data_set(Edje_Item *ei, void *data)
@@ -212,6 +289,19 @@ edje_item_data_set(Edje_Item *ei, void *data)
    ei->data = data;
 }
 
+/**
+ * @brief Get the data of the edje item.
+ *
+ * @param ei The edje item of type Edje_Item_Class.
+ *
+ * This function get the data of the edje item set by edje_item_data_set().
+ *
+ * @see edje_item_data_set()
+ * @see edje_item_add()
+ * @see edje_item_del()
+ *
+ */
+
 void *
 edje_item_data_get(Edje_Item *ei)
 {
@@ -219,6 +309,7 @@ edje_item_data_get(Edje_Item *ei)
 }
 
 /* this object covers the entire item */
+
 void
 edje_item_overlay_object_set(Edje_Item *ei, Evas_Object *obj)
 {
@@ -231,6 +322,8 @@ edje_item_overlay_object_set(Edje_Item *ei, Evas_Object *obj)
      evas_object_smart_member_add(((Smart_Data *)(ei->sd))->smart_obj, obj);
 }
 
+
+
 Evas_Object *
 edje_item_overlay_object_get(Edje_Item *ei)
 {
diff --git a/src/lib/edje_data.c b/src/lib/edje_data.c
index 63ccb51..11c4e9f 100644
--- a/src/lib/edje_data.c
+++ b/src/lib/edje_data.c
@@ -9,6 +9,8 @@ EAPI Eet_Data_Descriptor *_edje_edd_edje_style = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_style_tag = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_color_class = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_data = NULL;
+EAPI Eet_Data_Descriptor *_edje_edd_edje_external_directory = NULL;
+EAPI Eet_Data_Descriptor *_edje_edd_edje_external_directory_entry = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_font_directory = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_font_directory_entry = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_image_directory = NULL;
@@ -26,9 +28,7 @@ EAPI Eet_Data_Descriptor *_edje_edd_edje_part_collection = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_part = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_part_description = NULL;
 EAPI Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL;
-
-#define NEWD(str, typ) \
-   { eddc.name = str; eddc.size = sizeof(typ); }
+EAPI Eet_Data_Descriptor *_edje_edd_edje_external_param = NULL;
 
 #define FREED(eed) \
    if (eed) \
@@ -38,13 +38,15 @@ EAPI Eet_Data_Descriptor *_edje_edd_edje_part_image_id = NULL;
    }
 
 void
-_edje_edd_free(void)
+_edje_edd_shutdown(void)
 {
    FREED(_edje_edd_edje_file);
    FREED(_edje_edd_edje_style);
    FREED(_edje_edd_edje_style_tag);
    FREED(_edje_edd_edje_color_class);
    FREED(_edje_edd_edje_data);
+   FREED(_edje_edd_edje_external_directory);
+   FREED(_edje_edd_edje_external_directory_entry);
    FREED(_edje_edd_edje_font_directory);
    FREED(_edje_edd_edje_font_directory_entry);
    FREED(_edje_edd_edje_image_directory);
@@ -62,144 +64,107 @@ _edje_edd_free(void)
    FREED(_edje_edd_edje_part);
    FREED(_edje_edd_edje_part_description);
    FREED(_edje_edd_edje_part_image_id);
-}
-
-static char *
-_edje_str_direct_alloc(const char *str)
-{
-   return (char *)str;
-}
-
-static void
-_edje_str_direct_free(const char *str)
-{
-}
-
-static Eina_Hash *
-_edje_eina_hash_add_alloc(Eina_Hash *hash, const char *key, void *data)
-{
-   if (!hash) hash = eina_hash_string_small_new(NULL);
-   if (!hash) return NULL;
-
-   eina_hash_add(hash, key, data);
-   return hash;
+   FREED(_edje_edd_edje_external_param);
 }
 
 void
-_edje_edd_setup(void)
+_edje_edd_init(void)
 {
    Eet_Data_Descriptor_Class eddc;
 
-   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
-   eddc.func.mem_alloc = NULL;
-   eddc.func.mem_free = NULL;
-   eddc.func.str_alloc = (char *(*)(const char *))eina_stringshare_add;
-   eddc.func.str_free = eina_stringshare_del;
-   eddc.func.list_next = (void *(*)(void *))eina_list_next;
-   eddc.func.list_append = (void *(*)(void *, void *))eina_list_append;
-   eddc.func.list_data = (void *(*)(void *))eina_list_data_get;
-   eddc.func.list_free = (void *(*)(void *))eina_list_free;
-   eddc.func.hash_foreach = (void (*)(const Eina_Hash *, Eina_Bool (*)(const Eina_Hash *, const void *, void *, void *), void *))eina_hash_foreach;
-   eddc.func.hash_add = (Eina_Hash* (*)(Eina_Hash *, const char *, void *)) _edje_eina_hash_add_alloc;
-   eddc.func.hash_free = (void (*)(void *))eina_hash_free;
-   eddc.func.str_direct_alloc = _edje_str_direct_alloc;
-   eddc.func.str_direct_free = _edje_str_direct_free;
+   /* external directory */
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_External_Directory_Entry);
+   _edje_edd_edje_external_directory_entry =
+     eet_data_descriptor_file_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_directory_entry, Edje_External_Directory_Entry, "entry", entry, EET_T_STRING);
+
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_External_Directory);
+   _edje_edd_edje_external_directory =
+     eet_data_descriptor_file_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_external_directory, Edje_External_Directory, "entries", entries, _edje_edd_edje_external_directory_entry);
 
    /* font directory */
-   NEWD("Edje_Font_Directory_Entry",
-	Edje_Font_Directory_Entry);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Font_Directory_Entry);
    _edje_edd_edje_font_directory_entry =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_font_directory_entry, Edje_Font_Directory_Entry, "entry", entry, EET_T_STRING);
 
-   NEWD("Edje_Font_Directory",
-	Edje_Font_Directory);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Font_Directory);
    _edje_edd_edje_font_directory =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_font_directory, Edje_Font_Directory, "entries", entries, _edje_edd_edje_font_directory_entry);
 
    /* image directory */
-   NEWD("Edje_Image_Directory_Entry",
-	Edje_Image_Directory_Entry);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Image_Directory_Entry);
    _edje_edd_edje_image_directory_entry =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_image_directory_entry, Edje_Image_Directory_Entry, "entry", entry, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_image_directory_entry, Edje_Image_Directory_Entry, "source_type", source_type, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_image_directory_entry, Edje_Image_Directory_Entry, "source_param", source_param, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_image_directory_entry, Edje_Image_Directory_Entry, "id", id, EET_T_INT);
 
-   NEWD("Edje_Image_Directory",
-	Edje_Image_Directory);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Image_Directory);
    _edje_edd_edje_image_directory =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_image_directory, Edje_Image_Directory, "entries", entries, _edje_edd_edje_image_directory_entry);
 
    /* spectrum directory */
-   NEWD("Edje_Spectrum_Color",
-	Edje_Spectrum_Color);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Spectrum_Color);
    _edje_edd_edje_spectrum_color =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_color, Edje_Spectrum_Color, "r", r, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_color, Edje_Spectrum_Color, "g", g, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_color, Edje_Spectrum_Color, "b", b, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_color, Edje_Spectrum_Color, "a", a, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_color, Edje_Spectrum_Color, "d", d, EET_T_INT);
 
-   NEWD("Edje_Spectrum_Directory_Entry",
-	Edje_Spectrum_Directory_Entry);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Spectrum_Directory_Entry);
    _edje_edd_edje_spectrum_directory_entry =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_directory_entry, Edje_Spectrum_Directory_Entry, "entry", entry, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_directory_entry, Edje_Spectrum_Directory_Entry, "filename", filename, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_spectrum_directory_entry, Edje_Spectrum_Directory_Entry, "color_list", color_list, _edje_edd_edje_spectrum_color);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_spectrum_directory_entry, Edje_Spectrum_Directory_Entry, "id", id, EET_T_INT);
 
-   NEWD("Edje_Spectrum_Directory",
-	Edje_Spectrum_Directory);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Spectrum_Directory);
    _edje_edd_edje_spectrum_directory =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_spectrum_directory, Edje_Spectrum_Directory, "entries", entries, _edje_edd_edje_spectrum_directory_entry);
 
    /* collection directory */
-   NEWD("Edje_Part_Collection_Directory_Entry",
-	Edje_Part_Collection_Directory_Entry);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Collection_Directory_Entry);
    _edje_edd_edje_part_collection_directory_entry =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "entry", entry, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection_directory_entry, Edje_Part_Collection_Directory_Entry, "id", id, EET_T_INT);
 
-   NEWD("Edje_Part_Collection_Directory",
-	Edje_Part_Collection_Directory);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Collection_Directory);
    _edje_edd_edje_part_collection_directory =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection_directory, Edje_Part_Collection_Directory, "entries", entries, _edje_edd_edje_part_collection_directory_entry);
 
    /* generic data attachment */
-   NEWD("Edje_Data",
-	Edje_Data);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Data);
    _edje_edd_edje_data =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_data, Edje_Data, "key", key, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_data, Edje_Data, "value", value, EET_T_STRING);
 
-   NEWD("Edje_Style_Tag",
-	Edje_Style_Tag);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Style_Tag);
    _edje_edd_edje_style_tag =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_style_tag, Edje_Style_Tag, "key", key, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_style_tag, Edje_Style_Tag, "value", value, EET_T_STRING);
 
-   NEWD("Edje_Style",
-	Edje_Style);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Style);
    _edje_edd_edje_style =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_style, Edje_Style, "name", name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_style, Edje_Style, "tags", tags, _edje_edd_edje_style_tag);
 
-   NEWD("Edje_Color_Class",
-	Edje_Color_Class);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Color_Class);
    _edje_edd_edje_color_class =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_color_class, Edje_Color_Class, "name", name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_color_class, Edje_Color_Class, "r", r, EET_T_UCHAR);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_color_class, Edje_Color_Class, "g", g, EET_T_UCHAR);
@@ -215,13 +180,13 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_color_class, Edje_Color_Class, "a3", a3, EET_T_UCHAR);
 
    /* the main file directory */
-   NEWD("Edje_File",
-	Edje_File);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_File);
    _edje_edd_edje_file =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_file, Edje_File, "compiler", compiler, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_file, Edje_File, "version", version, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_file, Edje_File, "feature_ver", feature_ver, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "external_dir", external_dir, _edje_edd_edje_external_directory);
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "font_dir", font_dir, _edje_edd_edje_font_directory);
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "image_dir", image_dir, _edje_edd_edje_image_directory);
    EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_file, Edje_File, "spectrum_dir", spectrum_dir, _edje_edd_edje_spectrum_directory);
@@ -231,23 +196,20 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_file, Edje_File, "color_classes", color_classes, _edje_edd_edje_color_class);
 
    /* parts & programs - loaded induvidually */
-   NEWD("Edje_Program_Target",
-	Edje_Program_Target);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Program_Target);
    _edje_edd_edje_program_target =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program_target, Edje_Program_Target, "id", id, EET_T_INT);
 
-   NEWD("Edje_Program_After",
-	Edje_Program_After);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Program_After);
    _edje_edd_edje_program_after =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program_after,
                                  Edje_Program_After, "id", id, EET_T_INT);
 
-   NEWD("Edje_Program",
-	Edje_Program);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Program);
    _edje_edd_edje_program =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "id", id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "name", name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_program, Edje_Program, "signal", signal, EET_T_STRING);
@@ -264,16 +226,23 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_program, Edje_Program, "targets", targets, _edje_edd_edje_program_target);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_program, Edje_Program, "after", after, _edje_edd_edje_program_after);
 
-   NEWD("Edje_Part_Image_Id",
-	Edje_Part_Image_Id);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Image_Id);
    _edje_edd_edje_part_image_id =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_image_id, Edje_Part_Image_Id, "id", id, EET_T_INT);
 
-   NEWD("Edje_Part_Description",
-	Edje_Part_Description);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_External_Param);
+   _edje_edd_edje_external_param =
+     eet_data_descriptor_file_new(&eddc);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "name", name, EET_T_STRING);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "type", type, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "i", i, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "d", d, EET_T_DOUBLE);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_external_param, Edje_External_Param, "s", s, EET_T_STRING);
+
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Description);
    _edje_edd_edje_part_description =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "state.name", state.name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "state.value", state.value, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "visible", visible, EET_T_CHAR);
@@ -376,11 +345,11 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.align.y", table.align.y, EET_T_DOUBLE);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.x", table.padding.x, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_description, Edje_Part_Description, "table.padding.y", table.padding.y, EET_T_INT);
+   EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_description, Edje_Part_Description, "external_params", external_params, _edje_edd_edje_external_param);
 
-   NEWD("Edje_Pack_Element",
-	 Edje_Pack_Element);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Pack_Element);
    _edje_edd_edje_pack_element =
-      eet_data_descriptor3_new(&eddc);
+      eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "type", type, EET_T_UCHAR);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "name", name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "source", source, EET_T_STRING);
@@ -407,10 +376,9 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "colspan", colspan, EET_T_USHORT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_pack_element, Edje_Pack_Element, "rowspan", rowspan, EET_T_USHORT);
 
-   NEWD("Edje_Part",
-	Edje_Part);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part);
    _edje_edd_edje_part =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "name", name, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "id", id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "type", type, EET_T_UCHAR);
@@ -444,10 +412,9 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "source6", source6, EET_T_STRING);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part, Edje_Part, "items", items, _edje_edd_edje_pack_element);
 
-   NEWD("Edje_Part_Collection",
-	Edje_Part_Collection);
+   EET_EINA_FILE_DATA_DESCRIPTOR_CLASS_SET(&eddc, Edje_Part_Collection);
    _edje_edd_edje_part_collection  =
-     eet_data_descriptor3_new(&eddc);
+     eet_data_descriptor_file_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Edje_Part_Collection, "programs", programs, _edje_edd_edje_program);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Edje_Part_Collection, "parts", parts, _edje_edd_edje_part);
    EET_DATA_DESCRIPTOR_ADD_LIST(_edje_edd_edje_part_collection, Edje_Part_Collection, "data", data, _edje_edd_edje_data);
@@ -457,4 +424,5 @@ _edje_edd_setup(void)
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "prop.max.h", prop.max.h, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "id", id, EET_T_INT);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "script_only", script_only, EET_T_UCHAR);
+   EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part_collection, Edje_Part_Collection, "lua_script_only", lua_script_only, EET_T_UCHAR);
 }
diff --git a/src/lib/edje_edit.c b/src/lib/edje_edit.c
index 48cb607..36a34f0 100644
--- a/src/lib/edje_edit.c
+++ b/src/lib/edje_edit.c
@@ -5,8 +5,9 @@
 /*
  * TODO
  * -----------------------------------------------------------------
- * Modify edje so that also ebryo source is included in the eet file
+ * Add LUA Support :)
  * Remove images/fonts
+ * Clean the saving routines
  *
  */
 
@@ -16,15 +17,23 @@
 
 #include <string.h>
 #include <limits.h>
-#include <unistd.h>
 #include <sys/stat.h>
 #include <errno.h>
+
+#ifndef _MSC_VER
+# include <unistd.h>
+#endif
+
 #ifdef HAVE_LOCALE_H
 # include <locale.h>
 #endif
 
+#ifdef HAVE_EVIL
+# include <Evil.h>
+#endif
+
 #include "edje_private.h"
-#include "edje_cc.h"
+
 
 /* Get ed(Edje*) from obj(Evas_Object*) */
 #define GET_ED_OR_RETURN(RET) \
@@ -56,37 +65,23 @@
    epr = _edje_program_get_byname(obj, prog); \
    if (!epr) return RET;
 
-void *
-mem_alloc(size_t size)
+static void *
+_alloc(size_t size)
 {
    void *mem;
 
    mem = calloc(1, size);
    if (mem) return mem;
    fprintf(stderr, "Edje_Edit: Error. memory allocation of %i bytes failed. %s\n",
-           size, strerror(errno));
-   exit(-1);
+           (int)size, strerror(errno));
    return NULL;
 }
 
-char *
-mem_strdup(const char *s)
-{
-   void *str;
-
-   str = strdup(s);
-   if (str) return str;
-   fprintf(stderr, "Edje_Edit: Error. memory allocation of %i bytes failed. %s."
-           "string being duplicated: \"%s\"\n", strlen(s) + 1, strerror(errno), s);
-   exit(-1);
-   return NULL;
-}
-
-
 /*************/
 /* INTERNALS */
 /*************/
 
+
 static Edje_Part_Description *
 _edje_part_description_find_byname(Edje *ed, const char *part, const char *state) //state include the value in the string (ex. "default 0.00")
 {
@@ -173,25 +168,14 @@ _edje_image_name_find(Evas_Object *obj, int image_id)
 static void
 _edje_real_part_free(Edje_Real_Part *rp)
 {
-   Eina_List *l;
-
    if (!rp) return;
 
    if (rp->object)
      {
-	_edje_text_real_part_on_del(rp->edje, rp);
 	_edje_callbacks_del(rp->object);
 	evas_object_del(rp->object);
      }
 
-   l = rp->extra_objects;
-   while (rp->extra_objects)
-     {
-        evas_object_del(eina_list_data_get(rp->extra_objects));
-	rp->extra_objects = eina_list_remove_list(rp->extra_objects,
-						  rp->extra_objects);
-     }
-
    if (rp->swallowed_object)
      {
 	evas_object_smart_member_del(rp->swallowed_object);
@@ -203,7 +187,8 @@ _edje_real_part_free(Edje_Real_Part *rp)
 	if (rp->part->mouse_events)
 	  _edje_callbacks_del(rp->swallowed_object);
 
-	if (rp->part->type == EDJE_PART_TYPE_GROUP)
+	if (rp->part->type == EDJE_PART_TYPE_GROUP ||
+	    rp->part->type == EDJE_PART_TYPE_EXTERNAL)
 	  evas_object_del(rp->swallowed_object);
 
 	rp->swallowed_object = NULL;
@@ -214,14 +199,18 @@ _edje_real_part_free(Edje_Real_Part *rp)
    if (rp->text.cache.in_str) eina_stringshare_del(rp->text.cache.in_str);
    if (rp->text.cache.out_str) eina_stringshare_del(rp->text.cache.out_str);
 
-   if (rp->custom.description)
-     _edje_collection_free_part_description_free(rp->custom.description, 0);
+   if (rp->custom)
+     _edje_collection_free_part_description_free(rp->custom->description, 0);
+
+   free(rp->drag);
+   eina_mempool_free(_edje_real_part_state_mp, rp->param2);
+   eina_mempool_free(_edje_real_part_state_mp, rp->custom);
 
    _edje_unref(rp->edje);
-   free(rp);
+   eina_mempool_free(_edje_real_part_mp, rp);
 }
 
-static unsigned char
+static Eina_Bool
 _edje_import_image_file(Edje *ed, const char *path, int id)
 {
    char buf[256];
@@ -274,7 +263,7 @@ _edje_import_image_file(Edje *ed, const char *path, int id)
    snprintf(buf, sizeof(buf), "images/%i", id);
 
    /* write the image data */
-   printf("***********  Writing images/%i to edj ******************\n", id);
+   //printf("***********  Writing images/%i to edj ******************\n", id);
    bytes = eet_data_image_write(eetf, buf,
 				im_data, im_w, im_h,
 				im_alpha,
@@ -290,7 +279,7 @@ _edje_import_image_file(Edje *ed, const char *path, int id)
    /* Rewrite Edje_File to edj */
    evas_object_del(im);
 
-   printf("***********  Writing Edje_File* ed->file ******************\n");
+   //printf("***********  Writing Edje_File* ed->file ******************\n");
    bytes = eet_data_write(eetf, _edje_edd_edje_file, "edje_file", ed->file, 1);
    if (bytes <= 0)
      {
@@ -337,7 +326,7 @@ _edje_part_id_set(Edje *ed, Edje_Real_Part *rp, int new_id)
    part = rp->part;
 
    if (!part) return;
-   printf("CHANGE ID OF PART %s TO %d\n", part->name, new_id);
+   //printf("CHANGE ID OF PART %s TO %d\n", part->name, new_id);
 
    if (!ed || !part || new_id < -1) return;
 
@@ -416,7 +405,7 @@ _edje_parts_id_switch(Edje *ed, Edje_Real_Part *rp1, Edje_Real_Part *rp2)
    Edje_Part *p;
    Edje_Program *epr;
 
-   printf("SWITCH ID OF PART %d AND %d\n", rp1->part->id, rp2->part->id);
+   //printf("SWITCH ID OF PART %d AND %d\n", rp1->part->id, rp2->part->id);
 
    if (!ed || !rp1 || !rp2) return;
    if (rp1 == rp2) return;
@@ -506,7 +495,7 @@ _edje_fix_parts_id(Edje *ed)
    int correct_id;
    int count;
 
-   printf("FIXING PARTS ID \n");
+   //printf("FIXING PARTS ID \n");
 
    //TODO order the list first to be more robust
 
@@ -525,7 +514,7 @@ _edje_fix_parts_id(Edje *ed)
    count = eina_list_count(ed->collection->parts);
    if (count != ed->table_parts_size)
      {
-	ed->table_parts = realloc(ed->table_parts, SZ(Edje_Real_Part *) * count);
+	ed->table_parts = realloc(ed->table_parts, sizeof(Edje_Real_Part *) * count);
 	ed->table_parts_size = count;
      }
 
@@ -545,7 +534,7 @@ _edje_if_string_free(Edje *ed, const char *str)
    str = NULL;
 }
 
-Edje_Spectrum_Directory_Entry *
+static Edje_Spectrum_Directory_Entry *
 _edje_edit_spectrum_entry_get(Edje *ed, const char* spectra)
 {
    Edje_Spectrum_Directory_Entry *s;
@@ -561,7 +550,7 @@ _edje_edit_spectrum_entry_get(Edje *ed, const char* spectra)
    return NULL;
 }
 
-Edje_Spectrum_Directory_Entry *
+static Edje_Spectrum_Directory_Entry *
 _edje_edit_spectrum_entry_get_by_id(Edje *ed, int spectra_id)
 {
    Edje_Spectrum_Directory_Entry *s;
@@ -612,6 +601,22 @@ _edje_edit_style_tag_get(Edje *ed, const char *style, const char *name)
    return NULL;
 }
 
+static Edje_External_Directory_Entry *
+_edje_edit_external_get(Edje *ed, const char *name)
+{
+   Eina_List *l;
+   Edje_External_Directory_Entry *e;
+
+   if (!ed || !ed->file || !ed->file->external_dir || !name)
+     return NULL;
+
+   EINA_LIST_FOREACH(ed->file->external_dir->entries, l, e)
+      if (e->entry && !strcmp(e->entry, name))
+	return e;
+
+   return NULL;
+}
+
 /*****************/
 /*  GENERAL API  */
 /*****************/
@@ -645,7 +650,24 @@ edje_edit_compiler_get(Evas_Object *obj)
 /*  GROUPS API  */
 /****************/
 
-EAPI unsigned char
+/**
+ * @brief Add an edje (empty) group to an edje object's group set.
+ *
+ * @param obj The pointer to edje object.
+ * @param name The name of the group.
+ *
+ * @return 1 If it could allocate memory to the part group added
+ * or zero if not.
+ *
+ * This function adds, at run time, one more group, which will reside
+ * in memory, to the group set found in the .edj file which @a obj was
+ * loaded with. This group can be manipulated by other API functions,
+ * like @c edje_edit_part_add(), for example. If desired, the new
+ * group can be actually commited the respective .edj by use of @c
+ * edje_edit_save().
+ *
+ */
+EAPI Eina_Bool
 edje_edit_group_add(Evas_Object *obj, const char *name)
 {
    Edje_Part_Collection_Directory_Entry *de;
@@ -658,7 +680,7 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
 
    GET_ED_OR_RETURN(0);
 
-   printf("ADD GROUP: %s \n", name);
+   //printf("ADD GROUP: %s \n", name);
 
    /* check if a group with the same name already exists */
    EINA_LIST_FOREACH(ed->file->collection_dir->entries, l, d)
@@ -666,10 +688,10 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
        return 0;
 
    /* Create structs */
-   de = mem_alloc(SZ(Edje_Part_Collection_Directory_Entry));
+   de = _alloc(sizeof(Edje_Part_Collection_Directory_Entry));
    if (!de) return 0;
 
-   pc = mem_alloc(SZ(Edje_Part_Collection));
+   pc = _alloc(sizeof(Edje_Part_Collection));
    if (!pc)
      {
 	free(de);
@@ -681,7 +703,7 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
    search = 0;
    while (!id)
      {
-	unsigned char found = 0;
+	Eina_Bool found = 0;
 
 	EINA_LIST_FOREACH(ed->file->collection_dir->entries, l, d)
 	  {
@@ -699,9 +721,9 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
      }
 
    /* Init Edje_Part_Collection_Directory_Entry */
-   printf(" new id: %d\n", id);
+   //printf(" new id: %d\n", id);
    de->id = id;
-   de->entry = mem_strdup(name);
+   de->entry = strdup(name);
    ed->file->collection_dir->entries = eina_list_append(ed->file->collection_dir->entries, de);
 
    /* Init Edje_Part_Collection */
@@ -713,7 +735,7 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
    pc->script = NULL;
    pc->part = eina_stringshare_add(name);
 
-   //cd = mem_alloc(SZ(Code));
+   //cd = _alloc(sizeof(Code));
    //codes = eina_list_append(codes, cd);
 
    if (!ed->file->collection_hash)
@@ -723,8 +745,19 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
    return 1;
 }
 
-
-EAPI unsigned char
+/**
+ * @brief Delete an edje object's current group.
+ *
+ * @param obj The pointer to the edje object.
+ *
+ * @return @c 1 on success, @c 0 on failure.
+ *
+ * This function deletes the group which @a obj is set to. This
+ * operation can be commited the the .edj file the object was loaded
+ * with by use of @c edje_edit_save().
+ *
+ */
+EAPI Eina_Bool
 edje_edit_group_del(Evas_Object *obj)
 {
    char buf[32];
@@ -737,7 +770,7 @@ edje_edit_group_del(Evas_Object *obj)
    GET_ED_OR_RETURN(0);
 
    g = ed->collection;
-   printf("REMOVE GROUP: %s [id: %d]\n", g->part, g->id);
+   //printf("REMOVE GROUP: %s [id: %d]\n", g->part, g->id);
 
    /* Don't remove the last group */
    if (eina_list_count(ed->file->collection_dir->entries) < 2)
@@ -751,7 +784,7 @@ edje_edit_group_del(Evas_Object *obj)
 	        "for writing output\n", ed->file->path);
 	return 0;
      }
-   snprintf(buf, SZ(buf), "collections/%d", g->id);
+   snprintf(buf, sizeof(buf), "collections/%d", g->id);
    eet_delete(eetf, buf);
    eet_close(eetf);
 
@@ -768,7 +801,7 @@ edje_edit_group_del(Evas_Object *obj)
    /* Update collection_dir */
    EINA_LIST_FOREACH(ed->file->collection_dir->entries, l, e)
      {
-	printf("  id: %d  entry: %s\n", e->id, e->entry);
+	//printf("  id: %d  entry: %s\n", e->id, e->entry);
 	if (e->id == g->id)
 	  {
 	     ed->file->collection_dir->entries =
@@ -792,7 +825,7 @@ edje_edit_group_del(Evas_Object *obj)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_group_exist(Evas_Object *obj, const char *group)
 {
    Eina_List *l;
@@ -806,7 +839,7 @@ edje_edit_group_exist(Evas_Object *obj, const char *group)
    return 0;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_group_name_set(Evas_Object *obj, const char *new_name)
 {
    Eina_List *l;
@@ -816,12 +849,15 @@ edje_edit_group_name_set(Evas_Object *obj, const char *new_name)
    GET_ED_OR_RETURN(0);
 
    if (!new_name) return 0;
-   if (edje_edit_group_exist(obj, new_name)) return 0;
 
    pc = ed->collection;
 
-   printf("Set name of current group: %s [id: %d][new name: %s]\n",
-	 pc->part, pc->id, new_name);
+   if (!strcmp(pc->part, new_name)) return 1;
+
+   if (edje_edit_group_exist(obj, new_name)) return 0;
+
+   //printf("Set name of current group: %s [id: %d][new name: %s]\n",
+	// pc->part, pc->id, new_name);
 
    //if (pc->part && ed->file->free_strings) eina_stringshare_del(pc->part); TODO FIXME
    pc->part = eina_stringshare_add(new_name);
@@ -851,7 +887,7 @@ edje_edit_group_name_set(Evas_Object *obj, const char *new_name)
 EAPI int
 edje_edit_group_min_w_get(Evas_Object *obj)
 {
-   printf("Get min_w of group\n");
+   //printf("Get min_w of group\n");
    GET_ED_OR_RETURN(-1);
    if (!ed->collection) return -1;
    return ed->collection->prop.min.w;
@@ -860,7 +896,7 @@ edje_edit_group_min_w_get(Evas_Object *obj)
 EAPI void
 edje_edit_group_min_w_set(Evas_Object *obj, int w)
 {
-   printf("Set min_w of group [new w: %d]\n", w);
+   //printf("Set min_w of group [new w: %d]\n", w);
    GET_ED_OR_RETURN();
    ed->collection->prop.min.w = w;
 }
@@ -868,7 +904,7 @@ edje_edit_group_min_w_set(Evas_Object *obj, int w)
 EAPI int
 edje_edit_group_min_h_get(Evas_Object *obj)
 {
-   printf("Get min_h of group\n");
+   //printf("Get min_h of group\n");
    GET_ED_OR_RETURN(-1);
    if (!ed->collection) return -1;
    return ed->collection->prop.min.h;
@@ -877,7 +913,7 @@ edje_edit_group_min_h_get(Evas_Object *obj)
 EAPI void
 edje_edit_group_min_h_set(Evas_Object *obj, int h)
 {
-   printf("Set min_h of group [new h: %d]\n", h);
+   //printf("Set min_h of group [new h: %d]\n", h);
    GET_ED_OR_RETURN();
    ed->collection->prop.min.h = h;
 }
@@ -885,7 +921,7 @@ edje_edit_group_min_h_set(Evas_Object *obj, int h)
 EAPI int
 edje_edit_group_max_w_get(Evas_Object *obj)
 {
-   printf("Get max_w of group\n");
+   //printf("Get max_w of group\n");
    GET_ED_OR_RETURN(-1);
    if (!ed->collection) return -1;
    return ed->collection->prop.max.w;
@@ -894,7 +930,7 @@ edje_edit_group_max_w_get(Evas_Object *obj)
 EAPI void
 edje_edit_group_max_w_set(Evas_Object *obj, int w)
 {
-   printf("Set max_w of group: [new w: %d]\n", w);
+   //printf("Set max_w of group: [new w: %d]\n", w);
    GET_ED_OR_RETURN();
    ed->collection->prop.max.w = w;
 }
@@ -902,7 +938,7 @@ edje_edit_group_max_w_set(Evas_Object *obj, int w)
 EAPI int
 edje_edit_group_max_h_get(Evas_Object *obj)
 {
-   printf("Get max_h of group\n");
+   //printf("Get max_h of group\n");
    GET_ED_OR_RETURN(-1);
    if (!ed->collection) return -1;
    return ed->collection->prop.max.h;
@@ -911,7 +947,7 @@ edje_edit_group_max_h_get(Evas_Object *obj)
 EAPI void
 edje_edit_group_max_h_set(Evas_Object *obj, int h)
 {
-   printf("Set max_h of group: [new h: %d]\n", h);
+   //printf("Set max_h of group: [new h: %d]\n", h);
    GET_ED_OR_RETURN();
    ed->collection->prop.max.h = h;
 }
@@ -938,7 +974,7 @@ edje_edit_data_list_get(Evas_Object * obj)
    return datas;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_data_add(Evas_Object *obj, const char *itemname, const char *value)
 {
    Eina_List *l;
@@ -954,7 +990,7 @@ edje_edit_data_add(Evas_Object *obj, const char *itemname, const char *value)
      if (strcmp(dd->key, itemname) == 0)
        return 0;
 
-   d = mem_alloc(sizeof(Edje_Data));
+   d = _alloc(sizeof(Edje_Data));
    if (!d) return 0;
 
    d->key = (char*)eina_stringshare_add(itemname);
@@ -966,7 +1002,7 @@ edje_edit_data_add(Evas_Object *obj, const char *itemname, const char *value)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_data_del(Evas_Object *obj, const char *itemname)
 {
    Eina_List *l;
@@ -1009,7 +1045,7 @@ edje_edit_data_value_get(Evas_Object * obj, char *itemname)
    return NULL;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_data_value_set(Evas_Object *obj, const char *itemname, const char *value)
 {
    Eina_List *l;
@@ -1031,7 +1067,7 @@ edje_edit_data_value_set(Evas_Object *obj, const char *itemname, const char *val
    return 0;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_data_name_set(Evas_Object *obj, const char *itemname,  const char *newname)
 {
    Eina_List *l;
@@ -1068,14 +1104,14 @@ edje_edit_color_classes_list_get(Evas_Object * obj)
 
    if (!ed->file || !ed->file->color_classes)
       return NULL;
-   printf("GET CLASSES LIST %d %d\n", eina_list_count(ed->color_classes), eina_list_count(ed->file->color_classes));
+   //printf("GET CLASSES LIST %d %d\n", eina_list_count(ed->color_classes), eina_list_count(ed->file->color_classes));
    EINA_LIST_FOREACH(ed->file->color_classes, l, cc)
      classes = eina_list_append(classes, eina_stringshare_add(cc->name));
 
    return classes;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_color_class_colors_get(Evas_Object *obj, const char *class_name, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
 {
    Eina_List *l;
@@ -1109,7 +1145,7 @@ edje_edit_color_class_colors_get(Evas_Object *obj, const char *class_name, int *
    return 0;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_color_class_colors_set(Evas_Object *obj, const char *class_name, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
 {
    Eina_List *l;
@@ -1143,7 +1179,7 @@ edje_edit_color_class_colors_set(Evas_Object *obj, const char *class_name, int r
    return 0;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_color_class_add(Evas_Object *obj, const char *name)
 {
    Eina_List *l;
@@ -1159,7 +1195,7 @@ edje_edit_color_class_add(Evas_Object *obj, const char *name)
      if (strcmp(cc->name, name) == 0)
        return 0;
 
-   c = mem_alloc(sizeof(Edje_Color_Class));
+   c = _alloc(sizeof(Edje_Color_Class));
    if (!c) return 0;
 
    c->name = (char*)eina_stringshare_add(name);
@@ -1172,7 +1208,7 @@ edje_edit_color_class_add(Evas_Object *obj, const char *name)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_color_class_del(Evas_Object *obj, const char *name)
 {
    Eina_List *l;
@@ -1194,7 +1230,7 @@ edje_edit_color_class_del(Evas_Object *obj, const char *name)
    return 0;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_color_class_name_set(Evas_Object *obj, const char *name, const char *newname)
 {
    Eina_List *l;
@@ -1233,24 +1269,24 @@ edje_edit_styles_list_get(Evas_Object * obj)
 
    if (!ed->file || !ed->file->styles)
       return NULL;
-   printf("GET STYLES LIST %d\n", eina_list_count(ed->file->styles));
+   //printf("GET STYLES LIST %d\n", eina_list_count(ed->file->styles));
    EINA_LIST_FOREACH(ed->file->styles, l, s)
      styles = eina_list_append(styles, eina_stringshare_add(s->name));
 
    return styles;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_style_add(Evas_Object * obj, const char* style)
 {
    Edje_Style *s;
    GET_ED_OR_RETURN(0);
-   printf("ADD STYLE '%s'\n", style);
+   //printf("ADD STYLE '%s'\n", style);
 
    s = _edje_edit_style_get(ed, style);
    if (s) return 0;
 
-   s = mem_alloc(sizeof(Edje_Style));
+   s = _alloc(sizeof(Edje_Style));
    if (!s) return 0;
    s->name = (char*)eina_stringshare_add(style);
    s->tags = NULL;
@@ -1266,7 +1302,7 @@ edje_edit_style_del(Evas_Object * obj, const char* style)
    Edje_Style *s;
    
    GET_ED_OR_RETURN();
-   printf("DEL STYLE '%s'\n", style);
+   //printf("DEL STYLE '%s'\n", style);
    
    s = _edje_edit_style_get(ed, style);
    if (!s) return;
@@ -1299,7 +1335,7 @@ EAPI Eina_List *
 edje_edit_style_tags_list_get(Evas_Object * obj, const char* style)
 {
    Eina_List *tags = NULL;
-   Eina_List *l, *ll;
+   Eina_List *l;
    Edje_Style *s;
    Edje_Style_Tag *t;
 
@@ -1309,8 +1345,8 @@ edje_edit_style_tags_list_get(Evas_Object * obj, const char* style)
 
    s = _edje_edit_style_get(ed, style);
 
-   printf("GET STYLE TAG LIST %d\n", eina_list_count(s->tags));
-   EINA_LIST_FOREACH(s->tags, ll, t)
+   //printf("GET STYLE TAG LIST %d\n", eina_list_count(s->tags));
+   EINA_LIST_FOREACH(s->tags, l, t)
       tags = eina_list_append(tags, eina_stringshare_add(t->key));
 
    return tags;
@@ -1322,7 +1358,7 @@ edje_edit_style_tag_name_set(Evas_Object * obj, const char* style, const char* t
    Edje_Style_Tag *t;
 
    GET_ED_OR_RETURN();
-   printf("SET TAG NAME for '%s' FOR STYLE '%s'\n", tag, style);
+   //printf("SET TAG NAME for '%s' FOR STYLE '%s'\n", tag, style);
 
    if (!ed->file || !ed->file->styles || !style || !tag)
       return;
@@ -1339,7 +1375,7 @@ edje_edit_style_tag_value_get(Evas_Object * obj, const char* style, const char*
    Edje_Style_Tag *t;
 
    GET_ED_OR_RETURN(NULL);
-   printf("GET TAG '%s' FOR STYLE '%s'\n", tag, style);
+   //printf("GET TAG '%s' FOR STYLE '%s'\n", tag, style);
 
    if (!ed->file || !ed->file->styles || !style || !tag)
       return NULL;
@@ -1357,7 +1393,7 @@ edje_edit_style_tag_value_set(Evas_Object * obj, const char* style, const char*
    Edje_Style_Tag *t;
 
    GET_ED_OR_RETURN();
-   printf("SET TAG VALUE for '%s' FOR STYLE '%s'\n", tag, style);
+   //printf("SET TAG VALUE for '%s' FOR STYLE '%s'\n", tag, style);
 
    if (!ed->file || !ed->file->styles || !style || !tag)
       return;
@@ -1368,21 +1404,21 @@ edje_edit_style_tag_value_set(Evas_Object * obj, const char* style, const char*
    t->value = eina_stringshare_add(new_value);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_style_tag_add(Evas_Object * obj, const char* style, const char* tag_name)
 {
    Edje_Style *s;
    Edje_Style_Tag *t;
    
    GET_ED_OR_RETURN(0);
-   printf("ADD TAG '%s' IN STYLE '%s'\n", tag_name, style);
+   //printf("ADD TAG '%s' IN STYLE '%s'\n", tag_name, style);
 
    t = _edje_edit_style_tag_get(ed, style, tag_name);
    if (t) return 0;
    s = _edje_edit_style_get(ed, style);
    if (!s) return 0;
 
-   t = mem_alloc(sizeof(Edje_Style_Tag));
+   t = _alloc(sizeof(Edje_Style_Tag));
    if (!t) return 0;
    t->key = eina_stringshare_add(tag_name);
    t->value = NULL;
@@ -1400,7 +1436,7 @@ edje_edit_style_tag_del(Evas_Object * obj, const char* style, const char* tag)
    Edje_Style_Tag *t;
    
    GET_ED_OR_RETURN();
-   printf("DEL TAG '%s' IN STYLE '%s'\n", tag, style);
+   //printf("DEL TAG '%s' IN STYLE '%s'\n", tag, style);
    
    s = _edje_edit_style_get(ed, style);
    t = _edje_edit_style_tag_get(ed, style, tag);
@@ -1414,6 +1450,68 @@ edje_edit_style_tag_del(Evas_Object * obj, const char* style, const char* tag)
    t = NULL;
 }
 
+/*******************/
+/*  EXTERNALS API  */
+/*******************/
+
+EAPI Eina_List *
+edje_edit_externals_list_get(Evas_Object *obj)
+{
+   Eina_List *externals = NULL;
+   Eina_List *l;
+   Edje_External_Directory_Entry *e;
+
+   GET_ED_OR_RETURN(NULL);
+
+   if (!ed->file || !ed->file->external_dir)
+      return NULL;
+   //printf("GET STYLES LIST %d\n", eina_list_count(ed->file->styles));
+   EINA_LIST_FOREACH(ed->file->external_dir->entries, l, e)
+     externals = eina_list_append(externals, eina_stringshare_add(e->entry));
+
+   return externals;
+}
+
+EAPI Eina_Bool
+edje_edit_external_add(Evas_Object *obj, const char *external)
+{
+   Edje_External_Directory_Entry *e;
+   GET_ED_OR_RETURN(0);
+
+   e = _edje_edit_external_get(ed, external);
+   if (e) return 0;
+
+   e = _alloc(sizeof(Edje_External_Directory_Entry));
+   if (!e) return 0;
+   e->entry = (char*)eina_stringshare_add(external);
+
+   if (!ed->file->external_dir)
+     ed->file->external_dir = _alloc(sizeof(Edje_External_Directory));
+   ed->file->external_dir->entries = eina_list_append(ed->file->external_dir->entries, e);
+   return 1;
+}
+
+EAPI void
+edje_edit_external_del(Evas_Object *obj, const char *external)
+{
+   Edje_External_Directory_Entry *e;
+
+   GET_ED_OR_RETURN();
+
+   e = _edje_edit_external_get(ed, external);
+   if (!e) return;
+
+   ed->file->external_dir->entries = eina_list_remove(ed->file->external_dir->entries, e);
+   if (!ed->file->external_dir->entries)
+     {
+	free(ed->file->external_dir);
+	ed->file->external_dir = NULL;
+     }
+
+   _edje_if_string_free(ed, e->entry);
+   free(e);
+}
+
 /***************/
 /*  PARTS API  */
 /***************/
@@ -1440,15 +1538,16 @@ edje_edit_parts_list_get(Evas_Object *obj)
    return parts;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_name_set(Evas_Object *obj, const char* part, const char* new_name)
 {
    GET_RP_OR_RETURN(0);
 
    if (!new_name) return 0;
+   if (!strcmp(part, new_name)) return 1;
    if (_edje_real_part_get(ed, new_name)) return 0;
 
-   printf("Set name of part: %s [new name: %s]\n", part, new_name);
+   //printf("Set name of part: %s [new name: %s]\n", part, new_name);
 
    _edje_if_string_free(ed, rp->part->name);
    rp->part->name = (char *)eina_stringshare_add(new_name);
@@ -1456,8 +1555,8 @@ edje_edit_part_name_set(Evas_Object *obj, const char* part, const char* new_name
    return 1;
 }
 
-EAPI unsigned char
-edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
+Eina_Bool
+_edje_edit_real_part_add(Evas_Object *obj, const char *name, Edje_Part_Type type, const char *source)
 {
    Edje_Part_Collection *pc;
    Edje_Part *ep;
@@ -1465,22 +1564,22 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
 
    GET_ED_OR_RETURN(0);
 
-   printf("ADD PART: %s [type: %d]\n", name, type);
+   //printf("ADD PART: %s [type: %d]\n", name, type);
 
    /* Check if part already exists */
    if (_edje_real_part_get(ed, name))
-     return FALSE;
+     return EINA_FALSE;
 
    /* Alloc Edje_Part or return */
-   ep = mem_alloc(sizeof(Edje_Part));
-   if (!ep) return FALSE;
+   ep = _alloc(sizeof(Edje_Part));
+   if (!ep) return EINA_FALSE;
 
    /* Alloc Edje_Real_Part or return */
-   rp = mem_alloc(sizeof(Edje_Real_Part));
+   rp = _alloc(sizeof(Edje_Real_Part));
    if (!rp)
      {
 	free(ep);
-	return FALSE;
+	return EINA_FALSE;
      }
 
    /* Init Edje_Part */
@@ -1499,6 +1598,8 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
    ep->clip_to_id = -1;
    ep->dragable.confine_id = -1;
    ep->dragable.events_id = -1;
+   if (source)
+     ep->source = eina_stringshare_add(source);
 
    ep->default_desc = NULL;
    ep->other_desc = NULL;
@@ -1519,7 +1620,8 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
 	evas_object_text_font_source_set(rp->object, ed->path);
      }
    else if (ep->type == EDJE_PART_TYPE_SWALLOW ||
-	    ep->type == EDJE_PART_TYPE_GROUP)
+	    ep->type == EDJE_PART_TYPE_GROUP ||
+	    ep->type == EDJE_PART_TYPE_EXTERNAL)
      {
 	rp->object = evas_object_rectangle_add(ed->evas);
 	evas_object_color_set(rp->object, 0, 0, 0, 0);
@@ -1556,10 +1658,15 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
 	     if (ep->precise_is_inside)
 	       evas_object_precise_is_inside_set(rp->object, 1);
 	  }
+	if (ep->type == EDJE_PART_TYPE_EXTERNAL)
+	  {
+	     Evas_Object *child;
+	     child = _edje_external_type_add(source, evas_object_evas_get(obj), obj, NULL);
+	     if (child)
+	       _edje_real_part_swallow(rp, child);
+	  }
 	evas_object_clip_set(rp->object, ed->clipper);
      }
-   rp->drag.step.x = ep->dragable.step_x;
-   rp->drag.step.y = ep->dragable.step_y;
    rp->gradient_id = -1;
 
 
@@ -1578,10 +1685,26 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type)
 
    edje_object_calc_force(obj);
 
-   return TRUE;
+   return EINA_TRUE;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
+edje_edit_part_add(Evas_Object *obj, const char *name, Edje_Part_Type type)
+{
+   if (type == EDJE_PART_TYPE_EXTERNAL)
+     return EINA_FALSE;
+   return _edje_edit_real_part_add(obj, name, type, NULL);
+}
+
+EAPI Eina_Bool
+edje_edit_part_external_add(Evas_Object *obj, const char *name, const char *source)
+{
+   if (!source)
+     return EINA_FALSE;
+   return _edje_edit_real_part_add(obj, name, EDJE_PART_TYPE_EXTERNAL, source);
+}
+
+EAPI Eina_Bool
 edje_edit_part_del(Evas_Object *obj, const char* part)
 {
    Edje_Part *ep;
@@ -1590,12 +1713,12 @@ edje_edit_part_del(Evas_Object *obj, const char* part)
 
    GET_RP_OR_RETURN(0);
 
-   printf("REMOVE PART: %s\n", part);
+   //printf("REMOVE PART: %s\n", part);
 
    ep = rp->part;
    id = ep->id;
 
-   if (ed->table_parts_size <= 1) return FALSE; //don't remove the last part
+   if (ed->table_parts_size <= 1) return EINA_FALSE; //don't remove the last part
 
    /* Unlik Edje_Real_Parts that link to the removed one */
    int i;
@@ -1614,22 +1737,29 @@ edje_edit_part_del(Evas_Object *obj, const char* part)
 	if (real->param1.rel2_to_x == rp) real->param1.rel2_to_x = NULL;
 	if (real->param1.rel2_to_y == rp) real->param1.rel2_to_y = NULL;
 
-	if (real->param2.rel1_to_x == rp) real->param2.rel1_to_x = NULL;
-	if (real->param2.rel1_to_y == rp) real->param2.rel1_to_y = NULL;
-	if (real->param2.rel2_to_x == rp) real->param2.rel2_to_x = NULL;
-	if (real->param2.rel2_to_y == rp) real->param2.rel2_to_y = NULL;
+	if (real->param2)
+	  {
+	     if (real->param2->rel1_to_x == rp) real->param2->rel1_to_x = NULL;
+	     if (real->param2->rel1_to_y == rp) real->param2->rel1_to_y = NULL;
+	     if (real->param2->rel2_to_x == rp) real->param2->rel2_to_x = NULL;
+	     if (real->param2->rel2_to_y == rp) real->param2->rel2_to_y = NULL;
+	  }
 
-	if (real->custom.rel1_to_x == rp) real->custom.rel1_to_x = NULL;
-	if (real->custom.rel1_to_y == rp) real->custom.rel1_to_y = NULL;
-	if (real->custom.rel2_to_x == rp) real->custom.rel2_to_x = NULL;
-	if (real->custom.rel2_to_y == rp) real->custom.rel2_to_y = NULL;
+	if (real->custom)
+	  {
+	     if (real->custom->rel1_to_x == rp) real->custom->rel1_to_x = NULL;
+	     if (real->custom->rel1_to_y == rp) real->custom->rel1_to_y = NULL;
+	     if (real->custom->rel2_to_x == rp) real->custom->rel2_to_x = NULL;
+	     if (real->custom->rel2_to_y == rp) real->custom->rel2_to_y = NULL;
+	  }
 
 	if (real->clip_to == rp)
 	  {
 	     evas_object_clip_set(real->object, ed->clipper);
 	     real->clip_to = NULL;
 	  }
-	//TODO confine ??
+	if (real->drag && real->drag->confine_to == rp)
+	  real->drag->confine_to = NULL;
      }
 
    /* Unlink all the parts and descriptions that refer to id */
@@ -1662,17 +1792,17 @@ edje_edit_part_del(Evas_Object *obj, const char* part)
 
 
    edje_object_calc_force(obj);
-   return TRUE;
+   return EINA_TRUE;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_exist(Evas_Object *obj, const char *part)
 {
    GET_RP_OR_RETURN(0);
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_restack_below(Evas_Object *obj, const char* part)
 {
    Edje_Part_Collection *group;
@@ -1680,7 +1810,7 @@ edje_edit_part_restack_below(Evas_Object *obj, const char* part)
 
    GET_RP_OR_RETURN(0);
 
-   printf("RESTACK PART: %s BELOW\n", part);
+   //printf("RESTACK PART: %s BELOW\n", part);
 
    if (rp->part->id < 1) return 0;
    group = ed->collection;
@@ -1693,11 +1823,13 @@ edje_edit_part_restack_below(Evas_Object *obj, const char* part)
    _edje_parts_id_switch(ed, rp, prev);
 
    evas_object_stack_below(rp->object, prev->object);
+   if (rp->swallowed_object)
+     evas_object_stack_above(rp->swallowed_object, rp->object);
 
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_restack_above(Evas_Object *obj, const char* part)
 {
    Edje_Part_Collection *group;
@@ -1705,7 +1837,7 @@ edje_edit_part_restack_above(Evas_Object *obj, const char* part)
 
    GET_RP_OR_RETURN(0);
 
-   printf("RESTACK PART: %s ABOVE\n", part);
+   //printf("RESTACK PART: %s ABOVE\n", part);
 
    if (rp->part->id >= ed->table_parts_size - 1) return 0;
 
@@ -1720,11 +1852,13 @@ edje_edit_part_restack_above(Evas_Object *obj, const char* part)
    _edje_parts_id_switch(ed, rp, next);
 
    evas_object_stack_above(rp->object, next->object);
+   if (rp->swallowed_object)
+     evas_object_stack_above(rp->swallowed_object, rp->object);
 
    return 1;
 }
 
-EAPI unsigned char
+EAPI Edje_Part_Type
 edje_edit_part_type_get(Evas_Object *obj, const char *part)
 {
    GET_RP_OR_RETURN(0);
@@ -1740,7 +1874,7 @@ edje_edit_part_selected_state_get(Evas_Object *obj, const char *part)
    GET_RP_OR_RETURN(NULL);
 
    if (!rp->chosen_description)
-     return "default 0.00";
+     return eina_stringshare_add("default 0.00");
 
    snprintf(name, PATH_MAX, "%s %.2f",
             rp->chosen_description->state.name,
@@ -1749,7 +1883,7 @@ edje_edit_part_selected_state_get(Evas_Object *obj, const char *part)
    return eina_stringshare_add(name);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_selected_state_set(Evas_Object *obj, const char *part, const char *state)
 {
    Edje_Part_Description *pd;
@@ -1759,7 +1893,7 @@ edje_edit_part_selected_state_set(Evas_Object *obj, const char *part, const char
    pd = _edje_part_description_find_byname(ed, part, state);
    if (!pd) return 0;
 
-   printf("EDJE: Set state: %s\n", pd->state.name);
+   //printf("EDJE: Set state: %s\n", pd->state.name);
    _edje_part_description_apply(ed, rp, pd->state.name, pd->state.value, NULL, 0); //WHAT IS NULL , 0
 
    edje_object_calc_force(obj);
@@ -1773,7 +1907,7 @@ edje_edit_part_clip_to_get(Evas_Object *obj, const char *part)
 
    GET_RP_OR_RETURN(NULL);
 
-   printf("Get clip_to for part: %s [to_id: %d]\n", part, rp->part->clip_to_id);
+   //printf("Get clip_to for part: %s [to_id: %d]\n", part, rp->part->clip_to_id);
    if (rp->part->clip_to_id < 0) return NULL;
 
    clip = ed->table_parts[rp->part->clip_to_id % ed->table_parts_size];
@@ -1782,7 +1916,7 @@ edje_edit_part_clip_to_get(Evas_Object *obj, const char *part)
    return eina_stringshare_add(clip->part->name);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_clip_to_set(Evas_Object *obj, const char *part, const char *clip_to)
 {
    Edje_Real_Part *clip;
@@ -1792,7 +1926,7 @@ edje_edit_part_clip_to_set(Evas_Object *obj, const char *part, const char *clip_
    /* unset clipping */
    if (!clip_to)
      {
-	printf("UnSet clip_to for part: %s\n", part);
+	//printf("UnSet clip_to for part: %s\n", part);
 
 	if (rp->clip_to->object)
 	  {
@@ -1813,7 +1947,7 @@ edje_edit_part_clip_to_set(Evas_Object *obj, const char *part, const char *clip_
      }
 
    /* set clipping */
-   printf("Set clip_to for part: %s [to: %s]\n", part, clip_to);
+   //printf("Set clip_to for part: %s [to: %s]\n", part, clip_to);
    clip = _edje_real_part_get(ed, clip_to);
    if (!clip || !clip->part) return 0;
    rp->part->clip_to_id = clip->part->id;
@@ -1828,7 +1962,7 @@ edje_edit_part_clip_to_set(Evas_Object *obj, const char *part, const char *clip_
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_mouse_events_get(Evas_Object *obj, const char *part)
 {
    GET_RP_OR_RETURN(0);
@@ -1837,13 +1971,13 @@ edje_edit_part_mouse_events_get(Evas_Object *obj, const char *part)
 }
 
 EAPI void
-edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, unsigned char mouse_events)
+edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, Eina_Bool mouse_events)
 {
    GET_RP_OR_RETURN();
 
    if (!rp->object) return;
 
-   printf("Set mouse_events for part: %s [%d]\n", part, mouse_events);
+   //printf("Set mouse_events for part: %s [%d]\n", part, mouse_events);
 
    rp->part->mouse_events = mouse_events ? 1 : 0;
 
@@ -1859,7 +1993,7 @@ edje_edit_part_mouse_events_set(Evas_Object *obj, const char *part, unsigned cha
      }
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_repeat_events_get(Evas_Object *obj, const char *part)
 {
    GET_RP_OR_RETURN(0);
@@ -1869,13 +2003,13 @@ edje_edit_part_repeat_events_get(Evas_Object *obj, const char *part)
 }
 
 EAPI void
-edje_edit_part_repeat_events_set(Evas_Object *obj, const char *part, unsigned char repeat_events)
+edje_edit_part_repeat_events_set(Evas_Object *obj, const char *part, Eina_Bool repeat_events)
 {
    GET_RP_OR_RETURN();
 
    if (!rp->object) return;
 
-   printf("Set repeat_events for part: %s [%d]\n", part, repeat_events);
+   //printf("Set repeat_events for part: %s [%d]\n", part, repeat_events);
 
    rp->part->repeat_events = repeat_events ? 1 : 0;
 
@@ -1899,7 +2033,7 @@ edje_edit_part_ignore_flags_set(Evas_Object *obj, const char *part, Evas_Event_F
    GET_RP_OR_RETURN();
 
    if (!rp->object) return;
-   printf("Set ignore_flags for part: %s [%#x]\n", part, ignore_flags);
+   //printf("Set ignore_flags for part: %s [%#x]\n", part, ignore_flags);
 
    rp->part->ignore_flags = ignore_flags;
 }
@@ -1911,18 +2045,21 @@ edje_edit_part_source_get(Evas_Object *obj, const char *part)
 
    GET_RP_OR_RETURN(NULL);
 
-   printf("Get source for part: %s\n", part);
+   //printf("Get source for part: %s\n", part);
    if (!rp->part->source) return NULL;
 
    return eina_stringshare_add(rp->part->source);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_part_source_set(Evas_Object *obj, const char *part, const char *source)
 {
    GET_RP_OR_RETURN(0);
 
-   printf("Set source for part: %s [source: %s]\n", part, source);
+   //printf("Set source for part: %s [source: %s]\n", part, source);
+
+   if (rp->part->type == EDJE_PART_TYPE_EXTERNAL)
+     return 0;
 
    _edje_if_string_free(ed, rp->part->source);
 
@@ -1944,8 +2081,23 @@ EAPI void
 edje_edit_part_drag_x_set(Evas_Object *obj, const char *part, int drag)
 {
    GET_RP_OR_RETURN();
-   printf("Set dragX for part: %s\n", part);
+   //printf("Set dragX for part: %s\n", part);
    rp->part->dragable.x = drag;
+
+   if (!drag && !rp->part->dragable.y)
+     {
+	free(rp->drag);
+	rp->drag = NULL;
+	return ;
+     }
+
+   if (rp->drag) return;
+
+   rp->drag = _alloc(sizeof (Edje_Real_Part_Drag));
+   if (!rp->drag) return;
+
+   rp->drag->step.x = rp->part->dragable.step_x;
+   rp->drag->step.y = rp->part->dragable.step_y;
 }
 
 EAPI int
@@ -1960,8 +2112,23 @@ EAPI void
 edje_edit_part_drag_y_set(Evas_Object *obj, const char *part, int drag)
 {
    GET_RP_OR_RETURN();
-   printf("Set dragY for part: %s\n", part);
+   //printf("Set dragY for part: %s\n", part);
    rp->part->dragable.y = drag;
+
+   if (!drag && !rp->part->dragable.x)
+     {
+	free(rp->drag);
+	rp->drag = NULL;
+	return ;
+     }
+
+   if (rp->drag) return;
+
+   rp->drag = _alloc(sizeof (Edje_Real_Part_Drag));
+   if (!rp->drag) return;
+
+   rp->drag->step.x = rp->part->dragable.step_x;
+   rp->drag->step.y = rp->part->dragable.step_y;
 }
 
 EAPI int
@@ -1976,7 +2143,7 @@ EAPI void
 edje_edit_part_drag_step_x_set(Evas_Object *obj, const char *part, int step)
 {
    GET_RP_OR_RETURN();
-   printf("Set dragX_STEP for part: %s\n", part);
+   //printf("Set dragX_STEP for part: %s\n", part);
    rp->part->dragable.step_x = step;
 }
 
@@ -1992,7 +2159,7 @@ EAPI void
 edje_edit_part_drag_step_y_set(Evas_Object *obj, const char *part, int step)
 {
    GET_RP_OR_RETURN();
-   printf("Set dragY_STEP for part: %s\n", part);
+   //printf("Set dragY_STEP for part: %s\n", part);
    rp->part->dragable.step_y = step;
 }
 
@@ -2008,7 +2175,7 @@ EAPI void
 edje_edit_part_drag_count_x_set(Evas_Object *obj, const char *part, int count)
 {
    GET_RP_OR_RETURN();
-   printf("Set dragX_COUNT for part: %s\n", part);
+   //printf("Set dragX_COUNT for part: %s\n", part);
    rp->part->dragable.count_x = count;
 }
 
@@ -2024,7 +2191,7 @@ EAPI void
 edje_edit_part_drag_count_y_set(Evas_Object *obj, const char *part, int count)
 {
    GET_RP_OR_RETURN();
-   printf("Set dragY_COUNT for part: %s\n", part);
+   //printf("Set dragY_COUNT for part: %s\n", part);
    rp->part->dragable.count_y = count;
 }
 
@@ -2046,7 +2213,7 @@ EAPI void
 edje_edit_part_drag_confine_set(Evas_Object *obj, const char *part, const char *confine)
 {
    Edje_Real_Part *confine_part;
-   printf("******Set drag confine to: %s\n", confine);
+   //printf("******Set drag confine to: %s\n", confine);
    GET_RP_OR_RETURN();
 
    if (!confine)
@@ -2077,7 +2244,7 @@ EAPI void
 edje_edit_part_drag_event_set(Evas_Object *obj, const char *part, const char *event)
 {
    Edje_Real_Part *event_part;
-   printf("******Set drag event to: %s\n", event);
+   //printf("******Set drag event to: %s\n", event);
    GET_RP_OR_RETURN();
 
    if (!event)
@@ -2136,8 +2303,8 @@ edje_edit_state_name_set(Evas_Object *obj, const char *part, const char *state,
    int i;
 
    GET_PD_OR_RETURN(0);
-   printf("Set name of state: %s in part: %s [new name: %s]\n",
-          part, state, new_name);
+   //printf("Set name of state: %s in part: %s [new name: %s]\n",
+     //     part, state, new_name);
 
    if (!new_name) return 0;
 
@@ -2177,7 +2344,7 @@ edje_edit_state_name_set(Evas_Object *obj, const char *part, const char *state,
    pd->state.value = value;
 
    delim[0] = ' ';
-   printf("## SET OK %s %.2f\n", pd->state.name, pd->state.value);
+   //printf("## SET OK %s %.2f\n", pd->state.name, pd->state.value);
 
    return 1;
 }
@@ -2189,7 +2356,7 @@ edje_edit_state_del(Evas_Object *obj, const char *part, const char *state)
 
    GET_RP_OR_RETURN();
 
-   printf("REMOVE STATE: %s IN PART: %s\n", state, part);
+   //printf("REMOVE STATE: %s IN PART: %s\n", state, part);
 
    pd = _edje_part_description_find_byname(ed, part, state);
    if (!pd) return;
@@ -2206,9 +2373,10 @@ edje_edit_state_add(Evas_Object *obj, const char *part, const char *name)
 
    GET_RP_OR_RETURN();
 
-   printf("ADD STATE: %s TO PART: %s\n", name , part);
+   //printf("ADD STATE: %s TO PART: %s\n", name , part);
 
-   pd = mem_alloc(sizeof(Edje_Part_Description));
+   pd = _alloc(sizeof(Edje_Part_Description));
+   if (!pd) return;
 
    if (!rp->part->default_desc)
      rp->part->default_desc = pd;
@@ -2277,15 +2445,216 @@ edje_edit_state_add(Evas_Object *obj, const char *part, const char *name)
    pd->gradient.rel2.offset_x = -1;
    pd->gradient.rel2.offset_y = -1;
    pd->gradient.use_rel = 1;
+
+   if (rp->part->type == EDJE_PART_TYPE_EXTERNAL && rp->part->source)
+     {
+	Edje_External_Param_Info *pi;
+	pi = edje_external_param_info_get(rp->part->source);
+	while (pi && pi->name)
+	  {
+	     Edje_External_Param *p;
+	     p = _alloc(sizeof(Edje_External_Param));
+	     /* error checking.. meh */
+	     p->name = eina_stringshare_add(pi->name);
+	     p->type = pi->type;
+	     switch(p->type)
+	       {
+		case EDJE_EXTERNAL_PARAM_TYPE_INT:
+		   p->i = pi->info.i.def;
+		   break;
+		case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+		   p->d = pi->info.d.def;
+		   break;
+		case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+		   if (pi->info.s.def)
+		     p->s = eina_stringshare_add(pi->info.s.def);
+		   break;
+	       }
+	     pd->external_params = eina_list_append(pd->external_params, p);
+	     pi++;
+	  }
+	if (pd->external_params)
+	  rp->param1.external_params = _edje_external_params_parse(rp->swallowed_object, pd->external_params);
+     }
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_exist(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
    return 1;
 }
 
+EAPI Eina_Bool
+edje_edit_state_copy(Evas_Object *obj, const char *part, const char *from, const char *to)
+{
+   Edje_Part_Description *pdfrom, *pdto;
+   Edje_Part_Image_Id *i;
+   Edje_External_Param *p;
+   Eina_List *l;
+   GET_RP_OR_RETURN(0);
+
+   pdfrom = _edje_part_description_find_byname(ed, part, from);
+   if (!pdfrom)
+     return 0;
+
+   pdto = _edje_part_description_find_byname(ed, part, to);
+   if (!pdto)
+     {
+	pdto = _alloc(sizeof(Edje_Part_Description));
+	if (!pdto)
+	  return 0;
+	/* No need to check for default desc, at this point it must exist */
+	rp->part->other_desc = eina_list_append(rp->part->other_desc, pdto);
+	pdto->state.name = eina_stringshare_add(to);
+	pdto->state.value = 0.0;
+     }
+
+#define PD_COPY(_x) pdto->_x = pdfrom->_x
+#define PD_STRING_COPY(_x) _edje_if_string_free(ed, pdto->_x); \
+			   pdto->_x = eina_stringshare_add(pdfrom->_x)
+   PD_COPY(align.x);
+   PD_COPY(align.y);
+   PD_COPY(fixed.w);
+   PD_COPY(fixed.h);
+   PD_COPY(min.w);
+   PD_COPY(min.h);
+   PD_COPY(max.w);
+   PD_COPY(max.h);
+   PD_COPY(aspect.min);
+   PD_COPY(aspect.max);
+   PD_COPY(aspect.prefer);
+   PD_COPY(rel1.relative_x);
+   PD_COPY(rel1.relative_y);
+   PD_COPY(rel1.offset_x);
+   PD_COPY(rel1.offset_y);
+   PD_COPY(rel1.id_x);
+   PD_COPY(rel1.id_y);
+   PD_COPY(rel2.relative_x);
+   PD_COPY(rel2.relative_y);
+   PD_COPY(rel2.offset_x);
+   PD_COPY(rel2.offset_y);
+   PD_COPY(rel2.id_x);
+   PD_COPY(rel2.id_y);
+   EINA_LIST_FREE(pdto->image.tween_list, i)
+      free(i);
+   EINA_LIST_FOREACH(pdfrom->image.tween_list, l, i)
+     {
+	Edje_Part_Image_Id *new_i;
+	new_i = _alloc(sizeof(Edje_Part_Image_Id));
+	/* error checking? What to do if failed? Rollback, abort? */
+	new_i->id = i->id;
+	pdto->image.tween_list = eina_list_append(pdto->image.tween_list, new_i);
+     }
+   PD_STRING_COPY(gradient.type);
+   PD_STRING_COPY(gradient.params);
+   PD_COPY(gradient.id);
+   PD_COPY(gradient.use_rel);
+   PD_COPY(gradient.rel1.relative_x);
+   PD_COPY(gradient.rel1.relative_y);
+   PD_COPY(gradient.rel1.offset_x);
+   PD_COPY(gradient.rel1.offset_y);
+   PD_COPY(gradient.rel2.relative_x);
+   PD_COPY(gradient.rel2.relative_y);
+   PD_COPY(gradient.rel2.offset_x);
+   PD_COPY(gradient.rel2.offset_y);
+   PD_COPY(border.l);
+   PD_COPY(border.r);
+   PD_COPY(border.t);
+   PD_COPY(border.b);
+   PD_COPY(border.no_fill);
+   PD_COPY(fill.pos_rel_x);
+   PD_COPY(fill.rel_x);
+   PD_COPY(fill.pos_rel_y);
+   PD_COPY(fill.rel_y);
+   PD_COPY(fill.pos_abs_x);
+   PD_COPY(fill.abs_x);
+   PD_COPY(fill.pos_abs_y);
+   PD_COPY(fill.abs_y);
+   PD_COPY(fill.angle);
+   PD_COPY(fill.spread);
+   PD_COPY(fill.smooth);
+   PD_COPY(fill.type);
+   PD_STRING_COPY(color_class);
+   PD_STRING_COPY(text.text);
+   PD_STRING_COPY(text.text_class);
+   PD_STRING_COPY(text.style);
+   PD_STRING_COPY(text.font);
+   PD_STRING_COPY(text.repch);
+   PD_COPY(text.align.x);
+   PD_COPY(text.align.y);
+   PD_COPY(text.elipsis);
+   PD_COPY(text.size);
+   PD_COPY(text.id_source);
+   PD_COPY(text.id_text_source);
+   PD_COPY(text.fit_x);
+   PD_COPY(text.fit_y);
+   PD_COPY(text.min_x);
+   PD_COPY(text.min_y);
+   PD_COPY(text.max_x);
+   PD_COPY(text.max_y);
+   PD_STRING_COPY(box.layout);
+   PD_STRING_COPY(box.alt_layout);
+   PD_COPY(box.align.x);
+   PD_COPY(box.align.y);
+   PD_COPY(box.padding.x);
+   PD_COPY(box.padding.y);
+   PD_COPY(box.min.h);
+   PD_COPY(box.min.v);
+   PD_COPY(table.homogeneous);
+   PD_COPY(table.align.x);
+   PD_COPY(table.align.y);
+   PD_COPY(table.padding.x);
+   PD_COPY(table.padding.y);
+   PD_COPY(color.r);
+   PD_COPY(color.g);
+   PD_COPY(color.b);
+   PD_COPY(color.a);
+   PD_COPY(color2.r);
+   PD_COPY(color2.g);
+   PD_COPY(color2.b);
+   PD_COPY(color2.a);
+   PD_COPY(color3.r);
+   PD_COPY(color3.g);
+   PD_COPY(color3.b);
+   PD_COPY(color3.a);
+   /* XXX: optimize this, most likely we don't need to remove and add */
+   EINA_LIST_FREE(pdto->external_params, p)
+     {
+	_edje_if_string_free(ed, p->name);
+	if (p->s)
+	  _edje_if_string_free(ed, p->s);
+	free(p);
+     }
+   EINA_LIST_FOREACH(pdfrom->external_params, l, p)
+     {
+	Edje_External_Param *new_p;
+	new_p = _alloc(sizeof(Edje_External_Param));
+	new_p->name = eina_stringshare_add(p->name);
+	new_p->type = p->type;
+	switch (p->type)
+	  {
+	   case EDJE_EXTERNAL_PARAM_TYPE_INT:
+	      new_p->i = p->i;
+	      break;
+	   case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+	      new_p->d = p->d;
+	      break;
+	   case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+	      new_p->s = eina_stringshare_add(p->s);
+	      break;
+	   default:
+	      break;
+	  }
+	pdto->external_params = eina_list_append(pdto->external_params, new_p);
+     }
+   PD_COPY(visible);
+#undef PD_STRING_COPY
+#undef PD_COPY
+
+   return 1;
+}
+
 //relative
 EAPI double
 edje_edit_state_rel1_relative_x_get(Evas_Object *obj, const char *part, const char *state)
@@ -2397,7 +2766,7 @@ EAPI void
 edje_edit_state_rel1_offset_x_set(Evas_Object *obj, const char *part, const char *state, double x)
 {
    GET_PD_OR_RETURN();
-   printf("Set rel1x offset of part: %s state: %s to: %f\n", part, state, x);
+   //printf("Set rel1x offset of part: %s state: %s to: %f\n", part, state, x);
    //TODO check boudaries
    pd->rel1.offset_x = x;
    edje_object_calc_force(obj);
@@ -2407,7 +2776,7 @@ EAPI void
 edje_edit_state_rel1_offset_y_set(Evas_Object *obj, const char *part, const char *state, double y)
 {
    GET_PD_OR_RETURN();
-   printf("Set rel1y offset of part: %s state: %s to: %f\n", part, state, y);
+   //printf("Set rel1y offset of part: %s state: %s to: %f\n", part, state, y);
    //TODO check boudaries
    pd->rel1.offset_y = y;
    edje_object_calc_force(obj);
@@ -2417,7 +2786,7 @@ EAPI void
 edje_edit_state_rel2_offset_x_set(Evas_Object *obj, const char *part, const char *state, double x)
 {
    GET_PD_OR_RETURN();
-   printf("Set rel2x offset of part: %s state: %s to: %f\n", part, state, x);
+   //printf("Set rel2x offset of part: %s state: %s to: %f\n", part, state, x);
    //TODO check boudaries
    pd->rel2.offset_x = x;
    edje_object_calc_force(obj);
@@ -2427,7 +2796,7 @@ EAPI void
 edje_edit_state_rel2_offset_y_set(Evas_Object *obj, const char *part, const char *state, double y)
 {
    GET_PD_OR_RETURN();
-   printf("Set rel2y offset of part: %s state: %s to: %f\n", part, state, y);
+   //printf("Set rel2y offset of part: %s state: %s to: %f\n", part, state, y);
    //TODO check boudaries
    pd->rel2.offset_y = y;
    edje_object_calc_force(obj);
@@ -2518,7 +2887,7 @@ edje_edit_state_rel1_to_x_set(Evas_Object *obj, const char *part, const char *st
 
    GET_PD_OR_RETURN();
 
-   printf("Set rel1 to x on state: %s (to part: )\n", state);
+   //printf("Set rel1 to x on state: %s (to part: )\n", state);
 
    if (rel_to)
      {
@@ -2564,7 +2933,7 @@ edje_edit_state_rel2_to_x_set(Evas_Object *obj, const char *part, const char *st
 
    GET_PD_OR_RETURN();
 
-   printf("Set rel2 to x on state: %s (to part: )\n", state);
+   //printf("Set rel2 to x on state: %s (to part: )\n", state);
 
    if (rel_to)
      {
@@ -2712,7 +3081,7 @@ EAPI void
 edje_edit_state_align_x_set(Evas_Object *obj, const char *part, const char *state, double align)
 {
    GET_PD_OR_RETURN();
-   printf("SET ALIGN_X of state '%s' [to: %f]\n", state, align);
+   //printf("SET ALIGN_X of state '%s' [to: %f]\n", state, align);
    pd->align.x = align;
 }
 
@@ -2721,7 +3090,7 @@ edje_edit_state_align_y_set(Evas_Object *obj, const char *part, const char *stat
 {
    GET_PD_OR_RETURN();
 
-   printf("SET ALIGN_Y of state '%s' [to: %f]\n", state, align);
+   //printf("SET ALIGN_Y of state '%s' [to: %f]\n", state, align);
    pd->align.y = align;
 }
 
@@ -2731,7 +3100,7 @@ edje_edit_state_min_w_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET MIN_W of state '%s' [%d]\n", state, pd->min.w);
+   //printf("GET MIN_W of state '%s' [%d]\n", state, pd->min.w);
    return pd->min.w;
 }
 
@@ -2740,7 +3109,7 @@ edje_edit_state_min_w_set(Evas_Object *obj, const char *part, const char *state,
 {
    GET_PD_OR_RETURN();
 
-   printf("SET MIN_W of state '%s' [to: %d]\n", state, min_w);
+   //printf("SET MIN_W of state '%s' [to: %d]\n", state, min_w);
    pd->min.w = min_w;
 }
 
@@ -2749,7 +3118,7 @@ edje_edit_state_min_h_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET MIN_H of state '%s' [%d]\n", state, pd->min.h);
+   //printf("GET MIN_H of state '%s' [%d]\n", state, pd->min.h);
    return pd->min.h;
 }
 
@@ -2758,7 +3127,7 @@ edje_edit_state_min_h_set(Evas_Object *obj, const char *part, const char *state,
 {
    GET_PD_OR_RETURN();
 
-   printf("SET MIN_H of state '%s' [to: %d]\n", state, min_h);
+   //printf("SET MIN_H of state '%s' [to: %d]\n", state, min_h);
    pd->min.h = min_h;
 }
 
@@ -2767,7 +3136,7 @@ edje_edit_state_max_w_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET MAX_W of state '%s' [%d]\n", state, pd->max.w);
+   //printf("GET MAX_W of state '%s' [%d]\n", state, pd->max.w);
    return pd->max.w;
 }
 
@@ -2776,7 +3145,7 @@ edje_edit_state_max_w_set(Evas_Object *obj, const char *part, const char *state,
 {
    GET_PD_OR_RETURN();
 
-   printf("SET MAX_W of state '%s' [to: %d]\n", state, max_w);
+   //printf("SET MAX_W of state '%s' [to: %d]\n", state, max_w);
    pd->max.w = max_w;
 }
 
@@ -2785,7 +3154,7 @@ edje_edit_state_max_h_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET MAX_H of state '%s' [%d]\n", state, pd->max.h);
+   //printf("GET MAX_H of state '%s' [%d]\n", state, pd->max.h);
    return pd->max.h;
 }
 
@@ -2794,7 +3163,7 @@ edje_edit_state_max_h_set(Evas_Object *obj, const char *part, const char *state,
 {
    GET_PD_OR_RETURN();
 
-   printf("SET MAX_H of state '%s' [to: %d]\n", state, max_h);
+   //printf("SET MAX_H of state '%s' [to: %d]\n", state, max_h);
    pd->max.h = max_h;
 }
 
@@ -2804,7 +3173,7 @@ edje_edit_state_aspect_min_get(Evas_Object *obj, const char *part, const char *s
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET ASPECT_MIN of state '%s' [%f]\n", state, pd->aspect.min);
+   //printf("GET ASPECT_MIN of state '%s' [%f]\n", state, pd->aspect.min);
    return pd->aspect.min;
 }
 
@@ -2813,7 +3182,7 @@ edje_edit_state_aspect_max_get(Evas_Object *obj, const char *part, const char *s
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET ASPECT_MAX of state '%s' [%f]\n", state, pd->aspect.max);
+   //printf("GET ASPECT_MAX of state '%s' [%f]\n", state, pd->aspect.max);
    return pd->aspect.max;
 }
 
@@ -2822,7 +3191,7 @@ edje_edit_state_aspect_min_set(Evas_Object *obj, const char *part, const char *s
 {
    GET_PD_OR_RETURN();
 
-   printf("SET ASPECT_MIN of state '%s' [to: %f]\n", state, aspect);
+   //printf("SET ASPECT_MIN of state '%s' [to: %f]\n", state, aspect);
    pd->aspect.min = aspect;
 }
 
@@ -2831,7 +3200,7 @@ edje_edit_state_aspect_max_set(Evas_Object *obj, const char *part, const char *s
 {
    GET_PD_OR_RETURN();
 
-   printf("SET ASPECT_MAX of state '%s' [to: %f]\n", state, aspect);
+   //printf("SET ASPECT_MAX of state '%s' [to: %f]\n", state, aspect);
    pd->aspect.max = aspect;
 }
 
@@ -2840,7 +3209,7 @@ edje_edit_state_aspect_pref_get(Evas_Object *obj, const char *part, const char *
 {
    GET_PD_OR_RETURN(0);
 
-   printf("GET ASPECT_PREF of state '%s' [%d]\n", state, pd->aspect.prefer);
+   //printf("GET ASPECT_PREF of state '%s' [%d]\n", state, pd->aspect.prefer);
    return pd->aspect.prefer;
 }
 
@@ -2849,7 +3218,7 @@ edje_edit_state_aspect_pref_set(Evas_Object *obj, const char *part, const char *
 {
    GET_PD_OR_RETURN();
 
-   printf("SET ASPECT_PREF of state '%s' [to: %d]\n", state, pref);
+   //printf("SET ASPECT_PREF of state '%s' [to: %d]\n", state, pref);
    pd->aspect.prefer = pref;
 }
 
@@ -2891,7 +3260,7 @@ EAPI void
 edje_edit_state_fill_origin_relative_x_set(Evas_Object *obj, const char *part, const char *state, double x)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill origin of part: %s state: %s to: %f\n", part, state, x);
+   //printf("Set state fill origin of part: %s state: %s to: %f\n", part, state, x);
    pd->fill.pos_rel_x = x;
    edje_object_calc_force(obj);
 }
@@ -2900,7 +3269,7 @@ EAPI void
 edje_edit_state_fill_origin_relative_y_set(Evas_Object *obj, const char *part, const char *state, double y)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill origin of part: %s state: %s to: %f\n", part, state, y);
+   //printf("Set state fill origin of part: %s state: %s to: %f\n", part, state, y);
    pd->fill.pos_rel_y = y;
    edje_object_calc_force(obj);
 }
@@ -2909,7 +3278,7 @@ EAPI void
 edje_edit_state_fill_origin_offset_x_set(Evas_Object *obj, const char *part, const char *state, double x)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill origin offset x of part: %s state: %s to: %f\n", part, state, x);
+   //printf("Set state fill origin offset x of part: %s state: %s to: %f\n", part, state, x);
    pd->fill.pos_abs_x = x;
    edje_object_calc_force(obj);
 }
@@ -2918,7 +3287,7 @@ EAPI void
 edje_edit_state_fill_origin_offset_y_set(Evas_Object *obj, const char *part, const char *state, double y)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill origin offset y of part: %s state: %s to: %f\n", part, state, y);
+   //printf("Set state fill origin offset y of part: %s state: %s to: %f\n", part, state, y);
    pd->fill.pos_abs_y = y;
    edje_object_calc_force(obj);
 }
@@ -2959,7 +3328,7 @@ EAPI void
 edje_edit_state_fill_size_relative_x_set(Evas_Object *obj, const char *part, const char *state, double x)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill size of part: %s state: %s to: %f\n", part, state, x);
+   //printf("Set state fill size of part: %s state: %s to: %f\n", part, state, x);
    pd->fill.rel_x = x;
    edje_object_calc_force(obj);
 }
@@ -2968,7 +3337,7 @@ EAPI void
 edje_edit_state_fill_size_relative_y_set(Evas_Object *obj, const char *part, const char *state, double y)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill size of part: %s state: %s to: %f\n", part, state, y);
+   //printf("Set state fill size of part: %s state: %s to: %f\n", part, state, y);
    pd->fill.rel_y = y;
    edje_object_calc_force(obj);
 }
@@ -2977,7 +3346,7 @@ EAPI void
 edje_edit_state_fill_size_offset_x_set(Evas_Object *obj, const char *part, const char *state, double x)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill size offset x of part: %s state: %s to: %f\n", part, state, x);
+   //printf("Set state fill size offset x of part: %s state: %s to: %f\n", part, state, x);
    pd->fill.abs_x = x;
    edje_object_calc_force(obj);
 }
@@ -2986,12 +3355,12 @@ EAPI void
 edje_edit_state_fill_size_offset_y_set(Evas_Object *obj, const char *part, const char *state, double y)
 {
    GET_PD_OR_RETURN();
-   printf("Set state fill size offset y of part: %s state: %s to: %f\n", part, state, y);
+   //printf("Set state fill size offset y of part: %s state: %s to: %f\n", part, state, y);
    pd->fill.abs_y = y;
    edje_object_calc_force(obj);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_visible_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
@@ -3000,10 +3369,10 @@ edje_edit_state_visible_get(Evas_Object *obj, const char *part, const char *stat
 }
 
 EAPI void
-edje_edit_state_visible_set(Evas_Object *obj, const char *part, const char *state, unsigned char visible)
+edje_edit_state_visible_set(Evas_Object *obj, const char *part, const char *state, Eina_Bool visible)
 {
    GET_PD_OR_RETURN();
-   printf("Set state visible flag of part: %s state: %s to: %d\n", part, state, visible);
+   //printf("Set state visible flag of part: %s state: %s to: %d\n", part, state, visible);
    if (visible) pd->visible = 1;
    else         pd->visible = 0;
    edje_object_calc_force(obj);
@@ -3013,7 +3382,7 @@ EAPI const char*
 edje_edit_state_color_class_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(NULL);
-   printf("Get ColorClass of part: %s state: %s\n", part, state);
+   //printf("Get ColorClass of part: %s state: %s\n", part, state);
    return eina_stringshare_add(pd->color_class);
 }
 
@@ -3021,11 +3390,191 @@ EAPI void
 edje_edit_state_color_class_set(Evas_Object *obj, const char *part, const char *state, const char *color_class)
 {
    GET_PD_OR_RETURN();
-   printf("Set ColorClass of part: %s state: %s [to: %s]\n", part, state, color_class);
+   //printf("Set ColorClass of part: %s state: %s [to: %s]\n", part, state, color_class);
    _edje_if_string_free(ed, pd->color_class);
    pd->color_class = (char*)eina_stringshare_add(color_class);
 }
 
+EAPI const Eina_List *
+edje_edit_state_external_params_list_get(Evas_Object *obj, const char *part, const char *state)
+{
+   GET_PD_OR_RETURN(NULL);
+   return pd->external_params;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_get(Evas_Object *obj, const char *part, const char *state, const char *param, Edje_External_Param_Type *type, void **value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+	{
+	   if (type) *type = p->type;
+	   if (value)
+	      switch (p->type)
+		{
+		 case EDJE_EXTERNAL_PARAM_TYPE_INT:
+		    *value = &p->i;
+		    break;
+		 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+		    *value = &p->d;
+		    break;
+		 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+		    *value = p->s;
+		    break;
+		}
+	   return EINA_TRUE;
+	}
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_int_get(Evas_Object *obj, const char *part, const char *state, const char *param, int *value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+	{
+	   if (p->type != EDJE_EXTERNAL_PARAM_TYPE_INT)
+	     return EINA_FALSE;
+	   if (value)
+	     *value = p->i;
+	   return EINA_TRUE;
+	}
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_double_get(Evas_Object *obj, const char *part, const char *state, const char *param, double *value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+	{
+	   if (p->type != EDJE_EXTERNAL_PARAM_TYPE_DOUBLE)
+	     return EINA_FALSE;
+	   if (value)
+	     *value = p->d;
+	   return EINA_TRUE;
+	}
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_string_get(Evas_Object *obj, const char *part, const char *state, const char *param, const char **value)
+{
+   Eina_List *l;
+   Edje_External_Param *p;
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+	{
+	   if (p->type != EDJE_EXTERNAL_PARAM_TYPE_STRING)
+	     return EINA_FALSE;
+	   if (value)
+	     *value = p->s;
+	   return EINA_TRUE;
+	}
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_set(Evas_Object *obj, const char *part, const char *state, const char *param, Edje_External_Param_Type type, ...)
+{
+   va_list ap;
+   Eina_List *l;
+   Edje_External_Param *p;
+   Edje_Real_Part *rp;
+   int found = 0;
+
+   GET_PD_OR_RETURN(EINA_FALSE);
+
+   rp = _edje_real_part_get(ed, part);
+
+   va_start(ap, type);
+
+   EINA_LIST_FOREACH(pd->external_params, l, p)
+      if (!strcmp(p->name, param))
+	{
+	   found = 1;
+	   break;
+	}
+
+   if (!found)
+     {
+	p = _alloc(sizeof(Edje_External_Param));
+	if (!p)
+	  {
+	     va_end(ap);
+	     return EINA_FALSE;
+	  }
+	p->name = eina_stringshare_add(param);
+     }
+
+   p->type = type;
+   p->i = 0;
+   p->d = 0;
+   _edje_if_string_free(ed, p->s);
+   p->s = NULL;
+
+   switch (type)
+     {
+      case EDJE_EXTERNAL_PARAM_TYPE_INT:
+	 p->i = (int)va_arg(ap, int);
+	 break;
+      case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+	 p->d = (double)va_arg(ap, double);
+	 break;
+      case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+	 p->s = eina_stringshare_add((const char *)va_arg(ap, char *));
+	 break;
+     }
+
+   va_end(ap);
+
+   if (!found)
+     pd->external_params = eina_list_append(pd->external_params, p);
+
+   _edje_external_parsed_params_free(rp->swallowed_object, rp->param1.external_params);
+   rp->param1.external_params = _edje_external_params_parse(rp->swallowed_object, pd->external_params);
+
+   edje_object_calc_force(obj);
+
+   return EINA_TRUE;
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_int_set(Evas_Object *obj, const char *part, const char *state, const char *param, int value)
+{
+   return edje_edit_state_external_param_set(obj, part, state, param, EDJE_EXTERNAL_PARAM_TYPE_INT, value);
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_double_set(Evas_Object *obj, const char *part, const char *state, const char *param, double value)
+{
+   return edje_edit_state_external_param_set(obj, part, state, param, EDJE_EXTERNAL_PARAM_TYPE_DOUBLE, value);
+}
+
+EAPI Eina_Bool
+edje_edit_state_external_param_string_set(Evas_Object *obj, const char *part, const char *state, const char *param, const char *value)
+{
+   return edje_edit_state_external_param_set(obj, part, state, param, EDJE_EXTERNAL_PARAM_TYPE_STRING, value);
+}
+
 /**************/
 /*  TEXT API */
 /**************/
@@ -3141,7 +3690,7 @@ edje_edit_state_text_elipsis_set(Evas_Object *obj, const char *part, const char
    edje_object_calc_force(obj);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_text_fit_x_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
@@ -3150,7 +3699,7 @@ edje_edit_state_text_fit_x_get(Evas_Object *obj, const char *part, const char *s
 }
 
 EAPI void
-edje_edit_state_text_fit_x_set(Evas_Object *obj, const char *part, const char *state, unsigned char fit)
+edje_edit_state_text_fit_x_set(Evas_Object *obj, const char *part, const char *state, Eina_Bool fit)
 {
    GET_PD_OR_RETURN();
 
@@ -3160,7 +3709,7 @@ edje_edit_state_text_fit_x_set(Evas_Object *obj, const char *part, const char *s
    edje_object_calc_force(obj);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_text_fit_y_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(0);
@@ -3169,7 +3718,7 @@ edje_edit_state_text_fit_y_get(Evas_Object *obj, const char *part, const char *s
 }
 
 EAPI void
-edje_edit_state_text_fit_y_set(Evas_Object *obj, const char *part, const char *state, unsigned char fit)
+edje_edit_state_text_fit_y_set(Evas_Object *obj, const char *part, const char *state, Eina_Bool fit)
 {
    GET_PD_OR_RETURN();
 
@@ -3191,22 +3740,21 @@ edje_edit_fonts_list_get(Evas_Object *obj)
    if (!ed->file) return NULL;
    if (!ed->file->font_dir) return NULL;
 
-   printf("GET FONT LIST for %s\n", ed->file->path);
+   //printf("GET FONT LIST for %s\n", ed->file->path);
 
    EINA_LIST_FOREACH(ed->file->font_dir->entries, l, f)
      {
 	fonts = eina_list_append(fonts, eina_stringshare_add(f->entry));
-	printf("   Font: %s (%s) \n", f->entry, f->path);
+	//printf("   Font: %s (%s) \n", f->entry, f->path);
      }
 
    return fonts;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_font_add(Evas_Object *obj, const char* path)
 {
    char buf[PATH_MAX];
-   Font *fn;
    Edje_Font_Directory_Entry *fnt;
    Eet_File *eetf;
    struct stat st;
@@ -3217,7 +3765,7 @@ edje_edit_font_add(Evas_Object *obj, const char* path)
 
    GET_ED_OR_RETURN(0);
 
-   printf("ADD FONT: %s\n", path);
+   //printf("ADD FONT: %s\n", path);
 
    if (!path) return 0;
    if (stat(path, &st) || !S_ISREG(st.st_mode)) return 0;
@@ -3227,35 +3775,14 @@ edje_edit_font_add(Evas_Object *obj, const char* path)
 
    /* Create Font_Directory if not exist */
    if (!ed->file->font_dir)
-     ed->file->font_dir = mem_alloc(sizeof(Edje_Font_Directory));
-
-   /* Create Font */
-   fn = mem_alloc(sizeof(Font));
-   if (!fn) return 0;
+   {
+     ed->file->font_dir = _alloc(sizeof(Edje_Font_Directory));
+     if (!ed->file->font_dir) return 0;
+   }
 
    if ((name = strrchr(path, '/'))) name ++;
    else name = (char *)path;
 
-   fn->file = mem_strdup(name);
-   fn->name = mem_strdup(name);
-
-   /*{
-      Eina_List *l;
-      Font *lfn;
-
-      EINA_LIST_FOREACH(fonts, l, lfn)
-      {
-         if (!strcmp(lfn->name, fn->name))
-         {
-            free(fn->file);
-            free(fn->name);
-            free(fn);
-            return;
-         }
-      }
-   }
-   */
-
    /* Read font data from file */
    f = fopen(path, "rb");
    if (f)
@@ -3279,7 +3806,7 @@ edje_edit_font_add(Evas_Object *obj, const char* path)
 	fclose(f);
      }
    /* Write font to edje file */
-   snprintf(buf, sizeof(buf), "fonts/%s", fn->name);
+   snprintf(buf, sizeof(buf), "fonts/%s", name);
 
    if (fdata)
      {
@@ -3309,9 +3836,10 @@ edje_edit_font_add(Evas_Object *obj, const char* path)
    /* Create Edje_Font_Directory_Entry */
    if (ed->file->font_dir)
      {
-	fnt = mem_alloc(sizeof(Edje_Font_Directory_Entry));
-	fnt->entry = mem_strdup(fn->name);
-	fnt->path = mem_strdup(buf);
+	fnt = _alloc(sizeof(Edje_Font_Directory_Entry));
+	if (!fnt) return 0;
+	fnt->entry = strdup(name);
+	fnt->path = strdup(buf);
 
 	ed->file->font_dir->entries = eina_list_append(ed->file->font_dir->entries, fnt);
 	if (!ed->file->font_hash)
@@ -3327,7 +3855,7 @@ edje_edit_state_font_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(NULL);
 
-   printf("GET FONT of state: %s [%s]\n", state, pd->text.font);
+   //printf("GET FONT of state: %s [%s]\n", state, pd->text.font);
    if (!pd->text.font) return NULL;
    return eina_stringshare_add(pd->text.font);
 }
@@ -3337,7 +3865,7 @@ edje_edit_state_font_set(Evas_Object *obj, const char *part, const char *state,
 {
    GET_PD_OR_RETURN();
 
-   printf("SET FONT of state: %s [%s]\n", state, font);
+   //printf("SET FONT of state: %s [%s]\n", state, font);
 
    _edje_if_string_free(ed, pd->text.font);
    pd->text.font = (char *)eina_stringshare_add(font);
@@ -3345,21 +3873,21 @@ edje_edit_state_font_set(Evas_Object *obj, const char *part, const char *state,
    edje_object_calc_force(obj);
 }
 
-EAPI unsigned char
+EAPI Edje_Text_Effect
 edje_edit_part_effect_get(Evas_Object *obj, const char *part)
 {
    GET_RP_OR_RETURN(0);
 
-   printf("GET EFFECT of part: %s\n", part);
+   //printf("GET EFFECT of part: %s\n", part);
    return rp->part->effect;
 }
 
 EAPI void
-edje_edit_part_effect_set(Evas_Object *obj, const char *part, unsigned char effect)
+edje_edit_part_effect_set(Evas_Object *obj, const char *part, Edje_Text_Effect effect)
 {
    GET_RP_OR_RETURN();
 
-   printf("SET EFFECT of part: %s [%d]\n", part, effect);
+   //printf("SET EFFECT of part: %s [%d]\n", part, effect);
    rp->part->effect = effect;
 
    edje_object_calc_force(obj);
@@ -3381,7 +3909,7 @@ edje_edit_images_list_get(Evas_Object *obj)
    if (!ed->file) return NULL;
    if (!ed->file->image_dir) return NULL;
 
-   printf("GET IMAGES LIST for %s\n", ed->file->path);
+   //printf("GET IMAGES LIST for %s\n", ed->file->path);
 
    EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i)
      {
@@ -3393,7 +3921,7 @@ edje_edit_images_list_get(Evas_Object *obj)
    return images;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_image_add(Evas_Object *obj, const char* path)
 {
    Eina_List *l;
@@ -3410,28 +3938,32 @@ edje_edit_image_add(Evas_Object *obj, const char* path)
 
    /* Create Image_Directory if not exist */
    if (!ed->file->image_dir)
-     ed->file->image_dir = mem_alloc(sizeof(Edje_Image_Directory));
+     {
+	ed->file->image_dir = _alloc(sizeof(Edje_Image_Directory));
+	if (!ed->file->image_dir) return 0;
+     }
 
    /* Loop trough image directory to find if image exist */
-   printf("Add Image '%s' (total %d)\n", path,
-          eina_list_count(ed->file->image_dir->entries));
+   //printf("Add Image '%s' (total %d)\n", path,
+       //   eina_list_count(ed->file->image_dir->entries));
    EINA_LIST_FOREACH(ed->file->image_dir->entries, l, i)
      {
 	if (!i) return 0;
 	if (i->id >= free_id) free_id = i->id + 1; /*TODO search for free (hole) id*/
-	printf("IMG: %s [%d]\n", i->entry, i->id);
+	//printf("IMG: %s [%d]\n", i->entry, i->id);
      }
-   printf("FREE ID: %d\n", free_id);
+   //printf("FREE ID: %d\n", free_id);
 
    /* Import image */
    if (!_edje_import_image_file(ed, path, free_id))
       return 0;
 
    /* Create Image Entry */
-   de = mem_alloc(sizeof(Edje_Image_Directory_Entry));
+   de = _alloc(sizeof(Edje_Image_Directory_Entry));
+   if (!de) return 0;
    if ((name = strrchr(path, '/'))) name++;
    else name = (char *)path;
-   de->entry = mem_strdup(name);
+   de->entry = strdup(name);
    de->id = free_id;
    de->source_type = 1;
    de->source_param = 1;
@@ -3443,13 +3975,12 @@ edje_edit_image_add(Evas_Object *obj, const char* path)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_image_data_add(Evas_Object *obj, const char *name, int id)
 {
    Eina_List *l;
    Edje_Image_Directory_Entry *de;
    Edje_Image_Directory_Entry *i, *t;
-   int free_id = 0;
 
    GET_ED_OR_RETURN(0);
 
@@ -3459,7 +3990,10 @@ edje_edit_image_data_add(Evas_Object *obj, const char *name, int id)
 
    /* Create Image_Directory if not exist */
    if (!ed->file->image_dir)
-     ed->file->image_dir = mem_alloc(sizeof(Edje_Image_Directory));
+     {
+	ed->file->image_dir = _alloc(sizeof(Edje_Image_Directory));
+	if (!ed->file->image_dir) return 0;
+     }
 
    /* Loop trough image directory to find if image exist */
    t = NULL;
@@ -3471,13 +4005,16 @@ edje_edit_image_data_add(Evas_Object *obj, const char *name, int id)
 
    /* Create Image Entry */
    if (!t)
-     de = mem_alloc(sizeof(Edje_Image_Directory_Entry));
+     {
+	de = _alloc(sizeof(Edje_Image_Directory_Entry));
+	if (!de) return 0;
+     }
    else
      {
 	de = t;
 	free(de->entry);
      }
-   de->entry = mem_strdup(name);
+   de->entry = strdup(name);
    de->id = id;
    de->source_type = 1;
    de->source_param = 1;
@@ -3496,7 +4033,7 @@ edje_edit_image_id_get(Evas_Object *obj, const char *image_name)
    return _edje_image_id_find(obj, image_name);
 }
 
-EAPI int 
+EAPI Edje_Edit_Image_Comp
 edje_edit_image_compression_type_get(Evas_Object *obj, const char *image)
 {
    Edje_Image_Directory_Entry *i = NULL;
@@ -3580,7 +4117,7 @@ edje_edit_state_image_set(Evas_Object *obj, const char *part, const char *state,
    if (!image) return;
 
    id = _edje_image_id_find(obj, image);
-   printf("SET IMAGE for %s [%s]\n", state, image);
+   //printf("SET IMAGE for %s [%s]\n", state, image);
 
    if (id > -1) pd->image.id = id;
 
@@ -3608,7 +4145,7 @@ edje_edit_state_tweens_list_get(Evas_Object *obj, const char *part, const char *
    return tweens;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state, const char *tween)
 {
    Edje_Part_Image_Id *i;
@@ -3620,7 +4157,7 @@ edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state,
    if (id < 0) return 0;
 
    /* alloc Edje_Part_Image_Id */
-   i = mem_alloc(SZ(Edje_Part_Image_Id));
+   i = _alloc(sizeof(Edje_Part_Image_Id));
    if (!i) return 0;
    i->id = id;
 
@@ -3630,7 +4167,7 @@ edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state,
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_tween_del(Evas_Object *obj, const char *part, const char *state, const char *tween)
 {
    Eina_List *l;
@@ -3731,13 +4268,12 @@ edje_edit_spectrum_list_get(Evas_Object *obj)
    return spectrum;
 }
 
-
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_spectra_add(Evas_Object *obj, const char* name)
 {
    GET_ED_OR_RETURN(0);
 
-   printf("SPECTRA ADD [new name:%s]\n", name);
+   //printf("SPECTRA ADD [new name:%s]\n", name);
 
    Edje_Spectrum_Directory_Entry *s;
 
@@ -3746,9 +4282,13 @@ edje_edit_spectra_add(Evas_Object *obj, const char* name)
    if (_edje_edit_spectrum_entry_get(ed, name)) return 0;
 
    if (!ed->file->spectrum_dir)
-     ed->file->spectrum_dir = mem_alloc(SZ(Edje_Spectrum_Directory));
+     {
+	ed->file->spectrum_dir = _alloc(sizeof(Edje_Spectrum_Directory));
+	if (!ed->file->spectrum_dir) return 0;
+     }
 
-   s = mem_alloc(SZ(Edje_Spectrum_Directory_Entry));
+   s = _alloc(sizeof(Edje_Spectrum_Directory_Entry));
+   if (!s) return 0;
    ed->file->spectrum_dir->entries = eina_list_append(ed->file->spectrum_dir->entries, s);
    s->id = eina_list_count(ed->file->spectrum_dir->entries) - 1; //TODO Search for id holes
    s->entry = (char*)eina_stringshare_add(name);
@@ -3758,7 +4298,7 @@ edje_edit_spectra_add(Evas_Object *obj, const char* name)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_spectra_del(Evas_Object *obj, const char* spectra)
 {
    Edje_Spectrum_Directory_Entry *s;
@@ -3768,7 +4308,7 @@ edje_edit_spectra_del(Evas_Object *obj, const char* spectra)
    s = _edje_edit_spectrum_entry_get(ed, spectra);
    if (!s) return 0;
 
-   printf("SPECTRA DEL %s\n", spectra);
+   //printf("SPECTRA DEL %s\n", spectra);
 
    ed->file->spectrum_dir->entries = eina_list_remove(ed->file->spectrum_dir->entries, s);
    _edje_if_string_free(ed, s->entry);
@@ -3785,14 +4325,14 @@ edje_edit_spectra_del(Evas_Object *obj, const char* spectra)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_spectra_name_set(Evas_Object *obj, const char* spectra, const char* name)
 {
    Edje_Spectrum_Directory_Entry *s;
 
    GET_ED_OR_RETURN(0);
 
-   printf("SET SPECTRA NAME for spectra: %s [new name:%s]\n", spectra, name);
+   //printf("SET SPECTRA NAME for spectra: %s [new name:%s]\n", spectra, name);
 
    s = _edje_edit_spectrum_entry_get(ed, spectra);
    if (!s) return 0;
@@ -3818,14 +4358,14 @@ edje_edit_spectra_stop_num_get(Evas_Object *obj, const char* spectra)
    return eina_list_count(s->color_list);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_spectra_stop_num_set(Evas_Object *obj, const char* spectra, int num)
 {
    Edje_Spectrum_Directory_Entry *s;
    Edje_Spectrum_Color *color;
    GET_ED_OR_RETURN(0);
 
-   printf("SET SPECTRA STOP NUM for spectra: %s\n", spectra);
+   //printf("SET SPECTRA STOP NUM for spectra: %s\n", spectra);
 
    s = _edje_edit_spectrum_entry_get(ed, spectra);
    if (!s) return 0;
@@ -3843,7 +4383,8 @@ edje_edit_spectra_stop_num_set(Evas_Object *obj, const char* spectra, int num)
    //... and recreate (TODO we should optimize this function)
    while (num)
      {
-        color = mem_alloc(SZ(Edje_Spectrum_Color));
+        color = _alloc(sizeof(Edje_Spectrum_Color));
+        if (!color) return 0;
         s->color_list = eina_list_append(s->color_list, color);
         color->r = 255;
         color->g = 255;
@@ -3856,7 +4397,7 @@ edje_edit_spectra_stop_num_set(Evas_Object *obj, const char* spectra, int num)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_spectra_stop_color_get(Evas_Object *obj, const char* spectra, int stop_number, int *r, int *g, int *b, int *a, int *d)
 {
    Edje_Spectrum_Directory_Entry *s;
@@ -3878,7 +4419,7 @@ edje_edit_spectra_stop_color_get(Evas_Object *obj, const char* spectra, int stop
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_spectra_stop_color_set(Evas_Object *obj, const char* spectra, int stop_number, int r, int g, int b, int a, int d)
 {
    Edje_Spectrum_Directory_Entry *s;
@@ -3887,7 +4428,7 @@ edje_edit_spectra_stop_color_set(Evas_Object *obj, const char* spectra, int stop
 
    s = _edje_edit_spectrum_entry_get(ed, spectra);
    if (!s) return 0;
-   printf("SET SPECTRA STOP COLOR for spectra: %s stopn: %d\n", spectra, stop_number);
+   //printf("SET SPECTRA STOP COLOR for spectra: %s stopn: %d\n", spectra, stop_number);
 
    color = eina_list_nth(s->color_list, stop_number);
    if (!color) return 0;
@@ -3920,7 +4461,7 @@ edje_edit_state_gradient_type_get(Evas_Object *obj, const char *part, const char
    return eina_stringshare_add(pd->gradient.type);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_type_set(Evas_Object *obj, const char *part, const char *state, const char *type)
 {
    GET_PD_OR_RETURN(0);
@@ -3935,7 +4476,7 @@ edje_edit_state_gradient_type_set(Evas_Object *obj, const char *part, const char
 }
 
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_use_fill_get(Evas_Object *obj, const char *part, const char *state)
 {
    GET_PD_OR_RETURN(-1);
@@ -3962,14 +4503,14 @@ edje_edit_state_gradient_spectra_get(Evas_Object *obj, const char *part, const c
    return eina_stringshare_add(s->entry);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_spectra_set(Evas_Object *obj, const char *part, const char *state, const char* spectra)
 {
    Edje_Spectrum_Directory_Entry *s;
 
    GET_PD_OR_RETURN(0);
 
-   printf("SET GRADIENT SPECTRA for part: %s state: %s [%s]\n", part, state, spectra);
+   //printf("SET GRADIENT SPECTRA for part: %s state: %s [%s]\n", part, state, spectra);
 
    s = _edje_edit_spectrum_entry_get(ed, spectra);
    if (!s) return 0;
@@ -4031,7 +4572,7 @@ edje_edit_state_gradient_rel2_relative_y_get(Evas_Object *obj, const char *part,
    return pd->gradient.rel2.relative_y;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel1_relative_x_set(Evas_Object *obj, const char *part, const char *state, double val)
 {
    GET_PD_OR_RETURN(0);
@@ -4042,33 +4583,33 @@ edje_edit_state_gradient_rel1_relative_x_set(Evas_Object *obj, const char *part,
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel1_relative_y_set(Evas_Object *obj, const char *part, const char *state, double val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL1 RELY for part: %s state: %s [TO %f]\n", part, state, val);
+   //printf("SET GRADIENT REL1 RELY for part: %s state: %s [TO %f]\n", part, state, val);
 
    pd->gradient.rel1.relative_y = val;
    edje_object_calc_force(obj);
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel2_relative_x_set(Evas_Object *obj, const char *part, const char *state, double val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL2 RELX for part: %s state: %s [TO %f]\n", part, state, val);
+   //printf("SET GRADIENT REL2 RELX for part: %s state: %s [TO %f]\n", part, state, val);
 
    pd->gradient.rel2.relative_x = val;
    edje_object_calc_force(obj);
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel2_relative_y_set(Evas_Object *obj, const char *part, const char *state, double val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL2 RELY for part: %s state: %s [TO %f]\n", part, state, val);
+   //printf("SET GRADIENT REL2 RELY for part: %s state: %s [TO %f]\n", part, state, val);
 
    pd->gradient.rel2.relative_y = val;
    edje_object_calc_force(obj);
@@ -4107,44 +4648,44 @@ edje_edit_state_gradient_rel2_offset_y_get(Evas_Object *obj, const char *part, c
    return pd->gradient.rel2.offset_y;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel1_offset_x_set(Evas_Object *obj, const char *part, const char *state, int val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL1 OFFSETX for part: %s state: %s [TO %d]\n", part, state, val);
+   //printf("SET GRADIENT REL1 OFFSETX for part: %s state: %s [TO %d]\n", part, state, val);
 
    pd->gradient.rel1.offset_x = val;
    edje_object_calc_force(obj);
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel1_offset_y_set(Evas_Object *obj, const char *part, const char *state, int val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL1 OFFSETY for part: %s state: %s [TO %d]\n", part, state, val);
+   //printf("SET GRADIENT REL1 OFFSETY for part: %s state: %s [TO %d]\n", part, state, val);
 
    pd->gradient.rel1.offset_y = val;
    edje_object_calc_force(obj);
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel2_offset_x_set(Evas_Object *obj, const char *part, const char *state, int val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL2 OFFSETX for part: %s state: %s [TO %d]\n", part, state, val);
+   //printf("SET GRADIENT REL2 OFFSETX for part: %s state: %s [TO %d]\n", part, state, val);
 
    pd->gradient.rel2.offset_x = val;
    edje_object_calc_force(obj);
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_state_gradient_rel2_offset_y_set(Evas_Object *obj, const char *part, const char *state, int val)
 {
    GET_PD_OR_RETURN(0);
-   printf("SET GRADIENT REL2 OFFSETY for part: %s state: %s [TO %d]\n", part, state, val);
+   //printf("SET GRADIENT REL2 OFFSETY for part: %s state: %s [TO %d]\n", part, state, val);
 
    pd->gradient.rel2.offset_y = val;
    edje_object_calc_force(obj);
@@ -4194,7 +4735,7 @@ edje_edit_programs_list_get(Evas_Object *obj)
    return progs;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_add(Evas_Object *obj, const char *name)
 {
    Edje_Program *epr;
@@ -4202,14 +4743,14 @@ edje_edit_program_add(Evas_Object *obj, const char *name)
 
    GET_ED_OR_RETURN(0);
 
-   printf("ADD PROGRAM [new name: %s]\n", name);
+   //printf("ADD PROGRAM [new name: %s]\n", name);
 
    //Check if program already exists
    if (_edje_program_get_byname(obj, name))
      return 0;
 
    //Alloc Edje_Program or return
-   epr = mem_alloc(SZ(Edje_Program));
+   epr = _alloc(sizeof(Edje_Program));
    if (!epr) return 0;
 
    //Add program to group
@@ -4252,7 +4793,7 @@ edje_edit_program_add(Evas_Object *obj, const char *name)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_del(Evas_Object *obj, const char *prog)
 {
    Eina_List *l;
@@ -4263,7 +4804,7 @@ edje_edit_program_del(Evas_Object *obj, const char *prog)
    GET_ED_OR_RETURN(0);
    GET_EPR_OR_RETURN(0);
 
-   printf("DEL PROGRAM: %s\n", prog);
+   //printf("DEL PROGRAM: %s\n", prog);
 
    //Remove program from programs list
    id = epr->id;
@@ -4310,8 +4851,8 @@ edje_edit_program_del(Evas_Object *obj, const char *prog)
 	Edje_Program *p;
 
 	p = ed->table_programs[id % ed->table_programs_size];
-	printf("UPDATE: %s(id:%d) with new id: %d\n",
-	       p->name, p->id, id);
+	//printf("UPDATE: %s(id:%d) with new id: %d\n",
+	  //     p->name, p->id, id);
 	old_id = p->id;
 	p->id = id;
      }
@@ -4372,7 +4913,7 @@ edje_edit_program_del(Evas_Object *obj, const char *prog)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_exist(Evas_Object *obj, const char *prog)
 {
    GET_EPR_OR_RETURN(0);
@@ -4380,7 +4921,7 @@ edje_edit_program_exist(Evas_Object *obj, const char *prog)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_run(Evas_Object *obj, const char *prog)
 {
    GET_ED_OR_RETURN(0);
@@ -4390,7 +4931,7 @@ edje_edit_program_run(Evas_Object *obj, const char *prog)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_name_set(Evas_Object *obj, const char *prog, const char* new_name)
 {
    GET_ED_OR_RETURN(0);
@@ -4400,7 +4941,7 @@ edje_edit_program_name_set(Evas_Object *obj, const char *prog, const char* new_n
 
    if (_edje_program_get_byname(obj, new_name)) return 0;
 
-   printf("SET NAME for program: %s [new name: %s]\n", prog, new_name);
+   //printf("SET NAME for program: %s [new name: %s]\n", prog, new_name);
 
    _edje_if_string_free(ed, epr->name);
    epr->name = eina_stringshare_add(new_name);
@@ -4418,7 +4959,7 @@ edje_edit_program_source_get(Evas_Object *obj, const char *prog)
    return eina_stringshare_add(epr->source);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_source_set(Evas_Object *obj, const char *prog, const char *source)
 {
    GET_ED_OR_RETURN(0);
@@ -4426,7 +4967,7 @@ edje_edit_program_source_set(Evas_Object *obj, const char *prog, const char *sou
 
    if (!source) return 0;
 
-   printf("SET SOURCE for program: %s [%s]\n", prog, source);
+   //printf("SET SOURCE for program: %s [%s]\n", prog, source);
 
    _edje_if_string_free(ed, epr->source);
    epr->source = eina_stringshare_add(source);
@@ -4449,7 +4990,7 @@ edje_edit_program_signal_get(Evas_Object *obj, const char *prog)
    return eina_stringshare_add(epr->signal);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_signal_set(Evas_Object *obj, const char *prog, const char *signal)
 {
    GET_ED_OR_RETURN(0);
@@ -4457,7 +4998,7 @@ edje_edit_program_signal_set(Evas_Object *obj, const char *prog, const char *sig
 
    if (!signal) return 0;
 
-   printf("SET SIGNAL for program: %s [%s]\n", prog, signal);
+   //printf("SET SIGNAL for program: %s [%s]\n", prog, signal);
 
    _edje_if_string_free(ed, epr->signal);
    epr->signal = eina_stringshare_add(signal);
@@ -4480,13 +5021,13 @@ edje_edit_program_state_get(Evas_Object *obj, const char *prog)
    return eina_stringshare_add(epr->state);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_state_set(Evas_Object *obj, const char *prog, const char *state)
 {
    GET_ED_OR_RETURN(0);
    GET_EPR_OR_RETURN(0);
 
-   printf("SET STATE for program: %s\n", prog);
+   //printf("SET STATE for program: %s\n", prog);
 
    _edje_if_string_free(ed, epr->state);
    epr->state = eina_stringshare_add(state);
@@ -4504,13 +5045,13 @@ edje_edit_program_state2_get(Evas_Object *obj, const char *prog)
    return eina_stringshare_add(epr->state2);
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_state2_set(Evas_Object *obj, const char *prog, const char *state2)
 {
    GET_ED_OR_RETURN(0);
    GET_EPR_OR_RETURN(0);
 
-   printf("SET STATE2 for program: %s\n", prog);
+   //printf("SET STATE2 for program: %s\n", prog);
 
    _edje_if_string_free(ed, epr->state2);
    epr->state2 = eina_stringshare_add(state2);
@@ -4527,7 +5068,7 @@ edje_edit_program_value_get(Evas_Object *obj, const char *prog)
    return epr->value;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_value_set(Evas_Object *obj, const char *prog, double value)
 {
    GET_EPR_OR_RETURN(0);
@@ -4546,7 +5087,7 @@ edje_edit_program_value2_get(Evas_Object *obj, const char *prog)
    return epr->value2;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_value2_set(Evas_Object *obj, const char *prog, double value)
 {
    GET_EPR_OR_RETURN(0);
@@ -4565,7 +5106,7 @@ edje_edit_program_in_from_get(Evas_Object *obj, const char *prog)
    return epr->in.from;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_in_from_set(Evas_Object *obj, const char *prog, double seconds)
 {
    GET_EPR_OR_RETURN(0);
@@ -4584,7 +5125,7 @@ edje_edit_program_in_range_get(Evas_Object *obj, const char *prog)
    return epr->in.range;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_in_range_set(Evas_Object *obj, const char *prog, double seconds)
 {
    GET_EPR_OR_RETURN(0);
@@ -4594,7 +5135,7 @@ edje_edit_program_in_range_set(Evas_Object *obj, const char *prog, double second
    return 1;
 }
 
-EAPI int
+EAPI Edje_Tween_Mode
 edje_edit_program_transition_get(Evas_Object *obj, const char *prog)
 {
    GET_EPR_OR_RETURN(-1);
@@ -4603,8 +5144,8 @@ edje_edit_program_transition_get(Evas_Object *obj, const char *prog)
    return epr->tween.mode;
 }
 
-EAPI unsigned char
-edje_edit_program_transition_set(Evas_Object *obj, const char *prog, int transition)
+EAPI Eina_Bool
+edje_edit_program_transition_set(Evas_Object *obj, const char *prog, Edje_Tween_Mode transition)
 {
    GET_EPR_OR_RETURN(0);
 
@@ -4622,7 +5163,7 @@ edje_edit_program_transition_time_get(Evas_Object *obj, const char *prog)
    return epr->tween.time;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_transition_time_set(Evas_Object *obj, const char *prog, double seconds)
 {
    GET_EPR_OR_RETURN(0);
@@ -4632,7 +5173,7 @@ edje_edit_program_transition_time_set(Evas_Object *obj, const char *prog, double
    return 1;
 }
 
-EAPI int
+EAPI Edje_Action_Type
 edje_edit_program_action_get(Evas_Object *obj, const char *prog)
 {
    GET_EPR_OR_RETURN(-1);
@@ -4641,8 +5182,8 @@ edje_edit_program_action_get(Evas_Object *obj, const char *prog)
    return epr->action;
 }
 
-EAPI unsigned char
-edje_edit_program_action_set(Evas_Object *obj, const char *prog, int action)
+EAPI Eina_Bool
+edje_edit_program_action_set(Evas_Object *obj, const char *prog, Edje_Action_Type action)
 {
    GET_EPR_OR_RETURN(0);
 
@@ -4689,7 +5230,7 @@ edje_edit_program_targets_get(Evas_Object *obj, const char *prog)
    return targets;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_targets_clear(Evas_Object *obj, const char *prog)
 {
    GET_EPR_OR_RETURN(0);
@@ -4706,7 +5247,7 @@ edje_edit_program_targets_clear(Evas_Object *obj, const char *prog)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *target)
 {
    int id;
@@ -4736,7 +5277,7 @@ edje_edit_program_target_add(Evas_Object *obj, const char *prog, const char *tar
    else
      return 0;
 
-   t = mem_alloc(SZ(Edje_Program_Target));
+   t = _alloc(sizeof(Edje_Program_Target));
    if (!t) return 0;
 
    t->id = id;
@@ -4762,14 +5303,14 @@ edje_edit_program_afters_get(Evas_Object *obj, const char *prog)
 	p = ed->table_programs[a->id % ed->table_programs_size];
 	if (p && p->name)
 	  {
-	     printf("   a: %d name: %s\n", a->id, p->name);
+	     //printf("   a: %d name: %s\n", a->id, p->name);
 	     afters = eina_list_append(afters, eina_stringshare_add(p->name));
 	  }
      }
    return afters;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_afters_clear(Evas_Object *obj, const char *prog)
 {
    GET_EPR_OR_RETURN(0);
@@ -4786,7 +5327,7 @@ edje_edit_program_afters_clear(Evas_Object *obj, const char *prog)
    return 1;
 }
 
-EAPI unsigned char
+EAPI Eina_Bool
 edje_edit_program_after_add(Evas_Object *obj, const char *prog, const char *after)
 {
    Edje_Program *af;
@@ -4797,7 +5338,7 @@ edje_edit_program_after_add(Evas_Object *obj, const char *prog, const char *afte
    af = _edje_program_get_byname(obj, after);
    if (!af) return 0;
 
-   a = mem_alloc(SZ(Edje_Program_After));
+   a = _alloc(sizeof(Edje_Program_After));
    if (!a) return 0;
 
    a->id = af->id;
@@ -4840,7 +5381,7 @@ edje_edit_script_get(Evas_Object *obj)
 #define I6 "                  "
 #define I7 "                     "
 
-static char *types[] = {"NONE", "RECT", "TEXT", "IMAGE", "SWALLOW", "TEXTBLOCK", "GRADIENT", "GROUP"};
+static char *types[] = {"NONE", "RECT", "TEXT", "IMAGE", "SWALLOW", "TEXTBLOCK", "GRADIENT", "GROUP", "BOX", "TABLE", "EXTERNAL"};
 static char *effects[] = {"NONE", "PLAIN", "OUTLINE", "SOFT_OUTLINE", "SHADOW", "SOFT_SHADOW", "OUTLINE_SHADOW", "OUTLINE_SOFT_SHADOW ", "FAR_SHADOW ", "FAR_SOFT_SHADOW", "GLOW"};
 static char *prefers[] = {"NONE", "VERTICAL", "HORIZONTAL", "BOTH"};
 static void
@@ -4904,6 +5445,12 @@ _edje_generate_source_of_style(Edje * ed, const char *name, FILE * f)
 }
 
 static void
+_edje_generate_source_of_external(Edje *ed, const char *name, FILE *f)
+{
+   fprintf(f, I1 "external: \"%s\";\n", name);
+}
+
+static void
 _edje_generate_source_of_program(Evas_Object *obj, const char *program, FILE *f)
 {
    Eina_List *l, *ll;
@@ -5010,7 +5557,6 @@ _edje_generate_source_of_program(Evas_Object *obj, const char *program, FILE *f)
    fprintf(f, I3 "}\n");
 }
 
-
 static void
 _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *state, FILE *f)
 {
@@ -5203,6 +5749,36 @@ _edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *s
         //TODO rel1 and 2 seems unused
 	fprintf(f, I5"}\n");
      }
+
+   //External
+   if (rp->part->type == EDJE_PART_TYPE_EXTERNAL)
+     {
+	if ((ll = edje_edit_state_external_params_list_get(obj, part, state)))
+	  {
+	     Edje_External_Param *p;
+
+	     fprintf(f, I5"params {\n");
+	     EINA_LIST_FOREACH(ll, l, p)
+	       {
+		  switch (p->type)
+		    {
+		     case EDJE_EXTERNAL_PARAM_TYPE_INT:
+			fprintf(f, I6"int: \"%s\" \"%d\";\n", p->name, p->i);
+			break;
+		     case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
+			fprintf(f, I6"double: \"%s\" \"%g\";\n", p->name, p->d);
+			break;
+		     case EDJE_EXTERNAL_PARAM_TYPE_STRING:
+			if (p->s)
+			  fprintf(f, I6"string: \"%s\" \"%s\";\n", p->name, p->s);
+			break;
+		     default:
+			break;
+		    }
+	       }
+	     fprintf(f, I5"}\n");
+	  }
+     }
    
    fprintf(f, I4"}\n");//description
 }
@@ -5334,11 +5910,14 @@ _edje_generate_source(Evas_Object *obj)
    GET_ED_OR_RETURN(NULL);
    
    /* Open a temp file */
-   //TODO this will not work on windows
+#ifdef HAVE_EVIL
+   snprintf(tmpn, PATH_MAX, "%s/edje_edit.edc-tmp-XXXXXX", evil_tmpdir_get());
+#else
    strcpy(tmpn, "/tmp/edje_edit.edc-tmp-XXXXXX");
+#endif
    if (!(fd = mkstemp(tmpn))) return NULL;
    printf("*** tmp file: %s\n", tmpn);
-   if (!(f = fopen(tmpn, "w"))) return NULL;
+   if (!(f = fdopen(fd, "wb"))) return NULL;
 
    /* Write edc into file */
    //TODO Probably we need to save the file before generation
@@ -5429,6 +6008,17 @@ _edje_generate_source(Evas_Object *obj)
 	edje_edit_string_list_free(ll);
      }
 
+   /* Externals */
+   if ((ll = edje_edit_externals_list_get(obj)))
+     {
+	fprintf(f, I0 "externals {\n");
+	EINA_LIST_FOREACH(ll, l, entry)
+	   _edje_generate_source_of_external(ed, entry, f);
+
+	fprintf(f, I0 "}\n\n");
+	edje_edit_string_list_free(ll);
+     }
+
    /* Collections */
    fprintf(f, "collections {\n");
    ll = edje_file_collection_list(ed->file->path);
@@ -5448,63 +6038,35 @@ _edje_generate_source(Evas_Object *obj)
 /*  SAVING ROUTINES  */
 /*********************/
 ////////////////////////////////////////
-static char *
-_edje_edit_str_direct_alloc(const char *str)
-{
-   return (char *)str;
-}
+typedef struct _SrcFile               SrcFile;
+typedef struct _SrcFile_List          SrcFile_List;
 
-static void
-_edje_edit_str_direct_free(const char *str)
+struct _SrcFile
 {
-}
+   char *name;
+   char *file;
+};
 
-static void *
-_edje_eina_hash_add_alloc(void *hash, const void *key, void *data)
+struct _SrcFile_List
 {
-   Eina_Hash *result = hash;
-
-   if (!result) result = eina_hash_string_small_new(NULL);
-   if (!result) return NULL;
-
-   eina_hash_add(result, key, data);
-
-   return result;
-}
-
+   Eina_List *list;
+};
 
 static Eet_Data_Descriptor *_srcfile_edd = NULL;
 static Eet_Data_Descriptor *_srcfile_list_edd = NULL;
 
-void
+static void
 source_edd(void)
 {
    Eet_Data_Descriptor_Class eddc;
 
-   eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
-   eddc.func.mem_alloc = NULL;
-   eddc.func.mem_free = NULL;
-   eddc.func.str_alloc = eina_stringshare_add;
-   eddc.func.str_free = eina_stringshare_del;
-   eddc.func.list_next = eina_list_next;
-   eddc.func.list_append = eina_list_append;
-   eddc.func.list_data = eina_list_data_get;
-   eddc.func.list_free = eina_list_free;
-   eddc.func.hash_foreach = eina_hash_foreach;
-   eddc.func.hash_add = _edje_eina_hash_add_alloc;
-   eddc.func.hash_free = eina_hash_free;
-   eddc.func.str_direct_alloc = _edje_edit_str_direct_alloc;
-   eddc.func.str_direct_free = _edje_edit_str_direct_free;
-
-   eddc.name = "srcfile"; 
-   eddc.size = sizeof(SrcFile);
-   _srcfile_edd = eet_data_descriptor3_new(&eddc);
+   eet_eina_stream_data_descriptor_class_set(&eddc, "srcfile", sizeof(SrcFile));
+   _srcfile_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_srcfile_edd, SrcFile, "name", name, EET_T_INLINED_STRING);
    EET_DATA_DESCRIPTOR_ADD_BASIC(_srcfile_edd, SrcFile, "file", file, EET_T_INLINED_STRING);
 
-   eddc.name = "srcfile_list"; 
-   eddc.size = sizeof(SrcFile_List);
-   _srcfile_list_edd = eet_data_descriptor3_new(&eddc);
+   eet_eina_stream_data_descriptor_class_set(&eddc, "srcfile_list", sizeof(SrcFile_List));
+   _srcfile_list_edd = eet_data_descriptor_stream_new(&eddc);
    EET_DATA_DESCRIPTOR_ADD_LIST(_srcfile_list_edd, SrcFile_List, "list", list, _srcfile_edd);
 }
 /////////////////////////////////////////
@@ -5588,8 +6150,9 @@ edje_edit_save(Evas_Object *obj)
    printf("** Writing EDC Source [from: %s]\n", source_file);
 
    //open the temp file and put the contents in SrcFile
-   sf = mem_alloc(SZ(SrcFile));
-   sf->name = mem_strdup("generated_source.edc");
+   sf = _alloc(sizeof(SrcFile));
+   if (!sf) return 0;
+   sf->name = strdup("generated_source.edc");
 
    f = fopen(source_file, "rb");
    if (!f)
@@ -5604,14 +6167,14 @@ edje_edit_save(Evas_Object *obj)
    sz = ftell(f);
    fseek(f, 0, SEEK_SET);
 
-   sf->file = mem_alloc(sz + 1);
+   sf->file = _alloc(sz + 1); //TODO check result and return nicely
    fread(sf->file, sz, 1, f);
    sf->file[sz] = '\0';
    fseek(f, 0, SEEK_SET);
    fclose(f);
 
    //create the needed list of source files (only one)
-   sfl = mem_alloc(SZ(SrcFile_List));
+   sfl = _alloc(sizeof(SrcFile_List)); //TODO check result and return nicely
    sfl->list = NULL;
    sfl->list = eina_list_append(sfl->list, sf);
 
diff --git a/src/lib/edje_embryo.c b/src/lib/edje_embryo.c
index d8d44b3..b12db3d 100644
--- a/src/lib/edje_embryo.c
+++ b/src/lib/edje_embryo.c
@@ -675,6 +675,9 @@ _edje_embryo_fn_set_min_size(Embryo_Program *ep, Embryo_Cell *params)
    ed->collection->prop.min.w = w;
    ed->collection->prop.min.h = h;
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
    _edje_recalc(ed);
    return 0;
 }
@@ -699,6 +702,9 @@ _edje_embryo_fn_set_max_size(Embryo_Program *ep, Embryo_Cell *params)
    ed->collection->prop.max.w = w;
    ed->collection->prop.max.h = h;
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
    _edje_recalc(ed);
 
    return 0;
@@ -1542,7 +1548,7 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
      return 0;
 
    /* check whether this part already has a "custom" state */
-   if (rp->custom.description)
+   if (rp->custom)
      return 0;
 
    GETSTR(name, params[2]);
@@ -1558,6 +1564,13 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
    if (!(d = calloc(1, sizeof(Edje_Part_Description))))
      return 0;
 
+   rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
+   if (!rp->custom)
+     {
+	free(d);
+	return 0;
+     }
+
    *d = *parent;
 
    d->state.name = (char *)eina_stringshare_add("custom");
@@ -1573,6 +1586,8 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
         Edje_Part_Image_Id *iid_new;
 
 	iid_new = calloc(1, sizeof(Edje_Part_Image_Id));
+	if (!iid_new) continue;
+
 	iid_new->id = iid->id;
 
 	d->image.tween_list = eina_list_append(d->image.tween_list, iid_new);
@@ -1586,7 +1601,7 @@ _edje_embryo_fn_custom_state(Embryo_Program *ep, Embryo_Cell *params)
    d->text.style = DUP(d->text.style);
 #undef DUP
 
-   rp->custom.description = d;
+   rp->custom->description = d;
 
    return 0;
 }
@@ -1610,7 +1625,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
      return 0;
 
    /* check whether this part has a "custom" state */
-   if (!rp->custom.description)
+   if (!rp->custom)
      return 0;
 
    switch (params[2])
@@ -1618,90 +1633,90 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
       case EDJE_STATE_PARAM_ALIGNMENT:
 	 CHKPARAM(4);
 
-	 GETFLOAT(rp->custom.description->align.x, params[3]);
-	 GETFLOAT(rp->custom.description->align.y, params[4]);
+	 GETFLOAT(rp->custom->description->align.x, params[3]);
+	 GETFLOAT(rp->custom->description->align.y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_MIN:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->min.w, params[3]);
-	 GETINT(rp->custom.description->min.h, params[4]);
+	 GETINT(rp->custom->description->min.w, params[3]);
+	 GETINT(rp->custom->description->min.h, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_MAX:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->max.w, params[3]);
-	 GETINT(rp->custom.description->max.h, params[4]);
+	 GETINT(rp->custom->description->max.w, params[3]);
+	 GETINT(rp->custom->description->max.h, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_STEP:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->step.x, params[3]);
-	 GETINT(rp->custom.description->step.y, params[4]);
+	 GETINT(rp->custom->description->step.x, params[3]);
+	 GETINT(rp->custom->description->step.y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_ASPECT:
 	 CHKPARAM(4);
 
-	 GETFLOAT(rp->custom.description->aspect.min, params[3]);
-	 GETFLOAT(rp->custom.description->aspect.max, params[4]);
+	 GETFLOAT(rp->custom->description->aspect.min, params[3]);
+	 GETFLOAT(rp->custom->description->aspect.max, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_ASPECT_PREF:
 	 CHKPARAM(3);
 
-	 GETINT(rp->custom.description->aspect.prefer, params[3]);
+	 GETINT(rp->custom->description->aspect.prefer, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR:
 	 CHKPARAM(6);
 
-	 GETINT(rp->custom.description->color.r, params[3]);
-	 GETINT(rp->custom.description->color.g, params[4]);
-	 GETINT(rp->custom.description->color.b, params[5]);
-	 GETINT(rp->custom.description->color.a, params[6]);
+	 GETINT(rp->custom->description->color.r, params[3]);
+	 GETINT(rp->custom->description->color.g, params[4]);
+	 GETINT(rp->custom->description->color.b, params[5]);
+	 GETINT(rp->custom->description->color.a, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR2:
 	 CHKPARAM(6);
 
-	 GETINT(rp->custom.description->color2.r, params[3]);
-	 GETINT(rp->custom.description->color2.g, params[4]);
-	 GETINT(rp->custom.description->color2.b, params[5]);
-	 GETINT(rp->custom.description->color2.a, params[6]);
+	 GETINT(rp->custom->description->color2.r, params[3]);
+	 GETINT(rp->custom->description->color2.g, params[4]);
+	 GETINT(rp->custom->description->color2.b, params[5]);
+	 GETINT(rp->custom->description->color2.a, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR3:
 	 CHKPARAM(6);
 
-	 GETINT(rp->custom.description->color3.r, params[3]);
-	 GETINT(rp->custom.description->color3.g, params[4]);
-	 GETINT(rp->custom.description->color3.b, params[5]);
-	 GETINT(rp->custom.description->color3.a, params[6]);
+	 GETINT(rp->custom->description->color3.r, params[3]);
+	 GETINT(rp->custom->description->color3.g, params[4]);
+	 GETINT(rp->custom->description->color3.b, params[5]);
+	 GETINT(rp->custom->description->color3.a, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR_CLASS:
 	 CHKPARAM(3);
 
 	 GETSTR(s, params[3]);
-	 GETSTREVAS(s, rp->custom.description->color_class);
+	 GETSTREVAS(s, rp->custom->description->color_class);
 
 	 break;
       case EDJE_STATE_PARAM_REL1:
 	 CHKPARAM(4);
 
-	 GETFLOAT(rp->custom.description->rel1.relative_x, params[3]);
-	 GETFLOAT(rp->custom.description->rel1.relative_y, params[4]);
+	 GETFLOAT(rp->custom->description->rel1.relative_x, params[3]);
+	 GETFLOAT(rp->custom->description->rel1.relative_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL1_TO:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->rel1.id_x, params[3]);
-	 GETINT(rp->custom.description->rel1.id_y, params[4]);
+	 GETINT(rp->custom->description->rel1.id_x, params[3]);
+	 GETINT(rp->custom->description->rel1.id_y, params[4]);
 
 	 if (rp->param1.description->rel1.id_x >= 0)
 	   rp->param1.rel1_to_x = ed->table_parts[rp->param1.description->rel1.id_x % ed->table_parts_size];
@@ -1712,22 +1727,22 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
       case EDJE_STATE_PARAM_REL1_OFFSET:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->rel1.offset_x, params[3]);
-	 GETINT(rp->custom.description->rel1.offset_y, params[4]);
+	 GETINT(rp->custom->description->rel1.offset_x, params[3]);
+	 GETINT(rp->custom->description->rel1.offset_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL2:
 	 CHKPARAM(4);
 
-	 GETFLOAT(rp->custom.description->rel2.relative_x, params[3]);
-	 GETFLOAT(rp->custom.description->rel2.relative_y, params[4]);
+	 GETFLOAT(rp->custom->description->rel2.relative_x, params[3]);
+	 GETFLOAT(rp->custom->description->rel2.relative_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL2_TO:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->rel2.id_x, params[3]);
-	 GETINT(rp->custom.description->rel2.id_y, params[4]);
+	 GETINT(rp->custom->description->rel2.id_x, params[3]);
+	 GETINT(rp->custom->description->rel2.id_y, params[4]);
 
 	 if (rp->param1.description->rel2.id_x >= 0)
 	   rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size];
@@ -1738,52 +1753,52 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
       case EDJE_STATE_PARAM_REL2_OFFSET:
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->rel2.offset_x, params[3]);
-	 GETINT(rp->custom.description->rel2.offset_y, params[4]);
+	 GETINT(rp->custom->description->rel2.offset_x, params[3]);
+	 GETINT(rp->custom->description->rel2.offset_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_IMAGE:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(3);
 
-	 GETINT(rp->custom.description->image.id, params[3]);
+	 GETINT(rp->custom->description->image.id, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_BORDER:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(6);
 
-	 GETINT(rp->custom.description->border.l, params[3]);
-	 GETINT(rp->custom.description->border.r, params[4]);
-	 GETINT(rp->custom.description->border.t, params[5]);
-	 GETINT(rp->custom.description->border.b, params[6]);
+	 GETINT(rp->custom->description->border.l, params[3]);
+	 GETINT(rp->custom->description->border.r, params[4]);
+	 GETINT(rp->custom->description->border.t, params[5]);
+	 GETINT(rp->custom->description->border.b, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_FILL_SMOOTH:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(3);
 
-	 GETINT(rp->custom.description->fill.smooth, params[3]);
+	 GETINT(rp->custom->description->fill.smooth, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_FILL_POS:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(6);
 
-	 GETFLOAT(rp->custom.description->fill.pos_rel_x, params[3]);
-	 GETFLOAT(rp->custom.description->fill.pos_rel_y, params[4]);
-	 GETINT(rp->custom.description->fill.pos_abs_x, params[5]);
-	 GETINT(rp->custom.description->fill.pos_abs_y, params[6]);
+	 GETFLOAT(rp->custom->description->fill.pos_rel_x, params[3]);
+	 GETFLOAT(rp->custom->description->fill.pos_rel_y, params[4]);
+	 GETINT(rp->custom->description->fill.pos_abs_x, params[5]);
+	 GETINT(rp->custom->description->fill.pos_abs_y, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_FILL_SIZE:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(6);
 
-	 GETFLOAT(rp->custom.description->fill.rel_x, params[3]);
-	 GETFLOAT(rp->custom.description->fill.rel_y, params[4]);
-	 GETINT(rp->custom.description->fill.abs_x, params[5]);
-	 GETINT(rp->custom.description->fill.abs_y, params[6]);
+	 GETFLOAT(rp->custom->description->fill.rel_x, params[3]);
+	 GETFLOAT(rp->custom->description->fill.rel_y, params[4]);
+	 GETINT(rp->custom->description->fill.abs_x, params[5]);
+	 GETINT(rp->custom->description->fill.abs_y, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT:
@@ -1793,7 +1808,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 CHKPARAM(3);
 
 	 GETSTR(s, params[3]);
-	 GETSTREVAS(s, rp->custom.description->text.text);
+	 GETSTREVAS(s, rp->custom->description->text.text);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_CLASS:
@@ -1803,7 +1818,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 CHKPARAM(3);
 
 	 GETSTR(s, params[3]);
-	 GETSTREVAS(s, rp->custom.description->text.text_class);
+	 GETSTREVAS(s, rp->custom->description->text.text_class);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_FONT:
@@ -1811,7 +1826,7 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 CHKPARAM(3);
 
 	 GETSTR(s, params[3]);
-	 GETSTREVAS(s, rp->custom.description->text.font);
+	 GETSTREVAS(s, rp->custom->description->text.font);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_STYLE:
@@ -1819,22 +1834,22 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 CHKPARAM(3);
 
 	 GETSTR(s, params[3]);
-	 GETSTREVAS(s, rp->custom.description->text.style);
+	 GETSTREVAS(s, rp->custom->description->text.style);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_SIZE:
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(3);
 
-	 GETINT(rp->custom.description->text.size, params[3]);
+	 GETINT(rp->custom->description->text.size, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_FIT:
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->text.fit_x, params[3]);
-	 GETINT(rp->custom.description->text.fit_y, params[4]);
+	 GETINT(rp->custom->description->text.fit_x, params[3]);
+	 GETINT(rp->custom->description->text.fit_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_MIN:
@@ -1843,8 +1858,8 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	   return 0;
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->text.min_x, params[3]);
-	 GETINT(rp->custom.description->text.min_y, params[4]);
+	 GETINT(rp->custom->description->text.min_x, params[3]);
+	 GETINT(rp->custom->description->text.min_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_MAX:
@@ -1853,28 +1868,31 @@ _edje_embryo_fn_set_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	   return 0;
 	 CHKPARAM(4);
 
-	 GETINT(rp->custom.description->text.max_x, params[3]);
-	 GETINT(rp->custom.description->text.max_y, params[4]);
+	 GETINT(rp->custom->description->text.max_x, params[3]);
+	 GETINT(rp->custom->description->text.max_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_ALIGN:
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(4);
 
-	 GETFLOAT(rp->custom.description->text.align.x, params[3]);
-	 GETFLOAT(rp->custom.description->text.align.y, params[4]);
+	 GETFLOAT(rp->custom->description->text.align.x, params[3]);
+	 GETFLOAT(rp->custom->description->text.align.y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_VISIBLE:
 	 CHKPARAM(3);
 
-	 GETINT(rp->custom.description->visible, params[3]);
+	 GETINT(rp->custom->description->visible, params[3]);
 
 	 break;
       default:
 	 break;
      }
 
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    ed->dirty=1;
    return 0;
 }
@@ -1898,7 +1916,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
      return 0;
 
    /* check whether this part has a "custom" state */
-   if (!rp->custom.description)
+   if (!rp->custom)
      return 0;
 
    switch (params[2])
@@ -1906,162 +1924,162 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
       case EDJE_STATE_PARAM_ALIGNMENT:
 	 CHKPARAM(4);
 
-	 SETFLOAT(rp->custom.description->align.x, params[3]);
-	 SETFLOAT(rp->custom.description->align.y, params[4]);
+	 SETFLOAT(rp->custom->description->align.x, params[3]);
+	 SETFLOAT(rp->custom->description->align.y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_MIN:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->min.w, params[3]);
-	 SETINT(rp->custom.description->min.h, params[4]);
+	 SETINT(rp->custom->description->min.w, params[3]);
+	 SETINT(rp->custom->description->min.h, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_MAX:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->max.w, params[3]);
-	 SETINT(rp->custom.description->max.h, params[4]);
+	 SETINT(rp->custom->description->max.w, params[3]);
+	 SETINT(rp->custom->description->max.h, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_STEP:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->step.x, params[3]);
-	 SETINT(rp->custom.description->step.y, params[4]);
+	 SETINT(rp->custom->description->step.x, params[3]);
+	 SETINT(rp->custom->description->step.y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_ASPECT:
 	 CHKPARAM(4);
 
-	 SETFLOAT(rp->custom.description->aspect.min, params[3]);
-	 SETFLOAT(rp->custom.description->aspect.max, params[4]);
+	 SETFLOAT(rp->custom->description->aspect.min, params[3]);
+	 SETFLOAT(rp->custom->description->aspect.max, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_ASPECT_PREF:
 	 CHKPARAM(3);
 
-	 SETINT(rp->custom.description->aspect.prefer, params[3]);
+	 SETINT(rp->custom->description->aspect.prefer, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR:
 	 CHKPARAM(6);
 
-	 SETINT(rp->custom.description->color.r, params[3]);
-	 SETINT(rp->custom.description->color.g, params[4]);
-	 SETINT(rp->custom.description->color.b, params[5]);
-	 SETINT(rp->custom.description->color.a, params[6]);
+	 SETINT(rp->custom->description->color.r, params[3]);
+	 SETINT(rp->custom->description->color.g, params[4]);
+	 SETINT(rp->custom->description->color.b, params[5]);
+	 SETINT(rp->custom->description->color.a, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR2:
 	 CHKPARAM(6);
 
-	 SETINT(rp->custom.description->color2.r, params[3]);
-	 SETINT(rp->custom.description->color2.g, params[4]);
-	 SETINT(rp->custom.description->color2.b, params[5]);
-	 SETINT(rp->custom.description->color2.a, params[6]);
+	 SETINT(rp->custom->description->color2.r, params[3]);
+	 SETINT(rp->custom->description->color2.g, params[4]);
+	 SETINT(rp->custom->description->color2.b, params[5]);
+	 SETINT(rp->custom->description->color2.a, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR3:
 	 CHKPARAM(6);
 
-	 SETINT(rp->custom.description->color3.r, params[3]);
-	 SETINT(rp->custom.description->color3.g, params[4]);
-	 SETINT(rp->custom.description->color3.b, params[5]);
-	 SETINT(rp->custom.description->color3.a, params[6]);
+	 SETINT(rp->custom->description->color3.r, params[3]);
+	 SETINT(rp->custom->description->color3.g, params[4]);
+	 SETINT(rp->custom->description->color3.b, params[5]);
+	 SETINT(rp->custom->description->color3.a, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_COLOR_CLASS:
 	 CHKPARAM(4);
 
-	 s = rp->custom.description->color_class;
+	 s = rp->custom->description->color_class;
 	 SETSTRALLOCATE(s);
 
 	 break;
       case EDJE_STATE_PARAM_REL1:
 	 CHKPARAM(4);
 
-	 SETFLOAT(rp->custom.description->rel1.relative_x, params[3]);
-	 SETFLOAT(rp->custom.description->rel1.relative_y, params[4]);
+	 SETFLOAT(rp->custom->description->rel1.relative_x, params[3]);
+	 SETFLOAT(rp->custom->description->rel1.relative_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL1_TO:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->rel1.id_x, params[3]);
-	 SETINT(rp->custom.description->rel1.id_y, params[4]);
+	 SETINT(rp->custom->description->rel1.id_x, params[3]);
+	 SETINT(rp->custom->description->rel1.id_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL1_OFFSET:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->rel1.offset_x, params[3]);
-	 SETINT(rp->custom.description->rel1.offset_y, params[4]);
+	 SETINT(rp->custom->description->rel1.offset_x, params[3]);
+	 SETINT(rp->custom->description->rel1.offset_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL2:
 	 CHKPARAM(4);
 
-	 SETFLOAT(rp->custom.description->rel2.relative_x, params[3]);
-	 SETFLOAT(rp->custom.description->rel2.relative_y, params[4]);
+	 SETFLOAT(rp->custom->description->rel2.relative_x, params[3]);
+	 SETFLOAT(rp->custom->description->rel2.relative_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL2_TO:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->rel2.id_x, params[3]);
-	 SETINT(rp->custom.description->rel2.id_y, params[4]);
+	 SETINT(rp->custom->description->rel2.id_x, params[3]);
+	 SETINT(rp->custom->description->rel2.id_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_REL2_OFFSET:
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->rel2.offset_x, params[3]);
-	 SETINT(rp->custom.description->rel2.offset_y, params[4]);
+	 SETINT(rp->custom->description->rel2.offset_x, params[3]);
+	 SETINT(rp->custom->description->rel2.offset_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_IMAGE:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(3);
 
-	 SETINT(rp->custom.description->image.id, params[3]);
+	 SETINT(rp->custom->description->image.id, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_BORDER:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(6);
 
-	 SETINT(rp->custom.description->border.l, params[3]);
-	 SETINT(rp->custom.description->border.r, params[4]);
-	 SETINT(rp->custom.description->border.t, params[5]);
-	 SETINT(rp->custom.description->border.b, params[6]);
+	 SETINT(rp->custom->description->border.l, params[3]);
+	 SETINT(rp->custom->description->border.r, params[4]);
+	 SETINT(rp->custom->description->border.t, params[5]);
+	 SETINT(rp->custom->description->border.b, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_FILL_SMOOTH:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(3);
 
-	 SETINT(rp->custom.description->fill.smooth, params[3]);
+	 SETINT(rp->custom->description->fill.smooth, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_FILL_POS:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(6);
 
-	 SETFLOAT(rp->custom.description->fill.pos_rel_x, params[3]);
-	 SETFLOAT(rp->custom.description->fill.pos_rel_y, params[4]);
-	 SETINT(rp->custom.description->fill.pos_abs_x, params[5]);
-	 SETINT(rp->custom.description->fill.pos_abs_y, params[6]);
+	 SETFLOAT(rp->custom->description->fill.pos_rel_x, params[3]);
+	 SETFLOAT(rp->custom->description->fill.pos_rel_y, params[4]);
+	 SETINT(rp->custom->description->fill.pos_abs_x, params[5]);
+	 SETINT(rp->custom->description->fill.pos_abs_y, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_FILL_SIZE:
 	 if ( (rp->part->type != EDJE_PART_TYPE_IMAGE) ) return 0;
 	 CHKPARAM(6);
 
-	 SETFLOAT(rp->custom.description->fill.rel_x, params[3]);
-	 SETFLOAT(rp->custom.description->fill.rel_y, params[4]);
-	 SETINT(rp->custom.description->fill.abs_x, params[5]);
-	 SETINT(rp->custom.description->fill.abs_y, params[6]);
+	 SETFLOAT(rp->custom->description->fill.rel_x, params[3]);
+	 SETFLOAT(rp->custom->description->fill.rel_y, params[4]);
+	 SETINT(rp->custom->description->fill.abs_x, params[5]);
+	 SETINT(rp->custom->description->fill.abs_y, params[6]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT:
@@ -2070,7 +2088,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	   return 0;
 	 CHKPARAM(4);
 
-	 s = rp->custom.description->text.text;
+	 s = rp->custom->description->text.text;
 	 SETSTRALLOCATE(s);
 
 	 break;
@@ -2080,7 +2098,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	   return 0;
 	 CHKPARAM(4);
 
-	 s = rp->custom.description->text.text_class;
+	 s = rp->custom->description->text.text_class;
 	 SETSTRALLOCATE(s);
 
 	 break;
@@ -2088,7 +2106,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(4);
 
-	 s = rp->custom.description->text.font;
+	 s = rp->custom->description->text.font;
 	 SETSTRALLOCATE(s);
 
 	 break;
@@ -2096,7 +2114,7 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) return 0;
 	 CHKPARAM(4);
 
-	 s = rp->custom.description->text.style;
+	 s = rp->custom->description->text.style;
 	 SETSTRALLOCATE(s);
 
 	 break;
@@ -2104,15 +2122,15 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(3);
 
-	 SETINT(rp->custom.description->text.size, params[3]);
+	 SETINT(rp->custom->description->text.size, params[3]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_FIT:
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->text.fit_x, params[3]);
-	 SETINT(rp->custom.description->text.fit_y, params[4]);
+	 SETINT(rp->custom->description->text.fit_x, params[3]);
+	 SETINT(rp->custom->description->text.fit_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_MIN:
@@ -2121,8 +2139,8 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	   return 0;
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->text.min_x, params[3]);
-	 SETINT(rp->custom.description->text.min_y, params[4]);
+	 SETINT(rp->custom->description->text.min_x, params[3]);
+	 SETINT(rp->custom->description->text.min_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_MAX:
@@ -2131,22 +2149,22 @@ _edje_embryo_fn_get_state_val(Embryo_Program *ep, Embryo_Cell *params)
 	   return 0;
 	 CHKPARAM(4);
 
-	 SETINT(rp->custom.description->text.max_x, params[3]);
-	 SETINT(rp->custom.description->text.max_y, params[4]);
+	 SETINT(rp->custom->description->text.max_x, params[3]);
+	 SETINT(rp->custom->description->text.max_y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_TEXT_ALIGN:
 	 if ((rp->part->type != EDJE_PART_TYPE_TEXT)) return 0;
 	 CHKPARAM(4);
 
-	 SETFLOAT(rp->custom.description->text.align.x, params[3]);
-	 SETFLOAT(rp->custom.description->text.align.y, params[4]);
+	 SETFLOAT(rp->custom->description->text.align.x, params[3]);
+	 SETFLOAT(rp->custom->description->text.align.y, params[4]);
 
 	 break;
       case EDJE_STATE_PARAM_VISIBLE:
 	 CHKPARAM(3);
 
-	 SETINT(rp->custom.description->visible, params[3]);
+	 SETINT(rp->custom->description->visible, params[3]);
 
 	 break;
       default:
diff --git a/src/lib/edje_entry.c b/src/lib/edje_entry.c
index 64e06ef..22dba16 100644
--- a/src/lib/edje_entry.c
+++ b/src/lib/edje_entry.c
@@ -84,16 +84,15 @@ struct _Anchor
 
 #ifdef HAVE_ECORE_IMF   
 static void 
-_edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+_edje_entry_focus_in_cb(void *data, Evas_Object *o __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
-   Edje_Real_Part *rp = data;
-   if (!rp) return;
-   Entry *en = rp->entry_data;
+   Edje_Real_Part *rp;
+   Entry *en;
    
-   if (!en) return;
+   rp = data;
+   if (!rp || !rp->entry_data || !rp->edje || !rp->edje->obj) return;
 
-   if (!rp->edje || !rp->edje->obj) return;
-   
+   en = rp->entry_data;
    if (!en->imf_context) return;
 
    if (evas_object_focus_get(rp->edje->obj))
@@ -104,13 +103,15 @@ _edje_entry_focus_in_cb(void *data, Evas_Object *o, const char *emission, const
 }
 
 static void
-_edje_entry_focus_out_cb(void *data, Evas_Object *o, const char *emission, const char *source)
+_edje_entry_focus_out_cb(void *data, Evas_Object *o __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
 {
-   Edje_Real_Part *rp = data;
-   if (!rp) return;
-   Entry *en = rp->entry_data;
-   if (!en) return;
+   Edje_Real_Part *rp;
+   Entry *en;
 
+   rp = data;
+   if (!rp || !rp->entry_data) return;
+
+   en = rp->entry_data;
    if (!en->imf_context) return;
 
    ecore_imf_context_reset(en->imf_context);
@@ -120,7 +121,7 @@ _edje_entry_focus_out_cb(void *data, Evas_Object *o, const char *emission, const
 #endif
 
 static void
-_edje_focus_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_focus_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Edje *ed = data;
 #ifdef HAVE_ECORE_IMF   
@@ -147,7 +148,7 @@ _edje_focus_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 }
     
 static void
-_edje_focus_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_focus_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Edje *ed = data;
 #ifdef HAVE_ECORE_IMF
@@ -175,9 +176,10 @@ _edje_focus_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 }
 
 static void
-_curs_update_from_curs(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_curs_update_from_curs(Evas_Textblock_Cursor *c, Evas_Object *o __UNUSED__, Entry *en)
 {
    Evas_Coord cx, cy, cw, ch;
+   if (c != en->cursor) return;
    evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch);
    en->cx = cx + (cw / 2);
    en->cy = cy + (ch / 2);
@@ -271,7 +273,7 @@ _curs_next(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static int
-_curs_line_last_get(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_curs_line_last_get(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en __UNUSED__)
 {
    Evas_Textblock_Cursor *cc;
    int ln;
@@ -376,7 +378,7 @@ _sel_start(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static void
-_sel_enable(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_sel_enable(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, Entry *en)
 {
    if (en->have_selection) return;
    en->have_selection = EINA_TRUE;
@@ -419,7 +421,7 @@ _sel_preextend(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static void
-_sel_clear(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_sel_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, Entry *en)
 {
    en->had_sel = EINA_FALSE;
    if (en->sel_start)
@@ -454,7 +456,7 @@ _sel_clear(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static void
-_sel_update(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_sel_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
 {
    Eina_List *range = NULL, *l;
    Sel *sel;
@@ -544,7 +546,7 @@ _sel_update(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static void
-_edje_anchor_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_anchor_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Anchor *an = data;
    Evas_Event_Mouse_Down *ev = event_info;
@@ -576,7 +578,7 @@ _edje_anchor_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_in
 }
 
 static void
-_edje_anchor_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_anchor_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Anchor *an = data;
    Evas_Event_Mouse_Up *ev = event_info;
@@ -603,7 +605,7 @@ _edje_anchor_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
 }
 
 static void
-_edje_anchor_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_anchor_mouse_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Anchor *an = data;
    Evas_Event_Mouse_Move *ev = event_info;
@@ -630,7 +632,7 @@ _edje_anchor_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_in
 }
 
 static void
-_edje_anchor_mouse_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_anchor_mouse_in_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Anchor *an = data;
    Evas_Event_Mouse_In *ev = event_info;
@@ -652,7 +654,7 @@ _edje_anchor_mouse_in_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
 }
 
 static void
-_edje_anchor_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_anchor_mouse_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Anchor *an = data;
    Evas_Event_Mouse_Out *ev = event_info;
@@ -674,7 +676,7 @@ _edje_anchor_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_inf
 }
 
 static void
-_anchors_update(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_anchors_update(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
 {
    Eina_List *l, *ll, *range;
    Evas_Coord x, y, w, h;
@@ -771,7 +773,7 @@ _anchors_update(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static void
-_anchors_clear(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_anchors_clear(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o __UNUSED__, Entry *en)
 {
    while (en->anchorlist)
      {
@@ -876,7 +878,7 @@ _anchors_get(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 
 
 static void
-_range_del(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
+_range_del(Evas_Textblock_Cursor *c __UNUSED__, Evas_Object *o, Entry *en)
 {
    Evas_Textblock_Cursor *c1;
    
@@ -924,7 +926,7 @@ _backspace(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en)
 }
 
 static void
-_edje_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Edje *ed = data;
    Evas_Event_Key_Down *ev = event_info;
@@ -1027,11 +1029,6 @@ _edje_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 	       _range_del(en->cursor, rp->object, en);
 	     else
 	       _backspace(en->cursor, rp->object, en);
-
-#ifdef HAVE_ECORE_IMF
-	     if (en->have_composition)
-	       _backspace(en->cursor, rp->object, en);
-#endif
 	  }
 	_sel_clear(en->cursor, rp->object, en);
 	_curs_update_from_curs(en->cursor, rp->object, en);
@@ -1238,7 +1235,7 @@ _edje_key_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 }
 
 static void
-_edje_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_key_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
 {
    Edje *ed = data;
    Edje_Real_Part *rp = ed->focused_part;
@@ -1266,7 +1263,7 @@ _edje_key_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 }
 
 static void
-_edje_part_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_part_mouse_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Edje_Real_Part *rp = data;
    Evas_Event_Mouse_Down *ev = event_info;
@@ -1402,7 +1399,7 @@ _edje_part_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info
 }
 
 static void
-_edje_part_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_part_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Edje_Real_Part *rp = data;
    Evas_Event_Mouse_Up *ev = event_info;
@@ -1410,7 +1407,6 @@ _edje_part_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
    Evas_Coord x, y, w, h;
    Eina_Bool multiline;
    Evas_Textblock_Cursor *tc;
-   Eina_Bool dosel = EINA_FALSE;
    if (ev->button != 1) return;
    if (!rp) return;
    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
@@ -1466,7 +1462,7 @@ _edje_part_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 }
 
 static void
-_edje_part_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_edje_part_mouse_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info)
 {
    Edje_Real_Part *rp = data;
    Evas_Event_Mouse_Move *ev = event_info;
@@ -1554,7 +1550,6 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
 #ifdef HAVE_ECORE_IMF
    const char *ctx_id;
    const Ecore_IMF_Context_Info *ctx_info;
-   Evas *evas;
 #endif
    
    en = calloc(1, sizeof(Entry));
@@ -1638,8 +1633,7 @@ _edje_entry_real_part_init(Edje_Real_Part *rp)
 #endif
      }
    done:
-   en->cursor = evas_object_textblock_cursor_get(rp->object);
-
+   en->cursor = (Evas_Textblock_Cursor *)evas_object_textblock_cursor_get(rp->object);
 }
 
 void
@@ -1888,9 +1882,211 @@ _edje_entry_select_abort(Edje_Real_Part *rp)
      }
 }
 
+static Evas_Textblock_Cursor *
+_cursor_get(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Entry *en = rp->entry_data;
+   if (!en) return NULL;
+   switch (cur)
+     {
+     case EDJE_CURSOR_MAIN:
+        return en->cursor;
+        break;
+     case EDJE_CURSOR_SELECTION_BEGIN:
+        return en->sel_start;
+        break;
+     case EDJE_CURSOR_SELECTION_END:
+        return en->sel_end;
+        break;
+     default:
+        break;
+     }
+   return NULL;
+}
+
+Eina_Bool
+_edje_entry_cursor_next(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return 0;
+   if (!evas_textblock_cursor_char_next(c))
+     {
+        evas_textblock_cursor_eol_set(c, 0);
+	if (evas_textblock_cursor_node_next(c)) goto ok;
+        else return 0;
+     }
+   ok:
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+   return 1;
+}
+
+Eina_Bool
+_edje_entry_cursor_prev(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return 0;
+   if (!evas_textblock_cursor_char_prev(c))
+     {
+	if (evas_textblock_cursor_node_prev(c)) goto ok;
+        else return 0;
+     }
+   ok:
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+   return 1;
+}
+
+Eina_Bool
+_edje_entry_cursor_up(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   Evas_Coord lx, ly, lw, lh, cx, cy, cw, ch;
+   int ln;
+   if (!c) return 0;
+   ln = evas_textblock_cursor_line_geometry_get(c, NULL, NULL, NULL, NULL);
+   ln--;
+   if (ln < 0) return 0;
+   if (!evas_object_textblock_line_number_geometry_get(rp->object, ln, 
+                                                       &lx, &ly, &lw, &lh))
+     return 0;
+   evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch);
+   if (!evas_textblock_cursor_char_coord_set(c, cx, ly + (lh / 2)))
+     {
+        if (cx < (lx +(lw / 2)))
+          evas_textblock_cursor_line_first(c);
+        else
+          evas_textblock_cursor_line_last(c);
+     }
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+   return 1;
+}
+
+Eina_Bool
+_edje_entry_cursor_down(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   Evas_Coord lx, ly, lw, lh, cx, cy, cw, ch;
+   int ln, ll;
+   if (!c) return 0;
+   ln = evas_textblock_cursor_line_geometry_get(c, NULL, NULL, NULL, NULL);
+   ln++;
+   if (!evas_object_textblock_line_number_geometry_get(rp->object, ln, 
+                                                       &lx, &ly, &lw, &lh))
+     return 0;
+   evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch);
+   if (!evas_textblock_cursor_char_coord_set(c, cx, ly + (lh / 2)))
+     {
+        if (cx < (lx +(lw / 2)))
+          evas_textblock_cursor_line_first(c);
+        else
+          evas_textblock_cursor_line_last(c);
+     }
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+   return 1;
+}
+
+void
+_edje_entry_cursor_begin(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return;
+   evas_textblock_cursor_node_first(c);
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+}
+
+void
+_edje_entry_cursor_end(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return;
+   evas_textblock_cursor_node_last(c);
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+}
+
+void
+_edje_entry_cursor_copy(Edje_Real_Part *rp, Edje_Cursor cur, Edje_Cursor dst)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return;
+   Evas_Textblock_Cursor *d = _cursor_get(rp, dst);
+   if (!d) return;
+   evas_textblock_cursor_copy(c, d);
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+}
+
+void
+_edje_entry_cursor_line_begin(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return;
+   evas_textblock_cursor_line_first(c);
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+}
+
+void
+_edje_entry_cursor_line_end(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return;
+   evas_textblock_cursor_line_last(c);
+   _curs_update_from_curs(c, rp->object, rp->entry_data);
+   _sel_update(c, rp->object, rp->entry_data);
+   _edje_entry_real_part_configure(rp);
+}
+
+Eina_Bool
+_edje_entry_cursor_is_format_get(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return 0;
+   return evas_textblock_cursor_node_format_get(c);
+}
+
+Eina_Bool
+_edje_entry_cursor_is_visible_format_get(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   if (!c) return 0;
+   return evas_textblock_cursor_node_format_is_visible_get(c);
+}
+
+const char *
+_edje_entry_cursor_content_get(Edje_Real_Part *rp, Edje_Cursor cur)
+{
+   Evas_Textblock_Cursor *c = _cursor_get(rp, cur);
+   const char *s;
+   static buf[16];
+   int pos, pos2, ch;
+   if (!c) return NULL;
+   s = evas_textblock_cursor_node_format_get(c);
+   if (s) return s;
+   s = evas_textblock_cursor_node_text_get(c);
+   if (!s) return NULL;
+   pos = evas_textblock_cursor_pos_get(c);
+   pos2 = evas_string_char_next_get(s, pos, &ch);
+   strncpy(buf, s + pos, pos2 - pos);
+   buf[pos2 - pos] = 0;
+   return buf;
+}
+
 #ifdef HAVE_ECORE_IMF
 static int
-_edje_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx, char **text, int *cursor_pos)
+_edje_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx __UNUSED__, char **text, int *cursor_pos)
 {
    Edje_Real_Part *rp = data;
    Entry *en;
@@ -1917,16 +2113,12 @@ _edje_entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx, char
 }
 
 static int 
-_edje_entry_imf_event_commit_cb(void *data, int type, void *event)
+_edje_entry_imf_event_commit_cb(void *data, int type __UNUSED__, void *event)
 {
    Edje* ed = data;
    Edje_Real_Part *rp = ed->focused_part;
    Entry *en;
    Ecore_IMF_Event_Commit *ev = event;
-   int cursor_pos, composition_pos;
-   int start_pos, end_pos;
-   Eina_Bool selecting;
-   Eina_Bool changed = EINA_FALSE;
    int i;
    
    if (!rp) return 1;
@@ -1957,18 +2149,14 @@ _edje_entry_imf_event_commit_cb(void *data, int type, void *event)
 }
 
 static int 
-_edje_entry_imf_event_changed_cb(void *data, int type, void *event)
+_edje_entry_imf_event_changed_cb(void *data, int type __UNUSED__, void *event)
 {
    Edje* ed = data;
    Edje_Real_Part *rp = ed->focused_part;
    Entry *en;
    int cursor_pos;
-   int composition_pos, length;
-   int start_pos, end_pos;
-   Eina_Bool selecting = EINA_FALSE;
-   Eina_Bool changed = EINA_FALSE;
+   int length;
    Ecore_IMF_Event_Commit *ev = event;
-   Evas_Textblock_Cursor *start_cur, *end_cur;
    int i;
    char *preedit_string;
 
@@ -2019,7 +2207,7 @@ _edje_entry_imf_event_changed_cb(void *data, int type, void *event)
 }
 
 static int
-_edje_entry_imf_event_delete_surrounding_cb(void *data, int type, void *event)
+_edje_entry_imf_event_delete_surrounding_cb(void *data, int type __UNUSED__, void *event)
 {
    Edje *ed = data;
    Edje_Real_Part *rp = ed->focused_part;
diff --git a/src/lib/edje_external.c b/src/lib/edje_external.c
new file mode 100644
index 0000000..0fc1a9c
--- /dev/null
+++ b/src/lib/edje_external.c
@@ -0,0 +1,360 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#include "edje_private.h"
+
+static Eina_Hash *type_registry = NULL;
+static int init_count = 0;
+
+/**
+ * Register given type name to return the given information.
+ *
+ * @param type_name name to register and be known by edje's "source:"
+ *        parameter of "type: EXTERNAL" parts.
+ * @param type_info meta-information describing how to interact with it.
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (like
+ *         type already registered).
+ *
+ * @see edje_external_type_array_register()
+ */
+EAPI Eina_Bool
+edje_external_type_register(const char *type_name, const Edje_External_Type *type_info)
+{
+   if (!type_name)
+     return EINA_FALSE;
+   if (!type_info)
+     return EINA_FALSE;
+
+   if (type_info->abi_version != EDJE_EXTERNAL_TYPE_ABI_VERSION)
+     {
+	printf("EDJE ERROR: external type '%s' (%p) has incorrect abi version. "
+	       "got %#x where %#x was expected.\n",
+	       type_name, type_info,
+	       type_info->abi_version, EDJE_EXTERNAL_TYPE_ABI_VERSION);
+	return EINA_FALSE;
+     }
+
+   if (eina_hash_find(type_registry, type_name))
+     {
+	printf("EDJE ERROR: external type '%s' already registered\n", type_name);
+	return EINA_FALSE;
+     }
+   return eina_hash_add(type_registry, type_name, type_info);
+}
+
+/**
+ * Unregister given type name previously registered.
+ *
+ * @param type_name name to unregister. It should be registered with
+ *        edje_external_type_register() before.
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (like
+ *         type_name did not exist).
+ *
+ * @see edje_external_type_array_unregister()
+ */
+EAPI Eina_Bool
+edje_external_type_unregister(const char *type_name)
+{
+   if (!type_name)
+     return EINA_FALSE;
+   return eina_hash_del_by_key(type_registry, type_name);
+}
+
+/**
+ * Register a batch of types and their information.
+ *
+ * This is the recommended function to add information as it's faster
+ * than the single version edje_external_type_register().
+ *
+ * @note the given array is not modified, but the type name strings
+ *       are @b not duplicated! That is, all type names must be @b
+ *       live until they are unregistered! This was choosen to save
+ *       some memory and most people will just define the array as a
+ *       global static const type anyway.
+ *
+ * @param arrray @c NULL terminated array with type name and
+ *        information. Note that type name or information are not
+ *        modified by are @b referenced, so they must keep alive after
+ *        this function returns!
+ *
+ * @return @c EINA_TRUE on success, @c EINA_FALSE on failure (like
+ *         type already registered).
+ *
+ * @see edje_external_type_register()
+ */
+EAPI void
+edje_external_type_array_register(const Edje_External_Type_Info *array)
+{
+   const Edje_External_Type_Info *itr;
+
+   if (!array)
+     return;
+
+   for (itr = array; itr->name; itr++)
+     {
+	if (itr->info->abi_version != EDJE_EXTERNAL_TYPE_ABI_VERSION)
+	  {
+	     printf("EDJE ERROR: external type '%s' (%p) has incorrect abi "
+		    "version. got %#x where %#x was expected.\n",
+		    itr->name, itr->info,
+		    itr->info->abi_version, EDJE_EXTERNAL_TYPE_ABI_VERSION);
+	     continue;
+	  }
+
+	eina_hash_direct_add(type_registry, itr->name, itr->info);
+     }
+}
+
+/**
+ * Unregister a batch of given external type previously registered.
+ *
+ * @param array @c NULL terminated array, should be the same as the
+ *        one used to register with edje_external_type_array_register()
+ *
+ * @see edje_external_type_unregister()
+ */
+EAPI void
+edje_external_type_array_unregister(const Edje_External_Type_Info *array)
+{
+   const Edje_External_Type_Info *itr;
+
+   if (!array)
+     return;
+
+   for (itr = array; itr->name; itr++)
+     eina_hash_del(type_registry, itr->name, itr->info);
+}
+
+/**
+ * Return the current ABI version for Edje_External_Type structure.
+ *
+ * Always check this number before accessing Edje_External_Type in
+ * your own software. If the number is not the same, your software may
+ * access invalid memory and crash, or just get garbage values.
+ *
+ * @warning @b NEVER, EVER define your own Edje_External_Type using the
+ *          return of this function as it will change as Edje library
+ *          (libedje.so) changes, but your type definition will
+ *          not. Instead, use #EDJE_EXTERNAL_TYPE_ABI_VERSION.
+ *
+ * Summary:
+ *   - use edje_external_type_abi_version_get() to check.
+ *   - use #EDJE_EXTERNAL_TYPE_ABI_VERSION to define/declare.
+ *
+ * @return version this edje library was compiled.
+ */
+EAPI unsigned int
+edje_external_type_abi_version_get(void)
+{
+   return EDJE_EXTERNAL_TYPE_ABI_VERSION;
+}
+
+EAPI Eina_Iterator *
+edje_external_iterator_get(void)
+{
+   return eina_hash_iterator_tuple_new(type_registry);
+}
+
+EAPI Edje_External_Param *
+edje_external_param_find(const Eina_List *params, const char *key)
+{
+   const Eina_List *l;
+   Edje_External_Param *param;
+
+   EINA_LIST_FOREACH(params, l, param)
+      if (!strcmp(param->name, key)) return param;
+
+   return NULL;
+}
+
+EAPI Eina_Bool
+edje_external_param_int_get(const Eina_List *params, const char *key, int *ret)
+{
+   Edje_External_Param *param;
+
+   if (!params) return EINA_FALSE;
+   param = edje_external_param_find(params, key);
+
+   if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_INT && ret)
+     {
+	*ret = param->i;
+	return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_external_param_double_get(const Eina_List *params, const char *key, double *ret)
+{
+   Edje_External_Param *param;
+
+   if (!params) return EINA_FALSE;
+   param = edje_external_param_find(params, key);
+
+   if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE && ret)
+     {
+	*ret = param->d;
+	return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI Eina_Bool
+edje_external_param_string_get(const Eina_List *params, const char *key, const char **ret)
+{
+   Edje_External_Param *param;
+
+   if (!params) return EINA_FALSE;
+   param = edje_external_param_find(params, key);
+
+   if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING && ret)
+     {
+	*ret = param->s;
+	return EINA_TRUE;
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI const Edje_External_Param_Info *
+edje_external_param_info_get(const char *type_name)
+{
+   Edje_External_Type *type;
+
+   type = eina_hash_find(type_registry, type_name);
+   if (!type)
+     return NULL;
+   return type->parameters_info;
+}
+
+void
+_edje_external_init()
+{
+   if (!type_registry)
+     type_registry = eina_hash_string_superfast_new(NULL);
+
+   init_count++;
+}
+
+void
+_edje_external_shutdown()
+{
+   if (--init_count == 0)
+     {
+	eina_hash_free(type_registry);
+	type_registry = NULL;
+     }
+}
+
+Evas_Object *
+_edje_external_type_add(const char *type_name, Evas *evas, Evas_Object *parent, const Eina_List *params)
+{
+   Edje_External_Type *type;
+   Evas_Object *obj;
+
+   type = eina_hash_find(type_registry, type_name);
+   if (!type)
+     {
+	printf("EDJE ERROR: external type '%s' not registered\n", type_name);
+	return NULL;
+     }
+
+   obj = type->add(type->data, evas, parent, params);
+   if (!obj)
+     {
+	printf("EDJE ERROR: external type '%s' returned NULL from constructor\n", type_name);
+	return NULL;
+     }
+
+   evas_object_data_set(obj, "Edje_External_Type", type);
+
+   printf("evas object: %p, external type: %p, data_get: %p\n", obj, type, evas_object_data_get(obj, "Edje_External_Type"));
+   return obj;
+}
+
+void
+_edje_external_signal_emit(Evas_Object *obj, const char *emission, const char *source)
+{
+   Edje_External_Type *type;
+
+   type = evas_object_data_get(obj, "Edje_External_Type");
+   if (!type)
+     {
+	printf("EDJE ERROR: external type data not found.\n");
+	return;
+     }
+
+   type->signal_emit(type->data, obj, emission, source);
+}
+
+void
+_edje_external_params_free(Eina_List *external_params, unsigned int free_strings)
+{
+   Edje_External_Param *param;
+
+   EINA_LIST_FREE(external_params, param)
+     {
+	if (free_strings)
+	  {
+	     if (param->name) eina_stringshare_del(param->name);
+	     if (param->s) eina_stringshare_del(param->s);
+	  }
+	free(param);
+     }
+}
+
+void
+_edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep,
+      Edje_Calc_Params *params,
+      Edje_Part_Description *chosen_desc)
+{
+   Edje_External_Type *type;
+   void *params1, *params2 = NULL;
+   if (!ep->swallowed_object) return;
+
+   type = evas_object_data_get(ep->swallowed_object, "Edje_External_Type");
+
+   if (!type) return;
+
+   if (!type->state_set) return;
+
+   params1 = ep->param1.external_params ? ep->param1.external_params : ep->param1.description->external_params;
+   if (ep->param2 && ep->param2->description)
+     params2 = ep->param2->external_params ? ep->param2->external_params : ep->param2->description->external_params;
+
+   type->state_set(type->data, ep->swallowed_object,
+	 params1, params2, ep->description_pos);
+}
+
+void *
+_edje_external_params_parse(Evas_Object *obj, const Eina_List *params)
+{
+   Edje_External_Type *type;
+
+   type = evas_object_data_get(obj, "Edje_External_Type");
+   if (!type) return NULL;
+
+   if (!type->params_parse) return NULL;
+
+   return type->params_parse(type->data, obj, params);
+}
+
+void
+_edje_external_parsed_params_free(Evas_Object *obj, void *params)
+{
+   Edje_External_Type *type;
+
+   if (!params) return;
+
+   type = evas_object_data_get(obj, "Edje_External_Type");
+   if (!type) return;
+
+   if (!type->params_free) return;
+
+   type->params_free(params);
+}
diff --git a/src/lib/edje_load.c b/src/lib/edje_load.c
index 75f8a47..5710467 100644
--- a/src/lib/edje_load.c
+++ b/src/lib/edje_load.c
@@ -296,6 +296,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
    old_swallows = _edje_swallows_collect(ed);
 
    if (_edje_script_only(ed)) _edje_script_only_shutdown(ed);
+   if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
    _edje_file_del(ed);
 
    if (ed->path) eina_stringshare_del(ed->path);
@@ -304,7 +305,18 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
    ed->group = eina_stringshare_add(group);
 
    ed->load_error = EDJE_LOAD_ERROR_NONE;
-  _edje_file_add(ed);
+   _edje_file_add(ed);
+
+   if (ed->file && ed->file->external_dir)
+     {
+       const Edje_External_Directory_Entry *ext;
+       const Eina_List *n;
+
+       EINA_LIST_FOREACH(ed->file->external_dir->entries, n, ext)
+         {
+            edje_module_load(ext->entry);
+         }
+     }
 
    _edje_textblock_styles_add(ed);
    _edje_textblock_style_all_update(ed);
@@ -316,6 +328,11 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 	     ed->load_error = EDJE_LOAD_ERROR_NONE;
 	     _edje_script_only_init(ed);
 	  }
+	else if (ed->collection->lua_script_only)
+	  {
+	     ed->load_error = EDJE_LOAD_ERROR_NONE;
+	     _edje_lua_script_only_init(ed);
+	  }
 	else
 	  {
 	     Eina_List *l;
@@ -346,12 +363,29 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 		  Edje_Real_Part *rp;
 
 		  ep = eina_list_data_get(l);
-		  rp = calloc(1, sizeof(Edje_Real_Part));
+		  rp = eina_mempool_malloc(_edje_real_part_mp, sizeof(Edje_Real_Part));
 		  if (!rp)
 		    {
 		       ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
 		       return 0;
 		    }
+
+		  memset(rp, 0, sizeof (Edje_Real_Part));
+
+		  if ((ep->dragable.x != 0) || (ep->dragable.y != 0))
+		    {
+		       rp->drag = calloc(1, sizeof (Edje_Real_Part_Drag));
+		       if (!rp->drag)
+			 {
+			    ed->load_error = EDJE_LOAD_ERROR_RESOURCE_ALLOCATION_FAILED;
+			    free(rp);
+			    return 0;
+			 }
+
+		       rp->drag->step.x = ep->dragable.step_x;
+		       rp->drag->step.y = ep->dragable.step_y;
+		    }
+
 		  rp->edje = ed;
 		  _edje_ref(rp->edje);
 		  rp->part = ep;
@@ -360,35 +394,45 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 		  rp->chosen_description = rp->param1.description;
 		  if (!rp->param1.description)
 		    printf("EDJE ERROR: no default part description!\n");
-		  if (ep->type == EDJE_PART_TYPE_RECTANGLE)
-		    rp->object = evas_object_rectangle_add(ed->evas);
-		  else if (ep->type == EDJE_PART_TYPE_IMAGE)
-		    rp->object = evas_object_image_add(ed->evas);
-		  else if (ep->type == EDJE_PART_TYPE_TEXT)
-		    {
-		       _edje_text_part_on_add(ed, rp);
-		       rp->object = evas_object_text_add(ed->evas);
-		       evas_object_text_font_source_set(rp->object, ed->path);
-		    }
-		  else if (ep->type == EDJE_PART_TYPE_SWALLOW || ep->type == EDJE_PART_TYPE_GROUP)
-		    {
-		       rp->object = evas_object_rectangle_add(ed->evas);
-		       evas_object_color_set(rp->object, 0, 0, 0, 0);
-		       evas_object_pass_events_set(rp->object, 1);
-		       evas_object_pointer_mode_set(rp->object, EVAS_OBJECT_POINTER_MODE_NOGRAB);
-		    }
-		  else if (ep->type == EDJE_PART_TYPE_TEXTBLOCK)
-		    rp->object = evas_object_textblock_add(ed->evas);
-		  else if (ep->type == EDJE_PART_TYPE_GRADIENT)
-		    rp->object = evas_object_gradient_add(ed->evas);
-		  else if (ep->type == EDJE_PART_TYPE_BOX)
+
+		  switch (ep->type)
 		    {
-		       rp->object = evas_object_box_add(ed->evas);
+		     case EDJE_PART_TYPE_RECTANGLE:
+			rp->object = evas_object_rectangle_add(ed->evas);
+			break;
+		     case EDJE_PART_TYPE_IMAGE:
+			rp->object = evas_object_image_add(ed->evas);
+			break;
+		     case EDJE_PART_TYPE_TEXT:
+			_edje_text_part_on_add(ed, rp);
+			rp->object = evas_object_text_add(ed->evas);
+			evas_object_text_font_source_set(rp->object, ed->path);
+			break;
+		     case EDJE_PART_TYPE_SWALLOW:
+		     case EDJE_PART_TYPE_GROUP:
+		     case EDJE_PART_TYPE_EXTERNAL:
+			rp->object = evas_object_rectangle_add(ed->evas);
+			evas_object_color_set(rp->object, 0, 0, 0, 0);
+			evas_object_pass_events_set(rp->object, 1);
+			evas_object_pointer_mode_set(rp->object, EVAS_OBJECT_POINTER_MODE_NOGRAB);
+			break;
+		     case EDJE_PART_TYPE_TEXTBLOCK:
+			rp->object = evas_object_textblock_add(ed->evas);
+			break;
+		     case EDJE_PART_TYPE_GRADIENT:
+			rp->object = evas_object_gradient_add(ed->evas);
+			break;
+		     case EDJE_PART_TYPE_BOX:
+			rp->object = evas_object_box_add(ed->evas);
+			break;
+		     case EDJE_PART_TYPE_TABLE:
+			rp->object = evas_object_table_add(ed->evas);
+			break;
+		     default:
+			printf("EDJE ERROR: wrong part type %i!\n", ep->type);
+			break;
 		    }
-		  else if (ep->type == EDJE_PART_TYPE_TABLE)
-		    rp->object = evas_object_table_add(ed->evas);
-		  else
-		    printf("EDJE ERROR: wrong part type %i!\n", ep->type);
+
 		  if (rp->object)
 		    {
 		       evas_object_smart_member_add(rp->object, ed->obj);
@@ -415,8 +459,6 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 		       if (rp->part->clip_to_id < 0)
 			 evas_object_clip_set(rp->object, ed->clipper);
 		    }
-		  rp->drag.step.x = ep->dragable.step_x;
-		  rp->drag.step.y = ep->dragable.step_y;
 		  rp->gradient_id = -1;
 	       }
 	     if (n > 0)
@@ -443,7 +485,6 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 			 rp->param1.rel2_to_x = ed->table_parts[rp->param1.description->rel2.id_x % ed->table_parts_size];
 		       if (rp->param1.description->rel2.id_y >= 0)
 			 rp->param1.rel2_to_y = ed->table_parts[rp->param1.description->rel2.id_y % ed->table_parts_size];
-		       _edje_text_part_on_add_clippers(ed, rp);
 		       if (rp->part->clip_to_id >= 0)
 			 {
 			    rp->clip_to = ed->table_parts[rp->part->clip_to_id % ed->table_parts_size];
@@ -454,9 +495,12 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 				 evas_object_clip_set(rp->object, rp->clip_to->object);
 			      }
 			 }
-		       if (rp->part->dragable.confine_id >= 0)
-			 rp->confine_to = ed->table_parts[rp->part->dragable.confine_id % ed->table_parts_size];
-		       
+		       if (rp->drag)
+			 {
+			    if (rp->part->dragable.confine_id >= 0)
+			      rp->drag->confine_to = ed->table_parts[rp->part->dragable.confine_id % ed->table_parts_size];
+			 }
+
 		       /* replay events for dragable */
 		       if (rp->part->dragable.events_id >= 0)
 			 {
@@ -467,7 +511,7 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 				!rp->events_to->part->dragable.y)
 			      rp->events_to = NULL;
 			 }
-		       
+
 		       rp->swallow_params.min.w = 0;
 		       rp->swallow_params.min.w = 0;
 		       rp->swallow_params.max.w = -1;
@@ -519,11 +563,17 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 		  rp = ed->table_parts[i];
 		  evas_object_show(rp->object);
 		  if (_edje_block_break(ed)) break;
-		  if (rp->part->dragable.x < 0) rp->drag.val.x = 1.0;
-		  if (rp->part->dragable.y < 0) rp->drag.val.x = 1.0;
-		  _edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
+		  if (rp->drag)
+		    {
+		       if (rp->part->dragable.x < 0) rp->drag->val.x = 1.0;
+		       if (rp->part->dragable.y < 0) rp->drag->val.x = 1.0;
+		       _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
+		    }
 	       }
 	     ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	     ed->all_part_change = 1;
+#endif
 	     if ((evas_object_clipees_get(ed->clipper)) &&
 		 (evas_object_visible_get(obj)))
 	       evas_object_show(ed->clipper);
@@ -542,21 +592,36 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 		  const char *source = NULL;
 		  
 		  rp = ed->table_parts[i];
-		  if (rp->part->type != EDJE_PART_TYPE_GROUP &&
-		      rp->part->type != EDJE_PART_TYPE_BOX &&
-		      rp->part->type != EDJE_PART_TYPE_TABLE) continue;
-		  if (rp->part->type == EDJE_PART_TYPE_GROUP)
-		    source = rp->part->source;
-		  else if (rp->part->type == EDJE_PART_TYPE_BOX ||
-			   rp->part->type == EDJE_PART_TYPE_TABLE)
+
+		  switch (rp->part->type)
 		    {
-		       if (rp->part->items)
-			 {
-			    curr_item = rp->part->items;
-			    pack_it = curr_item->data;
-			    source = pack_it->source;
-			 }
+		     case EDJE_PART_TYPE_GROUP:
+			source = rp->part->source;
+			break;
+		     case EDJE_PART_TYPE_BOX:
+		     case EDJE_PART_TYPE_TABLE:
+			if (rp->part->items)
+			  {
+			     curr_item = rp->part->items;
+			     pack_it = curr_item->data;
+			     source = pack_it->source;
+			  }
+			break;
+		     case EDJE_PART_TYPE_EXTERNAL:
+			  {
+			     Evas_Object *child_obj;
+			     child_obj = _edje_external_type_add(rp->part->source, evas_object_evas_get(ed->obj), ed->obj, rp->part->default_desc->external_params);
+			     if (child_obj)
+			       {
+				  _edje_real_part_swallow(rp, child_obj);
+				  rp->param1.external_params = _edje_external_params_parse(child_obj, rp->param1.description->external_params);
+			       }
+			  }
+			continue;
+		     default:
+			continue;
 		    }
+
 		  while (source)
 		    {
 		       Eina_List *l;
@@ -652,11 +717,10 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
 	     
 	     if (group_path_started)
 	       {
-		  while (group_path)
-		    {
-		       eina_stringshare_del(eina_list_data_get(group_path));
-		       group_path = eina_list_remove_list(group_path, group_path);
-		    }
+		  const char *str;
+
+		  EINA_LIST_FREE(group_path, str)
+		    eina_stringshare_del(str);
 	       }
 	     
 	     /* reswallow any swallows that existed before setting the file */
@@ -782,48 +846,57 @@ _edje_file_del(Edje *ed)
 	       _edje_entry_real_part_shutdown(rp);
 	     if (rp->object)
 	       {
-		  _edje_text_real_part_on_del(ed, rp);
 		  _edje_callbacks_del(rp->object);
 		  evas_object_del(rp->object);
 	       }
 	     if (rp->swallowed_object)
 	       {
-		  evas_object_smart_member_del(rp->swallowed_object);
-		  evas_object_event_callback_del(rp->swallowed_object,
-						 EVAS_CALLBACK_FREE,
-						 _edje_object_part_swallow_free_cb);
-		  evas_object_clip_unset(rp->swallowed_object);
-		  evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
-		  if (rp->part->mouse_events)
-		     _edje_callbacks_del(rp->swallowed_object);
-
+                  _edje_real_part_swallow_clear(rp);
                   /* Objects swallowed by the app do not get deleted,
                    but those internally swallowed (GROUP type) do. */
-		  if (rp->part->type == EDJE_PART_TYPE_GROUP)
-		    evas_object_del(rp->swallowed_object);
-
+		  switch (rp->part->type)
+		    {
+		     case EDJE_PART_TYPE_EXTERNAL:
+			_edje_external_parsed_params_free(rp->swallowed_object, rp->param1.external_params);
+			if (rp->param2)
+			  _edje_external_parsed_params_free(rp->swallowed_object, rp->param2->external_params);
+		     case EDJE_PART_TYPE_GROUP:
+			evas_object_del(rp->swallowed_object);
+		     default:
+			break;
+		    }
 		  rp->swallowed_object = NULL;
 	       }
 	     if (rp->items)
 	       {
-		  /* all internal, for now */
-		  while (rp->items)
-		    {
-		       /* evas_box/table handles deletion of objects */
-		       /*evas_object_del(rp->items->data);*/
-		       rp->items = eina_list_remove_list(rp->items, rp->items);
-		    }
+		  /* evas_box/table handles deletion of objects */
+		  rp->items = eina_list_free(rp->items);
 	       }
 	     if (rp->text.text) eina_stringshare_del(rp->text.text);
 	     if (rp->text.font) eina_stringshare_del(rp->text.font);
 	     if (rp->text.cache.in_str) eina_stringshare_del(rp->text.cache.in_str);
 	     if (rp->text.cache.out_str) eina_stringshare_del(rp->text.cache.out_str);
 
-	     if (rp->custom.description)
-	       _edje_collection_free_part_description_free(rp->custom.description, ed->file->free_strings);
+	     if (rp->custom)
+               {
+                  if (ed->L)
+                    {
+                       _edje_lua_get_reg(ed->L, rp->custom->description);
+                       _edje_lua_free_reg(ed->L, lua_touserdata(ed->L, -1)); // created in edje_lua.c::_edje_lua_part_fn_custom_state
+                       lua_pop(ed->L, 1);
+                       _edje_lua_free_reg(ed->L, rp->custom->description); // created in edje_lua.c::_edje_lua_part_fn_custom_state
+                    }
+                  _edje_collection_free_part_description_free(rp->custom->description, ed->file->free_strings);
+               }
+
+	     /* Cleanup optional part. */
+	     free(rp->drag);
+
+	     eina_mempool_free(_edje_real_part_state_mp, rp->param2);
+	     eina_mempool_free(_edje_real_part_state_mp, rp->custom);
 
 	     _edje_unref(rp->edje);
-	     free(rp);
+	     eina_mempool_free(_edje_real_part_mp, rp);
 	  }
      }
    if ((ed->file) && (ed->collection))
@@ -834,9 +907,10 @@ _edje_file_del(Edje *ed)
 	_edje_textblock_styles_del(ed);
 	EINA_LIST_FOREACH(ed->collection->parts, l, ep)
 	  {
-	     _edje_text_part_on_del(ed, ep);
-	     _edje_color_class_on_del(ed, ep);
+	    _edje_text_part_on_del(ed, ep);
+	    _edje_color_class_on_del(ed, ep);
 	  }
+	
 	_edje_cache_coll_unref(ed->file, ed->collection);
 	ed->collection = NULL;
      }
@@ -847,29 +921,32 @@ _edje_file_del(Edje *ed)
      }
    if (ed->actions)
      {
-	while (ed->actions)
-	  {
-	     Edje_Running_Program *runp;
+	Edje_Running_Program *runp;
 
+	EINA_LIST_FREE(ed->actions, runp)
+	  {
 	     _edje_anim_count--;
-	     runp = eina_list_data_get(ed->actions);
-	     ed->actions = eina_list_remove(ed->actions, runp);
 	     free(runp);
 	  }
      }
    _edje_animators = eina_list_remove(_edje_animators, ed);
    if (ed->pending_actions)
      {
-	while (ed->pending_actions)
-	  {
-	     Edje_Pending_Program *pp;
+	Edje_Pending_Program *pp;
 
-	     pp = eina_list_data_get(ed->pending_actions);
-	     ed->pending_actions = eina_list_remove(ed->pending_actions, pp);
+	EINA_LIST_FREE(ed->pending_actions, pp)
+	  {
 	     ecore_timer_del(pp->timer);
 	     free(pp);
 	  }
      }
+   if (ed->L)
+     {
+	_edje_lua_free_reg(ed->L, ed); // created in edje_lua.c::_edje_lua_script_fn_new/_edje_lua_group_fn_new
+	_edje_lua_free_reg(ed->L, ed->L); // created in edje_program.c::_edje_program_run/edje_lua_script_only.c::_edje_lua_script_only_init
+	_edje_lua_free_thread(ed->L); // created in edje_program.c::_edje_program_run/edje_lua_script_only.c::_edje_lua_script_only_init
+	ed->L = NULL;
+     }
    if (ed->table_parts) free(ed->table_parts);
    ed->table_parts = NULL;
    ed->table_parts_size = 0;
@@ -881,7 +958,7 @@ _edje_file_del(Edje *ed)
  * Used to free the cached data values that are stored in the data_cache
  * hash table.
  */
-static Eina_Bool data_cache_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+static Eina_Bool data_cache_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
 {
    Edje_File    *edf;
 
@@ -893,15 +970,15 @@ static Eina_Bool data_cache_free(const Eina_Hash *hash, const void *key, void *d
 void
 _edje_file_free(Edje_File *edf)
 {
+   Edje_Color_Class *ecc;
+   Edje_Data *edt;
+
    if (edf->font_dir)
      {
-	while (edf->font_dir->entries)
-	  {
-	     Edje_Font_Directory_Entry *fe;
+	Edje_Font_Directory_Entry *fe;
 
-	     fe = eina_list_data_get(edf->font_dir->entries);
-	     edf->font_dir->entries =
-	       eina_list_remove_list(edf->font_dir->entries, edf->font_dir->entries);
+	EINA_LIST_FREE(edf->font_dir->entries, fe)
+	  {
 	     eina_hash_del(edf->font_hash, fe->entry, edf);
 	     if (edf->free_strings && fe->path) eina_stringshare_del(fe->path);
 	     free(fe);
@@ -915,13 +992,10 @@ _edje_file_free(Edje_File *edf)
      }
    if (edf->image_dir)
      {
-	while (edf->image_dir->entries)
-	  {
-	     Edje_Image_Directory_Entry *ie;
+	Edje_Image_Directory_Entry *ie;
 
-	     ie = eina_list_data_get(edf->image_dir->entries);
-	     edf->image_dir->entries =
-	       eina_list_remove_list(edf->image_dir->entries, edf->image_dir->entries);
+	EINA_LIST_FREE(edf->image_dir->entries, ie)
+	  {
 	     if (edf->free_strings && ie->entry) eina_stringshare_del(ie->entry);
 	     free(ie);
 	  }
@@ -929,13 +1003,10 @@ _edje_file_free(Edje_File *edf)
      }
    if (edf->collection_dir)
      {
-	while (edf->collection_dir->entries)
-	  {
-	     Edje_Part_Collection_Directory_Entry *ce;
+	Edje_Part_Collection_Directory_Entry *ce;
 
-	     ce = eina_list_data_get(edf->collection_dir->entries);
-	     edf->collection_dir->entries =
-	       eina_list_remove_list(edf->collection_dir->entries, edf->collection_dir->entries);
+	EINA_LIST_FREE(edf->collection_dir->entries, ce)
+	  {
 	     if (edf->free_strings && ce->entry) eina_stringshare_del(ce->entry);
 	     free(ce);
 	  }
@@ -943,19 +1014,15 @@ _edje_file_free(Edje_File *edf)
      }
    if (edf->spectrum_dir)
      {
-	while (edf->spectrum_dir->entries)
+	Edje_Spectrum_Directory_Entry *se;
+
+	EINA_LIST_FREE(edf->spectrum_dir->entries, se)
 	  {
-	     Edje_Spectrum_Directory_Entry *se;
+	     Edje_Spectrum_Color *sc;
+
+	     EINA_LIST_FREE(se->color_list, sc)
+	       free(sc);
 
-	     se = eina_list_data_get(edf->spectrum_dir->entries);
-	     edf->spectrum_dir->entries =
-	       eina_list_remove_list(edf->spectrum_dir->entries, edf->spectrum_dir->entries);
-	     while (se->color_list)
-	       {
-		 free(eina_list_data_get(se->color_list));
-		  se->color_list =
-                    eina_list_remove_list(se->color_list, se->color_list);
-	       }
              if (edf->free_strings)
                {
                   if (se->entry) eina_stringshare_del(se->entry);
@@ -965,12 +1032,9 @@ _edje_file_free(Edje_File *edf)
 	  }
 	free(edf->spectrum_dir);
      }
-   while (edf->data)
-     {
-	Edje_Data *edt;
 
-	edt = eina_list_data_get(edf->data);
-	edf->data = eina_list_remove(edf->data, edt);
+   EINA_LIST_FREE(edf->data, edt)
+     {
         if (edf->free_strings)
           {
              if (edt->key) eina_stringshare_del(edt->key);
@@ -985,13 +1049,8 @@ _edje_file_free(Edje_File *edf)
 	edf->data_cache = NULL;
      }
 
-   while (edf->color_classes)
+   EINA_LIST_FREE(edf->color_classes, ecc)
      {
-	Edje_Color_Class *ecc;
-
-	ecc = eina_list_data_get(edf->color_classes);
-	edf->color_classes =
-          eina_list_remove_list(edf->color_classes, edf->color_classes);
 	if (edf->free_strings && ecc->name) eina_stringshare_del(ecc->name);
 	free(ecc);
      }
@@ -1024,12 +1083,14 @@ _edje_file_free(Edje_File *edf)
 void
 _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
 {
-   while (ec->programs)
+   Edje_Program *pr;
+   Edje_Part *ep;
+
+   EINA_LIST_FREE(ec->programs, pr)
      {
-	Edje_Program *pr;
+	Edje_Program_Target *prt;
+	Edje_Program_After *pa;
 
-	pr = eina_list_data_get(ec->programs);
-	ec->programs = eina_list_remove_list(ec->programs, ec->programs);
         if (edf->free_strings)
           {
              if (pr->name) eina_stringshare_del(pr->name);
@@ -1038,54 +1099,32 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
              if (pr->state) eina_stringshare_del(pr->state);
              if (pr->state2) eina_stringshare_del(pr->state2);
           }
-	while (pr->targets)
-	  {
-	     Edje_Program_Target *prt;
-
-	     prt = eina_list_data_get(pr->targets);
-	     pr->targets = eina_list_remove_list(pr->targets, pr->targets);
-	     free(prt);
-	  }
-	while (pr->after)
-	  {
-	     Edje_Program_After *pa;
-
-	     pa = eina_list_data_get(pr->after);
-	     pr->after = eina_list_remove_list(pr->after, pr->after);
-	     free(pa);
-	  }
+	EINA_LIST_FREE(pr->targets, prt)
+	  free(prt);
+	EINA_LIST_FREE(pr->after, pa)
+	  free(pa);
 	free(pr);
      }
-   while (ec->parts)
+   EINA_LIST_FREE(ec->parts, ep)
      {
-	Edje_Part *ep;
+	Edje_Part_Description *desc;
 
-	ep = eina_list_data_get(ec->parts);
-	ec->parts = eina_list_remove(ec->parts, ep);
 	if (edf->free_strings && ep->name) eina_stringshare_del(ep->name);
 	if (ep->default_desc)
 	  {
 	     _edje_collection_free_part_description_free(ep->default_desc, edf->free_strings);
 	     ep->default_desc = NULL;
 	  }
-	while (ep->other_desc)
-	  {
-	     Edje_Part_Description *desc;
-
-	     desc = eina_list_data_get(ep->other_desc);
-	     ep->other_desc = eina_list_remove(ep->other_desc, desc);
-	     _edje_collection_free_part_description_free(desc, edf->free_strings);
-	  }
+	EINA_LIST_FREE(ep->other_desc, desc)
+	  _edje_collection_free_part_description_free(desc, edf->free_strings);
 	free(ep);
      }
    if (ec->data)
      {
-	while (ec->data)
-	  {
-	     Edje_Data *edt;
+	Edje_Data *edt;
 
-	     edt = eina_list_data_get(ec->data);
-	     ec->data = eina_list_remove(ec->data, edt);
+	EINA_LIST_FREE(ec->data, edt)
+	  {
              if (edf->free_strings)
                {
                   if (edt->key) eina_stringshare_del(edt->key);
@@ -1106,20 +1145,24 @@ _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
      }
 #endif
    if (ec->script) embryo_program_free(ec->script);
+   if (ec->L)
+     {
+	_edje_lua_free_reg(ec->L, ec); // created in edje_cache.c::_edje_file_coll_open
+	_edje_lua_free_thread(ec->L); // created in edje_cache.c::_edje_file_coll_open
+	ec->L = NULL;
+     }
    free(ec);
 }
 
 void
 _edje_collection_free_part_description_free(Edje_Part_Description *desc, unsigned int free_strings)
 {
-   while (desc->image.tween_list)
-     {
-	Edje_Part_Image_Id *pi;
+   Edje_Part_Image_Id *pi;
 
-	pi = eina_list_data_get(desc->image.tween_list);
-	desc->image.tween_list = eina_list_remove(desc->image.tween_list, pi);
-	free(pi);
-     }
+   EINA_LIST_FREE(desc->image.tween_list, pi)
+     free(pi);
+   if (desc->external_params)
+     _edje_external_params_free(desc->external_params, free_strings);
    if (free_strings)
      {
 	if (desc->color_class)     eina_stringshare_del(desc->color_class);
@@ -1134,7 +1177,7 @@ _edje_collection_free_part_description_free(Edje_Part_Description *desc, unsigne
 }
 
 static Eina_Bool
-_edje_file_collection_hash_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_edje_file_collection_hash_foreach(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata)
 {
    Edje_File *edf;
    Edje_Part_Collection *coll;
@@ -1201,8 +1244,8 @@ _cb_signal_repeat(void *data, Evas_Object *obj, const char *signal, const char *
    Evas_Object	*parent;
    Edje		*ed;
    char		 new_src[4096]; /* XXX is this max reasonable? */
-   int		 length_parent = 0;
-   int		 length_source;
+   size_t	 length_parent = 0;
+   size_t	 length_source;
 
    parent = data;
    ed = _edje_fetch(obj);
diff --git a/src/lib/edje_lua.c b/src/lib/edje_lua.c
new file mode 100644
index 0000000..9317551
--- /dev/null
+++ b/src/lib/edje_lua.c
@@ -0,0 +1,5136 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <string.h>
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca(size_t);
+#endif
+
+#include "edje_private.h"
+
+#include <lauxlib.h>
+#include <lualib.h>
+
+/*
+ * Edje_Lua framework definitions
+ */
+
+#define EDJE_LUA_GET 1
+#define EDJE_LUA_SET 2
+#define EDJE_LUA_FN 3
+
+typedef struct _Edje_Lua_Alloc Edje_Lua_Alloc;
+
+typedef struct _Edje_Lua_Ref Edje_Lua_Ref;
+
+typedef struct _Edje_Lua_Reg Edje_Lua_Reg;
+
+typedef struct _Edje_Lua_Timer Edje_Lua_Timer;
+
+typedef struct _Edje_Lua_Animator Edje_Lua_Animator;
+
+typedef struct _Edje_Lua_Poller Edje_Lua_Poller;
+
+typedef struct _Edje_Lua_Transform Edje_Lua_Transform;
+
+typedef struct _Edje_Lua_Transition Edje_Lua_Transition;
+
+typedef struct _Edje_Lua_Evas_Object Edje_Lua_Evas_Object;
+
+typedef struct _Edje_Lua_Edje_Part_Object Edje_Lua_Edje_Part_Object;
+
+typedef struct _Edje_Lua_Edje_Part_Description Edje_Lua_Edje_Part_Description;
+
+struct _Edje_Lua_Alloc
+{
+   size_t max, cur; /* maximal and current memory used by Lua */
+};
+
+struct _Edje_Lua_Ref
+{
+   int id;
+   lua_State *L;
+};
+
+struct _Edje_Lua_Reg
+{
+   const luaL_Reg *mt, *get, *set, *fn;
+};
+
+struct _Edje_Lua_Timer
+{
+   lua_State *L;
+   Ecore_Timer *et;
+   Edje_Lua_Ref *cb;
+};
+
+struct _Edje_Lua_Animator
+{
+   lua_State *L;
+   Ecore_Animator *ea;
+   Edje_Lua_Ref *cb;
+};
+
+struct _Edje_Lua_Poller
+{
+   lua_State *L;
+   Ecore_Poller *ep;
+   Edje_Lua_Ref *cb;
+};
+
+struct _Edje_Lua_Transform
+{
+   lua_State *L;
+   Evas_Transform et;
+};
+
+struct _Edje_Lua_Transition
+{
+   lua_State *L;
+   Ecore_Timer *et;
+   Edje_Lua_Ref *trans;
+   Edje_Lua_Ref *cb;
+   Edje_Lua_Ref *ref;
+   double dur;
+};
+
+struct _Edje_Lua_Evas_Object
+{
+   lua_State *L;
+   Edje *ed;
+   Evas_Object *eo;
+   Eina_Bool mouse_events;
+   Eina_List *cb;
+};
+
+struct _Edje_Lua_Edje_Part_Object
+{
+   lua_State *L;
+   Edje *ed;
+   Evas_Object *eo;
+   Edje_Real_Part *rp;
+   const char *key;
+};
+
+struct _Edje_Lua_Edje_Part_Description
+{
+   lua_State *L;
+   Edje *ed;
+   Evas_Object *eo;
+   Edje_Real_Part *rp;
+   Edje_Part_Description *pd;
+};
+
+void
+_edje_lua_error(lua_State *L, int err_code)
+{
+   char *err_type;
+
+   switch (err_code)
+     {
+     case LUA_ERRRUN:
+	err_type = "runtime";
+	break;
+     case LUA_ERRSYNTAX:
+	err_type = "syntax";
+	break;
+     case LUA_ERRMEM:
+	err_type = "memory allocation";
+	break;
+     case LUA_ERRERR:
+	err_type = "error handler";
+	break;
+     default:
+	err_type = "unknown";
+	break;
+     }
+   fprintf(stderr, "Lua %s error: %s\n", err_type, lua_tostring(L, -1));
+   // don't exit. this is BAD. lua script bugs will cause thngs like e to
+   // exit mysteriously endig your x session. bad!
+   // exit(-1);
+}
+
+lua_State *
+_edje_lua_new_thread(lua_State *L)
+{
+   /* create new thread */
+   lua_State *thread = lua_newthread(L);
+   //printf ("new thread %d->%d\n", L, thread);
+   /* create new environment for new thread */
+   lua_newtable(L);
+   /* inherit new environment from global environment */
+   lua_createtable(L, 1, 0);
+   lua_pushvalue(L, LUA_GLOBALSINDEX);
+   lua_setfield(L, -2, "__index");
+   lua_setmetatable(L, -2);
+   lua_setfenv(L, -2);
+   return thread;
+}
+
+void
+_edje_lua_free_thread(lua_State *L)
+{
+   lua_pushthread(L);
+   lua_getfenv(L, -1);
+   lua_pushnil(L);
+   while (lua_next(L, -2))
+     {
+	// key at -2, value at -1
+	lua_pop(L, 1);
+	lua_pushvalue(L, -1);
+	lua_pushnil(L);
+	lua_rawset(L, -4);
+     }
+   lua_settop(L, 0);
+   lua_gc(L, LUA_GCCOLLECT, 0);
+}
+
+/*
+ * only for debug, returns number of objects in registry
+ */
+static int
+_edje_lua_reg_count (lua_State *L)
+{
+   int count = 0;
+   lua_pushvalue(L, LUA_REGISTRYINDEX);
+   lua_pushnil(L);
+   while (lua_next(L, -2))
+     {
+	// key at -2, value at -1
+	lua_pop(L, 1);
+	count++;
+     }
+   lua_pop(L, 1);
+   return count;
+}
+
+static Edje_Lua_Ref *
+_edje_lua_new_ref(lua_State *L, int index)
+{
+   //printf ("_edje_lua_new_ref %d %d %d\n", L, lua_objlen(L, LUA_REGISTRYINDEX), _edje_lua_reg_count(L));
+   lua_pushvalue(L, index);
+   Edje_Lua_Ref *ref = malloc(sizeof(Edje_Lua_Ref));
+   ref->id = luaL_ref(L, LUA_REGISTRYINDEX);
+   ref->L = L;
+   return ref;
+}
+
+static void
+_edje_lua_get_ref(lua_State *L, Edje_Lua_Ref *ref)
+{
+   lua_rawgeti(L, LUA_REGISTRYINDEX, ref->id);
+}
+
+static void
+_edje_lua_free_ref(lua_State *L, Edje_Lua_Ref *ref)
+{
+   //printf ("_edje_lua_free_ref %d %d %d\n", L, lua_objlen(L, LUA_REGISTRYINDEX), _edje_lua_reg_count(L));
+   luaL_unref(L, LUA_REGISTRYINDEX, ref->id);
+   free(ref);
+   lua_gc(L, LUA_GCCOLLECT, 0);
+}
+
+void
+_edje_lua_new_reg(lua_State *L, int index, void *ptr)
+{
+   //printf ("_edje_lua_new_reg %d %d %d\n", L, ptr, _edje_lua_reg_count(L));
+   lua_pushvalue(L, index);
+   lua_pushlightuserdata(L, ptr);
+   lua_insert(L, -2);
+   lua_rawset(L, LUA_REGISTRYINDEX); /* freed in _edje_lua_free_reg */
+}
+
+void
+_edje_lua_get_reg(lua_State *L, void *ptr)
+{
+   //printf ("_edje_lua_get_reg %d %d\n", L, ptr);
+   lua_pushlightuserdata(L, ptr);
+   lua_rawget(L, LUA_REGISTRYINDEX);
+}
+
+void
+_edje_lua_free_reg(lua_State *L, void *ptr)
+{
+   //printf ("_edje_lua_free_reg %d %d %d\n", L, ptr, _edje_lua_reg_count(L));
+   lua_pushlightuserdata(L, ptr);
+   lua_pushnil(L);
+   lua_rawset(L, LUA_REGISTRYINDEX); /* created in _edje_lua_new_reg */
+   lua_gc(L, LUA_GCCOLLECT, 0);
+}
+
+static void
+_edje_lua_rawsetfield(lua_State *L, int index, const char *key)
+{
+   lua_pushstring(L, key);
+   lua_insert(L, -2);
+   if (index < 0)
+      lua_rawset(L, index - 1);
+   else
+      lua_rawset(L, index);
+}
+
+static void
+_edje_lua_rawgetfield(lua_State *L, int index, const char *key)
+{
+   lua_pushstring(L, key);
+   if (index < 0)
+      lua_rawget(L, index - 1);
+   else
+      lua_rawget(L, index);
+}
+
+static void
+_edje_lua_new_const(lua_State *L, const char *id, int val)
+{
+   lua_pushnumber(L, val);
+   lua_setglobal(L, id);
+}
+
+static void
+_edje_lua_new_metatable(lua_State *L, const Edje_Lua_Reg ** class)
+{
+   lua_newtable(L);
+   lua_pushlightuserdata(L, class);
+   lua_pushvalue(L, -2);
+   lua_rawset(L, LUA_REGISTRYINDEX); /* freed in _edje_lua_free_metatable */
+   lua_pushvalue(L, -1);
+   lua_pushlightuserdata(L, class);
+   lua_rawset(L, LUA_REGISTRYINDEX); /* freed in _edje_lua_free_metatable */
+}
+
+static void
+_edje_lua_get_metatable(lua_State *L, const Edje_Lua_Reg ** class)
+{
+   lua_pushlightuserdata(L, class);
+   lua_rawget(L, LUA_REGISTRYINDEX);
+}
+
+static void
+_edje_lua_free_metatable(lua_State *L, const Edje_Lua_Reg ** class)
+{
+   lua_pushlightuserdata(L, class);
+   lua_rawget(L, LUA_REGISTRYINDEX);
+   lua_pushnil(L);
+   lua_rawset(L, LUA_REGISTRYINDEX); /* created in _edje_lua_new_metatable */
+   lua_pushlightuserdata(L, class);
+   lua_pushnil(L);
+   lua_rawset(L, LUA_REGISTRYINDEX); /* created in _edje_lua_new_metatable */
+   lua_gc(L, LUA_GCCOLLECT, 0);
+}
+
+void *
+_edje_lua_checkudata(lua_State *L, int pos, const Edje_Lua_Reg * module)
+{
+   luaL_checktype(L, pos, LUA_TUSERDATA);
+   lua_getmetatable(L, pos);
+   lua_rawget(L, LUA_REGISTRYINDEX);
+   Edje_Lua_Reg **class = lua_touserdata(L, -1);
+   lua_pop(L, 1);		// class
+   int flag = 0;
+   int ptr = 0;
+   while (class[ptr] && !flag)
+      if (class[ptr++] == module)
+	 flag = 1;
+   if (!flag)
+     {
+	lua_pushstring(L, "class type mismatch");
+	lua_error(L);
+     }
+   return lua_touserdata(L, pos);
+}
+
+static void
+_edje_lua_new_class(lua_State *L, const Edje_Lua_Reg ** class)
+{
+   int n = 0;
+   _edje_lua_new_metatable(L, class);
+   while (class && (class[n] != NULL))
+     {
+	luaL_register(L, NULL, class[n]->mt);
+	lua_pushstring(L, "hands off, it's none of your business!");
+	_edje_lua_rawsetfield(L, -2, "__metatable");
+
+	if (n == 0)
+	  {
+	     lua_newtable(L);
+	     luaL_register(L, NULL, class[n]->set);
+	     lua_rawseti (L, -2, EDJE_LUA_SET);
+
+	     lua_newtable(L);
+	     luaL_register(L, NULL, class[n]->get);
+	     lua_rawseti (L, -2, EDJE_LUA_GET);
+
+	     lua_newtable(L);
+	     luaL_register(L, NULL, class[n]->fn);
+	     lua_rawseti (L, -2, EDJE_LUA_FN);
+	  }
+	else
+	  {
+	     lua_rawgeti(L, -1, EDJE_LUA_SET);
+	     luaL_register(L, NULL, class[n]->set);
+	     lua_pop(L, 1);
+
+	     lua_rawgeti(L, -1, EDJE_LUA_GET);
+	     luaL_register(L, NULL, class[n]->get);
+	     lua_pop(L, 1);
+
+	     lua_rawgeti(L, -1, EDJE_LUA_FN);
+	     luaL_register(L, NULL, class[n]->fn);
+	     lua_pop(L, 1);
+	  }
+	n += 1;
+     }
+}
+
+static void
+_edje_lua_set_class(lua_State *L, int index, const Edje_Lua_Reg ** class)
+{
+   lua_newtable(L);
+   if (index < 0)
+      lua_setfenv(L, index - 1);
+   else
+      lua_setfenv(L, index);
+
+   _edje_lua_get_metatable(L, class);
+   if (index < 0)
+      lua_setmetatable(L, index - 1);
+   else
+      lua_setmetatable(L, index);
+}
+
+int
+_edje_lua_look_fn(lua_State *L)
+{
+   lua_rawgeti(L, -1, EDJE_LUA_FN);
+   lua_pushvalue(L, 2);		// key
+   lua_rawget(L, -2);		// .fn[key]
+   if (lua_iscfunction(L, -1))
+      return 1;
+   else
+     {
+	lua_pop(L, 2);		// .fn[key], .fn
+	return 0;
+     }
+}
+
+int
+_edje_lua_look_get(lua_State *L)
+{
+   lua_rawgeti(L, -1, EDJE_LUA_GET);
+   lua_pushvalue(L, 2);		// key
+   lua_rawget(L, -2);		// .get[key]
+   if (lua_iscfunction(L, -1))
+     {
+	int err_code;
+
+	lua_pushvalue(L, 1);
+
+	if ((err_code = lua_pcall(L, 1, 1, 0)))
+	   _edje_lua_error(L, err_code);
+	return 1;
+     }
+   else
+     {
+	lua_pop(L, 2);		// .get[key], .get
+	return 0;
+     }
+}
+
+int
+_edje_lua_look_set(lua_State *L)
+{
+   lua_rawgeti(L, -1, EDJE_LUA_SET);
+   lua_pushvalue(L, 2);		// key
+   lua_rawget(L, -2);		// .set[key]
+   if (lua_iscfunction(L, -1))
+     {
+	int err_code;
+
+	lua_pushvalue(L, 1);	// obj
+	lua_pushvalue(L, 3);	// value
+
+	if ((err_code = lua_pcall(L, 2, 0, 0)))	// .set[key](obj,key,value)
+	   _edje_lua_error(L, err_code);
+	return 1;
+     }
+   else
+     {
+	lua_pop(L, 2);		// .set[key], .set
+	return 0;
+     }
+}
+
+/*
+ * Lua Class bindings
+ */
+
+const luaL_Reg lNil[] = {
+   {NULL, NULL}			// sentinel
+};
+
+const luaL_Reg lClass_mt[];
+
+const luaL_Reg lClass_fn[];
+
+const Edje_Lua_Reg mClass = {
+   lClass_mt,
+   lNil,
+   lNil,
+   lClass_fn
+};
+
+static int
+_edje_lua_class_mt_index(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   lua_getmetatable(L, 1);
+   if (!_edje_lua_look_fn(L))	// look in lClass_fn
+      if (!_edje_lua_look_get(L))	// look in lClass_get
+	{			// look in obj ref hash
+	   lua_getfenv(L, 1);
+	   lua_pushvalue(L, 2);	// key
+	   lua_rawget(L, -2);
+	}
+   return 1;
+}
+
+static int
+_edje_lua_class_mt_newindex(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   lua_getmetatable(L, 1);
+   if (!_edje_lua_look_set(L))	// look in lClass_set
+     {				// look in obj ref hash
+	lua_getfenv(L, 1);
+	lua_pushvalue(L, 2);
+	lua_pushvalue(L, 3);
+	lua_rawset(L, -3);
+     }
+   return 0;
+}
+
+static int
+_edje_lua_class_mt_gc(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   //printf("_edje_lua_class_mt_gc\n");
+   /* FIXME has to be commented to not raise an error, solve differently
+   lua_getfield(L, 1, "del");
+   if (!lua_isnil(L, -1))
+     {
+	lua_pushvalue(L, 1);
+	int err_code;
+
+	if (err_code = lua_pcall(L, 1, 0, 0))
+	   _edje_lua_error(L, err_code);
+     }
+   lua_pop(L, 1);
+   */
+   return 0;
+}
+
+static int
+_edje_lua_class_fn_set(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   /*
+    * for k,v in pairs(table) do
+    *   obj[k] = v
+    * end
+    */
+   lua_pushnil(L);
+   while (lua_next(L, 2))
+     {
+	// key at -2, value at -1
+	lua_pushvalue(L, -2);
+	lua_insert(L, -2);
+	lua_settable(L, 1);
+     }
+   return 0;
+}
+
+static int
+_edje_lua_class_fn_get(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   /*
+    * res = {}
+    * mtG = getmetatable(obj)['.get']
+    * for k,v in pairs(mtG) do
+    *   res[k] = obj[k]
+    * end
+    */
+   lua_newtable(L);		// res
+   lua_getmetatable(L, 1);	// mt
+   lua_getfield(L, -1, ".get");
+   lua_remove(L, -2);		// mt
+
+   lua_pushnil(L);
+   while (lua_next(L, -2))
+     {
+	// key at -2, value at -1
+	lua_pop(L, 1);		// value = cfunction
+	lua_pushvalue(L, -1);	// key
+	lua_pushvalue(L, -1);	// key
+	lua_gettable(L, 1);	// obj[key]
+	lua_settable(L, 2);	// res[key]
+     }
+   lua_pop(L, 1);		// .get
+   return 1;
+}
+
+static int
+_edje_lua_class_itr_call(lua_State *L, int id)
+{
+   int err_code;
+
+   _edje_lua_checkudata(L, 1, &mClass);
+   lua_getmetatable(L, 1);	// mt
+   lua_rawgeti(L, -1, id);
+   lua_remove(L, -2);		// mt
+   lua_getglobal(L, "pairs");
+   lua_insert(L, -2);
+
+   if ((err_code = lua_pcall(L, 1, 3, 0)))
+      _edje_lua_error(L, err_code);
+   return 3;
+}
+
+static int
+_edje_lua_class_fn_gpairs(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   return _edje_lua_class_itr_call(L, EDJE_LUA_GET);
+}
+
+static int
+_edje_lua_class_fn_spairs(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   return _edje_lua_class_itr_call(L, EDJE_LUA_SET);
+}
+
+static int
+_edje_lua_class_fn_fpairs(lua_State *L)
+{
+   _edje_lua_checkudata(L, 1, &mClass);
+   return _edje_lua_class_itr_call(L, EDJE_LUA_FN);
+}
+
+static int
+_edje_lua_class_fn_pairs(lua_State *L)
+{
+   int err_code;
+
+   _edje_lua_checkudata(L, 1, &mClass);
+   lua_getfenv(L, 1);
+   lua_getglobal(L, "pairs");
+   lua_insert(L, -2);
+
+   if ((err_code = lua_pcall(L, 1, 3, 0)))
+      _edje_lua_error(L, err_code);
+   return 3;
+}
+
+static int
+_edje_lua_class_fn_ipairs(lua_State *L)
+{
+   int err_code;
+
+   _edje_lua_checkudata(L, 1, &mClass);
+   lua_getfenv(L, 1);
+   lua_getglobal(L, "ipairs");
+   lua_insert(L, -2);
+
+   if ((err_code = lua_pcall(L, 1, 3, 0)))
+      _edje_lua_error(L, err_code);
+   return 3;
+}
+
+const luaL_Reg lClass_mt[] = {
+   {"__index", _edje_lua_class_mt_index},
+   {"__newindex", _edje_lua_class_mt_newindex},
+   {"__gc", _edje_lua_class_mt_gc},
+   {NULL, NULL}			// sentinel
+};
+
+const luaL_Reg lClass_fn[] = {
+   {"get", _edje_lua_class_fn_get},
+   {"set", _edje_lua_class_fn_set},
+   {"gpairs", _edje_lua_class_fn_gpairs},
+   {"spairs", _edje_lua_class_fn_spairs},
+   {"fpairs", _edje_lua_class_fn_fpairs},
+   {"pairs", _edje_lua_class_fn_pairs},
+   {"ipairs", _edje_lua_class_fn_ipairs},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Lua Edje Timer bindings
+ */
+
+const luaL_Reg lTimer_get[];
+
+const luaL_Reg lTimer_set[];
+
+const luaL_Reg lTimer_fn[];
+
+const Edje_Lua_Reg mTimer = {
+   lNil,
+   lTimer_get,
+   lTimer_set,
+   lTimer_fn
+};
+
+const Edje_Lua_Reg *cTimer[] = {
+   &mClass,
+   &mTimer,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_timer_cb(void *data)
+{
+   Edje_Lua_Timer *obj = data;
+   lua_State *L = obj->L;
+   int err_code;
+   int res;
+
+   _edje_lua_get_ref(L, obj->cb);	// callback function
+   _edje_lua_get_reg(L, obj);
+
+   if ((err_code = lua_pcall(L, 1, 1, 0)))
+      _edje_lua_error(L, err_code);
+
+   res = luaL_checkint(L, -1);
+   lua_pop(L, 1);		// -- res
+   if (res == ECORE_CALLBACK_CANCEL)
+     {
+	// delete object
+	_edje_lua_get_reg(L, obj);
+	lua_pushvalue(L, -1);
+	lua_pushstring(L, "del");
+	lua_gettable(L, -2);
+	lua_insert(L, -2);
+	if ((err_code = lua_pcall(L, 1, 0, 0)))
+	   _edje_lua_error(L, err_code);
+     }
+   return res;
+}
+
+static int
+_edje_lua_timer_get_pending(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+   if (obj->et)
+      lua_pushnumber(L, ecore_timer_pending_get(obj->et));
+   else
+      lua_pushnil(L);
+   return 1;
+}
+
+static int
+_edje_lua_timer_get_precision(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+
+   if (obj->et)
+     lua_pushnumber(L, ecore_timer_precision_get());
+   else
+     lua_pushnil(L);
+   
+   return 1;
+}
+
+static int
+_edje_lua_timer_get_interval(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+
+   if (obj->et)
+     lua_pushnumber(L, ecore_timer_interval_get(obj->et));
+   else
+     lua_pushnil(L);
+
+   return 1;
+}
+
+const luaL_Reg lTimer_get[] = {
+   {"pending", _edje_lua_timer_get_pending},
+   {"precision", _edje_lua_timer_get_precision},
+   {"interval", _edje_lua_timer_get_interval},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_timer_set_interval(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+   if (obj->et)
+      ecore_timer_interval_set(obj->et, luaL_checknumber(L, 2));
+   return 0;
+}
+
+const luaL_Reg lTimer_set[] = {
+   {"interval", _edje_lua_timer_set_interval},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_timer_fn_del(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+   if (obj->et)
+     {
+	ecore_timer_del(obj->et);
+	obj->et = NULL;
+     }
+   if (obj->cb)
+     {
+	_edje_lua_free_ref(L, obj->cb); // created in _edje_lua_group_fn_timer
+	obj->cb = NULL;
+     }
+   _edje_lua_free_reg(L, obj); // created in _edje_lua_group_fn_timer
+   return 0;
+}
+
+static int
+_edje_lua_timer_fn_freeze(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+   if (obj->et)
+      ecore_timer_freeze(obj->et);
+   return 0;
+}
+
+static int
+_edje_lua_timer_fn_thaw(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+   if (obj->et)
+      ecore_timer_thaw(obj->et);
+   return 0;
+}
+
+static int
+_edje_lua_timer_fn_delay(lua_State *L)
+{
+   Edje_Lua_Timer *obj = _edje_lua_checkudata(L, 1, &mTimer);
+   if (obj->et)
+      ecore_timer_delay(obj->et, luaL_checknumber(L, 2));
+   return 0;
+}
+
+const luaL_Reg lTimer_fn[] = {
+   {"del", _edje_lua_timer_fn_del},
+   {"freeze", _edje_lua_timer_fn_freeze},
+   {"thaw", _edje_lua_timer_fn_thaw},
+   {"delay", _edje_lua_timer_fn_delay},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Lua Edje Animator bindings
+ */
+
+const luaL_Reg lAnimator_get[];
+
+const luaL_Reg lAnimator_fn[];
+
+const Edje_Lua_Reg mAnimator = {
+   lNil,
+   lAnimator_get,
+   lNil,
+   lAnimator_fn
+};
+
+const Edje_Lua_Reg *cAnimator[] = {
+   &mClass,
+   &mAnimator,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_animator_cb(void *data)
+{
+   int err, res;
+   Edje_Lua_Animator *obj = data;
+   lua_State *L = obj->L;
+
+   _edje_lua_get_ref(L, obj->cb);
+   _edje_lua_get_reg(L, obj);
+
+   if ((err = lua_pcall(L, 1, 1, 0)))
+     _edje_lua_error(L, err);
+
+   res = luaL_checkint(L, -1);
+   lua_pop(L, 1);		// Pop res off the stack
+   if (res == ECORE_CALLBACK_CANCEL)
+     {
+	/* delete animator */
+	_edje_lua_get_reg(L, obj);
+	lua_pushvalue(L, -1);
+	lua_pushstring(L, "del");
+	lua_gettable(L, -2);
+	lua_insert(L, -2);
+	if ((err = lua_pcall(L, 1, 0, 0)))
+	  _edje_lua_error(L, err);
+     }
+
+   return res;
+}
+
+static int
+_edje_lua_animator_get_frametime(lua_State *L)
+{
+   Edje_Lua_Animator *obj = _edje_lua_checkudata(L, 1, &mAnimator);
+
+   if (obj->ea)
+     lua_pushnumber(L, ecore_animator_frametime_get());
+   else
+     lua_pushnil(L);
+
+   return 1;
+}
+
+const luaL_Reg lAnimator_get[] = {
+    {"frametime", _edje_lua_animator_get_frametime},
+    {NULL, NULL}
+};
+
+static int
+_edje_lua_animator_fn_del(lua_State *L)
+{
+   Edje_Lua_Animator *obj = _edje_lua_checkudata(L, 1, &mAnimator);
+   if (obj->ea)
+     {
+	ecore_animator_del(obj->ea);
+	obj->ea = NULL;
+     }
+   if (obj->cb)
+     {
+	_edje_lua_free_ref(L, obj->cb); // created in _edje_lua_group_fn_animator
+	obj->cb = NULL;
+     }
+   _edje_lua_free_reg(L, obj); // created in _edje_lua_group_fn_animator
+   return 0;
+}
+
+const luaL_Reg lAnimator_fn[] = {
+   {"del", _edje_lua_animator_fn_del},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Lua Edje Poller Bindings
+ */
+
+const luaL_Reg lPoller_get[];
+
+const luaL_Reg lPoller_fn[];
+
+const Edje_Lua_Reg mPoller = {
+   lNil,
+   lPoller_get,
+   lNil,
+   lPoller_fn
+};
+
+const Edje_Lua_Reg *cPoller[] = {
+   &mClass,
+   &mPoller,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_poller_cb(void *data)
+{
+   int err, res;
+   Edje_Lua_Poller *obj = data;
+   lua_State *L = obj->L;
+
+   _edje_lua_get_ref(L, obj->cb);
+   _edje_lua_get_reg(L, obj);
+
+   if ((err = lua_pcall(L, 1, 1, 0)))
+     _edje_lua_error(L, err);
+
+   res = luaL_checkint(L, -1);
+   lua_pop(L, 1);		// Pop res off the stack
+   if (res == ECORE_CALLBACK_CANCEL)
+     {
+	/* delete poller */
+	_edje_lua_get_reg(L, obj);
+	lua_pushvalue(L, -1);
+	lua_pushstring(L, "del");
+	lua_gettable(L, -2);
+	lua_insert(L, -2);
+	if ((err = lua_pcall(L, 1, 0, 0)))
+	  _edje_lua_error(L, err);
+     }
+
+   return res;
+}
+
+static int
+_edje_lua_poller_get_interval(lua_State *L)
+{
+   Edje_Lua_Poller *obj = _edje_lua_checkudata(L, 1, &mPoller);
+
+   if (obj->ep)
+     lua_pushnumber(L, ecore_poller_poll_interval_get(ECORE_POLLER_CORE));
+   else
+     lua_pushnil(L);
+
+   return 1;
+}
+
+const luaL_Reg lPoller_get[] = {
+   {"interval", _edje_lua_poller_get_interval},
+   {NULL, NULL}
+};
+
+static int
+_edje_lua_poller_fn_del(lua_State *L)
+{
+   Edje_Lua_Poller *obj = _edje_lua_checkudata(L, 1, &mPoller);
+   if (obj->ep)
+     {
+	ecore_poller_del(obj->ep);
+	obj->ep = NULL;
+     }
+
+   if (obj->cb)
+     {
+	_edje_lua_free_ref(L, obj->cb); // created in _edje_lua_group_fn_poller
+	obj->cb = NULL;
+     }
+   _edje_lua_free_reg(L, obj); // created in _edje_lua_group_fn_poller
+
+   return 0;
+}
+
+const luaL_Reg lPoller_fn[] = {
+   {"del", _edje_lua_poller_fn_del},
+   {NULL, NULL}
+};
+
+/*
+ * Lua Edje Transform bindings
+ */
+
+const luaL_Reg lTransform_get[];
+
+const luaL_Reg lTransform_set[];
+
+const luaL_Reg lTransform_fn[];
+
+const Edje_Lua_Reg mTransform = {
+   lNil,
+   lTransform_get,
+   lTransform_set,
+   lTransform_fn
+};
+
+const Edje_Lua_Reg *cTransform[] = {
+   &mClass,
+   &mTransform,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_transform_get_matrix(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   lua_createtable(L, 3, 0);
+      lua_createtable(L, 3, 0);
+	 lua_pushnumber(L, obj->et.mxx); lua_rawseti(L, -2, 1);
+	 lua_pushnumber(L, obj->et.mxy); lua_rawseti(L, -2, 2);
+	 lua_pushnumber(L, obj->et.mxz); lua_rawseti(L, -2, 3);
+      lua_rawseti(L, -2, 1);
+      lua_createtable(L, 3, 0);
+	 lua_pushnumber(L, obj->et.myx); lua_rawseti(L, -2, 1);
+	 lua_pushnumber(L, obj->et.myy); lua_rawseti(L, -2, 2);
+	 lua_pushnumber(L, obj->et.myz); lua_rawseti(L, -2, 3);
+      lua_rawseti(L, -2, 2);
+      lua_createtable(L, 3, 0);
+	 lua_pushnumber(L, obj->et.mzx); lua_rawseti(L, -2, 1);
+	 lua_pushnumber(L, obj->et.mzy); lua_rawseti(L, -2, 2);
+	 lua_pushnumber(L, obj->et.mzz); lua_rawseti(L, -2, 3);
+      lua_rawseti(L, -2, 3);
+   return 1;
+}
+
+const luaL_Reg lTransform_get[] = {
+   {"matrix", _edje_lua_transform_get_matrix},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_transform_set_matrix(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   luaL_checktype(L, 2, LUA_TTABLE);
+      lua_rawgeti(L, 2, 1);
+      luaL_checktype(L, -1, LUA_TTABLE);
+	 lua_rawgeti(L, -1, 1); obj->et.mxx = luaL_checknumber(L, -1); lua_pop(L, 1);
+	 lua_rawgeti(L, -1, 2); obj->et.mxy = luaL_checknumber(L, -1); lua_pop(L, 1);
+	 lua_rawgeti(L, -1, 3); obj->et.mxz = luaL_checknumber(L, -1); lua_pop(L, 1);
+      lua_pop(L, 1);
+      lua_rawgeti(L, 2, 2);
+      luaL_checktype(L, -1, LUA_TTABLE);
+	 lua_rawgeti(L, -1, 1); obj->et.myx = luaL_checknumber(L, -1); lua_pop(L, 1);
+	 lua_rawgeti(L, -1, 2); obj->et.myy = luaL_checknumber(L, -1); lua_pop(L, 1);
+	 lua_rawgeti(L, -1, 3); obj->et.myz = luaL_checknumber(L, -1); lua_pop(L, 1);
+      lua_pop(L, 1);
+      lua_rawgeti(L, 2, 3);
+      luaL_checktype(L, -1, LUA_TTABLE);
+	 lua_rawgeti(L, -1, 1); obj->et.mzx = luaL_checknumber(L, -1); lua_pop(L, 1);
+	 lua_rawgeti(L, -1, 2); obj->et.mzy = luaL_checknumber(L, -1); lua_pop(L, 1);
+	 lua_rawgeti(L, -1, 3); obj->et.mzz = luaL_checknumber(L, -1); lua_pop(L, 1);
+      lua_pop(L, 1);
+   return 0;
+}
+
+const luaL_Reg lTransform_set[] = {
+   {"matrix", _edje_lua_transform_set_matrix},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_transform_fn_identity(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   evas_transform_identity_set(&(obj->et));
+   return 0;
+}
+
+static int
+_edje_lua_transform_fn_rotate(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   evas_transform_rotate(luaL_checknumber(L, 2), &(obj->et));
+   return 0;
+}
+
+static int
+_edje_lua_transform_fn_translate(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   evas_transform_translate(luaL_checknumber(L, 2), luaL_checknumber(L, 3), &(obj->et));
+   return 0;
+}
+
+static int
+_edje_lua_transform_fn_scale(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   evas_transform_scale(luaL_checknumber(L, 2), luaL_checknumber(L, 3), &(obj->et));
+   return 0;
+}
+
+static int
+_edje_lua_transform_fn_shear(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   evas_transform_shear(luaL_checknumber(L, 2), luaL_checknumber(L, 3), &(obj->et));
+   return 0;
+}
+
+static int
+_edje_lua_transform_fn_compose(lua_State *L)
+{
+   Edje_Lua_Transform *obj = _edje_lua_checkudata(L, 1, &mTransform);
+   Edje_Lua_Transform *tar = _edje_lua_checkudata(L, 2, &mTransform);
+   evas_transform_compose(&(tar->et), &(obj->et));
+   return 0;
+}
+
+const luaL_Reg lTransform_fn[] = {
+   {"identity", _edje_lua_transform_fn_identity},
+   {"rotate", _edje_lua_transform_fn_rotate},
+   {"translate", _edje_lua_transform_fn_translate},
+   {"scale", _edje_lua_transform_fn_scale},
+   {"shear", _edje_lua_transform_fn_shear},
+   {"compose", _edje_lua_transform_fn_compose},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Lua Edje Transition bindings
+ */
+
+const luaL_Reg lTransition_get[];
+
+const luaL_Reg lTransition_set[];
+
+const luaL_Reg lTransition_fn[];
+
+const Edje_Lua_Reg mTransition = {
+   lNil,
+   lTransition_get,
+   lTransition_set,
+   lTransition_fn
+};
+
+const Edje_Lua_Reg *cTransition[] = {
+   &mClass,
+   &mTransition,
+   NULL				// sentinel
+};
+
+const luaL_Reg lTransition_get[] = {
+   {NULL, NULL}			// sentinel
+};
+
+const luaL_Reg lTransition_set[] = {
+   {NULL, NULL}			// sentinel
+};
+
+const luaL_Reg lTransition_fn[] = {
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Lua Evas Object bindings
+ */
+
+const luaL_Reg lObject_get[];
+
+const luaL_Reg lObject_set[];
+
+const luaL_Reg lObject_fn[];
+
+const Edje_Lua_Reg mObject = {
+   lNil,
+   lObject_get,
+   lObject_set,
+   lObject_fn
+};
+
+static void
+_edje_lua_object_del_cb(void *data, Evas * e, Evas_Object * obj,
+			void *event_info)
+{
+   //printf("_edje_lua_object_delete_cb\n");
+   lua_State *L = data;
+   _edje_lua_get_reg(L, obj);
+   Edje_Lua_Evas_Object *udata = _edje_lua_checkudata(L, -1, &mObject);
+   lua_pop(L, 1);
+   _edje_lua_free_reg(L, udata); // created in EDJE_LUA_SCRIPT_FN_ADD
+   _edje_lua_free_reg(L, obj); // created in EDJE_LUA_SCRIPT_FN_ADD
+
+   Edje_Lua_Ref *ref;
+   EINA_LIST_FREE(udata->cb, ref)
+      _edje_lua_free_ref(L, ref);
+}
+
+static int
+_edje_lua_object_fn_del(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   if (obj->eo)
+     {
+	evas_object_del(obj->eo);
+	obj->eo = NULL;
+	obj->ed = NULL;
+     }
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_show(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_show(obj->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_hide(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_hide(obj->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_move(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   //printf ("%i %i %i %i\n", obj->ed->x, obj->ed->y, luaL_checkint (L, 2), luaL_checkint (L, 3));
+   evas_object_move(obj->eo,
+		    obj->ed->x + luaL_checkint(L, 2),
+		    obj->ed->y + luaL_checkint(L, 3));
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_resize(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_resize(obj->eo, luaL_checkint(L, 2), luaL_checkint(L, 3));
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_raise(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_raise(obj->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_lower(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_lower(obj->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_stack_above(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   evas_object_stack_above(obj->eo, tar->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_stack_below(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   evas_object_stack_below(obj->eo, tar->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_fn_clip_unset(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_clip_unset(obj->eo);
+   return 0;
+}
+
+const luaL_Reg lObject_fn[] = {
+   {"del", _edje_lua_object_fn_del},
+   {"show", _edje_lua_object_fn_show},
+   {"hide", _edje_lua_object_fn_hide},
+   {"move", _edje_lua_object_fn_move},
+   {"resize", _edje_lua_object_fn_resize},
+   {"raise", _edje_lua_object_fn_raise},
+   {"lower", _edje_lua_object_fn_lower},
+   {"stack_above", _edje_lua_object_fn_stack_above},
+   {"stack_below", _edje_lua_object_fn_stack_below},
+   {"clip_unset", _edje_lua_object_fn_clip_unset},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_object_get_name(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushstring(L, evas_object_name_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_geometry(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   int x, y, w, h;
+   evas_object_geometry_get(obj->eo, &x, &y, &w, &h);
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_type(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushstring(L, evas_object_type_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_layer(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushnumber(L, evas_object_layer_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_above(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Evas_Object *above = evas_object_above_get(obj->eo);
+   _edje_lua_get_reg(L, above);
+   // TODO create object if it does not already exist?
+   return 1;
+}
+
+static int
+_edje_lua_object_get_below(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Evas_Object *below = evas_object_below_get(obj->eo);
+   _edje_lua_get_reg(L, below);
+   // TODO create object if it does not already exist?
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_min(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   int w, h;
+   evas_object_size_hint_min_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_max(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   int w, h;
+   evas_object_size_hint_max_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_request(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   int w, h;
+   evas_object_size_hint_request_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_aspect(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Evas_Aspect_Control a;
+   int w, h;
+   evas_object_size_hint_aspect_get(obj->eo, &a, &w, &h);
+   lua_createtable(L, 3, 0);
+   lua_pushnumber(L, a);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 3);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_align(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   double w, h;
+   evas_object_size_hint_align_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_weight(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   double w, h;
+   evas_object_size_hint_weight_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_size_hint_padding(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   int l, r, t, b;
+   evas_object_size_hint_padding_get(obj->eo, &l, &r, &t, &b);
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, l);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, r);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, t);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, b);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_visible(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_visible_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_render_op(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushnumber(L, evas_object_render_op_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_anti_alias(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_anti_alias_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_scale(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushnumber(L, evas_object_scale_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_color(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   int r, g, b, a;
+   evas_object_color_get(obj->eo, &r, &g, &b, &a);
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, r);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, g);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, b);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, a);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_object_get_color_interpolation(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushnumber(L, evas_object_color_interpolation_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_clip(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Evas_Object *clip = evas_object_clip_get(obj->eo);
+   _edje_lua_get_reg(L, clip);
+   // TODO create object if it does not already exist?
+   return 1;
+}
+
+static int
+_edje_lua_object_get_clipees(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Eina_List *clipees = (Eina_List *) evas_object_clipees_get(obj->eo);
+   Eina_List *l;
+   Evas_Object *clip;
+   int i = 1;
+   lua_createtable(L, eina_list_count(clipees), 0);
+   EINA_LIST_FOREACH(clipees, l, clip)
+     {
+	_edje_lua_get_reg(L, clip);
+	// TODO create object if it does not already exist?
+	lua_rawseti(L, -2, i++);
+     }
+   return 1;
+}
+
+static int
+_edje_lua_object_get_evas(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Evas *evas = evas_object_evas_get(obj->eo);
+   lua_pushnil(L);
+   // FIXME implement Evas class in the first place?
+   return 1;
+}
+
+static int
+_edje_lua_object_get_pass_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_pass_events_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_repeat_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_repeat_events_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_propagate_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_propagate_events_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_focus(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_focus_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_pointer_mode(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushnumber(L, evas_object_pointer_mode_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_precise_is_inside(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, evas_object_precise_is_inside_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_object_get_mouse_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   lua_pushboolean(L, obj->mouse_events);
+   return 1;
+}
+
+const luaL_Reg lObject_get[] = {
+   {"name", _edje_lua_object_get_name},
+   {"geometry", _edje_lua_object_get_geometry},
+   {"type", _edje_lua_object_get_type},
+   {"layer", _edje_lua_object_get_layer},
+   {"above", _edje_lua_object_get_above},
+   {"below", _edje_lua_object_get_below},
+   {"size_hint_min", _edje_lua_object_get_size_hint_min},
+   {"size_hint_max", _edje_lua_object_get_size_hint_max},
+   {"size_hint_request", _edje_lua_object_get_size_hint_request},
+   {"size_hint_aspect", _edje_lua_object_get_size_hint_aspect},
+   {"size_hint_align", _edje_lua_object_get_size_hint_align},
+   {"size_hint_weight", _edje_lua_object_get_size_hint_weight},
+   {"size_hint_padding", _edje_lua_object_get_size_hint_padding},
+   {"visible", _edje_lua_object_get_visible},
+   {"render_op", _edje_lua_object_get_render_op},
+   {"anti_alias", _edje_lua_object_get_anti_alias},
+   {"scale", _edje_lua_object_get_scale},
+   {"color", _edje_lua_object_get_color},
+   {"color_interpolation", _edje_lua_object_get_color_interpolation},
+   {"clip", _edje_lua_object_get_clip},
+   {"clipees", _edje_lua_object_get_clipees},
+   {"evas", _edje_lua_object_get_evas},
+   {"pass_events", _edje_lua_object_get_pass_events},
+   {"repeat_events", _edje_lua_object_get_repeat_events},
+   {"propagate_events", _edje_lua_object_get_propagate_events},
+   {"focus", _edje_lua_object_get_focus},
+   {"pointer_mode", _edje_lua_object_get_pointer_mode},
+   {"precise_is_inside", _edje_lua_object_get_precise_is_inside},
+   {"mouse_events", _edje_lua_object_get_mouse_events},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_object_set_name(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_name_set(obj->eo, luaL_checkstring(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_layer(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_layer_set(obj->eo, luaL_checkint(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_min(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_size_hint_min_set(obj->eo,
+	 luaL_checkint(L, -2),
+	 luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_max(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_size_hint_max_set(obj->eo,
+	 luaL_checkint(L, -2),
+	 luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_request(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_size_hint_request_set(obj->eo,
+	 luaL_checkint(L, -2),
+	 luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_aspect(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   evas_object_size_hint_aspect_set(obj->eo,
+	 luaL_checkint(L, -3),
+	 luaL_checkint(L, -2),
+	 luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_align(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_size_hint_align_set(obj->eo,
+	 luaL_checknumber(L, -2),
+	 luaL_checknumber(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_weight(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_size_hint_weight_set(obj->eo,
+	 luaL_checknumber(L, -2),
+	 luaL_checknumber(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_size_hint_padding(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   evas_object_size_hint_padding_set(obj->eo,
+	 luaL_checknumber(L, -4),
+	 luaL_checknumber(L, -3),
+	 luaL_checknumber(L, -2),
+	 luaL_checknumber(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_render_op(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_render_op_set(obj->eo, luaL_checkint(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_anti_alias(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_anti_alias_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_scale(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_scale_set(obj->eo, luaL_checknumber(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_color(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   evas_object_color_set(obj->eo,
+	 luaL_checkint(L, -4),
+	 luaL_checkint(L, -3),
+	 luaL_checkint(L, -2),
+	 luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_color_interpolation(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_color_interpolation_set(obj->eo, luaL_checkint(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_clip(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   Edje_Lua_Evas_Object *clip = _edje_lua_checkudata(L, 2, &mObject);
+   evas_object_clip_set(obj->eo, clip->eo);
+   return 0;
+}
+
+static int
+_edje_lua_object_set_pass_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_pass_events_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_repeat_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_repeat_events_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_propagate_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_propagate_events_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_focus(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_focus_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_pointer_mode(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_pointer_mode_set(obj->eo, luaL_checkint(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_object_set_precise_is_inside(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_precise_is_inside_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+#define OBJECT_CB_MACRO(KEY) \
+   lua_State *L = data; \
+   _edje_lua_get_reg(L, obj); \
+   lua_getfield(L, -1, KEY); \
+   if (lua_type(L, -1) != LUA_TFUNCTION) \
+      { \
+	 lua_pop(L, 2); \
+	 return; \
+      } \
+   lua_insert(L, -2);
+
+static void
+_edje_lua_object_cb_mouse_in(void *data, Evas * e, Evas_Object * obj,
+			     void *event_info)
+{
+   OBJECT_CB_MACRO("mouse_in");
+   Evas_Event_Mouse_In * ev = event_info;
+   int err_code;
+
+   lua_pushnumber(L, ev->output.x);
+   lua_pushnumber(L, ev->output.y);
+   lua_pushnumber(L, ev->canvas.x);
+   lua_pushnumber(L, ev->canvas.y);
+
+   if ((err_code = lua_pcall(L, 5, 0, 0)))
+      _edje_lua_error(L, err_code);
+}
+
+static void
+_edje_lua_object_cb_mouse_out(void *data, Evas * e, Evas_Object * obj,
+			      void *event_info)
+{
+   OBJECT_CB_MACRO("mouse_out");
+   Evas_Event_Mouse_In * ev = event_info;
+   int err_code;
+
+   lua_pushnumber(L, ev->output.x);
+   lua_pushnumber(L, ev->output.y);
+   lua_pushnumber(L, ev->canvas.x);
+   lua_pushnumber(L, ev->canvas.y);
+
+   if ((err_code = lua_pcall(L, 5, 0, 0)))
+      _edje_lua_error(L, err_code);
+}
+
+static void
+_edje_lua_object_cb_mouse_down(void *data, Evas * e, Evas_Object * obj,
+			       void *event_info)
+{
+   OBJECT_CB_MACRO("mouse_down");
+   Evas_Event_Mouse_Down * ev = event_info;
+   int err_code;
+
+   lua_pushnumber(L, ev->button);
+   lua_pushnumber(L, ev->output.x);
+   lua_pushnumber(L, ev->output.y);
+   lua_pushnumber(L, ev->canvas.x);
+   lua_pushnumber(L, ev->canvas.y);
+
+   if ((err_code = lua_pcall(L, 6, 0, 0)))
+      _edje_lua_error(L, err_code);
+}
+
+static void
+_edje_lua_object_cb_mouse_up(void *data, Evas * e, Evas_Object * obj,
+			     void *event_info)
+{
+   OBJECT_CB_MACRO("mouse_up");
+   Evas_Event_Mouse_Up * ev = event_info;
+   int err_code;
+
+   lua_pushnumber(L, ev->button);
+   lua_pushnumber(L, ev->output.x);
+   lua_pushnumber(L, ev->output.y);
+   lua_pushnumber(L, ev->canvas.x);
+   lua_pushnumber(L, ev->canvas.y);
+
+   if ((err_code = lua_pcall(L, 6, 0, 0)))
+      _edje_lua_error(L, err_code);
+}
+
+static void
+_edje_lua_object_cb_mouse_move(void *data, Evas * e, Evas_Object * obj,
+			       void *event_info)
+{
+   OBJECT_CB_MACRO("mouse_move");
+   Evas_Event_Mouse_Move * ev = event_info;
+   int err_code;
+
+   lua_pushnumber(L, ev->buttons);
+   lua_pushnumber(L, ev->cur.output.x);
+   lua_pushnumber(L, ev->cur.output.y);
+   lua_pushnumber(L, ev->cur.canvas.x);
+   lua_pushnumber(L, ev->cur.canvas.y);
+
+   if ((err_code = lua_pcall(L, 6, 0, 0)))
+      _edje_lua_error(L, err_code);
+}
+
+static void
+_edje_lua_object_cb_mouse_wheel(void *data, Evas * e, Evas_Object * obj,
+			       void *event_info)
+{
+   OBJECT_CB_MACRO("mouse_wheel");
+   Evas_Event_Mouse_Wheel * ev = event_info;
+   int err_code;
+
+   lua_pushnumber(L, ev->z);
+   lua_pushnumber(L, ev->output.x);
+   lua_pushnumber(L, ev->output.y);
+   lua_pushnumber(L, ev->canvas.x);
+   lua_pushnumber(L, ev->canvas.y);
+
+   if ((err_code = lua_pcall(L, 6, 0, 0)))
+      _edje_lua_error(L, err_code);
+}
+
+static int
+_edje_lua_object_set_mouse_events(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   obj->mouse_events = lua_toboolean(L, 2);
+   if (obj->mouse_events)
+     {
+	// add all mouse events
+	evas_object_event_callback_add(obj->eo, EVAS_CALLBACK_MOUSE_IN, _edje_lua_object_cb_mouse_in, L);
+	evas_object_event_callback_add(obj->eo, EVAS_CALLBACK_MOUSE_OUT, _edje_lua_object_cb_mouse_out, L);
+	evas_object_event_callback_add(obj->eo, EVAS_CALLBACK_MOUSE_DOWN, _edje_lua_object_cb_mouse_down, L);
+	evas_object_event_callback_add(obj->eo, EVAS_CALLBACK_MOUSE_UP, _edje_lua_object_cb_mouse_up, L);
+	evas_object_event_callback_add(obj->eo, EVAS_CALLBACK_MOUSE_MOVE, _edje_lua_object_cb_mouse_move, L);
+	evas_object_event_callback_add(obj->eo, EVAS_CALLBACK_MOUSE_WHEEL, _edje_lua_object_cb_mouse_wheel, L);
+     }
+   else
+     {
+	// delete all mouse events
+	evas_object_event_callback_del(obj->eo, EVAS_CALLBACK_MOUSE_IN, _edje_lua_object_cb_mouse_in);
+	evas_object_event_callback_del(obj->eo, EVAS_CALLBACK_MOUSE_OUT, _edje_lua_object_cb_mouse_out);
+	evas_object_event_callback_del(obj->eo, EVAS_CALLBACK_MOUSE_DOWN, _edje_lua_object_cb_mouse_down);
+	evas_object_event_callback_del(obj->eo, EVAS_CALLBACK_MOUSE_UP, _edje_lua_object_cb_mouse_up);
+	evas_object_event_callback_del(obj->eo, EVAS_CALLBACK_MOUSE_MOVE, _edje_lua_object_cb_mouse_move);
+	evas_object_event_callback_del(obj->eo, EVAS_CALLBACK_MOUSE_WHEEL, _edje_lua_object_cb_mouse_wheel);
+     }
+   return 0;
+}
+
+const luaL_Reg lObject_set[] = {
+   {"name", _edje_lua_object_set_name},
+   {"layer", _edje_lua_object_set_layer},
+   {"size_hint_min", _edje_lua_object_set_size_hint_min},
+   {"size_hint_max", _edje_lua_object_set_size_hint_max},
+   {"size_hint_request", _edje_lua_object_set_size_hint_request},
+   {"size_hint_aspect", _edje_lua_object_set_size_hint_aspect},
+   {"size_hint_align", _edje_lua_object_set_size_hint_align},
+   {"size_hint_weight", _edje_lua_object_set_size_hint_weight},
+   {"size_hint_padding", _edje_lua_object_set_size_hint_padding},
+   {"render_op", _edje_lua_object_set_render_op},
+   {"anti_alias", _edje_lua_object_set_anti_alias},
+   {"scale", _edje_lua_object_set_scale},
+   {"color", _edje_lua_object_set_color},
+   {"color_interpolation", _edje_lua_object_set_color_interpolation},
+   {"clip", _edje_lua_object_set_clip},
+   {"pass_events", _edje_lua_object_set_pass_events},
+   {"repeat_events", _edje_lua_object_set_repeat_events},
+   {"propagate_events", _edje_lua_object_set_propagate_events},
+   {"focus", _edje_lua_object_set_focus},
+   {"pointer_mode", _edje_lua_object_get_pointer_mode},
+   {"precise_is_inside", _edje_lua_object_get_precise_is_inside},
+   {"mouse_events", _edje_lua_object_set_mouse_events},
+   {NULL, NULL}			// sentinel
+};
+
+const Edje_Lua_Reg *cRectangle[] = {
+   &mClass,
+   &mObject,
+   NULL				// sentinel
+};
+
+/*
+ * Image
+ */
+
+const luaL_Reg lImage_get[];
+
+const luaL_Reg lImage_set[];
+
+const Edje_Lua_Reg mImage = {
+   lNil,
+   lImage_get,
+   lImage_set,
+   lNil
+};
+
+const Edje_Lua_Reg *cImage[] = {
+   &mClass,
+   &mObject,
+   &mImage,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_image_get_size(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mImage);
+   int w, h;
+   evas_object_image_size_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+};
+
+const luaL_Reg lImage_get[] = {
+   {"size", _edje_lua_image_get_size},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_image_set_file(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mImage);
+   int id = edje_edit_image_id_get(obj->ed->obj, luaL_checkstring(L, 2));
+   char buf[256];
+   sprintf(buf, "images/%i", id);
+   evas_object_image_file_set(obj->eo, obj->ed->path, buf);
+   return 0;
+}
+
+static int
+_edje_lua_image_set_fill(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mImage);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   evas_object_image_fill_set(obj->eo,
+			      luaL_checkint(L, -4),
+			      luaL_checkint(L, -3),
+			      luaL_checkint(L, -2), luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_image_set_fill_transform(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mImage);
+   Edje_Lua_Transform *tar = _edje_lua_checkudata(L, 2, &mTransform);
+   evas_object_image_fill_transform_set(obj->eo, &(tar->et));
+   return 0;
+}
+
+static int
+_edje_lua_image_set_alpha(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mObject);
+   evas_object_image_alpha_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+const luaL_Reg lImage_set[] = {
+   {"file", _edje_lua_image_set_file},
+   {"fill", _edje_lua_image_set_fill},
+   {"fill_transform", _edje_lua_image_set_fill_transform},
+   {"alpha", _edje_lua_image_set_alpha},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Line
+ */
+
+const luaL_Reg lLine_get[];
+const luaL_Reg lLine_set[];
+
+const Edje_Lua_Reg mLine = {
+   lNil,
+   lLine_get,
+   lLine_set,
+   lNil
+};
+
+const Edje_Lua_Reg *cLine[] = {
+   &mClass,
+   &mObject,
+   &mLine,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_line_get_xy(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mLine);
+   int x1, y1, x2, y2;
+   evas_object_line_xy_get(obj->eo, &x1, &y1, &x2, &y2);
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, x1); lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y1); lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, x2); lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, y2); lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+const luaL_Reg lLine_get[] = {
+   {"xy", _edje_lua_line_get_xy},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_line_set_xy(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mLine);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   evas_object_line_xy_set(obj->eo,
+                           luaL_checkint(L, -4),
+                           luaL_checkint(L, -3),
+                           luaL_checkint(L, -2),
+                           luaL_checkint(L, -1));
+   return 0;
+}
+
+const luaL_Reg lLine_set[] = {
+   {"xy", _edje_lua_line_set_xy},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Polygon
+ */
+
+const luaL_Reg lPolygon_fn[];
+
+const Edje_Lua_Reg mPolygon = {
+   lNil,
+   lNil,
+   lNil,
+   lPolygon_fn
+};
+
+const Edje_Lua_Reg *cPolygon[] = {
+   &mClass,
+   &mObject,
+   &mPolygon,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_polygon_fn_point_add(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mPolygon);
+   evas_object_polygon_point_add(obj->eo,
+				 luaL_checknumber(L, 2),
+				 luaL_checknumber(L, 3));
+   return 0;
+}
+
+static int
+_edje_lua_polygon_fn_points_clear(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mPolygon);
+   evas_object_polygon_points_clear(obj->eo);
+   return 0;
+}
+
+const luaL_Reg lPolygon_fn[] = {
+   {"point_add", _edje_lua_polygon_fn_point_add},
+   {"points_clear", _edje_lua_polygon_fn_points_clear},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Table
+ */
+
+const luaL_Reg lTable_get[];
+
+const luaL_Reg lTable_set[];
+
+const luaL_Reg lTable_fn[];
+
+const Edje_Lua_Reg mTable = {
+   lNil,
+   lTable_get,
+   lTable_set,
+   lTable_fn
+};
+
+const Edje_Lua_Reg *cTable[] = {
+   &mClass,
+   &mObject,
+   &mTable,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_table_get_homogeneous(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   lua_pushnumber(L, evas_object_table_homogeneous_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_table_get_padding(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   int x, y;
+   evas_object_table_padding_get(obj->eo, &x, &y);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_table_get_align(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   double x, y;
+   evas_object_table_align_get(obj->eo, &x, &y);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_table_get_col_row_size(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   int x, y;
+   evas_object_table_col_row_size_get(obj->eo, &x, &y);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_table_get_children(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   Eina_List *children = (Eina_List *) evas_object_table_children_get(obj->eo);
+   Eina_List *l;
+   Evas_Object *child;
+   int i = 1;
+   lua_createtable(L, eina_list_count(children), 0);
+   EINA_LIST_FOREACH(children, l, child)
+     {
+	_edje_lua_get_reg(L, child);
+	// TODO create object if it does not already exist?
+	lua_rawseti(L, -2, i++);
+     }
+   return 1;
+}
+
+const luaL_Reg lTable_get[] = {
+   {"homogeneous", _edje_lua_table_get_homogeneous},
+   {"padding", _edje_lua_table_get_padding},
+   {"align", _edje_lua_table_get_align},
+   {"col_row_size", _edje_lua_table_get_col_row_size},
+   {"children", _edje_lua_table_get_children},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_table_set_homogeneous(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   evas_object_table_homogeneous_set(obj->eo,
+	 luaL_checkint(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_table_set_padding(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_table_padding_set(obj->eo,
+	 luaL_checkint(L, -2),
+	 luaL_checkint(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_table_set_align(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   evas_object_table_align_set(obj->eo,
+	 luaL_checknumber(L, -2),
+	 luaL_checknumber(L, -1));
+   return 0;
+}
+
+const luaL_Reg lTable_set[] = {
+   {"homogeneous", _edje_lua_table_set_homogeneous},
+   {"padding", _edje_lua_table_set_padding},
+   {"align", _edje_lua_table_set_align},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_table_fn_pack(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+	 evas_object_table_pack(obj->eo, tar->eo,
+	    luaL_checkint(L, 3),
+	    luaL_checkint(L, 4),
+	    luaL_checkint(L, 5),
+	    luaL_checkint(L, 6)));
+   return 1;
+}
+
+static int
+_edje_lua_table_fn_unpack(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+	 evas_object_table_unpack(obj->eo, tar->eo));
+   return 1;
+}
+
+static int
+_edje_lua_table_fn_clear(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mTable);
+   evas_object_table_clear(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+const luaL_Reg lTable_fn[] = {
+   {"pack", _edje_lua_table_fn_pack},
+   {"unpack", _edje_lua_table_fn_unpack},
+   {"clear", _edje_lua_table_fn_clear},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Description
+ */
+
+const luaL_Reg lDescription_get[];
+
+const luaL_Reg lDescription_set[];
+
+const Edje_Lua_Reg mDescription = {
+   lNil,
+   lDescription_get,
+   lDescription_set,
+   lNil
+};
+
+const Edje_Lua_Reg *cDescription[] = {
+   &mClass,
+   &mObject,
+   &mDescription,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_description_get_alignment(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->align.x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->align.y);
+   lua_rawseti(L, -2, 1);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_min(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->min.w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->min.h);
+   lua_rawseti(L, -2, 1);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_max(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->max.w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->max.h);
+   lua_rawseti(L, -2, 1);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_step(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->step.x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->step.y);
+   lua_rawseti(L, -2, 1);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_aspect(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->aspect.min);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->aspect.max);
+   lua_rawseti(L, -2, 1);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_aspect_pref(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_pushnumber(L, obj->rp->custom->description->aspect.prefer);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_color(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   /* check whether this part has a "custom" state */
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, obj->rp->custom->description->color.r);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->color.g);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, obj->rp->custom->description->color.b);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, obj->rp->custom->description->color.a);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_color2(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, obj->rp->custom->description->color2.r);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->color2.g);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, obj->rp->custom->description->color2.b);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, obj->rp->custom->description->color2.a);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_color3(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, obj->rp->custom->description->color3.r);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->color3.g);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, obj->rp->custom->description->color3.b);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, obj->rp->custom->description->color3.a);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_color_class(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_pushstring(L, obj->rp->custom->description->color_class);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_rel1(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->rel1.relative_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->rel1.relative_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_rel1_to(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->rel1.id_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->rel1.id_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_rel1_offset(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->rel1.offset_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->rel1.offset_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_rel2(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->rel2.relative_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->rel2.relative_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_rel2_to(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->rel2.id_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->rel2.id_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_rel2_offset(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->rel2.offset_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->rel2.offset_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_image(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   // TODO
+   return 0;
+}
+
+static int
+_edje_lua_description_get_border(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, obj->rp->custom->description->border.l);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->border.r);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, obj->rp->custom->description->border.t);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, obj->rp->custom->description->border.b);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_fill_smooth(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_pushboolean(L, obj->rp->custom->description->fill.smooth);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_fill_pos(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, obj->rp->custom->description->fill.pos_rel_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->fill.pos_rel_y);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, obj->rp->custom->description->fill.pos_abs_x);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, obj->rp->custom->description->fill.pos_abs_y);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_fill_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, obj->rp->custom->description->fill.rel_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->fill.rel_y);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, obj->rp->custom->description->fill.abs_x);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, obj->rp->custom->description->fill.abs_y);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_pushstring(L, obj->rp->custom->description->text.text);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_class(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_pushstring(L, obj->rp->custom->description->text.text_class);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_font(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_pushstring(L, obj->rp->custom->description->text.text_class);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_style(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_pushstring(L, obj->rp->custom->description->text.style);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_pushnumber(L, obj->rp->custom->description->text.size);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_fit(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushboolean(L, obj->rp->custom->description->text.fit_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushboolean(L, obj->rp->custom->description->text.fit_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_min(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->text.min_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->text.min_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_max(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->text.max_x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->text.max_y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_text_align(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, obj->rp->custom->description->text.align.x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, obj->rp->custom->description->text.align.y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_description_get_visible(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_pushboolean(L, obj->rp->custom->description->visible);
+   return 1;
+}
+
+const luaL_Reg lDescription_get[] = {
+   {"alignment", _edje_lua_description_get_alignment},
+   {"min", _edje_lua_description_get_min},
+   {"max", _edje_lua_description_get_max},
+   {"step", _edje_lua_description_get_step},
+   {"aspect", _edje_lua_description_get_aspect},
+   {"aspect_pref", _edje_lua_description_get_aspect_pref},
+   {"color", _edje_lua_description_get_color},
+   {"color2", _edje_lua_description_get_color2},
+   {"color3", _edje_lua_description_get_color3},
+   {"color_class", _edje_lua_description_get_color_class},
+   {"rel1", _edje_lua_description_get_rel1},
+   {"rel1_to", _edje_lua_description_get_rel1_to},
+   {"rel1_offset", _edje_lua_description_get_rel1_offset},
+   {"rel2", _edje_lua_description_get_rel2},
+   {"rel2_to", _edje_lua_description_get_rel2_to},
+   {"rel2_offset", _edje_lua_description_get_rel2_offset},
+   {"image", _edje_lua_description_get_image},
+   {"border", _edje_lua_description_get_border},
+   {"fill_smooth", _edje_lua_description_get_fill_smooth},
+   {"fill_pos", _edje_lua_description_get_fill_pos},
+   {"fill_size", _edje_lua_description_get_fill_size},
+   {"text", _edje_lua_description_get_text},
+   {"text_class", _edje_lua_description_get_text_class},
+   {"text_font", _edje_lua_description_get_text_font},
+   {"text_style", _edje_lua_description_get_text_style},
+   {"text_size", _edje_lua_description_get_text_size},
+   {"text_fit", _edje_lua_description_get_text_fit},
+   {"text_min", _edje_lua_description_get_text_min},
+   {"text_max", _edje_lua_description_get_text_max},
+   {"text_align", _edje_lua_description_get_text_align},
+   {"visible", _edje_lua_description_get_visible},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_description_set_alignment(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->align.x = luaL_checknumber(L, -2);
+   obj->rp->custom->description->align.y = luaL_checknumber(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_min(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->min.w = luaL_checkint(L, -2);
+   obj->rp->custom->description->min.h = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_max(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->max.w = luaL_checkint(L, -2);
+   obj->rp->custom->description->max.h = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_step(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->step.x = luaL_checkint(L, -2);
+   obj->rp->custom->description->step.y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_aspect(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->aspect.min = luaL_checknumber(L, -2);
+   obj->rp->custom->description->aspect.max = luaL_checknumber(L, -1);
+   return 0;
+
+}
+
+static int
+_edje_lua_description_set_aspect_pref(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->aspect.prefer = luaL_checknumber(L, 2);
+   return 0;
+
+}
+
+static int
+_edje_lua_description_set_color(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   obj->rp->custom->description->color.r = luaL_checkint(L, -4);
+   obj->rp->custom->description->color.g = luaL_checkint(L, -3);
+   obj->rp->custom->description->color.b = luaL_checkint(L, -2);
+   obj->rp->custom->description->color.a = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_color2(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   obj->rp->custom->description->color2.r = luaL_checkint(L, -4);
+   obj->rp->custom->description->color2.g = luaL_checkint(L, -3);
+   obj->rp->custom->description->color2.b = luaL_checkint(L, -2);
+   obj->rp->custom->description->color2.a = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_color3(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   obj->rp->custom->description->color3.r = luaL_checkint(L, -4);
+   obj->rp->custom->description->color3.g = luaL_checkint(L, -3);
+   obj->rp->custom->description->color3.b = luaL_checkint(L, -2);
+   obj->rp->custom->description->color3.a = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_color_class(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->color_class = (char *)luaL_checkstring(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_rel1(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->rel1.relative_x = luaL_checknumber(L, -2);
+   obj->rp->custom->description->rel1.relative_y = luaL_checknumber(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_rel1_to(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->rel1.id_x = luaL_checknumber(L, -2);
+   obj->rp->custom->description->rel1.id_y = luaL_checknumber(L, -1);
+   if (obj->rp->param1.description->rel1.id_x >= 0)
+     obj->rp->param1.rel1_to_x = obj->ed->table_parts[obj->rp->param1.description->rel1.id_x % obj->ed->table_parts_size];
+   if (obj->rp->param1.description->rel1.id_y >= 0)
+     obj->rp->param1.rel1_to_y = obj->ed->table_parts[obj->rp->param1.description->rel1.id_y % obj->ed->table_parts_size];
+   return 0;
+}
+
+static int
+_edje_lua_description_set_rel1_offset(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->rel1.offset_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->rel1.offset_y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_rel2(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->rel2.relative_x = luaL_checknumber(L, -2);
+   obj->rp->custom->description->rel2.relative_y = luaL_checknumber(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_rel2_to(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->rel2.id_x = luaL_checknumber(L, -2);
+   obj->rp->custom->description->rel2.id_y = luaL_checknumber(L, -1);
+   if (obj->rp->param1.description->rel2.id_x >= 0)
+     obj->rp->param1.rel2_to_x = obj->ed->table_parts[obj->rp->param1.description->rel2.id_x % obj->ed->table_parts_size];
+   if (obj->rp->param1.description->rel2.id_y >= 0)
+     obj->rp->param1.rel2_to_y = obj->ed->table_parts[obj->rp->param1.description->rel2.id_y % obj->ed->table_parts_size];
+   return 0;
+}
+
+static int
+_edje_lua_description_set_rel2_offset(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->rel2.offset_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->rel2.offset_y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_image(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   obj->rp->custom->description->image.id =
+      edje_edit_image_id_get(obj->ed->obj, (char *)luaL_checkstring(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_description_set_border(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   obj->rp->custom->description->border.l = luaL_checkint(L, -2);
+   obj->rp->custom->description->border.r = luaL_checkint(L, -1);
+   obj->rp->custom->description->border.t = luaL_checkint(L, -2);
+   obj->rp->custom->description->border.b = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_fill_smooth(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->fill.smooth = lua_toboolean(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_fill_pos(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   obj->rp->custom->description->fill.pos_rel_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->fill.pos_rel_y = luaL_checkint(L, -1);
+   obj->rp->custom->description->fill.pos_abs_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->fill.pos_abs_y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_fill_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_IMAGE))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   obj->rp->custom->description->fill.rel_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->fill.rel_y = luaL_checkint(L, -1);
+   obj->rp->custom->description->fill.abs_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->fill.abs_y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->text.text = (char *)luaL_checkstring(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_class(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->text.text_class =
+      (char *)luaL_checkstring(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_font(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->text.font = (char *)luaL_checkstring(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_style(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->text.style = (char *)luaL_checkstring(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->text.size = luaL_checkint(L, 2);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_fit(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->text.fit_x = lua_toboolean(L, -2);
+   obj->rp->custom->description->text.fit_y = lua_toboolean(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_min(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->text.min_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->text.min_y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_max(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT)
+       && (obj->rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->text.max_x = luaL_checkint(L, -2);
+   obj->rp->custom->description->text.max_y = luaL_checkint(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_text_align(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if ((obj->rp->part->type != EDJE_PART_TYPE_TEXT))
+      return 0;
+   if (!obj->rp->custom) return 0;
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->rp->custom->description->text.align.x = luaL_checknumber(L, -2);
+   obj->rp->custom->description->text.align.y = luaL_checknumber(L, -1);
+   return 0;
+}
+
+static int
+_edje_lua_description_set_visible(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Description *obj =
+      _edje_lua_checkudata(L, 1, &mDescription);
+   if (!obj->rp->custom) return 0;
+   obj->rp->custom->description->visible = lua_toboolean(L, 2);
+   return 0;
+}
+
+const luaL_Reg lDescription_set[] = {
+   {"alignment", _edje_lua_description_set_alignment},
+   {"min", _edje_lua_description_set_min},
+   {"max", _edje_lua_description_set_max},
+   {"step", _edje_lua_description_set_step},
+   {"aspect", _edje_lua_description_set_aspect},
+   {"aspect_pref", _edje_lua_description_set_aspect_pref},
+   {"color", _edje_lua_description_set_color},
+   {"color2", _edje_lua_description_set_color2},
+   {"color3", _edje_lua_description_set_color3},
+   {"color_class", _edje_lua_description_set_color_class},
+   {"rel1", _edje_lua_description_set_rel1},
+   {"rel1_to", _edje_lua_description_set_rel1_to},
+   {"rel1_offset", _edje_lua_description_set_rel1_offset},
+   {"rel2", _edje_lua_description_set_rel2},
+   {"rel2_to", _edje_lua_description_set_rel2_to},
+   {"rel2_offset", _edje_lua_description_set_rel2_offset},
+   {"image", _edje_lua_description_set_image},
+   {"border", _edje_lua_description_set_border},
+   {"fill_smooth", _edje_lua_description_set_fill_smooth},
+   {"fill_pos", _edje_lua_description_set_fill_pos},
+   {"fill_size", _edje_lua_description_set_fill_size},
+   {"text", _edje_lua_description_set_text},
+   {"text_class", _edje_lua_description_set_text_class},
+   {"text_font", _edje_lua_description_set_text_font},
+   {"text_style", _edje_lua_description_set_text_style},
+   {"text_size", _edje_lua_description_set_text_size},
+   {"text_fit", _edje_lua_description_set_text_fit},
+   {"text_min", _edje_lua_description_set_text_min},
+   {"text_max", _edje_lua_description_set_text_max},
+   {"text_align", _edje_lua_description_set_text_align},
+   {"visible", _edje_lua_description_set_visible},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Part
+ */
+
+const luaL_Reg lPart_get[];
+
+const luaL_Reg lPart_set[];
+
+const luaL_Reg lPart_fn[];
+
+const Edje_Lua_Reg mPart = {
+   lNil,
+   lPart_get,
+   lPart_set,
+   lPart_fn
+};
+
+static void
+_edje_lua_edje_part_del_cb(void *data, Evas * e, Evas_Object * obj,
+			void *event_info)
+{
+   //printf("_edje_lua_object_delete_cb\n");
+   lua_State *L = data;
+   _edje_lua_get_reg(L, obj);
+   Edje_Lua_Edje_Part_Object *udata = _edje_lua_checkudata(L, -1, &mPart);
+   lua_pop(L, 1);
+   _edje_lua_free_reg(L, udata); // created in _edje_lua_group_mt_index
+   _edje_lua_free_reg(L, obj); // created in _edje_lua_group_mt_index
+}
+
+const Edje_Lua_Reg *cPart[] = {
+   &mClass,
+   &mObject,
+   &mPart,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_part_get_swallow(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Evas_Object *swa = edje_object_part_swallow_get(obj->ed->obj, obj->key);
+   _edje_lua_get_reg(L, swa);
+   // TODO create object if it does not already exist?
+   return 1;
+}
+
+static int
+_edje_lua_part_get_type(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushnumber(L, edje_edit_part_type_get(obj->ed->obj, obj->key));
+   return 1;
+}
+
+static int
+_edje_lua_part_get_effect(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushnumber(L, edje_edit_part_effect_get(obj->ed->obj, obj->key));
+   return 1;
+}
+
+static int
+_edje_lua_part_get_mouse_events(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushboolean(L, edje_edit_part_mouse_events_get(obj->ed->obj, obj->key));
+   return 1;
+}
+
+static int
+_edje_lua_part_get_repeat_events(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushboolean(L, edje_edit_part_repeat_events_get(obj->ed->obj, obj->key));
+   return 1;
+}
+
+static int
+_edje_lua_part_get_states_list(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Eina_List *slist = edje_edit_part_states_list_get(obj->ed->obj, obj->key);
+   Eina_List *ilist;
+   lua_newtable(L);
+   int i = 1;
+   for (ilist = slist; ilist; ilist = eina_list_next(ilist))
+     {
+	lua_pushstring(L, eina_list_data_get(ilist));
+	lua_rawseti(L, -2, i++);
+     }
+   edje_edit_string_list_free(slist);
+   return 1;
+};
+
+static int
+_edje_lua_part_get_state(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   const char *state;
+   double val;
+   state = edje_object_part_state_get(obj->ed->obj, obj->key, &val);
+   lua_createtable(L, 2, 0);
+   lua_pushstring(L, state);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, val);
+   lua_rawseti(L, -2, 2);
+   return 1;
+};
+
+static int
+_edje_lua_part_get_text(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushstring(L, edje_object_part_text_get(obj->ed->obj, obj->key));
+   return 1;
+};
+
+static int
+_edje_lua_part_get_text_selection(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushstring(L,
+		  edje_object_part_text_selection_get(obj->ed->obj, obj->key));
+   return 1;
+};
+
+static int
+_edje_lua_part_get_drag_dir(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushnumber(L, edje_object_part_drag_dir_get(obj->ed->obj, obj->key));
+   return 1;
+}
+
+static int
+_edje_lua_part_get_drag_value(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   double dx, dy;
+   edje_object_part_drag_value_get(obj->ed->obj, obj->key, &dx, &dy);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, dx);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, dy);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_part_get_drag_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   double dx, dy;
+   edje_object_part_drag_size_get(obj->ed->obj, obj->key, &dx, &dy);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, dx);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, dy);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_part_get_drag_step(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   double dx, dy;
+   edje_object_part_drag_step_get(obj->ed->obj, obj->key, &dx, &dy);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, dx);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, dy);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_part_get_drag_page(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   double dx, dy;
+   edje_object_part_drag_page_get(obj->ed->obj, obj->key, &dx, &dy);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, dx);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, dy);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_part_get_text_cursor_geometry(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Evas_Coord x, y, w, h;
+   edje_object_part_text_cursor_geometry_get(obj->ed->obj, obj->key,
+					     &x, &y, &w, &h);
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_part_get_geometry(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Evas_Coord x, y, w, h;
+   edje_object_part_geometry_get(obj->ed->obj, obj->key, &x, &y, &w, &h);
+   lua_createtable(L, 4, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 3);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 4);
+   return 1;
+}
+
+static int
+_edje_lua_part_get_table_col_row_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   int cols, rows;
+   edje_object_part_table_col_row_size_get(obj->ed->obj, obj->key, &cols, &rows);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, cols); lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, rows); lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int _edje_lua_part_fn_custom_state(lua_State *L);
+
+const luaL_Reg lPart_get[] = {
+   {"custom_state", _edje_lua_part_fn_custom_state},
+   {"Swallow", _edje_lua_part_get_swallow},
+
+   {"drag_dir", _edje_lua_part_get_drag_dir},
+   {"drag_value", _edje_lua_part_get_drag_value},
+   {"drag_size", _edje_lua_part_get_drag_size},
+   {"drag_step", _edje_lua_part_get_drag_step},
+   {"drag_page", _edje_lua_part_get_drag_page},
+
+   {"type", _edje_lua_part_get_type},
+   {"effect", _edje_lua_part_get_effect},
+   {"mouse_events", _edje_lua_part_get_mouse_events},
+   {"repeat_events", _edje_lua_part_get_repeat_events},
+   {"states_list", _edje_lua_part_get_states_list},
+   {"state", _edje_lua_part_get_state},
+
+   {"text", _edje_lua_part_get_text},
+   {"text_selection", _edje_lua_part_get_text_selection},
+   {"text_cursor_geometry", _edje_lua_part_get_text_cursor_geometry},
+
+   {"geometry", _edje_lua_part_get_geometry},
+   {"part_col_row_size", _edje_lua_part_get_table_col_row_size},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_part_set_effect(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_edit_part_effect_set(obj->ed->obj, obj->key, luaL_checkint(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_mouse_events(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_edit_part_mouse_events_set(obj->ed->obj, obj->key, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_repeat_events(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_edit_part_repeat_events_set(obj->ed->obj, obj->key,
+				    lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_state(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   _edje_part_description_apply(obj->ed, obj->rp,
+				luaL_checkstring(L, -2), luaL_checknumber(L, -1),
+				NULL, 0.0);
+   _edje_part_pos_set(obj->ed, obj->rp, EDJE_TWEEN_MODE_LINEAR, 0.0);
+   _edje_recalc(obj->ed);
+   return 0;
+}
+
+static int
+_edje_lua_part_set_tween_state(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   lua_rawgeti(L, 2, 3);
+   lua_rawgeti(L, 2, 4);
+   lua_rawgeti(L, 2, 5);
+   _edje_part_description_apply(obj->ed, obj->rp,
+				luaL_checkstring(L, -4), luaL_checknumber(L, -3),
+				luaL_checkstring(L, -2), luaL_checknumber(L, -1));
+   _edje_part_pos_set(obj->ed, obj->rp, EDJE_TWEEN_MODE_LINEAR,
+		      luaL_checknumber(L, -5));
+   _edje_recalc(obj->ed);
+   return 0;
+}
+
+static int
+_edje_lua_part_set_text(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_object_part_text_set(obj->ed->obj, obj->key, luaL_checkstring(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_drag_value(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   edje_object_part_drag_value_set(obj->ed->obj, obj->key,
+				   luaL_checknumber(L, -2),
+				   luaL_checknumber(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_drag_size(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   edje_object_part_drag_size_set(obj->ed->obj, obj->key,
+				  luaL_checknumber(L, -2),
+				  luaL_checknumber(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_drag_step(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   edje_object_part_drag_step_set(obj->ed->obj, obj->key,
+				  luaL_checknumber(L, -2),
+				  luaL_checknumber(L, -1));
+   return 0;
+}
+
+static int
+_edje_lua_part_set_drag_page(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   edje_object_part_drag_page_set(obj->ed->obj, obj->key,
+				  luaL_checknumber(L, -2),
+				  luaL_checknumber(L, -1));
+   return 0;
+}
+
+const luaL_Reg lPart_set[] = {
+   {"drag_value", _edje_lua_part_set_drag_value},
+   {"drag_size", _edje_lua_part_set_drag_size},
+   {"drag_step", _edje_lua_part_set_drag_step},
+   {"drag_page", _edje_lua_part_set_drag_page},
+
+   {"effect", _edje_lua_part_set_effect},
+   {"mouse_events", _edje_lua_part_set_mouse_events},
+   {"repeat_events", _edje_lua_part_set_repeat_events},
+   {"state", _edje_lua_part_set_state},
+   {"tween_state", _edje_lua_part_set_tween_state},
+   {"text", _edje_lua_part_set_text},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_part_fn_swallow(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *swa = _edje_lua_checkudata(L, 2, &mObject);
+   edje_object_part_swallow(obj->ed->obj, obj->key, swa->eo);
+   return 0;
+}
+
+static int
+_edje_lua_part_fn_unswallow(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_object_part_unswallow(obj->ed->obj, obj->eo);
+   return 0;
+}
+
+static int
+_edje_lua_part_fn_text_select_none(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_object_part_text_select_none(obj->ed->obj, obj->key);
+   return 0;
+}
+
+static int
+_edje_lua_part_fn_text_select_all(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_object_part_text_select_all(obj->ed->obj, obj->key);
+   return 0;
+}
+
+static int
+_edje_lua_part_fn_text_insert(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   edje_object_part_text_insert(obj->ed->obj, obj->key, luaL_checkstring(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_part_fn_custom_state(lua_State *L)
+{
+   char *name;
+   float val;
+   Edje_Part_Description *parent;
+   Edje_Part_Image_Id *iid;
+   Eina_List *l;
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   /* check whether this part already has a "custom" state */
+   if (obj->rp->custom)
+     {
+	_edje_lua_get_reg(L, obj->rp->custom->description);
+	return 1;
+     }
+
+   name = (char *)luaL_checkstring(L, 2);	// state name
+   val = luaL_checknumber(L, 3);	// state val
+   if (!(parent = _edje_part_description_find(obj->ed, obj->rp, name, val)))
+     {
+	lua_pushnil(L);
+	return 1;
+     }
+   /* now create the custom state */
+   Edje_Lua_Edje_Part_Description *tar =
+      lua_newuserdata(L, sizeof(Edje_Lua_Edje_Part_Description));
+   tar->rp = obj->rp;
+   _edje_lua_set_class(L, -1, cDescription);
+   _edje_lua_new_reg(L, -1, tar); // freed in edje_load.c::_edje_file_del
+   if (!(tar->pd = calloc(1, sizeof(Edje_Part_Description))))
+     {
+	lua_pushnil(L);
+	return 1;
+     }
+   
+   obj->rp->custom = eina_mempool_malloc(_edje_real_part_state_mp, sizeof (Edje_Real_Part_State));
+   if (!obj->rp->custom)
+     {
+        free(tar->pd);
+        tar->pd = NULL;
+        lua_pushnil(L);
+        return 1;
+     }
+   
+   *(tar->pd) = *parent;
+   tar->pd->state.name = (char *)eina_stringshare_add("custom");
+   tar->pd->state.value = 0.0;
+   /* 
+    * make sure all the allocated memory is getting copied,
+    * not just referenced
+    */
+   tar->pd->image.tween_list = NULL;
+   EINA_LIST_FOREACH(parent->image.tween_list, l, iid)
+   {
+      Edje_Part_Image_Id *iid_new;
+      iid_new = calloc(1, sizeof(Edje_Part_Image_Id));
+      iid_new->id = iid->id;
+
+      tar->pd->image.tween_list =
+	 eina_list_append(tar->pd->image.tween_list, iid_new);
+   }
+#define DUP(x) x ? (char *)eina_stringshare_add(x) : NULL
+   tar->pd->color_class = DUP(tar->pd->color_class);
+   tar->pd->text.text = DUP(tar->pd->text.text);
+   tar->pd->text.text_class = DUP(tar->pd->text.text_class);
+   tar->pd->text.font = DUP(tar->pd->text.font);
+   tar->pd->text.style = DUP(tar->pd->text.style);
+#undef DUP
+   obj->rp->custom->description = tar->pd;
+   _edje_lua_new_reg(L, -1, obj->rp->custom->description); // freed in edje_load.c::_edje_file_del
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_table_pack(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+      edje_object_part_table_pack(obj->ed->obj, obj->key, tar->eo,
+	 luaL_checkint(L, 3),
+	 luaL_checkint(L, 4),
+	 luaL_checkint(L, 5),
+	 luaL_checkint(L, 6)));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_table_unpack(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+	 edje_object_part_table_unpack(obj->ed->obj, obj->key, tar->eo));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_table_clear(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushboolean(L,
+	 edje_object_part_table_clear(obj->ed->obj, obj->key, lua_toboolean(L, 2)));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_append(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+	 edje_object_part_box_append(obj->ed->obj, obj->key, tar->eo));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_prepend(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+	 edje_object_part_box_prepend(obj->ed->obj, obj->key, tar->eo));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_insert_before(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   Edje_Lua_Evas_Object *ref = _edje_lua_checkudata(L, 3, &mObject);
+   lua_pushboolean(L,
+	 edje_object_part_box_insert_before(obj->ed->obj, obj->key, tar->eo, tar->eo));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_insert_at(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   lua_pushboolean(L,
+	 edje_object_part_box_insert_at(obj->ed->obj, obj->key, tar->eo, luaL_checkint(L, 3)));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_remove(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   Edje_Lua_Evas_Object *tar = _edje_lua_checkudata(L, 2, &mObject);
+   edje_object_part_box_remove(obj->ed->obj, obj->key, tar->eo);
+   lua_pushvalue(L, 2);
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_remove_at(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   _edje_lua_get_reg(L, edje_object_part_box_remove_at(obj->ed->obj, obj->key, luaL_checkint(L, 2)));
+   return 1;
+}
+
+static int
+_edje_lua_part_fn_box_remove_all(lua_State *L)
+{
+   Edje_Lua_Edje_Part_Object *obj = _edje_lua_checkudata(L, 1, &mPart);
+   lua_pushboolean(L,
+	 edje_object_part_box_remove_all(obj->ed->obj, obj->key, lua_toboolean(L, 2)));
+   return 1;
+}
+
+const luaL_Reg lPart_fn[] = {
+   {"swallow", _edje_lua_part_fn_swallow},
+   {"unswallow", _edje_lua_part_fn_unswallow},
+
+   {"custom_state", _edje_lua_part_fn_custom_state},
+
+   {"text_select_none", _edje_lua_part_fn_text_select_none},
+   {"text_select_all", _edje_lua_part_fn_text_select_all},
+   {"text_insert", _edje_lua_part_fn_text_insert},
+
+   {"table_pack", _edje_lua_part_fn_table_pack},
+   {"table_unpack", _edje_lua_part_fn_table_unpack},
+   {"table_clear", _edje_lua_part_fn_table_clear},
+
+   {"box_append", _edje_lua_part_fn_box_append},
+   {"box_prepend", _edje_lua_part_fn_box_prepend},
+   {"box_insert_before", _edje_lua_part_fn_box_insert_before},
+   {"box_insert_at", _edje_lua_part_fn_box_insert_at},
+   {"box_remove", _edje_lua_part_fn_box_remove},
+   {"box_remove_at", _edje_lua_part_fn_box_remove_at},
+   {"box_remove_all", _edje_lua_part_fn_box_remove_all},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Group
+ */
+
+const luaL_Reg lGroup_mt[];
+
+const luaL_Reg lGroup_get[];
+
+const luaL_Reg lGroup_set[];
+
+const luaL_Reg lGroup_fn[];
+
+const Edje_Lua_Reg mGroup = {
+   lGroup_mt,
+   lGroup_get,
+   lGroup_set,
+   lGroup_fn
+};
+
+const Edje_Lua_Reg *cGroup[] = {
+   &mClass,
+   &mObject,
+   &mGroup,
+   NULL				// sentinel
+};
+
+static int
+_edje_lua_group_mt_index(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_getmetatable(L, 1);
+   if (!_edje_lua_look_fn(L))
+     {
+	// look in lGroup_fn
+	if (!_edje_lua_look_get(L))
+	  {
+	     // look in lGroup_get
+	     const char *key = luaL_checkstring(L, 2);
+	     Edje *ed = _edje_fetch(obj->eo);
+	     Edje_Real_Part *rp = _edje_real_part_recursive_get(ed, key);
+	     if (rp)
+	       {
+		  // check if lua userdata exists
+		  Evas_Object *part = (Evas_Object *) edje_object_part_object_get(obj->eo, key);
+		  _edje_lua_get_reg(L, part);
+		  if (lua_isnil(L, -1))
+		    {
+		       // create it
+		       lua_pop(L, 1);
+		       Edje_Lua_Edje_Part_Object *tar =
+			  lua_newuserdata(L, sizeof(Edje_Lua_Edje_Part_Object));
+		       tar->eo = part;
+		       tar->ed = ed;
+		       tar->key = key;
+		       tar->L = L;
+		       tar->rp = rp;
+		       _edje_lua_set_class(L, -1, cPart);
+		       _edje_lua_new_reg(L, -1, tar); // freed in _edje_lua_edje_part_del_cb
+		       _edje_lua_new_reg(L, -1, part); // freed in _edje_lua_edje_part_del_cb
+		       evas_object_event_callback_add(tar->eo,
+						      EVAS_CALLBACK_DEL,
+						      _edje_lua_edje_part_del_cb,
+						      L);
+		    }
+	       }
+	     else
+	       {
+		  // look in obj environment table
+		  lua_getfenv(L, 1);
+		  lua_pushvalue(L, 2);	// key
+		  lua_rawget(L, -2);
+	       }
+	  }
+     }
+   return 1;
+}
+
+const luaL_Reg lGroup_mt[] = {
+   {"__index", _edje_lua_group_mt_index},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_group_get_group(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   const char *file, *group;
+   edje_object_file_get(obj->eo, &file, &group);
+   lua_pushstring(L, group);
+   return 1;
+}
+
+static int
+_edje_lua_group_get_mouse(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   int x, y;
+   evas_pointer_canvas_xy_get(evas_object_evas_get(obj->eo), &x, &y);
+   x -= obj->ed->x;
+   y -= obj->ed->y;
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, x);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, y);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_group_get_mouse_buttons(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_pushnumber(L, evas_pointer_button_down_mask_get(obj->ed->evas));
+   return 1;
+}
+
+static int
+_edje_lua_group_get_size_min(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   int w, h;
+   edje_object_size_min_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_group_get_size_max(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   int w, h;
+   edje_object_size_max_get(obj->eo, &w, &h);
+   lua_createtable(L, 2, 0);
+   lua_pushnumber(L, w);
+   lua_rawseti(L, -2, 1);
+   lua_pushnumber(L, h);
+   lua_rawseti(L, -2, 2);
+   return 1;
+}
+
+static int
+_edje_lua_group_get_scale(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_pushnumber(L, edje_object_scale_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_group_get_load_error(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_pushnumber(L, edje_object_load_error_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_group_get_load_error_str(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_pushstring(L, edje_load_error_str(edje_object_load_error_get(obj->eo)));
+   return 1;
+}
+
+static int
+_edje_lua_group_get_play(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_pushboolean(L, edje_object_play_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_group_get_animation(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   lua_pushboolean(L, edje_object_animation_get(obj->eo));
+   return 1;
+}
+
+static int
+_edje_lua_group_get_frametime(lua_State *L)
+{
+   lua_pushnumber(L, edje_frametime_get());
+   return 1;
+}
+
+const luaL_Reg lGroup_get[] = {
+   {"group", _edje_lua_group_get_group},
+   {"mouse", _edje_lua_group_get_mouse},
+   {"mouse_buttons", _edje_lua_group_get_mouse_buttons},
+   {"size_min", _edje_lua_group_get_size_min},
+   {"size_max", _edje_lua_group_get_size_max},
+   {"scale", _edje_lua_group_get_scale},
+   {"load_error", _edje_lua_group_get_load_error},
+   {"load_error_str", _edje_lua_group_get_load_error_str},
+   {"play", _edje_lua_group_get_play},
+   {"animation", _edje_lua_group_get_animation},
+   {"frametime", _edje_lua_group_get_frametime},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_group_set_group(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_file_set(obj->eo, obj->ed->file->path, luaL_checkstring(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_group_set_size_min(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->ed->collection->prop.min.w = luaL_checkint(L, -2);
+   obj->ed->collection->prop.min.h = luaL_checkint(L, -1);
+   obj->ed->dirty = 1;
+   _edje_recalc(obj->ed);
+   return 0;
+}
+
+static int
+_edje_lua_group_set_size_max(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   luaL_checktype(L, 2, LUA_TTABLE);
+   lua_rawgeti(L, 2, 1);
+   lua_rawgeti(L, 2, 2);
+   obj->ed->collection->prop.max.w = luaL_checkint(L, -2);
+   obj->ed->collection->prop.max.h = luaL_checkint(L, -1);
+   obj->ed->dirty = 1;
+   _edje_recalc(obj->ed);
+   return 0;
+}
+
+static int
+_edje_lua_group_set_scale(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_scale_set(obj->eo, luaL_checknumber(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_group_set_play(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_play_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_group_set_animation(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_animation_set(obj->eo, lua_toboolean(L, 2));
+   return 0;
+}
+
+static void
+_edje_lua_group_text_change_cb(void* data, Evas_Object *obj, const char* part)
+{
+   Edje_Lua_Ref *ref = data;
+   lua_State *L = ref->L;
+   int err_code;
+
+   _edje_lua_get_ref(L, ref);
+   _edje_lua_get_reg(L, obj);
+   lua_pushstring(L, part);
+
+   if ((err_code = lua_pcall(L, 2, 0, 0)))
+     _edje_lua_error(L, err_code);
+}
+
+static int
+_edje_lua_group_set_text_change_cb(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_text_change_cb_set(obj->eo, _edje_lua_group_text_change_cb, _edje_lua_new_ref(L, 2));
+   return 0;
+}
+
+static int
+_edje_lua_group_set_frametime(lua_State *L)
+{
+   edje_frametime_set(luaL_checknumber(L, 2));
+   return 0;
+}
+
+const luaL_Reg lGroup_set[] = {
+   {"group", _edje_lua_group_set_group},
+   {"size_min", _edje_lua_group_set_size_min},
+   {"size_max", _edje_lua_group_set_size_max},
+   {"scale", _edje_lua_group_set_scale},
+   {"play", _edje_lua_group_set_play},
+   {"animation", _edje_lua_group_set_animation},
+   {"text_change_cb", _edje_lua_group_set_text_change_cb},
+   {"frametime", _edje_lua_group_set_frametime},
+   {NULL, NULL}			// sentinel
+};
+
+static int
+_edje_lua_group_fn_timer(lua_State *L)
+{
+   Edje_Lua_Timer *tar = lua_newuserdata(L, sizeof(Edje_Lua_Timer));
+   _edje_lua_set_class(L, -1, cTimer);
+   tar->et = ecore_timer_add(luaL_checknumber(L, 2), _edje_lua_timer_cb, tar);
+   tar->L = L;
+   _edje_lua_new_reg(L, -1, tar); // freed in _edje_lua_timer_cb/del
+   tar->cb = _edje_lua_new_ref(L, 3); // freed in _edje_lua_timer_cb/del
+   return 1;
+}
+
+static int
+_edje_lua_group_fn_animator(lua_State *L)
+{
+   Edje_Lua_Animator *tar = lua_newuserdata(L, sizeof(Edje_Lua_Animator));
+   _edje_lua_set_class(L, -1, cAnimator);
+   tar->ea = ecore_animator_add(_edje_lua_animator_cb, tar);
+   tar->L = L;
+   _edje_lua_new_reg(L, -1, tar); // freed in _edje_lua_animator_cb/del
+   tar->cb = _edje_lua_new_ref(L, 2); // freed in _edje_lua_animator_cb/del
+   return 1;
+}
+
+static int
+_edje_lua_group_fn_poller(lua_State *L)
+{
+   int interval;
+   Edje_Lua_Poller *tar;
+   tar = lua_newuserdata(L, sizeof(Edje_Lua_Poller));
+   _edje_lua_set_class(L, -1, cPoller);
+   
+   interval = luaL_checknumber(L, 2);
+   if ((interval <= 0) || ((interval & 1) != 0))
+     {
+	return 0;
+     }
+
+   // Only 1 type of poller currently implemented in ecore
+   tar->ep = ecore_poller_add(ECORE_POLLER_CORE, interval, 
+			   _edje_lua_poller_cb, tar);
+   tar->L = L;
+   _edje_lua_new_reg(L, -1, tar); // freed in _edje_lua_poller_cb/del
+   tar->cb = _edje_lua_new_ref(L, 3); // freed in _edje_lua_poller_cb/del
+
+   return 1;
+}
+
+static int
+_edje_lua_group_fn_transform(lua_State *L)
+{
+   Edje_Lua_Transform *tar = lua_newuserdata(L, sizeof(Edje_Lua_Transform));
+   evas_transform_identity_set (&(tar->et));
+   _edje_lua_set_class(L, -1, cTransform);
+   tar->L = L;
+   return 1;
+}
+
+static int
+_edje_lua_group_fn_signal_emit(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_signal_emit(obj->eo,
+			   luaL_checkstring(L, 2), luaL_checkstring(L, 3));
+   return 0;
+}
+
+Edje_Program *
+_edje_lua_program_get_byname(Evas_Object * obj, const char *prog_name)
+{
+   Edje_Program *epr;
+   int i;
+   Edje *ed;
+   ed = _edje_fetch(obj);
+   if (!ed)
+      return NULL;
+   if (!prog_name)
+      return NULL;
+   for (i = 0; i < ed->table_programs_size; i++)
+     {
+	epr = ed->table_programs[i];
+	if ((epr->name) && (strcmp(epr->name, prog_name) == 0))
+	   return epr;
+     }
+   return NULL;
+}
+
+static int
+_edje_lua_group_fn_program_run(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   Edje_Program *pr =
+      _edje_lua_program_get_byname(obj->eo, luaL_checkstring(L, 2));
+   if (pr)
+      _edje_program_run(obj->ed, pr, 0, "", "");
+   return 0;
+}
+
+static int
+_edje_lua_group_fn_program_stop(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   Edje_Program *pr =
+      _edje_lua_program_get_byname(obj->eo, luaL_checkstring(L, 2));
+   int program_id = pr->id;
+   Edje_Running_Program *runp;
+   Eina_List *l;
+   obj->ed->walking_actions = 1;
+   EINA_LIST_FOREACH(obj->ed->actions, l, runp)
+      if (program_id == runp->program->id)
+      _edje_program_end(obj->ed, runp);
+   obj->ed->walking_actions = 0;
+   return 0;
+}
+
+static int
+_edje_lua_group_fn_message_send(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   int type = luaL_checkint(L, 2);
+   void *msg = NULL;
+   int i;
+   int size;
+   switch (type)
+     {
+     case EDJE_MESSAGE_NONE:
+	break;
+     case EDJE_MESSAGE_SIGNAL:
+	break;
+     case EDJE_MESSAGE_STRING:
+	  {
+	     Edje_Message_String *msg_string =
+		malloc(sizeof(Edje_Message_String));
+	     msg_string->str = (char *)luaL_checkstring(L, 4);
+	     msg = msg_string;
+	  }
+	break;
+     case EDJE_MESSAGE_INT:
+	  {
+	     Edje_Message_Int *msg_int = malloc(sizeof(Edje_Message_Int));
+
+	     msg_int->val = luaL_checkint(L, 4);
+	     msg = msg_int;
+	  }
+	break;
+     case EDJE_MESSAGE_FLOAT:
+	  {
+	     Edje_Message_Float *msg_float = malloc(sizeof(Edje_Message_Float));
+
+	     msg_float->val = luaL_checknumber(L, 4);
+	     msg = msg_float;
+	  }
+	break;
+     case EDJE_MESSAGE_STRING_SET:
+	  {
+	     if (lua_type(L, 4) != LUA_TTABLE)
+	       break;
+	     size = lua_objlen(L, 4);
+	     Edje_Message_String_Set *msg_string_set =
+		malloc(sizeof(Edje_Message_String_Set) +
+		      (size - 1) * sizeof(char *));
+	     msg_string_set->count = size;
+	     for (i = 0; i < size; i++)
+	       {
+		  lua_rawgeti(L, 4, i + 1);
+		  msg_string_set->str[i] = (char *)luaL_checkstring(L, -1);
+		  lua_pop(L, 1);
+	       }
+	     msg = msg_string_set;
+	  }
+	break;
+     case EDJE_MESSAGE_INT_SET:
+	  {
+	     if (lua_type(L, 4) != LUA_TTABLE)
+	       break;
+	     size = lua_objlen(L, 4);
+	     Edje_Message_Int_Set *msg_int_set =
+		malloc(sizeof(Edje_Message_Int_Set) + (size - 1) * sizeof(int));
+	     msg_int_set->count = size;
+	     for (i = 0; i < size; i++)
+	       {
+		  lua_rawgeti(L, 4, i + 1);
+		  msg_int_set->val[i] = luaL_checkint(L, -1);
+		  lua_pop(L, 1);
+	       }
+	     msg = msg_int_set;
+	  }
+	break;
+     case EDJE_MESSAGE_FLOAT_SET:
+	  {
+	     if (lua_type(L, 4) != LUA_TTABLE)
+	       break;
+	     size = lua_objlen(L, 4);
+	     Edje_Message_Float_Set *msg_float_set =
+		malloc(sizeof(Edje_Message_Float_Set) +
+		      (size - 1) * sizeof(double));
+	     msg_float_set->count = size;
+	     for (i = 0; i < size; i++)
+	       {
+		  lua_rawgeti(L, 4, i + 1);
+		  msg_float_set->val[i] = luaL_checknumber(L, -1);
+		  lua_pop(L, 1);
+	       }
+	     msg = msg_float_set;
+	  }
+	break;
+     case EDJE_MESSAGE_STRING_INT:
+	  {
+	     Edje_Message_String_Int *msg_string_int =
+		malloc(sizeof(Edje_Message_String_Int));
+	     msg_string_int->str = (char *)luaL_checkstring(L, 4);
+	     msg_string_int->val = luaL_checkint(L, 5);
+	     msg = msg_string_int;
+	  }
+	break;
+     case EDJE_MESSAGE_STRING_FLOAT:
+	  {
+	     Edje_Message_String_Float *msg_string_float =
+		malloc(sizeof(Edje_Message_String_Float));
+	     msg_string_float->str = (char *)luaL_checkstring(L, 4);
+	     msg_string_float->val = luaL_checknumber(L, 5);
+	     msg = msg_string_float;
+	  }
+	break;
+     case EDJE_MESSAGE_STRING_INT_SET:
+	  {
+	     if (lua_type(L, 5) != LUA_TTABLE)
+	       break;
+	     size = lua_objlen(L, 5);
+	     Edje_Message_String_Int_Set *msg_string_int_set =
+		malloc(sizeof(Edje_Message_String_Int_Set) +
+		      (size - 1) * sizeof(int));
+	     msg_string_int_set->str = (char *)luaL_checkstring(L, 4);
+	     msg_string_int_set->count = size;
+	     for (i = 0; i < size; i++)
+	       {
+		  lua_rawgeti(L, 5, i + 1);
+		  msg_string_int_set->val[i] = luaL_checkint(L, -1);
+		  lua_pop(L, 1);
+	       }
+	     msg = msg_string_int_set;
+	  }
+	break;
+     case EDJE_MESSAGE_STRING_FLOAT_SET:
+	  {
+	     if (lua_type(L, 5) != LUA_TTABLE)
+	       break;
+	     size = lua_objlen(L, 5);
+	     Edje_Message_String_Float_Set *msg_string_float_set =
+		malloc(sizeof(Edje_Message_String_Float_Set) +
+		      (size - 1) * sizeof(double));
+	     msg_string_float_set->str = (char *)luaL_checkstring(L, 4);
+	     msg_string_float_set->count = size;
+	     for (i = 0; i < size; i++)
+	       {
+		  lua_rawgeti(L, 5, i + 1);
+		  msg_string_float_set->val[i] = luaL_checknumber(L, -1);
+		  lua_pop(L, 1);
+	       }
+	     msg = msg_string_float_set;
+	  }
+	break;
+     default:
+	break;
+     }
+
+   if (msg)
+     {
+	edje_object_message_send(obj->eo, type, luaL_checkint(L, 3), msg);
+	free(msg);
+     }
+
+   return 0;
+}
+
+static void
+_edje_lua_group_signal_callback(void *data, Evas_Object * edj,
+				const char *signal, const char *source)
+{
+   Edje_Lua_Ref *cb = data;
+   lua_State *L = cb->L;
+   _edje_lua_get_ref(L, cb);	// signal callback function
+   if (lua_isfunction(L, -1))
+     {
+	int err_code;
+
+	_edje_lua_get_reg(L, edj);
+	lua_pushstring(L, signal);	// signal
+	lua_pushstring(L, source);	// source
+
+	if ((err_code = lua_pcall(L, 3, 0, 0)))
+	  _edje_lua_error(L, err_code);
+     }
+}
+
+static int
+_edje_lua_group_fn_signal_callback_add(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   if (lua_type(L, 4) == LUA_TFUNCTION)
+     {
+	Edje_Lua_Ref *ref = _edje_lua_new_ref(L, 4);
+	obj->cb = eina_list_append(obj->cb, ref);
+	edje_object_signal_callback_add(obj->eo,
+					luaL_checkstring(L, 2),
+					luaL_checkstring(L, 3),
+					_edje_lua_group_signal_callback,
+					ref); // freed in _edje_lua_group_fn_signal_callback_del
+     }
+   return 0;
+}
+
+static int
+_edje_lua_group_fn_signal_callback_del(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   Edje_Lua_Ref *ref = edje_object_signal_callback_del(obj->eo,
+				   luaL_checkstring(L, 2),
+				   luaL_checkstring(L, 3),
+				   _edje_lua_group_signal_callback);
+   obj->cb = eina_list_remove(obj->cb, ref);
+   _edje_lua_free_ref(L, ref); // created in _edje_lua_group_fn_signal_callback_add
+   return 0;
+}
+
+static int
+_edje_lua_group_fn_freeze(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_freeze(obj->eo);
+   return 0;
+}
+
+static int
+_edje_lua_group_fn_thaw(lua_State *L)
+{
+   Edje_Lua_Evas_Object *obj = _edje_lua_checkudata(L, 1, &mGroup);
+   edje_object_thaw(obj->eo);
+   return 0;
+}
+
+const luaL_Reg lGroup_fn[] = {
+   {"timer", _edje_lua_group_fn_timer},
+   {"animator", _edje_lua_group_fn_animator},
+   {"poller", _edje_lua_group_fn_poller},
+   {"transform", _edje_lua_group_fn_transform},
+   {"signal_emit", _edje_lua_group_fn_signal_emit},
+   {"message_send", _edje_lua_group_fn_message_send},
+   {"program_run", _edje_lua_group_fn_program_run},
+   {"program_stop", _edje_lua_group_fn_program_stop},
+   {"signal_callback_add", _edje_lua_group_fn_signal_callback_add},
+   {"signal_callback_del", _edje_lua_group_fn_signal_callback_del},
+   {"freeze", _edje_lua_group_fn_freeze},
+   {"thaw", _edje_lua_group_fn_thaw},
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * Lua bindings
+ */
+
+const luaL_Reg lScript_get[];
+
+const luaL_Reg lScript_set[];
+
+const luaL_Reg lScript_fn[];
+
+const Edje_Lua_Reg mScript = {
+   lNil,
+   lScript_get,
+   lScript_set,
+   lScript_fn
+};
+
+const Edje_Lua_Reg *cScript[] = {
+   &mClass,
+   &mObject,
+   &mGroup,
+   &mScript,
+   NULL				// sentinel
+};
+
+/*
+ * macro for adding an evas_object in the lua_script_only object
+ */
+#define _EDJE_LUA_SCRIPT_FN_ADD(DEF, CLASS, FUNC)			\
+  static int								\
+  DEF (lua_State *L)							\
+  {									\
+     int set = lua_gettop (L) == 2;					\
+     Edje_Lua_Evas_Object *obj = _edje_lua_checkudata (L, 1, &mScript); \
+     Edje_Lua_Evas_Object *tar = lua_newuserdata (L, sizeof (Edje_Lua_Evas_Object)); \
+     _edje_lua_set_class (L, -1, CLASS);				\
+     tar->eo = FUNC (obj->ed->evas);					\
+     tar->ed = obj->ed;							\
+     tar->L = L;							\
+     tar->cb = NULL;							\
+     evas_object_move (tar->eo, obj->ed->x, obj->ed->y);		\
+     _edje_lua_new_reg (L, -1, tar); /* freed in _edje_lua_object_del_cb */ \
+     _edje_lua_new_reg (L, -1, tar->eo); /* freed in _edje_lua_object_del_cb */ \
+     evas_object_smart_member_add (tar->eo, obj->eo);			\
+     evas_object_clip_set (tar->eo, obj->ed->clipper);			\
+     evas_object_event_callback_add (tar->eo, EVAS_CALLBACK_DEL, _edje_lua_object_del_cb, L); \
+     if (set)								\
+       {								\
+	  int err_code;							\
+	  lua_getfield (L, -1, "set");					\
+	  lua_pushvalue (L, -2);					\
+	  lua_pushvalue (L, 2);						\
+	  if ((err_code = lua_pcall (L, 2, 0, 0)))			\
+	    _edje_lua_error (L, err_code);				\
+       }								\
+     return 1;								\
+  }
+
+_EDJE_LUA_SCRIPT_FN_ADD(_edje_lua_script_fn_rectangle,
+			cRectangle,
+			evas_object_rectangle_add)
+_EDJE_LUA_SCRIPT_FN_ADD(_edje_lua_script_fn_image,
+			cImage,
+			evas_object_image_add)
+_EDJE_LUA_SCRIPT_FN_ADD(_edje_lua_script_fn_table,
+			cTable,
+			evas_object_table_add)
+_EDJE_LUA_SCRIPT_FN_ADD(_edje_lua_script_fn_line,
+			cLine,
+			evas_object_line_add)
+_EDJE_LUA_SCRIPT_FN_ADD(_edje_lua_script_fn_polygon,
+			cPolygon,
+			evas_object_polygon_add)
+_EDJE_LUA_SCRIPT_FN_ADD(_edje_lua_script_fn_group, cGroup, edje_object_add)
+
+const luaL_Reg lScript_fn[] = {
+   {"rectangle", _edje_lua_script_fn_rectangle},
+   {"image", _edje_lua_script_fn_image},
+   {"table", _edje_lua_script_fn_table},
+   {"line", _edje_lua_script_fn_line},
+   {"polygon", _edje_lua_script_fn_polygon},
+   {"group", _edje_lua_script_fn_group},
+   {NULL, NULL}			// sentinel
+};
+
+const luaL_Reg lScript_get[] = {
+   {NULL, NULL}			// sentinel
+};
+
+const luaL_Reg lScript_set[] = {
+   {NULL, NULL}			// sentinel
+};
+
+/*
+ * creates and exports a lua_script_only object
+ */
+void
+_edje_lua_script_fn_new(Edje * ed)
+{
+   lua_State *L = ed->L;
+   Edje_Lua_Evas_Object *tar = lua_newuserdata(L, sizeof(Edje_Lua_Evas_Object));
+   _edje_lua_set_class(L, -1, cScript);
+   tar->eo = ed->obj;
+   tar->ed = ed;
+   tar->L = L;
+   tar->cb = NULL;
+   _edje_lua_new_reg(L, -1, tar); // freed in _edje_lua_object_del_cb
+   _edje_lua_new_reg(L, -1, ed); // freed in edje_load.c::_edje_file_del
+   _edje_lua_new_reg(L, -1, ed->obj); // freed in _edje_lua_object_del_cb
+   evas_object_event_callback_add(tar->eo, EVAS_CALLBACK_DEL,
+				  _edje_lua_object_del_cb, L);
+}
+
+/*
+ * creates and exports an Edje group with associated Lua scripts in the parts and programs sections
+ */
+void
+_edje_lua_group_fn_new(Edje * ed)
+{
+   lua_State *L = ed->L;
+   Edje_Lua_Evas_Object *tar = lua_newuserdata(L, sizeof(Edje_Lua_Evas_Object));
+   _edje_lua_set_class(L, -1, cGroup);
+   tar->eo = ed->obj;
+   tar->ed = ed;
+   tar->L = L;
+   tar->cb = NULL;
+   _edje_lua_new_reg(L, -1, tar); // freed in _edje_lua_object_del_cb
+   _edje_lua_new_reg(L, -1, ed); // freed in edje_load.c::_edje_file_del
+   _edje_lua_new_reg(L, -1, ed->obj); // freed in _edje_lua_object_del_cb
+   evas_object_event_callback_add(tar->eo, EVAS_CALLBACK_DEL,
+				  _edje_lua_object_del_cb, L);
+}
+
+/*
+ * this function loads all the Lua bindings into the global Lua state
+ */
+static void
+_edje_lua_open(lua_State *L)
+{
+   /*
+    * export classes
+    */
+   _edje_lua_new_class(L, cTimer);
+   _edje_lua_new_class(L, cAnimator);
+   _edje_lua_new_class(L, cPoller);
+   _edje_lua_new_class(L, cTransform);
+   _edje_lua_new_class(L, cRectangle);
+   _edje_lua_new_class(L, cImage);
+   _edje_lua_new_class(L, cTable);
+   _edje_lua_new_class(L, cLine);
+   _edje_lua_new_class(L, cPolygon);
+   _edje_lua_new_class(L, cGroup);
+   _edje_lua_new_class(L, cDescription);
+   _edje_lua_new_class(L, cPart);
+   _edje_lua_new_class(L, cScript);
+
+   /*
+    * export constants
+    */
+   _edje_lua_new_const(L, "MESSAGE_NONE", EDJE_MESSAGE_NONE);
+   _edje_lua_new_const(L, "MESSAGE_SIGNAL", EDJE_MESSAGE_SIGNAL);
+   _edje_lua_new_const(L, "MESSAGE_STRING", EDJE_MESSAGE_STRING);
+   _edje_lua_new_const(L, "MESSAGE_INT", EDJE_MESSAGE_INT);
+   _edje_lua_new_const(L, "MESSAGE_FLOAT", EDJE_MESSAGE_FLOAT);
+   _edje_lua_new_const(L, "MESSAGE_STRING_SET", EDJE_MESSAGE_STRING_SET);
+   _edje_lua_new_const(L, "MESSAGE_INT_SET", EDJE_MESSAGE_INT_SET);
+   _edje_lua_new_const(L, "MESSAGE_FLOAT_SET", EDJE_MESSAGE_FLOAT_SET);
+   _edje_lua_new_const(L, "MESSAGE_STRING_INT", EDJE_MESSAGE_STRING_INT);
+   _edje_lua_new_const(L, "MESSAGE_STRING_FLOAT", EDJE_MESSAGE_STRING_FLOAT);
+   _edje_lua_new_const(L, "MESSAGE_STRING_INT_SET", EDJE_MESSAGE_STRING_INT_SET);
+   _edje_lua_new_const(L, "MESSAGE_STRING_FLOAT_SET", EDJE_MESSAGE_STRING_FLOAT_SET);
+
+   _edje_lua_new_const(L, "PART_TYPE_NONE", EDJE_PART_TYPE_NONE);
+   _edje_lua_new_const(L, "PART_TYPE_RECTANGLE", EDJE_PART_TYPE_RECTANGLE);
+   _edje_lua_new_const(L, "PART_TYPE_TEXT", EDJE_PART_TYPE_TEXT);
+   _edje_lua_new_const(L, "PART_TYPE_IMAGE", EDJE_PART_TYPE_IMAGE);
+   _edje_lua_new_const(L, "PART_TYPE_SWALLOW", EDJE_PART_TYPE_SWALLOW);
+   _edje_lua_new_const(L, "PART_TYPE_TEXTBLOCK", EDJE_PART_TYPE_TEXTBLOCK);
+   _edje_lua_new_const(L, "PART_TYPE_GRADIENT", EDJE_PART_TYPE_GRADIENT);
+   _edje_lua_new_const(L, "PART_TYPE_GROUP", EDJE_PART_TYPE_GROUP);
+   _edje_lua_new_const(L, "PART_TYPE_BOX", EDJE_PART_TYPE_BOX);
+
+   _edje_lua_new_const(L, "TEXT_EFFECT_NONE", EDJE_TEXT_EFFECT_NONE);
+   _edje_lua_new_const(L, "TEXT_EFFECT_PLAIN", EDJE_TEXT_EFFECT_PLAIN);
+   _edje_lua_new_const(L, "TEXT_EFFECT_OUTLINE", EDJE_TEXT_EFFECT_OUTLINE);
+   _edje_lua_new_const(L, "TEXT_EFFECT_OTLINE", EDJE_TEXT_EFFECT_SOFT_OUTLINE);
+   _edje_lua_new_const(L, "TEXT_EFFECT_SHADOW", EDJE_TEXT_EFFECT_SHADOW);
+   _edje_lua_new_const(L, "TEXT_EFFECT_SOFT_SHADOW", EDJE_TEXT_EFFECT_SOFT_SHADOW);
+   _edje_lua_new_const(L, "TEXT_EFFECT_OUTLINE_SHADOW", EDJE_TEXT_EFFECT_OUTLINE_SHADOW);
+   _edje_lua_new_const(L, "TEXT_EFFECT_OUTLINE_SOFT_SHADOW", EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW);
+   _edje_lua_new_const(L, "TEXT_EFFECT_FAR_SHADOW", EDJE_TEXT_EFFECT_FAR_SHADOW);
+   _edje_lua_new_const(L, "TEXT_EFFECT_FAR_SOFT_SHADOW", EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW);
+   _edje_lua_new_const(L, "TEXT_EFFECT_GLOW", EDJE_TEXT_EFFECT_GLOW);
+
+   _edje_lua_new_const(L, "RENDER_BLEND", EVAS_RENDER_BLEND);
+   _edje_lua_new_const(L, "RENDER_BLEND_REL", EVAS_RENDER_BLEND_REL);
+   _edje_lua_new_const(L, "RENDER_COPY", EVAS_RENDER_COPY);
+   _edje_lua_new_const(L, "RENDER_COPY_REL", EVAS_RENDER_COPY_REL);
+   _edje_lua_new_const(L, "RENDER_ADD", EVAS_RENDER_ADD);
+   _edje_lua_new_const(L, "RENDER_ADD_REL", EVAS_RENDER_ADD_REL);
+   _edje_lua_new_const(L, "RENDER_SUB", EVAS_RENDER_SUB);
+   _edje_lua_new_const(L, "RENDER_SUB_REL", EVAS_RENDER_SUB_REL);
+   _edje_lua_new_const(L, "RENDER_TINT", EVAS_RENDER_TINT);
+   _edje_lua_new_const(L, "RENDER_TINT_REL", EVAS_RENDER_TINT_REL);
+   _edje_lua_new_const(L, "RENDER_MASK", EVAS_RENDER_MASK);
+   _edje_lua_new_const(L, "RENDER_MUL", EVAS_RENDER_MUL);
+
+   _edje_lua_new_const(L, "BORDER_FILL_NONE", EVAS_BORDER_FILL_NONE);
+   _edje_lua_new_const(L, "BORDER_FILL_DEFAULT", EVAS_BORDER_FILL_DEFAULT);
+   _edje_lua_new_const(L, "BORDER_FILL_SOLID", EVAS_BORDER_FILL_SOLID);
+
+   _edje_lua_new_const(L, "POINTER_MODE_AUTOGRAB", EVAS_OBJECT_POINTER_MODE_AUTOGRAB);
+   _edje_lua_new_const(L, "POINTER_MODE_NOGRAB", EVAS_OBJECT_POINTER_MODE_NOGRAB);
+
+   _edje_lua_new_const(L, "ASPECT_CONTROL_NEITHER", EVAS_ASPECT_CONTROL_NEITHER);
+   _edje_lua_new_const(L, "ASPECT_CONTROL_HORIZONTAL", EVAS_ASPECT_CONTROL_HORIZONTAL);
+   _edje_lua_new_const(L, "ASPECT_CONTROL_VERTICAL", EVAS_ASPECT_CONTROL_VERTICAL);
+   _edje_lua_new_const(L, "ASPECT_CONTROL_BOTH", EVAS_ASPECT_CONTROL_BOTH);
+
+   _edje_lua_new_const(L, "CALLBACK_RENEW", ECORE_CALLBACK_RENEW);
+   _edje_lua_new_const(L, "CALLBACK_CANCEL", ECORE_CALLBACK_CANCEL);
+}
+
+/*
+ * main Lua state
+ * created by edje_init ()
+ * closed by edje_shutdown ()
+ * any other private Lua state inherits from this global state
+ */
+static lua_State *Ledje = NULL;
+
+lua_State *
+_edje_lua_state_get ()
+{
+   return Ledje;
+}
+
+/*
+ * custom memory allocation function
+ * raises an error, if memory usage is above the given maximum
+ */
+static void *
+_edje_lua_alloc(void *ud, void *ptr, size_t osize, size_t nsize)
+{
+   Edje_Lua_Alloc *ela = ud;
+   
+   ela->cur += nsize - osize;
+   if (ela->cur > ela->max)
+     {
+	fprintf(stderr, 
+                "Edje Lua memory limit of %i bytes reached (%i allocated)\n",
+                ela->max, ela->cur);
+	return NULL;
+     }
+   if (nsize == 0)
+     {
+	free(ptr);		/* ANSI requires that free(NULL) has no effect */
+	return NULL;
+     }
+   else
+      /* ANSI requires that realloc(NULL, size) == malloc(size) */
+      return realloc(ptr, nsize);
+}
+
+void
+_edje_lua_init()
+{
+   if (Ledje != NULL) return;
+   /*
+    * create main Lua state with the custom memory allocation function
+    */
+   static Edje_Lua_Alloc ela = { 1e7, 0 };	// TODO make the memory limit configurable?
+   Ledje = lua_newstate(_edje_lua_alloc, &ela);
+   if (!Ledje)
+     {
+	fprintf(stderr, "Lua error: Lua state could not be initialized\n");
+	exit(-1);
+     }
+
+   /*
+    * configure Lua garbage collector
+    * TODO optimize garbage collector for typical edje use or make it configurable
+    */
+   lua_gc(Ledje, LUA_GCSETPAUSE, 200);
+   lua_gc(Ledje, LUA_GCSETSTEPMUL, 200);
+
+   /*
+    * sandbox Lua
+    * no access to io, os and package routines
+    * no loading and execution of files
+    * no loading and execution of strings
+    * no access to the OS environment
+    */
+   luaopen_base(Ledje);
+   luaopen_table(Ledje);
+   luaopen_string(Ledje);
+   luaopen_math(Ledje);
+   luaopen_os(Ledje);
+
+   /*
+    * FIXME
+    * this is just for debug purposes
+    * remove it in the final version
+    */
+   lua_pushnil(Ledje);
+   lua_setglobal(Ledje, "load");
+   lua_pushnil(Ledje);
+   lua_setglobal(Ledje, "loadfile");
+   lua_pushnil(Ledje);
+   lua_setglobal(Ledje, "loadstring");
+   lua_pushnil(Ledje);
+   lua_setglobal(Ledje, "dofile");
+   lua_pushnil(Ledje);
+   lua_setglobal(Ledje, "dostring");
+
+   lua_getglobal(Ledje, "os");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "exit");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "setlocale");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "getenv");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "remove");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "tmpname");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "rename");
+   lua_pushnil(Ledje);
+   lua_setfield(Ledje, -2, "execute");
+   lua_pushnil(Ledje);
+
+   /*
+    * we need a weak value registry
+    * so that deleted and unused objects can be garbage collected
+    */
+   lua_createtable(Ledje, 1, 0);
+   //lua_pushstring(Ledje, "v"); 
+   lua_pushstring(Ledje, "");
+   lua_setfield(Ledje, -2, "__mode");
+   lua_setmetatable(Ledje, LUA_REGISTRYINDEX);
+
+   /*
+    * load Lua Evas/Edje bindings
+    */
+   _edje_lua_open(Ledje);
+}
+
+void
+_edje_lua_shutdown()
+{
+   if (Ledje == NULL) return;
+   lua_close(Ledje);
+}
diff --git a/src/lib/edje_lua_script_only.c b/src/lib/edje_lua_script_only.c
new file mode 100644
index 0000000..d100890
--- /dev/null
+++ b/src/lib/edje_lua_script_only.c
@@ -0,0 +1,296 @@
+/*
+ * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca(size_t);
+#endif
+
+#include "edje_private.h"
+
+int
+_edje_lua_script_only(Edje * ed)
+{
+   if ((ed->collection) && (ed->collection->L) &&
+       (ed->collection->lua_script_only))
+      return 1;
+   return 0;
+}
+
+void
+_edje_lua_script_only_init(Edje * ed)
+{
+   if (ed->collection && ed->collection->L)
+     {
+	 ed->L = _edje_lua_new_thread(ed->collection->L); // freed in _edje_lua_script_only_shutdown
+	 _edje_lua_new_reg(ed->collection->L, -1, ed->L); // freed in _edje_lua_script_only_shutdown
+	 lua_pop(ed->collection->L, 1); /* thread */
+
+	 lua_State *L = ed->L;
+	 _edje_lua_script_fn_new(ed);
+	 lua_pop(L, 1); /* script */
+
+	 lua_getglobal(L, "init");
+	 if (!lua_isnil (L, -1))
+	   {
+	      int err_code;
+
+	      lua_pushvalue(L, LUA_GLOBALSINDEX); /* set function environment from collection thread to edje object thread */
+	      lua_setfenv(L, -2);
+	      _edje_lua_get_reg(L, ed);
+
+	      if ((err_code = lua_pcall(L, 1, 0, 0)))
+		_edje_lua_error(L, err_code);
+	   }
+	 else
+	   lua_pop(L, 1);
+     }
+}
+
+void
+_edje_lua_script_only_shutdown(Edje * ed)
+{
+   if (ed->collection && ed->collection->L && ed->L)
+     {
+	lua_State *L = ed->L;
+	lua_getglobal(L, "shutdown");
+	if (!lua_isnil (L, -1))
+	  {
+	     int err_code;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX);
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+
+	     if ((err_code = lua_pcall(L, 1, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+	else
+	  lua_pop (L, 1);
+     }
+}
+
+void
+_edje_lua_script_only_show(Edje * ed)
+{
+   if (ed->collection && ed->collection->L && ed->L)
+     {
+	lua_State *L = ed->L;
+	lua_getglobal(L, "show");
+	if (!lua_isnil (L, -1))
+	  {
+	     int err_code;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX);
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+
+	     if ((err_code = lua_pcall(L, 1, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+	else
+	  lua_pop (L, 1);
+     }
+}
+
+void
+_edje_lua_script_only_hide(Edje * ed)
+{
+   if (ed->collection && ed->collection->L && ed->L)
+     {
+	lua_State *L = ed->L;
+	lua_getglobal(L, "hide");
+	if (!lua_isnil (L, -1))
+	  {
+	     int err_code;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX);
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+
+	     if ((err_code = lua_pcall(L, 1, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+	else
+	  lua_pop (L, 1);
+     }
+}
+
+void
+_edje_lua_script_only_move(Edje * ed)
+{
+   if (ed->collection && ed->collection->L && ed->L)
+     {
+	lua_State *L = ed->L;
+	lua_getglobal(L, "move");
+	if (!lua_isnil (L, -1))
+	  {
+	     int err_code;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX);
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+	     lua_pushnumber(L, ed->x);
+	     lua_pushnumber(L, ed->y);
+
+	     if ((err_code = lua_pcall(L, 3, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+	else
+	  lua_pop (L, 1);
+     }
+}
+
+void
+_edje_lua_script_only_resize(Edje * ed)
+{
+   if (ed->collection && ed->collection->L && ed->L)
+     {
+	lua_State *L = ed->L;
+	lua_getglobal(L, "resize");
+	if (!lua_isnil (L, -1))
+	  {
+	     int err_code;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX);
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+	     lua_pushnumber(L, ed->w);
+	     lua_pushnumber(L, ed->h);
+
+	     if ((err_code = lua_pcall(L, 3, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+	else
+	  lua_pop (L, 1);
+     }
+}
+
+void
+_edje_lua_script_only_message(Edje * ed, Edje_Message * em)
+{
+   if (ed->collection && ed->collection->L && ed->L)
+     {
+	lua_State *L = ed->L;
+	lua_getglobal(L, "message");
+	if (!lua_isnil (L, -1))
+	  {
+	     int nargs = 3;
+	     int err_code;
+	     int count;
+	     int i;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX);
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+	     lua_pushnumber(L, em->type);
+	     lua_pushnumber(L, em->id);
+	     switch (em->type)
+	       {
+		case EDJE_MESSAGE_NONE:
+		   break;
+		case EDJE_MESSAGE_SIGNAL:
+		   break;
+		case EDJE_MESSAGE_STRING:
+		   lua_pushstring(L, ((Edje_Message_String *) em->msg)->str);
+		   nargs += 1;
+		   break;
+		case EDJE_MESSAGE_INT:
+		   lua_pushnumber(L, ((Edje_Message_Int *) em->msg)->val);
+		   nargs += 1;
+		   break;
+		case EDJE_MESSAGE_FLOAT:
+		   lua_pushnumber(L, ((Edje_Message_Float *) em->msg)->val);
+		   nargs += 1;
+		   break;
+		case EDJE_MESSAGE_STRING_SET:
+		   count = ((Edje_Message_String_Set *) em->msg)->count;
+		   lua_createtable(L, count, 0);
+		   for (i = 0; i < count; i++)
+		     {
+			lua_pushstring(L, ((Edje_Message_String_Set *) em->msg)->str[i]);
+			lua_rawseti(L, -2, i + 1);
+		     }
+		   nargs += 1;
+		   break;
+		case EDJE_MESSAGE_INT_SET:
+		   count = ((Edje_Message_Int_Set *) em->msg)->count;
+		   lua_createtable(L, count, 0);
+		   for (i = 0; i < count; i++)
+		     {
+			lua_pushnumber(L, ((Edje_Message_Int_Set *) em->msg)->val[i]);
+			lua_rawseti(L, -2, i + 1);
+		     }
+		   nargs += 1;
+		   break;
+		case EDJE_MESSAGE_FLOAT_SET:
+		   count = ((Edje_Message_Float_Set *) em->msg)->count;
+		   lua_createtable(L, count, 0);
+		   for (i = 0; i < count; i++)
+		     {
+			lua_pushnumber(L, ((Edje_Message_Float_Set *) em->msg)->val[i]);
+			lua_rawseti(L, -2, i + 1);
+		     }
+		   nargs += 1;
+		   break;
+		case EDJE_MESSAGE_STRING_INT:
+		   lua_pushstring(L, ((Edje_Message_String_Int *) em->msg)->str);
+		   lua_pushnumber(L, ((Edje_Message_String_Int *) em->msg)->val);
+		   nargs += 2;
+		   break;
+		case EDJE_MESSAGE_STRING_FLOAT:
+		   lua_pushstring(L, ((Edje_Message_String_Float *) em->msg)->str);
+		   lua_pushnumber(L, ((Edje_Message_String_Float *) em->msg)->val);
+		   nargs += 2;
+		   break;
+		case EDJE_MESSAGE_STRING_INT_SET:
+		   lua_pushstring(L, ((Edje_Message_String_Int_Set *) em->msg)->str);
+		   count = ((Edje_Message_String_Int_Set *) em->msg)->count;
+		   lua_createtable(L, count, 0);
+		   for (i = 0; i < count; i++)
+		     {
+			lua_pushnumber(L, ((Edje_Message_String_Int_Set *) em->msg)->val[i]);
+			lua_rawseti(L, -2, i + 1);
+		     }
+		   nargs += 2;
+		   break;
+		case EDJE_MESSAGE_STRING_FLOAT_SET:
+		   lua_pushstring(L, ((Edje_Message_String_Float_Set *) em->msg)->str);
+		   count = ((Edje_Message_String_Float_Set *) em->msg)->count;
+		   lua_createtable(L, count, 0);
+		   for (i = 0; i < count; i++)
+		     {
+			lua_pushnumber(L, ((Edje_Message_String_Float_Set *) em->msg)->val[i]);
+			lua_rawseti(L, -2, i + 1);
+		     }
+		   nargs += 2;
+		   break;
+		default:
+		   break;
+	       }
+
+	     if ((err_code = lua_pcall(L, nargs, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+	else
+	  lua_pop (L, 1);
+     }
+}
+
diff --git a/src/lib/edje_main.c b/src/lib/edje_main.c
index 976b532..5540352 100644
--- a/src/lib/edje_main.c
+++ b/src/lib/edje_main.c
@@ -6,61 +6,202 @@
 
 #include "edje_private.h"
 
-static int initted = 0;
+static int _edje_init_count = 0;
+static int _edje_log_dom_global = -1;
+Eina_Mempool *_edje_real_part_mp = NULL;
+Eina_Mempool *_edje_real_part_state_mp = NULL;
 
-/************************** API Routines **************************/
+#ifdef EDJE_DEFAULT_LOG_COLOR
+# undef EDJE_DEFAULT_LOG_COLOR
+#endif
+#define EDJE_DEFAULT_LOG_COLOR EINA_COLOR_CYAN
+#ifdef ERR
+# undef ERR
+#endif
+#define ERR(...) EINA_LOG_DOM_ERR(_edje_log_dom_global, __VA_ARGS__)
 
-/** Initialize the EDJE library.
+
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Edje_main_Group Main
  *
- * @return The new init count.
+ * @brief These functions provide an abstraction layer between the
+ * application code and the interface, while allowing extremely
+ * flexible dynamic layouts and animations.
+ *
+ * @{
  */
+
+/**
+ * @brief Initialize the edje library.
+ *
+ * @return The new init count. The initial value is zero.
+ *
+ * This function initializes the ejde library, making the propers
+ * calls to initialization functions. It makes calls to functions
+ * eina_init(), ecore_job_init(), embryo_init() and eet_init() so
+ * there is no need to call those functions again in your code. To
+ * shutdown edje there is a function edje_shutdown().
+ *
+ * @see edje_shutdown()
+ * @see eina_init()
+ * @see ecore_job_init()
+ * @see embryo_init()
+ * @see eet_init()
+ *
+ */
+
 EAPI int
 edje_init(void)
 {
-   initted++;
-   if (initted == 1)
+   if (++_edje_init_count != 1)
+     return _edje_init_count;
+
+   srand(time(NULL));
+
+   if (!eina_init())
+     {
+	fprintf(stderr, "Edje: Eina init failed");
+	return --_edje_init_count;
+     }
+
+   _edje_log_dom_global = eina_log_domain_register("Edje", EDJE_DEFAULT_LOG_COLOR);
+   if (_edje_log_dom_global < 0)
      {
-	eina_init();
-        ecore_job_init();
-	srand(time(NULL));
-	_edje_edd_setup();
-	_edje_text_init();
-	_edje_box_init();
-	embryo_init();
-	eet_init();
+	EINA_LOG_ERR("Edje Can not create a general log domain.");
+	goto shutdown_eina;
      }
+
+   if (!ecore_job_init())
+     {
+	ERR("Edje: Ecore_Job init failed");
+	goto unregister_log_domain;
+     }
+
+   if (!embryo_init())
+     {
+	ERR("Edje: Embryo init failed");
+	goto shutdown_ecore_job;
+     }
+
+   if (!eet_init())
+     {
+	ERR("Edje: Eet init failed");
+	goto shutdown_embryo;
+     }
+
+   _edje_edd_init();
+   _edje_text_init();
+   _edje_box_init();
+   _edje_external_init();
+   _edje_module_init();
+   _edje_lua_init();
    _edje_message_init();
-   return initted;
+
+   _edje_real_part_mp = eina_mempool_add("chained_mempool",
+					 "Edje_Real_Part", NULL,
+					 sizeof (Edje_Real_Part), 128);
+   if (!_edje_real_part_mp)
+     {
+	ERR("ERROR: Mempool for Edje_Real_Part cannot be allocated.\n");
+	goto shutdown_eet;
+     }
+
+   _edje_real_part_state_mp = eina_mempool_add("chained_mempool",
+					       "Edje_Real_Part_State", NULL,
+					       sizeof (Edje_Real_Part_State), 256);
+   if (!_edje_real_part_state_mp)
+     {
+	ERR("ERROR: Mempool for Edje_Real_Part_State cannot be allocated.\n");
+	goto shutdown_eet;
+     }
+
+   return _edje_init_count;
+
+ shutdown_eet:
+   eina_mempool_del(_edje_real_part_state_mp);
+   eina_mempool_del(_edje_real_part_mp);
+   _edje_real_part_state_mp = NULL;
+   _edje_real_part_mp = NULL;
+   _edje_message_shutdown();
+   _edje_lua_shutdown();
+   _edje_module_shutdown();
+   _edje_external_shutdown();
+   _edje_box_shutdown();
+   _edje_text_class_members_free();
+   _edje_text_class_hash_free();
+   _edje_edd_shutdown();
+   eet_shutdown();
+ shutdown_embryo:
+   embryo_shutdown();
+ shutdown_ecore_job:
+   ecore_job_shutdown();
+ unregister_log_domain:
+   eina_log_domain_unregister(_edje_log_dom_global);
+   _edje_log_dom_global = -1;
+ shutdown_eina:
+   eina_shutdown();
+   return --_edje_init_count;
 }
 
-/** Shutdown the EDJE library.
+/**
+ * @brief Shutdown the edje library.
+ *
+ * @return The number of times the library has been initialised without being
+ *         shutdown.
+ *
+ * This function shuts down the edje library. It calls the functions
+ * eina_shutdown(), ecore_job_shutdown(), embryo_shutdown() and
+ * eet_shutdown(), so there is no need to call these functions again
+ * in your code.
+ *
+ * @see edje_init()
+ * @see eina_shutdown()
+ * @see ecore_job_shutdown()
+ * @see embryo_shutdown()
+ * @see eet_shutdown()
  *
- * @return The new init count.
  */
+
 EAPI int
 edje_shutdown(void)
 {
-   initted--;
-   if (initted > 0) return initted;
+   if (--_edje_init_count != 0)
+     return _edje_init_count;
 
    if (_edje_timer)
      ecore_animator_del(_edje_timer);
    _edje_timer = NULL;
 
    _edje_file_cache_shutdown();
-   _edje_message_shutdown();
-   _edje_edd_free();
    _edje_color_class_members_free();
    _edje_color_class_hash_free();
+
+   eina_mempool_del(_edje_real_part_state_mp);
+   eina_mempool_del(_edje_real_part_mp);
+   _edje_real_part_state_mp = NULL;
+   _edje_real_part_mp = NULL;
+
+   _edje_message_shutdown();
+   _edje_lua_shutdown();
+   _edje_module_shutdown();
+   _edje_external_shutdown();
+   _edje_box_shutdown();
    _edje_text_class_members_free();
    _edje_text_class_hash_free();
-   _edje_box_shutdown();
+   _edje_edd_shutdown();
+
+   eet_shutdown();
    embryo_shutdown();
    ecore_job_shutdown();
-   eet_shutdown();
+   eina_log_domain_unregister(_edje_log_dom_global);
+   _edje_log_dom_global = -1;
    eina_shutdown();
 
-   return 0;
+   return _edje_init_count;
 }
 
 /* Private Routines */
@@ -174,3 +315,8 @@ _edje_unref(Edje *ed)
    ed->references--;
    if (ed->references == 0) _edje_del(ed);
 }
+
+/**
+ *
+ * @}
+ */
diff --git a/src/lib/edje_message_queue.c b/src/lib/edje_message_queue.c
index 65ed934..12a2833 100644
--- a/src/lib/edje_message_queue.c
+++ b/src/lib/edje_message_queue.c
@@ -12,6 +12,38 @@ static Ecore_Timer *job_loss_timer = NULL;
 static Eina_List *msgq = NULL;
 static Eina_List *tmp_msgq = NULL;
 
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Edje_message_queue_Group Message_Queue
+ *
+ * @brief These functions provide an abstraction layer between the
+ * application code and the interface, while allowing extremely
+ * flexible dynamic layouts and animations.
+ *
+ * @{
+ */
+
+/**
+ * @brief Send message to object.
+ *
+ * @param obj The edje object reference.
+ * @param type The type of message to send.
+ * @param id A identification number for the message.
+ * @param msg The message to be send.
+ *
+ *
+ * This function sends messages to this object and to all of its child
+ * objects, if applicable. The function that handles messages arriving
+ * at this edje object is is set with
+ * edje_object_message_handler_set().
+ *
+ * @see edje_object_message_handler_set()
+ *
+ */
+
 EAPI void
 edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void *msg)
 {
@@ -30,6 +62,19 @@ edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void
      }
 }
 
+/**
+ * @brief Set the message handler function for this an object.
+ *
+ * @param obj The edje object reference.
+ * @param func The function to handle messages.
+ * @param data The data to be associated to the message handler.
+ *
+ *
+ * This function associates a message handler function and data to the
+ * edje object.
+ *
+ */
+
 EAPI void
 edje_object_message_handler_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg), void *data)
 {
@@ -40,6 +85,17 @@ edje_object_message_handler_set(Evas_Object *obj, void (*func) (void *data, Evas
    _edje_message_cb_set(ed, func, data);
 }
 
+/**
+ * @brief Process an object's message queue.
+ *
+ * @param obj The edje object reference.
+ *
+ * This function goes through the object message queue processing the
+ * pending messages for *this* specific edje object. Normally they'd
+ * be processed only at idle time.
+ *
+ */
+
 EAPI void
 edje_object_message_signal_process(Evas_Object *obj)
 {
@@ -84,20 +140,29 @@ edje_object_message_signal_process(Evas_Object *obj)
      }
 }
 
+/**
+ * @brief Process all queued up edje messages.
+ *
+ * This function triggers the processing of messages addressed to any
+ * (alive) edje objects.
+ *
+ */
+
 EAPI void
 edje_message_signal_process(void)
 {
    _edje_message_queue_process();
 }
 
+
 static int
-_edje_dummy_timer(void *data)
+_edje_dummy_timer(void *data __UNUSED__)
 {
    return 0;
 }
 
 static void
-_edje_job(void *data)
+_edje_job(void *data __UNUSED__)
 {
    if (job_loss_timer)
      {
@@ -109,7 +174,7 @@ _edje_job(void *data)
 }
 
 static int
-_edje_job_loss_timer(void *data)
+_edje_job_loss_timer(void *data __UNUSED__)
 {
    job_loss_timer = NULL;
    if (job) job = NULL;
@@ -558,12 +623,17 @@ _edje_message_process(Edje_Message *em)
 	return;
      }
    /* now this message is destined for the script message handler fn */
-   if (!((em->edje->collection) && (em->edje->collection->script))) return;
-   if (_edje_script_only(em->edje))
+   if (!(em->edje->collection)) return;
+   if ((em->edje->collection->script) && _edje_script_only (em->edje))
      {
 	_edje_script_only_message(em->edje, em);
 	return;
      }
+   if (em->edje->collection->L)
+     {
+	_edje_lua_script_only_message(em->edje, em);
+	return;
+     }
    fn = embryo_program_function_find(em->edje->collection->script, "message");
    if (fn == EMBRYO_FUNCTION_NONE) return;
    /* reset the engine */
@@ -704,3 +774,8 @@ _edje_message_del(Edje *ed)
 	if (ed->message.num <= 0) return;
      }
 }
+
+/**
+ *
+ * @}
+ */
diff --git a/src/lib/edje_module.c b/src/lib/edje_module.c
new file mode 100644
index 0000000..8fa66a5
--- /dev/null
+++ b/src/lib/edje_module.c
@@ -0,0 +1,154 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <Eina.h>
+#include <Ecore_File.h>
+#include "Edje.h"
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+# define MODULE_EXTENSION ".dll"
+#else
+# define MODULE_EXTENSION ".so"
+#endif /* !defined(_WIN32) && !defined(__CYGWIN__) */
+
+#define LOG_COLOR "\033[36m"
+
+Eina_Hash *_registered_modules = NULL;
+Eina_Array *_available_modules = NULL;
+Eina_List *_modules_name = NULL;
+static int _edje_modules_log_dom = -1;
+
+const char *
+_edje_module_name_get(Eina_Module *m)
+{
+   const char *name;
+   ssize_t len;
+
+   name = ecore_file_file_get(eina_module_file_get(m));
+   len = strlen(name);
+   len -= sizeof(MODULE_EXTENSION) - 1;
+   if (len <= 0) return NULL;
+   return eina_stringshare_add_length(name, len);
+}
+
+EAPI Eina_Bool
+edje_module_load(const char *module)
+{
+   Eina_Module *m;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(module, EINA_FALSE);
+
+   if (eina_hash_find(_registered_modules, module))
+     return EINA_TRUE;
+
+   m = eina_module_find(_available_modules, module);
+
+   if (!m)
+     {
+       EINA_LOG_ERR("Could not find the module %s", module);
+       return EINA_FALSE;
+     }
+
+   if (!eina_module_load(m))
+     {
+       EINA_LOG_ERR("Could not load the module %s", module);
+       return EINA_TRUE;
+     }
+
+   return !!eina_hash_add(_registered_modules, module, m);
+}
+
+void
+_edje_module_init(void)
+{
+   unsigned int i;
+   Eina_Array_Iterator it;
+   Eina_Module *m;
+
+   _edje_modules_log_dom = eina_log_domain_register("edje_module", LOG_COLOR);
+
+   if (_edje_modules_log_dom < 0)
+     {
+       EINA_LOG_ERR("Could not register log domain: edje_module");
+       return;
+     }
+
+   _registered_modules = eina_hash_string_small_new(NULL);
+   _available_modules = eina_module_list_get(_available_modules,
+           PACKAGE_LIB_DIR "/edje", 0, NULL, NULL);
+
+   if (!_available_modules)
+     {
+       eina_hash_free(_registered_modules);
+       return;
+     }
+
+   EINA_ARRAY_ITER_NEXT(_available_modules, i, m, it)
+     {
+       const char *name;
+
+       name = _edje_module_name_get(m);
+       _modules_name = eina_list_append(_modules_name, name);
+     }
+
+}
+
+void
+_edje_module_shutdown(void)
+{
+   Eina_List *l;
+   const char *data;
+
+   eina_module_list_flush(_available_modules);
+   if (_available_modules)
+     {
+       eina_array_free(_available_modules);
+       _available_modules = NULL;
+     }
+
+   if (_registered_modules)
+     {
+       eina_hash_free(_registered_modules);
+       _registered_modules = NULL;
+     }
+
+   if (_modules_name)
+     {
+       EINA_LIST_FOREACH(_modules_name, l, data)
+         {
+           eina_stringshare_del(data);
+         }
+       _modules_name = NULL;
+     }
+
+   eina_log_domain_unregister(_edje_modules_log_dom);
+   _edje_modules_log_dom = -1;
+}
+
+EAPI const Eina_List *
+edje_available_modules_get(void)
+{
+   return _modules_name;
+}
diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h
index 59d8372..5fd2566 100644
--- a/src/lib/edje_private.h
+++ b/src/lib/edje_private.h
@@ -23,6 +23,9 @@
 #include "Edje.h"
 #include "Edje_Edit.h"
 
+#include <lua.h>
+#include <lauxlib.h>
+
 #ifdef __GNUC__
 # if __GNUC__ >= 4
 // BROKEN in gcc 4 on amd64
@@ -115,6 +118,8 @@ typedef struct _Edje_File                            Edje_File;
 typedef struct _Edje_Style                           Edje_Style;
 typedef struct _Edje_Style_Tag                       Edje_Style_Tag;
 typedef struct _Edje_Data                            Edje_Data;
+typedef struct _Edje_External_Directory              Edje_External_Directory;
+typedef struct _Edje_External_Directory_Entry        Edje_External_Directory_Entry;
 typedef struct _Edje_Font_Directory                  Edje_Font_Directory;
 typedef struct _Edje_Font_Directory_Entry            Edje_Font_Directory_Entry;
 typedef struct _Edje_Image_Directory                 Edje_Image_Directory;
@@ -145,49 +150,6 @@ typedef struct _Edje_Patterns                        Edje_Patterns;
 #define EDJE_IMAGE_SOURCE_TYPE_EXTERNAL       3
 #define EDJE_IMAGE_SOURCE_TYPE_LAST           4
 
-#define EDJE_PART_TYPE_NONE      0
-#define EDJE_PART_TYPE_RECTANGLE 1
-#define EDJE_PART_TYPE_TEXT      2
-#define EDJE_PART_TYPE_IMAGE     3
-#define EDJE_PART_TYPE_SWALLOW   4
-#define EDJE_PART_TYPE_TEXTBLOCK 5
-#define EDJE_PART_TYPE_GRADIENT  6
-#define EDJE_PART_TYPE_GROUP     7
-#define EDJE_PART_TYPE_BOX       8
-#define EDJE_PART_TYPE_TABLE     9
-#define EDJE_PART_TYPE_LAST     10
-
-#define EDJE_TEXT_EFFECT_NONE                0
-#define EDJE_TEXT_EFFECT_PLAIN               1
-#define EDJE_TEXT_EFFECT_OUTLINE             2
-#define EDJE_TEXT_EFFECT_SOFT_OUTLINE        3
-#define EDJE_TEXT_EFFECT_SHADOW              4
-#define EDJE_TEXT_EFFECT_SOFT_SHADOW         5
-#define EDJE_TEXT_EFFECT_OUTLINE_SHADOW      6
-#define EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW 7
-#define EDJE_TEXT_EFFECT_FAR_SHADOW          8
-#define EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW     9
-#define EDJE_TEXT_EFFECT_GLOW               10
-#define EDJE_TEXT_EFFECT_LAST               11
-
-#define EDJE_ACTION_TYPE_NONE          0
-#define EDJE_ACTION_TYPE_STATE_SET     1
-#define EDJE_ACTION_TYPE_ACTION_STOP   2
-#define EDJE_ACTION_TYPE_SIGNAL_EMIT   3
-#define EDJE_ACTION_TYPE_DRAG_VAL_SET  4
-#define EDJE_ACTION_TYPE_DRAG_VAL_STEP 5
-#define EDJE_ACTION_TYPE_DRAG_VAL_PAGE 6
-#define EDJE_ACTION_TYPE_SCRIPT        7
-#define EDJE_ACTION_TYPE_FOCUS_SET     8
-#define EDJE_ACTION_TYPE_LAST          9
-
-#define EDJE_TWEEN_MODE_NONE       0
-#define EDJE_TWEEN_MODE_LINEAR     1
-#define EDJE_TWEEN_MODE_SINUSOIDAL 2
-#define EDJE_TWEEN_MODE_ACCELERATE 3
-#define EDJE_TWEEN_MODE_DECELERATE 4
-#define EDJE_TWEEN_MODE_LAST       5
-
 #define EDJE_VAR_NONE   0
 #define EDJE_VAR_INT    1
 #define EDJE_VAR_FLOAT  2
@@ -247,6 +209,7 @@ struct _Edje_File
 {
    const char                     *path;
 
+   Edje_External_Directory        *external_dir;
    Edje_Font_Directory            *font_dir;
    Edje_Image_Directory           *image_dir;
    Edje_Spectrum_Directory        *spectrum_dir;
@@ -307,6 +270,22 @@ struct _Edje_Font_Directory_Entry
    const char *path;
 };
 
+/*----------*/
+
+struct _Edje_External_Directory
+{
+   Eina_List *entries; /* a list of Edje_External_Directory_Entry */
+};
+
+struct _Edje_External_Directory_Entry
+{
+   const char *entry; /* the name of the external */
+};
+
+
+/*----------*/
+
+
 
 /*----------*/
 
@@ -447,10 +426,12 @@ struct _Edje_Part_Collection
 #endif
 
    Embryo_Program   *script; /* all the embryo script code for this group */
-
    const char       *part;
    
    unsigned char    script_only;
+
+   unsigned char	lua_script_only;
+   lua_State		*L;
 };
 
 struct _Edje_Part
@@ -603,8 +584,21 @@ struct _Edje_Part_Description
          int x, y;
       } padding;
    } table;
-
+   
+#if 0
+   // // // // //
+   struct {
+      struct {
+         double ax, ay, az;
+      } rot;
+      // FIXME: center point is another part id
+      // FIXME: perspective should other part or global value/obj
+   } map;
+   // // // // //
+#endif
+   
    Edje_Color color, color2, color3;  /* color for rect or text, shadow etc. */
+   Eina_List *external_params; /* parameters for external objects */
 
    unsigned char     visible; /* is it shown */
 };
@@ -614,6 +608,8 @@ struct _Edje_Part_Description
 
 
 typedef struct _Edje Edje;
+typedef struct _Edje_Real_Part_State Edje_Real_Part_State;
+typedef struct _Edje_Real_Part_Drag Edje_Real_Part_Drag;
 typedef struct _Edje_Real_Part Edje_Real_Part;
 typedef struct _Edje_Running_Program Edje_Running_Program;
 typedef struct _Edje_Signal_Callback Edje_Signal_Callback;
@@ -707,6 +703,8 @@ struct _Edje
    } message;
    int                      processing_messages;
 
+   int                   state;
+
    unsigned short        dirty : 1;
    unsigned short        recalc : 1;
    unsigned short        walking_callbacks : 1;
@@ -720,42 +718,105 @@ struct _Edje
    unsigned short        block_break : 1;
    unsigned short        delete_me : 1;
    unsigned short        postponed : 1;
+#ifdef EDJE_CALC_CACHE
+   unsigned short        text_part_change : 1;
+   unsigned short        all_part_change : 1;
+#endif
+   lua_State *L;
 };
 
+struct _Edje_Calc_Params
+{
+   int              x, y, w, h; // 16
+   Edje_Rectangle   req; // 16
+   Edje_Rectangle   req_drag; // 16
+   Edje_Color       color; // 4
+   union {
+      struct {
+	 struct {
+	    int           x, y, w, h; // 16
+	    int           angle; // 4
+	    int           spread; // 4
+	 } fill; // 24
+
+	 union {
+	    struct {
+	       int           l, r, t, b; // 16
+	    } image; // 16
+	    struct {
+	       int           id; // 4
+	       char         *type; // 4
+	    } gradient; // 8
+	 } spec; // 16
+      } common; // 40
+      struct {
+	 Edje_Alignment align; /* text alignment within bounds */ // 16
+	 double         elipsis; // 8
+	 int            size; // 4
+	 Edje_Color     color2, color3; // 8
+      } text; // 36
+   } type; // 40
+   unsigned char    visible : 1;
+   unsigned char    smooth : 1; // 4
+}; // 96
+
+struct _Edje_Real_Part_State
+{
+   Edje_Part_Description *description; // 4
+   Edje_Real_Part        *rel1_to_x; // 4
+   Edje_Real_Part        *rel1_to_y; // 4
+   Edje_Real_Part        *rel2_to_x; // 4
+   Edje_Real_Part        *rel2_to_y; // 4
+#ifdef EDJE_CALC_CACHE
+   int                    state; // 4
+   Edje_Calc_Params       p; // 96
+#endif
+   void                  *external_params; // 4
+}; // 24
+// WITH EDJE_CALC_CACHE 124
+
+struct _Edje_Real_Part_Drag
+{
+   double		 x, y; // 16
+   Edje_Position_Scale	 val, size, step, page; // 64
+   struct {
+      unsigned int	 count; // 4
+      int		 x, y; // 8
+   } down;
+   struct {
+      int		 x, y; // 8
+   } tmp;
+   unsigned char	 need_reset : 1; // 4
+   Edje_Real_Part       *confine_to; // 4
+}; // 104
+
 struct _Edje_Real_Part
 {
    Edje                     *edje; // 4
    Edje_Part                *part; // 4
    Evas_Object              *object; // 4
-   Eina_List                *extra_objects; // 4
-   Evas_Object              *swallowed_object; // 4 // FIXME: move with swallow_params data
+   int                       x, y, w, h; // 16
+   Edje_Rectangle            req; // 16
+
    Eina_List                *items; // 4 //FIXME: only if table/box
    void                     *entry_data; // 4 // FIXME: move to entry section
    Evas_Object              *cursorbg_object; // 4 // FIXME: move to entry section
    Evas_Object              *cursorfg_object; // 4 // FIXME: move to entry section
-   int                       x, y, w, h; // 16
-   Edje_Rectangle            req; // 16
-   Edje_Position             offset; // 8 // FIXME: move to text section
+
+   Evas_Object              *swallowed_object; // 4 // FIXME: move with swallow_params data
    struct {
       Edje_Size min, max; // 16
       Edje_Aspect aspect; // 12
    } swallow_params; // 28 // FIXME: only if type SWALLOW
-   struct {
-      double        x, y; // 16
-      Edje_Position_Scale val, size, step, page; // 64
-      struct {
-	 unsigned int count; // 4
-	 int  x, y; // 8
-      } down;
-      struct {
-	 int  x, y; // 8
-      } tmp;
-      unsigned char need_reset : 1; // 4
-   } drag; // 104 // FIME: make drag pointer to struct optional
+
+   Edje_Real_Part_Drag      *drag; // 4
+   Edje_Real_Part	    *events_to; // 4
+
    struct {
       Edje_Real_Part        *source; // 4
       Edje_Real_Part        *text_source; // 4
       const char            *text; // 4
+      Edje_Position          offset; // 8 text only
       const char	    *font; // 4 text only
       const char	    *style; // 4 text only
       int                    size; // 4 text only
@@ -775,28 +836,30 @@ struct _Edje_Real_Part
 
    double                    description_pos; // 8
    Edje_Part_Description    *chosen_description; // 4
-   struct {
-      Edje_Part_Description *description; // 4
-      Edje_Real_Part        *rel1_to_x; // 4
-      Edje_Real_Part        *rel1_to_y; // 4
-      Edje_Real_Part        *rel2_to_x; // 4
-      Edje_Real_Part        *rel2_to_y; // 4
-   } param1, param2, custom; // 60 // FIXME: custom should be alloced on demand - 20--
-
-   Edje_Real_Part           *confine_to; // 4 // fixme - make part of drag
+   Edje_Real_Part_State      param1; // 20
+   // WITH EDJE_CALC_CACHE: 140
+   Edje_Real_Part_State     *param2, *custom; // 8
+
+#ifdef EDJE_CALC_CACHE
+   int                       state; // 4
+#endif
+
    Edje_Real_Part           *clip_to; // 4
 
    Edje_Running_Program     *program; // 4
-   Edje_Real_Part           *events_to; // 4
 
    int                       clicked_button; // 4
-   int                       gradient_id; // 4
+   int                       gradient_id; // 4 // FIXME: only for gradient
 
    unsigned char             calculated; // 1
    unsigned char             calculating; // 1
 
    unsigned char             still_in   : 1; // 2
-}; //  394
+#ifdef EDJE_CALC_CACHE
+   unsigned char             invalidate : 1;
+#endif
+}; //  260
+// WITH EDJE_CALC_CACHE: 400
 
 struct _Edje_Running_Program
 {
@@ -816,33 +879,6 @@ struct _Edje_Signal_Callback
    unsigned char delete_me : 1;
 };
 
-struct _Edje_Calc_Params
-{
-   int              x, y, w, h;
-   Edje_Rectangle   req;
-   Edje_Rectangle   req_drag;
-   struct {
-      int           x, y, w, h;
-      int           angle;
-      int           spread;
-   } fill;
-   Edje_Color color, color2, color3;
-   struct {
-      int           l, r, t, b;
-   } border;
-   struct {
-      Edje_Alignment align; /* text alignment within bounds */
-      double         elipsis;
-      int            size;
-   } text;
-   struct {
-     int             id;
-     char           *type;
-   } gradient;
-   unsigned char    visible : 1;
-   unsigned char    smooth : 1;
-};
-
 struct _Edje_Pending_Program
 {
    Edje         *edje;
@@ -1061,6 +1097,9 @@ extern double           _edje_scale;
 extern int              _edje_freeze_val;
 extern int              _edje_freeze_calc_count;
 
+extern Eina_Mempool *_edje_real_part_mp;
+extern Eina_Mempool *_edje_real_part_state_mp;
+
 void  _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos);
 Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val);
 void  _edje_part_description_apply(Edje *ed, Edje_Real_Part *ep, const char  *d1, double v1, const char *d2, double v2);
@@ -1080,8 +1119,8 @@ int   _edje_pending_timer_cb(void *data);
 void  _edje_callbacks_add(Evas_Object *obj, Edje *ed, Edje_Real_Part *rp);
 void  _edje_callbacks_del(Evas_Object *obj);
 
-void  _edje_edd_setup(void);
-void  _edje_edd_free(void);
+void  _edje_edd_init(void);
+void  _edje_edd_shutdown(void);
 
 void  _edje_file_add(Edje *ed);
 void  _edje_file_del(Edje *ed);
@@ -1109,9 +1148,7 @@ void  _edje_callbacks_patterns_clean(Edje *ed);
 
 void           _edje_text_init(void);
 void           _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep);
-void           _edje_text_part_on_add_clippers(Edje *ed, Edje_Real_Part *ep);
 void           _edje_text_part_on_del(Edje *ed, Edje_Part *ep);
-void           _edje_text_real_part_on_del(Edje *ed, Edje_Real_Part *ep);
 void           _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
 Evas_Font_Size _edje_text_size_calc(Evas_Font_Size size, Edje_Text_Class *tc);
 const char *   _edje_text_class_font_get(Edje *ed, Edje_Part_Description *chosen_desc, int *size, char **free_later);
@@ -1140,7 +1177,9 @@ int               _edje_unblock(Edje *ed);
 int               _edje_block_break(Edje *ed);
 void              _edje_block_violate(Edje *ed);
 void              _edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+void              _edje_object_part_swallow_changed_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
 void              _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow);
+void              _edje_real_part_swallow_clear(Edje_Real_Part *rp);
 void              _edje_box_init(void);
 void              _edje_box_shutdown(void);
 Eina_Bool         _edje_box_layout_find(const char *name, Evas_Object_Box_Layout *cb, void **data, void (**free_data)(void *data));
@@ -1293,6 +1332,27 @@ void _edje_script_only_move(Edje *ed);
 void _edje_script_only_resize(Edje *ed);
 void _edje_script_only_message(Edje *ed, Edje_Message *em);
 
+lua_State *_edje_lua_state_get();
+lua_State *_edje_lua_new_thread(lua_State *L);
+void _edje_lua_free_thread(lua_State *L);
+void _edje_lua_new_reg(lua_State *L, int index, void *ptr);
+void _edje_lua_get_reg(lua_State *L, void *ptr);
+void _edje_lua_free_reg(lua_State *L, void *ptr);
+void _edje_lua_script_fn_new(Edje *ed);
+void _edje_lua_group_fn_new(Edje *ed);
+void _edje_lua_init();
+void _edje_lua_shutdown();
+void _edje_lua_error(lua_State *L, int err_code);
+
+int  _edje_lua_script_only(Edje *ed);
+void _edje_lua_script_only_init(Edje *ed);
+void _edje_lua_script_only_shutdown(Edje *ed);
+void _edje_lua_script_only_show(Edje *ed);
+void _edje_lua_script_only_hide(Edje *ed);
+void _edje_lua_script_only_move(Edje *ed);
+void _edje_lua_script_only_resize(Edje *ed);
+void _edje_lua_script_only_message(Edje *ed, Edje_Message *em);
+
 void _edje_entry_init(Edje *ed);
 void _edje_entry_shutdown(Edje *ed);
 void _edje_entry_real_part_init(Edje_Real_Part *rp);
@@ -1312,4 +1372,28 @@ void _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Co
 void _edje_entry_select_allow_set(Edje_Real_Part *rp, Eina_Bool allow);
 void _edje_entry_select_abort(Edje_Real_Part *rp);
 
+Eina_Bool _edje_entry_cursor_next(Edje_Real_Part *rp, Edje_Cursor cur);
+Eina_Bool _edje_entry_cursor_prev(Edje_Real_Part *rp, Edje_Cursor cur);
+Eina_Bool _edje_entry_cursor_up(Edje_Real_Part *rp, Edje_Cursor cur);
+Eina_Bool _edje_entry_cursor_down(Edje_Real_Part *rp, Edje_Cursor cur);
+void _edje_entry_cursor_begin(Edje_Real_Part *rp, Edje_Cursor cur);
+void _edje_entry_cursor_end(Edje_Real_Part *rp, Edje_Cursor cur);
+void _edje_entry_cursor_line_begin(Edje_Real_Part *rp, Edje_Cursor cur);
+void _edje_entry_cursor_line_end(Edje_Real_Part *rp, Edje_Cursor cur);
+Eina_Bool _edje_entry_cursor_is_format_get(Edje_Real_Part *rp, Edje_Cursor cur);
+Eina_Bool _edje_entry_cursor_is_visible_format_get(Edje_Real_Part *rp, Edje_Cursor cur);
+const char *_edje_entry_cursor_content_get(Edje_Real_Part *rp, Edje_Cursor cur);
+    
+void _edje_external_init();
+void _edje_external_shutdown();
+Evas_Object *_edje_external_type_add(const char *type_name, Evas *evas, Evas_Object *parent, const Eina_List *params);
+void _edje_external_signal_emit(Evas_Object *obj, const char *emission, const char *source);
+void _edje_external_params_free(Eina_List *params, unsigned int free_strings);
+void _edje_external_recalc_apply(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, Edje_Part_Description *chosen_desc);
+void *_edje_external_params_parse(Evas_Object *obj, const Eina_List *params);
+void _edje_external_parsed_params_free(Evas_Object *obj, void *params);
+
+void _edje_module_init();
+void _edje_module_shutdown();
+
 #endif
diff --git a/src/lib/edje_program.c b/src/lib/edje_program.c
index a04c4b0..ab51431 100644
--- a/src/lib/edje_program.c
+++ b/src/lib/edje_program.c
@@ -2,7 +2,31 @@
  * vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
  */
 
-#define _GNU_SOURCE
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef _WIN32
+# define _GNU_SOURCE
+#endif
+
+#ifdef HAVE_ALLOCA_H
+# include <alloca.h>
+#elif defined __GNUC__
+# define alloca __builtin_alloca
+#elif defined _AIX
+# define alloca __alloca
+#elif defined _MSC_VER
+# include <malloc.h>
+# define alloca _alloca
+#else
+# include <stddef.h>
+# ifdef  __cplusplus
+extern "C"
+# endif
+void *alloca (size_t);
+#endif
+
 #include <string.h>
 
 #include "edje_private.h"
@@ -13,13 +37,33 @@ int             _edje_anim_count = 0;
 Ecore_Animator *_edje_timer = NULL;
 Eina_List      *_edje_animators = NULL;
 
-/************************** API Routines **************************/
 
-/* FIXDOC: Expand */
-/** Set the frametime
- * @param t The frametime
+/*============================================================================*
+ *                                   API                                      *
+ *============================================================================*/
+
+/**
+ * @addtogroup Edje_program_Group Program
+ *
+ * @brief These functions provide an abstraction layer between the
+ * application code and the interface, while allowing extremely
+ * flexible dynamic layouts and animations.
+ *
+ * @{
+ */
+
+/**
+ * @brief Set edje trasitions' frame time.
+ *
+ * @param t The frame time, in seconds. Default value is 1/30.
+ *
+ * This function sets the edje built-in animations' frame time (thus,
+ * affecting their resolution) by calling
+ * ecore_animator_frametime_set(). This frame time can be retrieved
+ * with edje_frametime_get().
+ *
+ * @see edje_frametime_get()
  *
- * Sets the global frametime in seconds, by default this is 1/30.
  */
 EAPI void
 edje_frametime_set(double t)
@@ -27,11 +71,16 @@ edje_frametime_set(double t)
    ecore_animator_frametime_set(t);
 }
 
-/* FIXDOC: Expand */
-/** Get the frametime
- * @return The frametime
+/**
+ * @brief Get edje trasitions' frame time.
+ *
+ * @return The frame time, in seconds.
+ *
+ * This function returns the edje frame time set by
+ * edje_frametime_set().
+ *
+ * @see edje_frametime_set()
  *
- * Returns the frametime in seconds, by default this is 1/30.
  */
 EAPI double
 edje_frametime_get(void)
@@ -39,13 +88,15 @@ edje_frametime_get(void)
    return ecore_animator_frametime_get();
 }
 
-/* FIXDOC: Expand */
-/** Add a callback for a signal emitted by @a obj.
- * @param obj A valid Evas_Object handle
- * @param emission The signal name
- * @param source The signal source
- * @param func The callback function to be executed when the signal is emitted
- * @param data A pointer to data to pass in to the callback function
+/**
+ * @brief Add a callback for a signal emitted by @a obj.
+ *
+ * @param obj A valid Evas_Object handle.
+ * @param emission The signal's name.
+ * @param source The signal's source.
+ * @param func The callback function to be executed when the signal is
+ * emitted.
+ * @param data A pointer to data to pass in to the callback function.
  *
  * Connects a callback function to a signal emitted by @a obj.
  * In EDC, a program can emit a signal as follows:
@@ -69,21 +120,21 @@ edje_frametime_get(void)
  * edje_object_callback_add(obj, "a_signal", "a_source", cb_signal, data);
  * @endcode
  *
- * Here, @a data is an arbitrary pointer to be used as desired.
- * Note that @a emission and @a source correspond respectively to first and
- * second parameters to the SIGNAL_EMIT action.
+ * Here, @a data is an arbitrary pointer to be used as desired.  Note
+ * that @a emission and @a source correspond respectively to the first
+ * and the second parameters at the SIGNAL_EMIT action.
  *
- * Internal edje signals can also be attached to, and globs can be in either
- * the emission or source name. e.g.
+ * Internal edje signals can also be attached to, and globs can occur
+ * in either the emission or source name, e.g.
  *
  * @code
  * edje_object_callback_add(obj, "mouse,down,*", "button.*", NULL);
  * @endcode
  *
  * Here, any mouse down events on an edje part whose name begins with
- * "button." will trigger the callback. The actual signal and source name
- * will be passed in to the @a emission and @a source parameters of the
- * callback function. (e.g. "mouse,down,2" and "button.close").
+ * "button." will trigger the callback. The actual signal and source
+ * names will be passed in to the @a emission and @a source parameters
+ * of the callback function (e.g. "mouse,down,2" and "button.close").
  */
 EAPI void
 edje_object_signal_callback_add(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source), void *data)
@@ -112,17 +163,23 @@ edje_object_signal_callback_add(Evas_Object *obj, const char *emission, const ch
      _edje_callbacks_patterns_clean(ed);
 }
 
-/** Remove a callback from an object
- * @param obj A valid Evas_Object handle
- * @param emission the emission string
- * @param source the source string
- * @param func the callback function
- * @return the data pointer
+/**
+ * @brief Remove a signal-triggered callback from an object.
+ *
+ * @param obj A valid Evas_Object handle.
+ * @param emission The emission string.
+ * @param source The source string.
+ * @param func The callback function.
+ * @return The data pointer
+ *
+ * This function removes a callback, previously attached to the
+ * emittion of a signal, from the object @a obj. The parameters @a
+ * emission, @a source and @a func must match exactly those passed to
+ * a previous call to edje_object_signal_callback_add(). The data
+ * pointer that was passed to this call will be returned.
+ *
+ * @see edje_object_signal_callback_add().
  *
- * Removes a callback from an object. The parameters @a emission, @a source
- * and @a func must match exactly those passed to a previous call to
- * edje_object_signal_callback_add(). The data pointer that was passed to
- * this call will be returned.
  */
 EAPI void *
 edje_object_signal_callback_del(Evas_Object *obj, const char *emission, const char *source, void (*func) (void *data, Evas_Object *o, const char *emission, const char *source))
@@ -166,24 +223,22 @@ edje_object_signal_callback_del(Evas_Object *obj, const char *emission, const ch
    return NULL;
 }
 
-/* FIXDOC: Verify/Expand */
-/** Send a signal to the Edje object
- * @param obj A vaild Evas_Object handle
- * @param emission The signal
- * @param source The signal source
- *
- * This sends a signal to the edje object.
+/**
+ * @brief Send a signal to an edje object.
  *
- * An edje program can respond to a signal by specifying matching 'signal'
- * and 'source' fields.
+ * @param obj A valid Evas_Object handle.
+ * @param emission The signal's name.
+ * @param source The signal's source.
  *
- * E.g.
+ * This function sends a signal to the object @a obj. An edje program
+ * can respond to a signal by specifying matching 'signal' and
+ * 'source' fields.
  *
  * @code
  * edje_object_signal_emit(obj, "a_signal", "");
  * @endcode
  *
- * will trigger a program whose edc is:
+ * will trigger a program whose EDC block is:
  *
  * @code
  * program {
@@ -194,7 +249,7 @@ edje_object_signal_callback_del(Evas_Object *obj, const char *emission, const ch
  * }
  * @endcode
  *
- * FIXME should this signal be sent to children also?
+ * FIXME: should this signal be sent to children also?
  */
 EAPI void
 edje_object_signal_emit(Evas_Object *obj, const char *emission, const char *source)
@@ -209,12 +264,18 @@ edje_object_signal_emit(Evas_Object *obj, const char *emission, const char *sour
 }
 
 /* FIXDOC: Verify/Expand */
-/** Set the Edje to play or pause
- * @param obj A valid Evas_Object handle
- * @param play Play instruction (1 to play, 0 to pause)
+/**
+ * @brief Set the edje object to playing or paused states.
+ *
+ * @param obj A valid Evas_Object handle.
+ * @param play Object state (1 to playing, 0 to pauseed).
+ *
+ * This function sets the edje object @a obj to playing or paused
+ * states, depending on the parameter @a play.  This has no effect if
+ * the object was already at that state.
+ *
+ * @see edje_object_play_get().
  *
- * This sets the Edje to play or pause depending on the parameter.
- * This has no effect if the Edje is already in that state.
  */
 EAPI void
 edje_object_play_set(Evas_Object *obj, int play)
@@ -252,11 +313,19 @@ edje_object_play_set(Evas_Object *obj, int play)
      }
 }
 
-/* FIXDOC: Verify/Expand */
-/** Get the Edje play/pause state
- * @param obj A valid Evas_Object handle
- * @return 0 if Edje not connected, Edje delete_me, or Edje paused\n
- * 1 if Edje set to play
+/**
+ * @brief Get the edje object's play/pause state.
+ *
+ * @param obj A valid Evas_Object handle.
+ * @return @c 0 if the object is not connected, its @c delete_me flag
+ * is set, or it is at paused state; @c 1 if the object is at playing
+ * state.
+ *
+ * This function tells if an edje object is playing or not. This state
+ * is set by edje_object_play_set().
+ *
+ * @see edje_object_play_set().
+ *
  */
 EAPI int
 edje_object_play_get(const Evas_Object *obj)
@@ -271,11 +340,18 @@ edje_object_play_get(const Evas_Object *obj)
 }
 
 /* FIXDOC: Verify/Expand */
-/** Set Animation state
- * @param obj A valid Evas_Object handle
- * @param on Animation State
+/**
+ * @brief Set the object's animation state.
+ *
+ * @param obj A valid Evas_Object handle.
+ * @param on Animation State.
+ *
+ * This function starts or stops an edje object's animation. The
+ * information if it's runnig can be retrieved by
+ * edje_object_animation_get().
+ *
+ * @see edje_object_animation_get()
  *
- * Stop or start an Edje animation.
  */
 EAPI void
 edje_object_animation_set(Evas_Object *obj, int on)
@@ -334,12 +410,19 @@ edje_object_animation_set(Evas_Object *obj, int on)
    _edje_unblock(ed);
 }
 
-/* FIXDOC: Verify/Expand */
-/** Get the animation state
- * @param obj A valid Evas_Object handle
- * @return 0 on Error or if not animated\n
- * 1 if animated
+/**
+ * @brief Get the edje object's animation state.
+ *
+ * @param obj A valid Evas_Object handle.
+ * @return @c 0 on error or if object is not animated; @c 1 if animated.
+ *
+ * This function returns if the animation is playing or not. The
+ * animation state is set by edje_object_play_set().
+ *
+ * @see edje_object_animation_set().
+ *
  */
+
 EAPI int
 edje_object_animation_get(const Evas_Object *obj)
 {
@@ -647,8 +730,8 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
 //		       goto done;
 		    }
 	       }
-	     done:
-	        continue;
+//	     done:
+//	        continue;
 	  }
 //	_edje_emit(ed, "program,stop", pr->name);
 	if (_edje_block_break(ed)) goto break_prog;
@@ -671,15 +754,15 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
 	     if (pt->id >= 0)
 	       {
 		  rp = ed->table_parts[pt->id % ed->table_parts_size];
-		  if ((rp) && (rp->drag.down.count == 0))
+		  if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
 		    {
-		       rp->drag.val.x = pr->value;
-		       rp->drag.val.y = pr->value2;
-		       if      (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
-		       else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
-		       if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
-		       else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
-		       _edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
+		       rp->drag->val.x = pr->value;
+		       rp->drag->val.y = pr->value2;
+		       if      (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
+		       else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
+		       if      (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
+		       else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
+		       _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
 		       _edje_emit(ed, "drag,set", rp->part->name);
 		       if (_edje_block_break(ed)) goto break_prog;
 		    }
@@ -697,15 +780,15 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
 	     if (pt->id >= 0)
 	       {
 		  rp = ed->table_parts[pt->id % ed->table_parts_size];
-		  if ((rp) && (rp->drag.down.count == 0))
+		  if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
 		    {
-		       rp->drag.val.x += pr->value * rp->drag.step.x * rp->part->dragable.x;
-		       rp->drag.val.y += pr->value2 * rp->drag.step.y * rp->part->dragable.y;
-		       if      (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
-		       else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
-		       if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
-		       else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
-		       _edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
+		       rp->drag->val.x += pr->value * rp->drag->step.x * rp->part->dragable.x;
+		       rp->drag->val.y += pr->value2 * rp->drag->step.y * rp->part->dragable.y;
+		       if      (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
+		       else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
+		       if      (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
+		       else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
+		       _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
 		       _edje_emit(ed, "drag,step", rp->part->name);
 		       if (_edje_block_break(ed)) goto break_prog;
 		    }
@@ -723,15 +806,15 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
 	     if (pt->id >= 0)
 	       {
 		  rp = ed->table_parts[pt->id % ed->table_parts_size];
-		  if ((rp) && (rp->drag.down.count == 0))
+		  if ((rp) && (rp->drag) && (rp->drag->down.count == 0))
 		    {
-		       rp->drag.val.x += pr->value * rp->drag.page.x * rp->part->dragable.x;
-		       rp->drag.val.y += pr->value2 * rp->drag.page.y * rp->part->dragable.y;
-		       if      (rp->drag.val.x < 0.0) rp->drag.val.x = 0.0;
-		       else if (rp->drag.val.x > 1.0) rp->drag.val.x = 1.0;
-		       if      (rp->drag.val.y < 0.0) rp->drag.val.y = 0.0;
-		       else if (rp->drag.val.y > 1.0) rp->drag.val.y = 1.0;
-		       _edje_dragable_pos_set(ed, rp, rp->drag.val.x, rp->drag.val.y);
+		       rp->drag->val.x += pr->value * rp->drag->page.x * rp->part->dragable.x;
+		       rp->drag->val.y += pr->value2 * rp->drag->page.y * rp->part->dragable.y;
+		       if      (rp->drag->val.x < 0.0) rp->drag->val.x = 0.0;
+		       else if (rp->drag->val.x > 1.0) rp->drag->val.x = 1.0;
+		       if      (rp->drag->val.y < 0.0) rp->drag->val.y = 0.0;
+		       else if (rp->drag->val.y > 1.0) rp->drag->val.y = 1.0;
+		       _edje_dragable_pos_set(ed, rp, rp->drag->val.x, rp->drag->val.y);
 		       _edje_emit(ed, "drag,page", rp->part->name);
 		       if (_edje_block_break(ed)) goto break_prog;
 		    }
@@ -752,6 +835,45 @@ _edje_program_run(Edje *ed, Edje_Program *pr, int force, const char *ssig, const
 	if (_edje_block_break(ed)) goto break_prog;
 	_edje_recalc_do(ed);
      }
+   else if (pr->action == EDJE_ACTION_TYPE_LUA_SCRIPT)
+     {
+	//printf ("running Lua program script %i\n", pr->id);
+
+//	_edje_emit(ed, "program,start", pr->name);
+	if (_edje_block_break(ed)) goto break_prog;
+	
+	if (ed->L == NULL) /* private state does not yet exist, create it */
+	  {
+	     ed->L = _edje_lua_new_thread(ed->collection->L);
+	     _edje_lua_new_reg(ed->collection->L, -1, ed->L); // freed in edje_load.c::_edje_file_del
+	     lua_pop(ed->collection->L, 1);
+	  }
+	lua_State *L = ed->L;
+	lua_pushnumber(L, pr->id);
+	lua_gettable(L, LUA_GLOBALSINDEX);
+	if (!lua_isnil(L, -1))
+	  {
+	     int err_code;
+
+	     lua_pushvalue(L, LUA_GLOBALSINDEX); /* set function environment from collection thread to edje object thread */
+	     lua_setfenv(L, -2);
+	     _edje_lua_get_reg(L, ed);
+	     if (lua_isnil(L, -1)) /* group object does not yet exist, create it */
+	       {
+		  lua_pop(L, 1);
+		  _edje_lua_group_fn_new (ed);
+	       }
+	     lua_pushstring(L, ssig);
+	     lua_pushstring(L, ssrc);
+
+	     if ((err_code = lua_pcall(L, 3, 0, 0)))
+	       _edje_lua_error(L, err_code);
+	  }
+
+	//	_edje_emit(ed, "program,stop", pr->name);
+	if (_edje_block_break(ed)) goto break_prog;
+	_edje_recalc_do(ed);
+     }
    else if (pr->action == EDJE_ACTION_TYPE_FOCUS_SET)
      {
 	if (!pr->targets)
@@ -824,8 +946,8 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
      {
         size_t length;
         char *part;
-       /* the signal contains a colon, split the signal into "group:signal",
-	* and deliver it to "group"
+       /* the signal contains a colon, split the signal into "part:signal",
+	* and deliver it to "part" (if there is a GROUP or EXTERNAL part named "part")
 	*/
        length = strlen(sig) + 1;
        part = alloca(length);
@@ -842,17 +964,25 @@ _edje_emit(Edje *ed, const char *sig, const char *src)
             for (i = 0; i < ed->table_parts_size; i++)
               {
                  Edje_Real_Part *rp = ed->table_parts[i];
-                 if ((rp->part->type == EDJE_PART_TYPE_GROUP) &&
+                 if ((rp->part->type == EDJE_PART_TYPE_GROUP || rp->part->type == EDJE_PART_TYPE_EXTERNAL) &&
                      (rp->swallowed_object) &&
                      (rp->part) && (rp->part->name) &&
                      (strcmp(rp->part->name, part) == 0))
                    {
-                      Edje *ed2 = _edje_fetch(rp->swallowed_object);
-                      if (ed2) _edje_emit(ed2, newsig, src);
-                      return; /* stop processing.
-			       * XXX maybe let signal be processed anyway?
-			       * XXX in this case, just comment this line
-			       */
+		      if (rp->part->type == EDJE_PART_TYPE_GROUP)
+			{
+			   Edje *ed2 = _edje_fetch(rp->swallowed_object);
+			   if (ed2) _edje_emit(ed2, newsig, src);
+			   return; /* stop processing.
+				    * XXX maybe let signal be processed anyway?
+				    * XXX in this case, just comment this line
+				    */
+			}
+		      else if (rp->part->type == EDJE_PART_TYPE_EXTERNAL)
+			{
+			   _edje_external_signal_emit(rp->swallowed_object, newsig, src);
+			   return;
+			}
                    }
               }
          }
@@ -1132,3 +1262,8 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src)
    _edje_thaw(ed);
    _edje_unref(ed);
 }
+
+/**
+ *
+ * @}
+ */
diff --git a/src/lib/edje_script_only.c b/src/lib/edje_script_only.c
index e8835c4..76c8a4a 100644
--- a/src/lib/edje_script_only.c
+++ b/src/lib/edje_script_only.c
@@ -20,7 +20,7 @@
 # ifdef  __cplusplus
 extern "C"
 # endif
-void *alloca (size_t);
+void *alloca(size_t);
 #endif
 
 #include "edje_private.h"
@@ -76,25 +76,25 @@ typedef struct _Sinfo Sinfo;
 
 struct _Sinfo
 {
-   struct {
+   struct
+   {
       Embryo_Function
-	obj_init, obj_shutdown, obj_show, obj_show_immediate,
-	obj_hide, obj_hide_immediate, obj_move, obj_move_immediate,
-	obj_resize, obj_resize_immediate, obj_message
-	;
+	 obj_init, obj_shutdown, obj_show, obj_show_immediate,
+	 obj_hide, obj_hide_immediate, obj_move, obj_move_immediate,
+	 obj_resize, obj_resize_immediate, obj_message;
    } fn;
-   struct {
-      Ecore_Job 
-	*show, *hide, *move, *resize
-	;
+   struct
+   {
+      Ecore_Job * show, *hide, *move, *resize;
    } job;
-   struct {
+   struct
+   {
       int id;
-      Eina_Hash *hash; // FIXME: hash -> bad. too big. one-way lookup etc.
+      Eina_Hash *hash;		// FIXME: hash -> bad. too big. one-way lookup etc.
    } oid;
 };
 
-static void _call_fn(Edje *ed, const char *fname, Embryo_Function fn);
+static void _call_fn(Edje * ed, const char *fname, Embryo_Function fn);
 
 /* frankly - these make the code shorter to type and read - just sanity for
  * development */
@@ -124,23 +124,26 @@ struct _Oid
 
 /* FIXME: using eina_hash and strings is just nasty! make a custom int hash */
 static int
-_oid_alloc(Edje *ed)
+_oid_alloc(Edje * ed)
 {
    SI_RETURN(0);
-   
+
    si->oid.id++;
    return si->oid.id;
 }
 
 static Oid *
-_oid_track(Edje *ed, Evas_Object *o)
+_oid_track(Edje * ed, Evas_Object * o)
 {
    Oid *oi;
+
    char buf[64];
+
    SI_RETURN(NULL);
-   
+
    oi = calloc(1, sizeof(Oid));
-   if (!oi) return NULL;
+   if (!oi)
+      return NULL;
    oi->oid = _oid_alloc(ed);
    if (!oi->oid)
      {
@@ -153,15 +156,17 @@ _oid_track(Edje *ed, Evas_Object *o)
    evas_object_clip_set(oi->obj, oi->ed->clipper);
    evas_object_geometry_get(oi->obj, &(oi->x), &(oi->y), &(oi->w), &(oi->h));
    snprintf(buf, sizeof(buf), "%i", oi->oid);
-   if (!si->oid.hash) si->oid.hash = eina_hash_string_superfast_new(NULL);
+   if (!si->oid.hash)
+      si->oid.hash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(si->oid.hash, buf, oi);
    return oi;
 }
 
 static Oid *
-_oid_find(Edje *ed, int oid)
+_oid_find(Edje * ed, int oid)
 {
    char buf[64];
+
    SI_RETURN(NULL);
 
    snprintf(buf, sizeof(buf), "%i", oid);
@@ -169,9 +174,10 @@ _oid_find(Edje *ed, int oid)
 }
 
 static void
-_oid_del(Edje *ed, int oid)
+_oid_del(Edje * ed, int oid)
 {
    char buf[64];
+
    SI;
 
    snprintf(buf, sizeof(buf), "%i", oid);
@@ -179,147 +185,177 @@ _oid_del(Edje *ed, int oid)
 }
 
 static void
-_oid_free(Oid *oid)
+_oid_free(Oid * oid)
 {
    free(oid);
 }
 
 static Eina_Bool
-_oid_freeall_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_oid_freeall_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
 {
    Oid *oid = data;
+
    evas_object_del(oid->obj);
    free(oid);
    return 1;
 }
 
 static void
-_oid_freeall(Edje *ed)
+_oid_freeall(Edje * ed)
 {
    SI;
-   if (!si->oid.hash) return;
+   if (!si->oid.hash)
+      return;
    eina_hash_foreach(si->oid.hash, _oid_freeall_cb, ed);
    eina_hash_free(si->oid.hash);
    si->oid.hash = NULL;
 }
 
 static Eina_Bool
-_oid_moveall_cb(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_oid_moveall_cb(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
 {
    Oid *oid = data;
+
    evas_object_move(oid->obj, oid->ed->x + oid->x, oid->ed->y + oid->y);
    return 1;
 }
 
 static void
-_oid_moveall(Edje *ed)
+_oid_moveall(Edje * ed)
 {
    SI;
-   if (!si->oid.hash) return;
+   if (!si->oid.hash)
+      return;
    eina_hash_foreach(si->oid.hash, _oid_moveall_cb, ed);
 }
 
 /**********/
 
 static Embryo_Cell
-_exp_e_obj_del(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_del(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
 
    CHKPARAM(1);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
    evas_object_del(oid->obj);
    _oid_del(ed, oid->oid);
    _oid_free(oid);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_rect_add(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_rect_add(Embryo_Program * ep, Embryo_Cell * params __UNUSED__)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Evas_Object *o;
+
    Oid *oid;
+
    SI_RETURN(-1);
-   
+
    o = evas_object_rectangle_add(evas_object_evas_get(ed->obj));
-   if (!o) return 0;
+   if (!o)
+      return 0;
    oid = _oid_track(ed, o);
-   if (oid) return oid->oid;
+   if (oid)
+      return oid->oid;
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_show(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_show(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
 
    CHKPARAM(1);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
    evas_object_show(oid->obj);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_hide(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_hide(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
 
    CHKPARAM(1);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
    evas_object_hide(oid->obj);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_move(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_move(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
-   
+
    CHKPARAM(3);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
-   if ((oid->x == params[2]) && (oid->y == params[3])) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
+   if ((oid->x == params[2]) && (oid->y == params[3]))
+      return -1;
    oid->x = params[2];
    oid->y = params[3];
    evas_object_move(oid->obj, ed->x + oid->x, ed->y + oid->y);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_resize(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_resize(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
-   
+
    CHKPARAM(3);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
-   if ((oid->w == params[2]) && (oid->h == params[3])) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
+   if ((oid->w == params[2]) && (oid->h == params[3]))
+      return -1;
    oid->w = params[2];
    oid->h = params[3];
    evas_object_resize(oid->obj, oid->w, oid->h);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_geometry_set(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_geometry_set(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
-   
+
    CHKPARAM(5);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
    if ((oid->x == params[2]) && (oid->y == params[3]) &&
-       (oid->w == params[4]) && (oid->h == params[5])) return -1;
+       (oid->w == params[4]) && (oid->h == params[5]))
+      return -1;
    oid->x = params[2];
    oid->y = params[3];
    oid->w = params[4];
@@ -328,47 +364,57 @@ _exp_e_obj_geometry_set(Embryo_Program *ep, Embryo_Cell *params)
    evas_object_resize(oid->obj, oid->w, oid->h);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_geometry_get(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_geometry_get(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
-   
+
    CHKPARAM(5);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
    SETINT(oid->x, params[2]);
    SETINT(oid->y, params[3]);
    SETINT(oid->w, params[4]);
    SETINT(oid->h, params[5]);
    return 0;
 }
-    
+
 static Embryo_Cell
-_exp_e_obj_color_set(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_color_set(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    SI_RETURN(-1);
 
    CHKPARAM(5);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
    evas_object_color_set(oid->obj, params[2], params[3], params[4], params[5]);
    return 0;
 }
 
 static Embryo_Cell
-_exp_e_obj_color_get(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_obj_color_get(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    Oid *oid;
+
    int r, g, b, a;
+
    SI_RETURN(-1);
 
    CHKPARAM(5);
-   if (!(oid = _oid_find(ed, params[1]))) return -1;
-   evas_object_color_get(oid->obj, &r, &g , &b, &a);
+   if (!(oid = _oid_find(ed, params[1])))
+      return -1;
+   evas_object_color_get(oid->obj, &r, &g, &b, &a);
    SETINT(r, params[2]);
    SETINT(g, params[3]);
    SETINT(b, params[4]);
@@ -377,16 +423,19 @@ _exp_e_obj_color_get(Embryo_Program *ep, Embryo_Cell *params)
 }
 
 static Embryo_Cell
-_exp_e_signal_emit(Embryo_Program *ep, Embryo_Cell *params)
+_exp_e_signal_emit(Embryo_Program * ep, Embryo_Cell * params)
 {
    Edje *ed = embryo_program_data_get(ep);
+
    char *sig = NULL, *src = NULL;
+
    SI_RETURN(-1);
-   
+
    CHKPARAM(2);
    GETSTR(sig, params[1]);
    GETSTR(src, params[2]);
-   if ((!sig) || (!src)) return -1;
+   if ((!sig) || (!src))
+      return -1;
    _edje_emit(ed, sig, src);
    return 0;
 }
@@ -394,25 +443,26 @@ _exp_e_signal_emit(Embryo_Program *ep, Embryo_Cell *params)
 /**********/
 
 int
-_edje_script_only(Edje *ed)
+_edje_script_only(Edje * ed)
 {
    if ((ed->collection) && (ed->collection->script) &&
        (ed->collection->script_only))
-     return 1;
+      return 1;
    return 0;
 }
 
 void
-_edje_script_only_init(Edje *ed)
+_edje_script_only_init(Edje * ed)
 {
    Sinfo *si;
-   
+
    si = calloc(1, sizeof(Sinfo));
-   if (!si) return;
+   if (!si)
+      return;
    ed->script_only_data = si;
 
    embryo_program_data_set(ed->collection->script, ed);
-   
+
    EXPF(e_obj_del);
    EXPF(e_obj_rect_add);
    EXPF(e_obj_show);
@@ -424,7 +474,7 @@ _edje_script_only_init(Edje *ed)
    EXPF(e_obj_color_set);
    EXPF(e_obj_color_get);
    EXPF(e_signal_emit);
-   
+
    embryo_program_vm_push(ed->collection->script);
    embryo_program_max_cycle_run_set(ed->collection->script, 5000000);
 
@@ -445,7 +495,7 @@ _edje_script_only_init(Edje *ed)
 }
 
 void
-_edje_script_only_shutdown(Edje *ed)
+_edje_script_only_shutdown(Edje * ed)
 {
    SI;
 
@@ -461,28 +511,29 @@ static void
 _show_job(void *data)
 {
    Edje *ed = data;
+
    SI;
-   
+
    ZERJ(show);
    CLFN(obj_show);
 }
 void
-_edje_script_only_show(Edje *ed)
+_edje_script_only_show(Edje * ed)
 {
    SI;
-   
+
    IFFN(obj_show)
-     {
-	IFNJ(hide)
-	  {
-	     DELJ(show);
-	     ADDJ(show, _show_job);
-	  }
-	else
-	  {
-	     DELJ(hide);
-	  }
-     }
+   {
+      IFNJ(hide)
+      {
+	 DELJ(show);
+	 ADDJ(show, _show_job);
+      }
+      else
+      {
+	 DELJ(hide);
+      }
+   }
    IFNO(obj_show_immediate) return;
    CLFN(obj_show_immediate);
 }
@@ -491,28 +542,29 @@ static void
 _hide_job(void *data)
 {
    Edje *ed = data;
+
    SI;
-   
+
    ZERJ(hide);
    CLFN(obj_hide);
 }
 void
-_edje_script_only_hide(Edje *ed)
+_edje_script_only_hide(Edje * ed)
 {
    SI;
-   
+
    IFFN(obj_hide)
-     {
-	IFNJ(show)
-	  {
-	     DELJ(hide);
-	     ADDJ(hide, _hide_job);
-	  }
-	else
-	  {
-	     DELJ(show);
-	  }
-     }
+   {
+      IFNJ(show)
+      {
+	 DELJ(hide);
+	 ADDJ(hide, _hide_job);
+      }
+      else
+      {
+	 DELJ(show);
+      }
+   }
    IFNO(obj_hide_immediate) return;
    CLFN(obj_hide_immediate);
 }
@@ -521,8 +573,9 @@ static void
 _move_job(void *data)
 {
    Edje *ed = data;
+
    SI;
-   
+
    _oid_moveall(ed);
    ZERJ(move);
    IFNO(obj_move) return;
@@ -531,7 +584,7 @@ _move_job(void *data)
    CLFN(obj_move);
 }
 void
-_edje_script_only_move(Edje *ed)
+_edje_script_only_move(Edje * ed)
 {
    SI;
 
@@ -547,33 +600,34 @@ static void
 _resize_job(void *data)
 {
    Edje *ed = data;
+
    SI;
-   
+
    ZERJ(resize);
    PINT(ed->w);
    PINT(ed->h);
    CLFN(obj_resize);
 }
 void
-_edje_script_only_resize(Edje *ed)
+_edje_script_only_resize(Edje * ed)
 {
    SI;
 
    IFFN(obj_resize)
-     {
-	DELJ(resize);
-	ADDJ(resize, _resize_job);
-     }
+   {
+      DELJ(resize);
+      ADDJ(resize, _resize_job);
+   }
    PINT(ed->w);
    PINT(ed->h);
    CLFN(obj_resize_immediate);
 }
 
 void
-_edje_script_only_message(Edje *ed, Edje_Message *em)
+_edje_script_only_message(Edje * ed, Edje_Message * em)
 {
    SI;
-   
+
    IFNO(obj_message) return;
    _edje_message_parameters_push(em);
    CLFN(obj_message);
@@ -582,10 +636,10 @@ _edje_script_only_message(Edje *ed, Edje_Message *em)
 /**************************************************/
 
 static void
-_call_fn(Edje *ed, const char *fname, Embryo_Function fn)
+_call_fn(Edje * ed, const char *fname, Embryo_Function fn)
 {
    int ret;
-   
+
    ret = embryo_program_run(ed->collection->script, fn);
    if (ret == EMBRYO_PROGRAM_FAIL)
      {
@@ -593,15 +647,14 @@ _call_fn(Edje *ed, const char *fname, Embryo_Function fn)
 	       "ENTRY POINT: %s\n"
 	       "ERROR:       %s\n",
 	       fname,
-	       embryo_error_string_get(embryo_program_error_get(ed->collection->script)));
+	       embryo_error_string_get(embryo_program_error_get
+				       (ed->collection->script)));
      }
    else if (ret == EMBRYO_PROGRAM_TOOLONG)
      {
 	printf("EDJE:        ERROR with embryo script.\n"
 	       "ENTRY POINT: %s\n"
 	       "ERROR:       Script exceeded maximum allowed cycle count of %i\n",
-	       fname,
-	       embryo_program_max_cycle_run_get(ed->collection->script));
+	       fname, embryo_program_max_cycle_run_get(ed->collection->script));
      }
 }
-
diff --git a/src/lib/edje_smart.c b/src/lib/edje_smart.c
index 2e26dd6..aad086c 100644
--- a/src/lib/edje_smart.c
+++ b/src/lib/edje_smart.c
@@ -99,6 +99,7 @@ _edje_smart_del(Evas_Object * obj)
    _edje_edjes = eina_list_remove(_edje_edjes, obj);
    evas_object_smart_data_set(obj, NULL);
    if (_edje_script_only(ed)) _edje_script_only_shutdown(ed);
+   if (_edje_lua_script_only(ed)) _edje_lua_script_only_shutdown(ed);
    _edje_file_del(ed);
    _edje_unref(ed);
 }
@@ -121,6 +122,11 @@ _edje_smart_move(Evas_Object * obj, Evas_Coord x, Evas_Coord y)
 	_edje_script_only_move(ed);
 	return;
      }
+   if (_edje_lua_script_only(ed))
+   {
+      _edje_lua_script_only_move(ed);
+      return;
+   }
    
    for (i = 0; i < ed->table_parts_size; i++)
      {
@@ -129,26 +135,13 @@ _edje_smart_move(Evas_Object * obj, Evas_Coord x, Evas_Coord y)
 
 	ep = ed->table_parts[i];
 	evas_object_geometry_get(ep->object, &ox, &oy, NULL, NULL);
-	evas_object_move(ep->object, ed->x + ep->x + ep->offset.x, ed->y + ep->y +ep->offset.y);
+	evas_object_move(ep->object, ed->x + ep->x + ep->text.offset.x, ed->y + ep->y + ep->text.offset.y);
 	if (ep->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
 	  _edje_entry_real_part_configure(ep);
 	if (ep->swallowed_object)
 	  {
 	     evas_object_geometry_get(ep->swallowed_object, &ox, &oy, NULL, NULL);
-	     evas_object_move(ep->swallowed_object, ed->x + ep->x + ep->offset.x, ed->y + ep->y +ep->offset.y);
-	  }
-	if (ep->extra_objects)
-	  {
-	     Eina_List *el;
-	     Evas_Object *o;
-
-	     EINA_LIST_FOREACH(ep->extra_objects, el, o)
-	       {
-		  Evas_Coord oox, ooy;
-
-		  evas_object_geometry_get(o, &oox, &ooy, NULL, NULL);
-		  evas_object_move(o, ed->x + ep->x + ep->offset.x + (oox - ox), ed->y + ep->y + ep->offset.y + (ooy - oy));
-	       }
+	     evas_object_move(ep->swallowed_object, ed->x + ep->x + ep->text.offset.x, ed->y + ep->y + ep->text.offset.y);
 	  }
      }
 //   _edje_emit(ed, "move", NULL);
@@ -164,11 +157,19 @@ _edje_smart_resize(Evas_Object * obj, Evas_Coord w, Evas_Coord h)
    if ((w == ed->w) && (h == ed->h)) return;
    ed->w = w;
    ed->h = h;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
    if (_edje_script_only(ed))
      {
 	_edje_script_only_resize(ed);
 	return;
      }
+   if (_edje_lua_script_only(ed))
+     {
+	_edje_lua_script_only_resize(ed);
+	return;
+     }
 //   evas_object_resize(ed->clipper, ed->w, ed->h);
    ed->dirty = 1;
    _edje_recalc_do(ed);
@@ -190,6 +191,11 @@ _edje_smart_show(Evas_Object * obj)
 	_edje_script_only_show(ed);
 	return;
      }
+   if (_edje_lua_script_only(ed))
+   {
+      _edje_lua_script_only_show(ed);
+      return;
+   }
    _edje_emit(ed, "show", NULL);
 }
 
@@ -208,6 +214,11 @@ _edje_smart_hide(Evas_Object * obj)
 	_edje_script_only_hide(ed);
 	return;
      }
+   if (_edje_lua_script_only(ed))
+   {
+      _edje_lua_script_only_hide(ed);
+      return;
+   }
    _edje_emit(ed, "hide", NULL);
 }
 
diff --git a/src/lib/edje_text.c b/src/lib/edje_text.c
index 2ca19eb..e33cbc8 100644
--- a/src/lib/edje_text.c
+++ b/src/lib/edje_text.c
@@ -57,26 +57,6 @@ _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep)
 }
 
 void
-_edje_text_part_on_add_clippers(Edje *ed, Edje_Real_Part *ep)
-{
-   Eina_List *l;
-   Evas_Object *o;
-
-   EINA_LIST_FOREACH(ep->extra_objects, l, o)
-     {
-	if (ep->part->clip_to_id >= 0)
-	  {
-	     ep->clip_to = ed->table_parts[ep->part->clip_to_id % ed->table_parts_size];
-	     if (ep->clip_to)
-	       {
-		  evas_object_pass_events_set(ep->clip_to->object, 1);
-		  evas_object_clip_set(o, ep->clip_to->object);
-	       }
-	  }
-     }
-}
-
-void
 _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
 {
    Eina_List *tmp;
@@ -90,19 +70,6 @@ _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
        _edje_text_class_member_del(ed, desc->text.text_class);
 }
 
-void
-_edje_text_real_part_on_del(Edje *ed, Edje_Real_Part *ep)
-{
-   while (ep->extra_objects)
-     {
-	Evas_Object *o;
-
-	o = eina_list_data_get(ep->extra_objects);
-	ep->extra_objects = eina_list_remove(ep->extra_objects, o);
-	evas_object_del(o);
-     }
-}
-
 static void
 _edje_text_fit_set(char *buf, const char *text, int c1, int c2)
 {
@@ -162,19 +129,19 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
    part_get_geometry(ep, &tw, &th);
    evas_object_text_style_pad_get(ep->object, &l, &r, NULL, NULL);
 
-   p = ((sw - tw) * params->text.elipsis);
+   p = ((sw - tw) * params->type.text.elipsis);
 
    /* chop chop */
    if (tw > sw)
      {
-	if (params->text.elipsis != 0.0)
-	  c1 = evas_object_text_char_coords_get(ep->object,
-		-p + l, th / 2,
-		NULL, NULL, NULL, NULL);
-	if (params->text.elipsis != 1.0)
-	  c2 = evas_object_text_char_coords_get(ep->object,
-		-p + sw - r, th / 2,
-		NULL, NULL, NULL, NULL);
+	if (params->type.text.elipsis != 0.0)
+          /* should be the last in text! not the rightmost */
+          c1 = evas_object_text_last_up_to_pos(ep->object,
+                -p + l, th / 2);
+	if (params->type.text.elipsis != 1.0)
+          /* should be the last in text! not the rightmost */
+          c2 = evas_object_text_last_up_to_pos(ep->object,
+                -p + sw - r, th / 2);
 	if ((c1 < 0) && (c2 < 0))
 	  {
 	     c1 = 0;
@@ -276,7 +243,7 @@ _edje_text_font_get(const char *base, const char *new, char **free_later)
 
    if (base && (!new))
      return base;
-   else if ((!base) && new)
+   else if (!base)
      return new;
 
    base_style = strstr(base, ":style=");
@@ -393,7 +360,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 	sh = params->h;
      }
 
-   size = params->text.size;
+   size = params->type.text.size;
 
    if ((ep->text.cache.in_size == size) &&
        (ep->text.cache.in_w == sw) &&
@@ -401,9 +368,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
        (ep->text.cache.in_str) &&
        (text) &&
        (!strcmp(ep->text.cache.in_str, text)) &&
-       (ep->text.cache.align_x == params->text.align.x) &&
-       (ep->text.cache.align_y == params->text.align.y) &&
-       (ep->text.cache.elipsis == params->text.elipsis) &&
+       (ep->text.cache.align_x == params->type.text.align.x) &&
+       (ep->text.cache.align_y == params->type.text.align.y) &&
+       (ep->text.cache.elipsis == params->type.text.elipsis) &&
        (ep->text.cache.fit_x == chosen_desc->text.fit_x) &&
        (ep->text.cache.fit_y == chosen_desc->text.fit_y))
      {
@@ -569,9 +536,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
    ep->text.cache.in_w = sw;
    ep->text.cache.in_h = sh;
    ep->text.cache.out_size = size;
-   ep->text.cache.align_x = params->text.align.x;
-   ep->text.cache.align_y = params->text.align.y;
-   ep->text.cache.elipsis = params->text.elipsis;
+   ep->text.cache.align_x = params->type.text.align.x;
+   ep->text.cache.align_y = params->type.text.align.y;
+   ep->text.cache.elipsis = params->type.text.elipsis;
    ep->text.cache.fit_x = chosen_desc->text.fit_x;
    ep->text.cache.fit_y = chosen_desc->text.fit_y;
    arrange_text:
@@ -583,12 +550,12 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
    evas_object_text_font_set(ep->object, font, size);
    evas_object_text_text_set(ep->object, text);
    part_get_geometry(ep, &tw, &th);
-   ep->offset.x = ((sw - tw) * params->text.align.x);
-   ep->offset.y = ((sh - th) * params->text.align.y);
+   ep->text.offset.x = ((sw - tw) * params->type.text.align.x);
+   ep->text.offset.y = ((sh - th) * params->type.text.align.y);
 
    evas_object_move(ep->object,
-		    ed->x + params->x + ep->offset.x,
-		    ed->y + params->y + ep->offset.y);
+		    ed->x + params->x + ep->text.offset.x,
+		    ed->y + params->y + ep->text.offset.y);
 
    if (params->visible) evas_object_show(ep->object);
    else evas_object_hide(ep->object);
@@ -612,97 +579,97 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
 	  {
 	     style = EVAS_TEXT_STYLE_OUTLINE;
 	     evas_object_text_outline_color_set(ep->object,
-					        (params->color2.r * params->color2.a) / 255,
-					        (params->color2.g * params->color2.a) / 255,
-					        (params->color2.b * params->color2.a) / 255,
-						params->color2.a);
+					        (params->type.text.color2.r * params->type.text.color2.a) / 255,
+					        (params->type.text.color2.g * params->type.text.color2.a) / 255,
+					        (params->type.text.color2.b * params->type.text.color2.a) / 255,
+						params->type.text.color2.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_SOFT_OUTLINE)
 	  {
 	     style = EVAS_TEXT_STYLE_SOFT_OUTLINE;
 	     evas_object_text_outline_color_set(ep->object,
-						(params->color2.r * params->color2.a) / 255,
-						(params->color2.g * params->color2.a) / 255,
-						(params->color2.b * params->color2.a) / 255,
-						params->color2.a);
+						(params->type.text.color2.r * params->type.text.color2.a) / 255,
+						(params->type.text.color2.g * params->type.text.color2.a) / 255,
+						(params->type.text.color2.b * params->type.text.color2.a) / 255,
+						params->type.text.color2.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_SHADOW)
 	  {
 	     style = EVAS_TEXT_STYLE_SHADOW;
 	     evas_object_text_shadow_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_SOFT_SHADOW)
 	  {
 	     style = EVAS_TEXT_STYLE_SOFT_SHADOW;
 	     evas_object_text_shadow_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_OUTLINE_SHADOW)
 	  {
 	     style = EVAS_TEXT_STYLE_OUTLINE_SHADOW;
 	     evas_object_text_outline_color_set(ep->object,
-						(params->color2.r * params->color2.a) / 255,
-						(params->color2.g * params->color2.a) / 255,
-						(params->color2.b * params->color2.a) / 255,
-						params->color2.a);
+						(params->type.text.color2.r * params->type.text.color2.a) / 255,
+						(params->type.text.color2.g * params->type.text.color2.a) / 255,
+						(params->type.text.color2.b * params->type.text.color2.a) / 255,
+						params->type.text.color2.a);
 	     evas_object_text_shadow_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW)
 	  {
 	     style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW;
 	     evas_object_text_outline_color_set(ep->object,
-						(params->color2.r * params->color2.a) / 255,
-						(params->color2.g * params->color2.a) / 255,
-						(params->color2.b * params->color2.a) / 255,
-						params->color2.a);
+						(params->type.text.color2.r * params->type.text.color2.a) / 255,
+						(params->type.text.color2.g * params->type.text.color2.a) / 255,
+						(params->type.text.color2.b * params->type.text.color2.a) / 255,
+						params->type.text.color2.a);
 	     evas_object_text_shadow_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_FAR_SHADOW)
 	  {
 	     style = EVAS_TEXT_STYLE_FAR_SHADOW;
 	     evas_object_text_shadow_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW)
 	  {
 	     style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW;
 	     evas_object_text_shadow_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	else if (ep->part->effect == EDJE_TEXT_EFFECT_GLOW)
 	  {
 	     style = EVAS_TEXT_STYLE_GLOW;
 	     evas_object_text_glow_color_set(ep->object,
-						(params->color2.r * params->color2.a) / 255,
-						(params->color2.g * params->color2.a) / 255,
-						(params->color2.b * params->color2.a) / 255,
-						params->color2.a);
+						(params->type.text.color2.r * params->type.text.color2.a) / 255,
+						(params->type.text.color2.g * params->type.text.color2.a) / 255,
+						(params->type.text.color2.b * params->type.text.color2.a) / 255,
+						params->type.text.color2.a);
 	     evas_object_text_glow2_color_set(ep->object,
-					       (params->color3.r * params->color3.a) / 255,
-					       (params->color3.g * params->color3.a) / 255,
-					       (params->color3.b * params->color3.a) / 255,
-					       params->color3.a);
+					       (params->type.text.color3.r * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.g * params->type.text.color3.a) / 255,
+					       (params->type.text.color3.b * params->type.text.color3.a) / 255,
+					       params->type.text.color3.a);
 	  }
 	evas_object_text_style_set(ep->object, style);
      }
diff --git a/src/lib/edje_textblock_styles.c b/src/lib/edje_textblock_styles.c
index 232b1fd..a7c0f83 100644
--- a/src/lib/edje_textblock_styles.c
+++ b/src/lib/edje_textblock_styles.c
@@ -7,7 +7,7 @@
 #include "edje_private.h"
 
 static int
-_edje_font_is_embedded(Edje_File *edf, char *font)
+_edje_font_is_embedded(Edje_File *edf, char *font __UNUSED__)
 {
    if (!edf->font_dir) return 0;
    return 1;
@@ -40,8 +40,7 @@ _edje_str_escape(const char *str)
 static void
 _edje_format_param_parse(char *item, char **key, char **val)
 {
-   char *p;
-   char *k, *v;
+   char *p, *k, *v;
 
    p = strchr(item, '=');
    k = malloc(p - item + 1);
@@ -57,8 +56,7 @@ static char *
 _edje_format_parse(const char **s)
 {
    char *item, *ds;
-   const char *p;
-   const char *ss;
+   const char *p, *ss;
    const char *s1 = NULL;
    const char *s2 = NULL;
 
@@ -109,10 +107,9 @@ _edje_format_is_param(char *item)
 }
 
 static char *
-_edje_strbuf_append(char *s, const char *s2, int *len, int *alloc)
+_edje_strbuf_append2(char *s, const char *s2, int *len, int *alloc)
 {
-   int l2;
-   int tlen;
+   int l2, tlen;
 
    if (!s2) return s;
    l2 = strlen(s2);
@@ -134,15 +131,14 @@ _edje_strbuf_append(char *s, const char *s2, int *len, int *alloc)
 }
 
 static char *
-_edje_strbuf_append_escaped(char *s, const char *unescaped_s, int *len, int *alloc)
+_edje_strbuf_append2_escaped(char *s, const char *unescaped_s, int *len, int *alloc)
 {
    char *tmp;
 
    tmp = _edje_str_escape(unescaped_s);
-   if (!tmp)
-     return s;
+   if (!tmp) return s;
 
-   s = _edje_strbuf_append(s, tmp, len, alloc);
+   s = _edje_strbuf_append2(s, tmp, len, alloc);
    free(tmp);
 
    return s;
@@ -151,8 +147,7 @@ _edje_strbuf_append_escaped(char *s, const char *unescaped_s, int *len, int *all
 static char *
 _edje_format_reparse(Edje_File *edf, const char *str, Edje_Style_Tag **tag_ret)
 {
-   char *s2;
-   char *item;
+   char *s2, *item;
    char *newstr = NULL;
    const char *s;
    int newlen = 0, newalloc = 0;
@@ -185,12 +180,13 @@ _edje_format_reparse(Edje_File *edf, const char *str, Edje_Style_Tag **tag_ret)
 		    {
 		       if (_edje_font_is_embedded(edf, val))
 			 {
-			    char     *tmpstr = NULL;
-			    int       tmplen = 0;
-			    int       tmpalloc = 0;
+			    char *tmpstr = NULL;
+			    int tmplen = 0, tmpalloc = 0;
 
-			    tmpstr = _edje_strbuf_append(tmpstr, "fonts/", &tmplen, &tmpalloc);
-			    tmpstr = _edje_strbuf_append(tmpstr, val, &tmplen, &tmpalloc);
+			    tmpstr = _edje_strbuf_append2(tmpstr, "fonts/", 
+                                                         &tmplen, &tmpalloc);
+			    tmpstr = _edje_strbuf_append2(tmpstr, val, 
+                                                         &tmplen, &tmpalloc);
 			    (*tag_ret)->font = eina_stringshare_add(tmpstr);
 			    free(tmpstr);
 			 }
@@ -205,8 +201,8 @@ _edje_format_reparse(Edje_File *edf, const char *str, Edje_Style_Tag **tag_ret)
 		  s2 = _edje_str_escape(item);
 		  if (s2)
 		    {
-		       if (newstr) newstr = _edje_strbuf_append(newstr, " ", &newlen, &newalloc);
-		       newstr = _edje_strbuf_append(newstr, s2, &newlen, &newalloc);
+		       if (newstr) newstr = _edje_strbuf_append2(newstr, " ", &newlen, &newalloc);
+		       newstr = _edje_strbuf_append2(newstr, s2, &newlen, &newalloc);
 		       free(s2);
 		    }
 	       }
@@ -215,8 +211,8 @@ _edje_format_reparse(Edje_File *edf, const char *str, Edje_Style_Tag **tag_ret)
 	  }
 	else
 	  {
-	     if (newstr) newstr = _edje_strbuf_append(newstr, " ", &newlen, &newalloc);
-	     newstr = _edje_strbuf_append(newstr, item, &newlen, &newalloc);
+	     if (newstr) newstr = _edje_strbuf_append2(newstr, " ", &newlen, &newalloc);
+	     newstr = _edje_strbuf_append2(newstr, item, &newlen, &newalloc);
 	  }
 	free(item);
      }
@@ -237,22 +233,17 @@ _edje_textblock_style_all_update(Edje *ed)
 
    EINA_LIST_FOREACH(ed->file->styles, l, stl)
      {
-
 	Edje_Style_Tag *tag;
 	Edje_Text_Class *tc;
-	char *buf = NULL;
-	int bufalloc = 0;
-	int buflen = 0;
-	int found = 0;
-	char *fontset = NULL, *fontsource = NULL;
+	int bufalloc = 0, buflen = 0, found = 0;
+	char *buf = NULL, *fontset = NULL, *fontsource = NULL;
 
 	/* Make sure the style is already defined */
 	if (!stl->style) break;
 
 	/* Make sure the style contains a text_class */
 	EINA_LIST_FOREACH(stl->tags, ll, tag)
-	  if (tag->text_class)
-	    found = 1;
+	  if (tag->text_class) found = 1;
 
 	/* No text classes , goto next style */
 	if (!found) continue;
@@ -268,8 +259,8 @@ _edje_textblock_style_all_update(Edje *ed)
 	     if (!tag->key) continue;
 
 	     /* Add Tag Key */
-	     buf = _edje_strbuf_append(buf, tag->key, &buflen, &bufalloc);
-	     buf = _edje_strbuf_append(buf, "='", &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, tag->key, &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, "='", &buflen, &bufalloc);
 
 	     /* Configure fonts from text class if it exists */
 	     if ((tc = _edje_text_class_find(ed, tag->text_class)))
@@ -279,19 +270,19 @@ _edje_textblock_style_all_update(Edje *ed)
 	       }
 
 	     /* Add and Ha`ndle tag parsed data */
-	     buf = _edje_strbuf_append(buf, tag->value, &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, tag->value, &buflen, &bufalloc);
 
 	     if (!strcmp(tag->key, "DEFAULT"))
 	       {
 		  if (fontset)
 		    {
-		       buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		       buf = _edje_strbuf_append(buf, "font_fallbacks=", &buflen, &bufalloc);
-		       buf = _edje_strbuf_append(buf, fontset, &buflen, &bufalloc);
+		       buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		       buf = _edje_strbuf_append2(buf, "font_fallbacks=", &buflen, &bufalloc);
+		       buf = _edje_strbuf_append2(buf, fontset, &buflen, &bufalloc);
 		    }
-		  buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, "font_source=", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, fontsource, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, "font_source=", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, fontsource, &buflen, &bufalloc);
 	       }
 	     if (tag->font_size != 0)
 	       {
@@ -302,24 +293,24 @@ _edje_textblock_style_all_update(Edje *ed)
 		  else
 		    snprintf(font_size, sizeof(font_size), "%f", tag->font_size);
 
-		  buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, "font_size=", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, font_size, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, "font_size=", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, font_size, &buflen, &bufalloc);
 	       }
 	     /* Add font name last to save evas from multiple loads */
 	     if (tag->font)
 	       {
 		  const char *f;
 
-		  buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, "font=", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, "font=", &buflen, &bufalloc);
 
 		  f = (found) ? tc->font : tag->font;
-		  buf = _edje_strbuf_append_escaped(buf, f, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2_escaped(buf, f, &buflen, &bufalloc);
 	       }
 	     found = 0;
 
-	     buf = _edje_strbuf_append(buf, "'", &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, "'", &buflen, &bufalloc);
 	  }
 	if (fontset) free(fontset);
 	if (fontsource) free(fontsource);
@@ -407,8 +398,8 @@ _edje_textblock_style_parse_and_fix(Edje_File *edf)
 	     if (!tag->key) continue;
 
 	     /* Add Tag Key */
-	     buf = _edje_strbuf_append(buf, tag->key, &buflen, &bufalloc);
-	     buf = _edje_strbuf_append(buf, "='", &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, tag->key, &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, "='", &buflen, &bufalloc);
 
 	     ts = _edje_format_reparse(edf, tag->value, &(tag));
 
@@ -418,7 +409,7 @@ _edje_textblock_style_parse_and_fix(Edje_File *edf)
 		  if (eet_dictionary_string_check(eet_dictionary_get(edf->ef), tag->value) == 0)
 		    eina_stringshare_del(tag->value);
 		  tag->value = eina_stringshare_add(ts);
-		  buf = _edje_strbuf_append(buf, tag->value, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, tag->value, &buflen, &bufalloc);
 		  free(ts);
 	       }
 
@@ -426,31 +417,31 @@ _edje_textblock_style_parse_and_fix(Edje_File *edf)
 	       {
 		  if (fontset)
 		    {
-		       buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		       buf = _edje_strbuf_append(buf, "font_fallbacks=", &buflen, &bufalloc);
-		       buf = _edje_strbuf_append(buf, fontset, &buflen, &bufalloc);
+		       buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		       buf = _edje_strbuf_append2(buf, "font_fallbacks=", &buflen, &bufalloc);
+		       buf = _edje_strbuf_append2(buf, fontset, &buflen, &bufalloc);
 		    }
-		  buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, "font_source=", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, fontsource, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, "font_source=", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, fontsource, &buflen, &bufalloc);
 	       }
 	     if (tag->font_size > 0)
 	       {
 		  char font_size[32];
 
 		  snprintf(font_size, sizeof(font_size), "%f", tag->font_size);
-		  buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, "font_size=", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, font_size, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, "font_size=", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, font_size, &buflen, &bufalloc);
 	       }
 	     /* Add font name last to save evas from multiple loads */
 	     if (tag->font)
 	       {
-		  buf = _edje_strbuf_append(buf, " ", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append(buf, "font=", &buflen, &bufalloc);
-		  buf = _edje_strbuf_append_escaped(buf, tag->font, &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, " ", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2(buf, "font=", &buflen, &bufalloc);
+		  buf = _edje_strbuf_append2_escaped(buf, tag->font, &buflen, &bufalloc);
 	       }
-	     buf = _edje_strbuf_append(buf, "'", &buflen, &bufalloc);
+	     buf = _edje_strbuf_append2(buf, "'", &buflen, &bufalloc);
 	  }
 	if (fontset) free(fontset);
 	if (fontsource) free(fontsource);
diff --git a/src/lib/edje_util.c b/src/lib/edje_util.c
index d5fdf31..cb63764 100644
--- a/src/lib/edje_util.c
+++ b/src/lib/edje_util.c
@@ -6,19 +6,17 @@
 
 #include "edje_private.h"
 
-
+typedef struct _Edje_Box_Layout Edje_Box_Layout;
 struct _Edje_Box_Layout
 {
-	EINA_RBTREE;
-	Evas_Object_Box_Layout func;
-	void *(*layout_data_get)(void *);
-	void (*layout_data_free)(void *);
-	void *data;
-	void (*free_data)(void *);
-	char name[];
+   EINA_RBTREE;
+   Evas_Object_Box_Layout func;
+   void *(*layout_data_get)(void *);
+   void (*layout_data_free)(void *);
+   void *data;
+   void (*free_data)(void *);
+   char name[];
 };
-typedef struct _Edje_Box_Layout                      Edje_Box_Layout;
-
 
 static Eina_Hash *_edje_color_class_hash = NULL;
 static Eina_Hash *_edje_color_class_member_hash = NULL;
@@ -34,7 +32,6 @@ int _edje_freeze_val = 0;
 int _edje_freeze_calc_count = 0;
 
 typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
-
 struct _Edje_List_Foreach_Data
 {
    Eina_List *list;
@@ -47,21 +44,23 @@ Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);
 
 /************************** API Routines **************************/
 
-/* FIXDOC: These all need to be looked over, Verified/Expanded upon.  I just got lazy and stopped putting FIXDOC next to each function in this file. */
-
 //#define FASTFREEZE 1
 
-/** Freeze all Edje objects in the current process.
+/**
+ * @brief Freeze Edje objects.
+ *
+ * This function freezes every edje objects in the current process.
+ *
+ * See edje_object_freeze().
  *
- * See edje_object_freeze() for more.
  */
 EAPI void
 edje_freeze(void)
 {
-#ifdef FASTFREEZE   
+#ifdef FASTFREEZE
    _edje_freeze_val++;
    printf("fr ++ ->%i\n", _edje_freeze_val);
-#else   
+#else
 // FIXME: could just have a global freeze instead of per object
 // above i tried.. but this broke some things. notable e17's menus. why?
    Eina_List *l;
@@ -69,24 +68,24 @@ edje_freeze(void)
 
    EINA_LIST_FOREACH(_edje_edjes, l, data)
      edje_object_freeze(data);
-#endif   
+#endif
 }
 
-#ifdef FASTFREEZE   
+#ifdef FASTFREEZE
 static void
 _edje_thaw_edje(Edje *ed)
 {
    int i;
-   
+
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *rp;
-	
+
 	rp = ed->table_parts[i];
 	if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
 	  {
 	     Edje *ed2;
-	     
+
 	     ed2 = _edje_fetch(rp->swallowed_object);
 	     if (ed2) _edje_thaw_edje(ed2);
 	  }
@@ -95,15 +94,20 @@ _edje_thaw_edje(Edje *ed)
 }
 #endif
 
-/** Thaw all Edje objects in the current process.
+/**
+ * @brief Thaw edje objects.
+ *
+ * This function thaw all edje object in the current process.
+ *
+ * See edje_object_thaw().
  *
- * See edje_object_thaw() for more.
  */
 EAPI void
 edje_thaw(void)
 {
   Evas_Object *data;
-#ifdef FASTFREEZE   
+
+#ifdef FASTFREEZE
    _edje_freeze_val--;
    printf("fr -- ->%i\n", _edje_freeze_val);
    if ((_edje_freeze_val <= 0) && (_edje_freeze_calc_count > 0))
@@ -126,10 +130,17 @@ edje_thaw(void)
 
    EINA_LIST_FOREACH(_edje_edjes, l, data)
      edje_object_thaw(data);
-#endif   
+#endif
 }
 
-/* FIXDOC: Expand */
+/**
+ * @brief Set the edje append fontset.
+ *
+ * @param fonts The fontset to append.
+ *
+ * This function sets the edje append fontset.
+ *
+ */
 EAPI void
 edje_fontset_append_set(const char *fonts)
 {
@@ -138,17 +149,47 @@ edje_fontset_append_set(const char *fonts)
    _edje_fontset_append = fonts ? strdup(fonts) : NULL;
 }
 
-/* FIXDOC: Expand */
+/**
+ * @brief Get the edje append fontset.
+ *
+ * @return The edje append fontset.
+ *
+ * This function returns the edje append fontset set by
+ * edje_fontset_append_set() function.
+ *
+ * @see edje_fontset_append_set().
+ *
+ */
 EAPI const char *
 edje_fontset_append_get(void)
 {
    return _edje_fontset_append;
 }
 
+/**
+ * @brief Set edje's global scaling factor.
+ *
+ * @param scale The edje (global) scale factor. The defaul is 1.0.
+ *
+ * Edje allows one to build scalable interfaces. Scale factors, which
+ * are set to neutral values by default (no scaling, actual sizes),
+ * are of two types: global and individual. Edje's global scaling
+ * factor will affect all its objects which hadn't their individual
+ * scaling factors altered from the default value. If they had it set
+ * differently, that factor will override the global one.
+ *
+ * Scaling affects the values of min/max object sizes, which are
+ * multiplied by it. Font sizes are scaled, too.
+ *
+ * This property can be retrieved with edje_scale_get().
+ *
+ * @see edje_scale_get().
+ *
+ */
 EAPI void
 edje_scale_set(double scale)
 {
-   Eina_List *l;
+  Eina_List *l;
    Evas_Object *data;
 
    if (_edje_scale == scale) return;
@@ -157,12 +198,39 @@ edje_scale_set(double scale)
      edje_object_calc_force(data);
 }
 
+/**
+ * @brief Get edje's global scaling factor.
+ *
+ * @return The edje (global) scale factor. The defaul is 1.0.
+ *
+ * This function returns edje's global scale factor, which can be set
+ * by edje_scale_set().
+ *
+ * @see edje_scale_set().
+ *
+ */
 EAPI double
 edje_scale_get(void)
 {
    return _edje_scale;
 }
 
+/**
+ * @brief Set the edje object's scaling factor.
+ *
+ * @param obj The edje object's reference.
+ * @param scale The edje object scale factor. The defaul is 1.0.
+ *
+ * This function sets the individual scale factor of the @a obj edje
+ * object. This property (or edje's global scale factor, when
+ * applicable), will affect this object's parts. However, only parts
+ * which, at the EDC language level, were declared which the "scale"
+ * attribute set to 1 (default is zero) will be affected.
+ *
+ * This scale factor can be retrieved with edje_object_scale_get().
+ * @see edje_object_scale_get().
+ *
+ */
 EAPI void
 edje_object_scale_set(Evas_Object *obj, double scale)
 {
@@ -175,6 +243,17 @@ edje_object_scale_set(Evas_Object *obj, double scale)
    edje_object_calc_force(obj);
 }
 
+/**
+ * @brief Get the edje object's scaling factor.
+ *
+ * @param obj The edje object's reference.
+ *
+ * This function returns the individual scale factor of the @a obj
+ * edje object, which can be set by edje_object_scale_set().
+ *
+ * @see edje_object_scale_set().
+ *
+ */
 EAPI double
 edje_object_scale_get(const Evas_Object *obj)
 {
@@ -185,16 +264,17 @@ edje_object_scale_get(const Evas_Object *obj)
    return ed->scale;
 }
 
-/* FIXDOC: Verify/Expand */
-/** Get Edje object data
+/**
+ * @brief Get Edje object data.
+ *
  * @param obj A valid Evas_Object handle
  * @param key The data key
  * @return The data string
  *
- * This fetches data specified at the object level.
+ * This function fetches data specified at the object level.
  *
- * In EDC this comes from a data block within the group block that @a obj
- * was loaded from. E.g.
+ * In EDC this comes from a data block within the group block that @a
+ * obj was loaded from. E.g.
  *
  * @code
  * collections {
@@ -225,14 +305,15 @@ edje_object_data_get(const Evas_Object *obj, const char *key)
    return NULL;
 }
 
-/* FIXDOC: Verify/Expand */
-/** Freeze object
+/**
+ * @brief Freeze object.
+ *
  * @param obj A valid Evas_Object handle
- * @return The frozen state\n
- * 0 on Error
+ * @return The frozen state or 0 on Error
+ *
+ * This function puts all changes on hold. Successive freezes will
+ * nest, requiring an equal number of thaws.
  *
- * This puts all changes on hold.  Successive freezes will nest,
- * requiring an equal number of thaws.
  */
 EAPI int
 edje_object_freeze(Evas_Object *obj)
@@ -252,12 +333,14 @@ edje_object_freeze(Evas_Object *obj)
    return _edje_freeze(ed);
 }
 
-/** Thaw object
+/**
+ * @brief Thaw object.
+ *
  * @param obj A valid Evas_Object handle
- * @return The frozen state\n
- * 0 on Error
+ * @return The frozen state or 0 on Error
  *
  * This allows frozen changes to occur.
+ *
  */
 EAPI int
 edje_object_thaw(Evas_Object *obj)
@@ -270,6 +353,7 @@ edje_object_thaw(Evas_Object *obj)
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *rp;
+
 	rp = ed->table_parts[i];
 	if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
 	  edje_object_thaw(rp->swallowed_object);
@@ -277,7 +361,9 @@ edje_object_thaw(Evas_Object *obj)
    return _edje_thaw(ed);
 }
 
-/** Set Edje color class
+/**
+ * @brief Set Edje color class.
+ *
  * @param color_class
  * @param r Object Red value
  * @param g Object Green value
@@ -292,14 +378,24 @@ edje_object_thaw(Evas_Object *obj)
  * @param b3 Shadow Blue value
  * @param a3 Shadow Alpha value
  *
- * Sets the color values for a process level color class. This will cause all
- * edje parts in the current process that have the specified color class to
- * have their colors multiplied by these values. (Object level color classes
- * set by edje_object_color_class_set() will override the values set by this
+ * This function sets the color values for a process level color
+ * class.  This will cause all edje parts in the current process that
+ * have the specified color class to have their colors multiplied by
+ * these values.  (Object level color classes set by
+ * edje_object_color_class_set() will override the values set by this
  * function).
  *
- * The first color is the object, the second is the text outline, and the
- * third is the text shadow. (Note that the second two only apply to text parts)
+ * The first color is the object, the second is the text outline, and
+ * the third is the text shadow. (Note that the second two only apply
+ * to text parts).
+ *
+ * Setting color emits a signal "color_class,set" with source being
+ * the given color class in all objects.
+ *
+ * @see edje_color_class_set().
+ *
+ * @note unlike Evas, Edje colors are @b not pre-multiplied. That is,
+ *       half-transparent white is 255 255 255 128.
  */
 EAPI void
 edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
@@ -320,7 +416,8 @@ edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2
 	     free(cc);
 	     return;
 	  }
-	if (!_edje_color_class_hash) _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
+	if (!_edje_color_class_hash) 
+          _edje_color_class_hash = eina_hash_string_superfast_new(NULL);
         eina_hash_add(_edje_color_class_hash, color_class, cc);
      }
 
@@ -359,15 +456,93 @@ edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2
 
 	ed = eina_list_data_get(members);
 	ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	ed->all_part_change = 1;
+#endif
 	_edje_recalc(ed);
+	_edje_emit(ed, "color_class,set", color_class);
 	members = eina_list_next(members);
      }
 }
 
 /**
+ * @brief Get Edje color class.
+ *
+ * @param color_class
+ * @param r Object Red value
+ * @param g Object Green value
+ * @param b Object Blue value
+ * @param a Object Alpha value
+ * @param r2 Outline Red value
+ * @param g2 Outline Green value
+ * @param b2 Outline Blue value
+ * @param a2 Outline Alpha value
+ * @param r3 Shadow Red value
+ * @param g3 Shadow Green value
+ * @param b3 Shadow Blue value
+ * @param a3 Shadow Alpha value
+ *
+ * @return EINA_TRUE if found or EINA_FALSE if not found and all
+ *         values are zeroed.
+ *
+ * This function gets the color values for a process level color
+ * class. This value is the globally set and not per-object, that is,
+ * the value that would be used by objects if they did not override with
+ * edje_object_color_class_set().
+ *
+ * The first color is the object, the second is the text outline, and
+ * the third is the text shadow. (Note that the second two only apply
+ * to text parts).
+ *
+ * @see edje_color_class_set().
+ *
+ * @note unlike Evas, Edje colors are @b not pre-multiplied. That is,
+ *       half-transparent white is 255 255 255 128.
+ */
+EAPI Eina_Bool
+edje_color_class_get(const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
+{
+   Edje_Color_Class *cc;
+
+   if (!color_class)
+     cc = NULL;
+   else
+     cc = eina_hash_find(_edje_color_class_hash, color_class);
+
+   if (cc)
+     {
+#define X(C) if (C) *C = cc->C
+#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
+	S(r, g, b, a);
+	S(r2, g2, b2, a2);
+	S(r3, g3, b3, a3);
+#undef S
+#undef X
+	return EINA_TRUE;
+     }
+   else
+     {
+#define X(C) if (C) *C = 0
+#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
+	S(r, g, b, a);
+	S(r2, g2, b2, a2);
+	S(r3, g3, b3, a3);
+#undef S
+#undef X
+	return EINA_FALSE;
+     }
+}
+
+/**
+ * @brief Delete edje color class.
+ *
  * @param color_class
  *
- * Deletes any values at the process level for the specified color class.
+ * This function deletes any values at the process level for the
+ * specified color class.
+ *
+ * Deleting color emits a signal "color_class,del" with source being
+ * the given color class in all objects.
  */
 void
 edje_color_class_del(const char *color_class)
@@ -391,16 +566,24 @@ edje_color_class_del(const char *color_class)
 
 	ed = eina_list_data_get(members);
 	ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	ed->all_part_change = 1;
+#endif
 	_edje_recalc(ed);
+	_edje_emit(ed, "color_class,del", color_class);
 	members = eina_list_next(members);
      }
 }
 
 /**
- * Lists all color classes known about by the current process.
+ * @brief Lists color classes.
+ *
+ * @return A list of color class names (strings). These strings and
+ * the list must be free()'d by the caller.
+ *
+ * This function lists all color classes known about by the current
+ * process.
  *
- * @return A list of color class names (strings). These strings and the list
- * must be free()'d by the caller.
  */
 Eina_List *
 edje_color_class_list(void)
@@ -415,7 +598,7 @@ edje_color_class_list(void)
 }
 
 static Eina_Bool
-_edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_edje_color_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
 {
    Edje_List_Foreach_Data *fd;
 
@@ -424,7 +607,9 @@ _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *dat
    return EINA_TRUE;
 }
 
-/** Sets the object color class
+/**
+ * @brief Sets the object color class.
+ *
  * @param obj A valid Evas_Object handle
  * @param color_class
  * @param r Object Red value
@@ -440,12 +625,20 @@ _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *dat
  * @param b3 Shadow Blue value
  * @param a3 Shadow Alpha value
  *
- * Sets the color values for an object level color class. This will cause all
- * edje parts in the specified object that have the specified color class to
- * have their colors multiplied by these values.
+ * This function sets the color values for an object level color
+ * class. This will cause all edje parts in the specified object that
+ * have the specified color class to have their colors multiplied by
+ * these values.
+ *
+ * The first color is the object, the second is the text outline, and
+ * the third is the text shadow. (Note that the second two only apply
+ * to text parts).
  *
- * The first color is the object, the second is the text outline, and the
- * third is the text shadow. (Note that the second two only apply to text parts)
+ * Setting color emits a signal "color_class,set" with source being
+ * the given color.
+ *
+ * @note unlike Evas, Edje colors are @b not pre-multiplied. That is,
+ *       half-transparent white is 255 255 255 128.
  */
 EAPI void
 edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3)
@@ -489,6 +682,9 @@ edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, in
 	     cc->b3 = b3;
 	     cc->a3 = a3;
 	     ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	     ed->all_part_change = 1;
+#endif
 	     _edje_recalc(ed);
 	     return;
 	  }
@@ -515,23 +711,98 @@ edje_object_color_class_set(Evas_Object *obj, const char *color_class, int r, in
    cc->a3 = a3;
    ed->color_classes = eina_list_append(ed->color_classes, cc);
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
 
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *rp;
+
 	rp = ed->table_parts[i];
 	if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
-	  edje_object_color_class_set(rp->swallowed_object, color_class, r, g, b, a, r2, g2, b2, a2, r3, g3, b3, a3);
+	  edje_object_color_class_set(rp->swallowed_object, color_class, 
+                                      r, g, b, a, r2, g2, b2, a2, r3, g3, b3, 
+                                      a3);
      }
 
    _edje_recalc(ed);
+   _edje_emit(ed, "color_class,set", color_class);
 }
 
 /**
+ * @brief Gets the object color class.
+ *
+ * @param obj A valid Evas_Object handle
  * @param color_class
+ * @param r Object Red value
+ * @param g Object Green value
+ * @param b Object Blue value
+ * @param a Object Alpha value
+ * @param r2 Outline Red value
+ * @param g2 Outline Green value
+ * @param b2 Outline Blue value
+ * @param a2 Outline Alpha value
+ * @param r3 Shadow Red value
+ * @param g3 Shadow Green value
+ * @param b3 Shadow Blue value
+ * @param a3 Shadow Alpha value
+ *
+ * @return EINA_TRUE if found or EINA_FALSE if not found and all
+ *         values are zeroed.
+ *
+ * This function gets the color values for an object level color
+ * class. If no explicit object color is set, then global values will
+ * be used.
+ *
+ * The first color is the object, the second is the text outline, and
+ * the third is the text shadow. (Note that the second two only apply
+ * to text parts).
  *
- * Deletes any values at the object level for the specified object and
- * color class.
+ * @note unlike Evas, Edje colors are @b not pre-multiplied. That is,
+ *       half-transparent white is 255 255 255 128.
+ */
+EAPI Eina_Bool
+edje_object_color_class_get(const Evas_Object *obj, const char *color_class, int *r, int *g, int *b, int *a, int *r2, int *g2, int *b2, int *a2, int *r3, int *g3, int *b3, int *a3)
+{
+   Edje *ed = _edje_fetch(obj);
+   Edje_Color_Class *cc = _edje_color_class_find(ed, color_class);
+
+   if (cc)
+     {
+#define X(C) if (C) *C = cc->C
+#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
+	S(r, g, b, a);
+	S(r2, g2, b2, a2);
+	S(r3, g3, b3, a3);
+#undef S
+#undef X
+	return EINA_TRUE;
+     }
+   else
+     {
+#define X(C) if (C) *C = 0
+#define S(_r, _g, _b, _a) X(_r); X(_g); X(_b); X(_a)
+	S(r, g, b, a);
+	S(r2, g2, b2, a2);
+	S(r3, g3, b3, a3);
+#undef S
+#undef X
+	return EINA_FALSE;
+     }
+}
+
+/**
+ * @brief Delete the object color class.
+ *
+ * @param obj The edje object's reference.
+ * @param color_class The color class to be deleted.
+ *
+ * This function deletes any values at the object level for the
+ * specified object and color class.
+ *
+ * Deleting color emits a signal "color_class,del" with source being
+ * the given color.
  */
 void
 edje_object_color_class_del(Evas_Object *obj, const char *color_class)
@@ -558,22 +829,32 @@ edje_object_color_class_del(Evas_Object *obj, const char *color_class)
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *rp;
+
 	rp = ed->table_parts[i];
 	if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
 	  edje_object_color_class_del(rp->swallowed_object, color_class);
      }
 
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
    _edje_recalc(ed);
+   _edje_emit(ed, "color_class,del", color_class);
 }
 
-/** Set the Edje text class
- * @param text_class The text class name ?!
+/**
+ * @brief Set the Edje text class.
+ *
+ * @param text_class The text class name
  * @param font The font name
  * @param size The font size
  *
- * This sets updates all edje members which belong to this text class
- * with the new font attributes.
+ * This function sets updates all edje members which belong to this
+ * text class with the new font attributes.
+ *
+ * @see edje_text_class_get().
+ *
  */
 EAPI void
 edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size size)
@@ -628,15 +909,22 @@ edje_text_class_set(const char *text_class, const char *font, Evas_Font_Size siz
 	ed = eina_list_data_get(members);
 	ed->dirty = 1;
 	_edje_textblock_style_all_update(ed);
+#ifdef EDJE_CALC_CACHE
+	ed->text_part_change = 1;
+#endif
 	_edje_recalc(ed);
 	members = eina_list_next(members);
      }
 }
 
 /**
- * @param text_class
+ * @brief Delete the text class.
+ *
+ * @param text_class The text class name string
+ *
+ * This function deletes any values at the process level for the
+ * specified text class.
  *
- * Deletes any values at the process level for the specified text class.
  */
 void
 edje_text_class_del(const char *text_class)
@@ -662,16 +950,23 @@ edje_text_class_del(const char *text_class)
 	ed = eina_list_data_get(members);
 	ed->dirty = 1;
 	_edje_textblock_style_all_update(ed);
+#ifdef EDJE_CALC_CACHE
+	ed->text_part_change = 1;
+#endif
 	_edje_recalc(ed);
 	members = eina_list_next(members);
      }
 }
 
 /**
- * Lists all text classes known about by the current process.
+ * @brief List text classes.
+ *
+ * @return A list of text class names (strings). These strings are
+ * stringshares and the list must be free()'d by the caller.
+ *
+ * This function lists all text classes known about by the current
+ * process.
  *
- * @return A list of text class names (strings). These strings are stringshares and
- * the list must be free()'d by the caller.
  */
 Eina_List *
 edje_text_class_list(void)
@@ -681,12 +976,11 @@ edje_text_class_list(void)
    memset(&fdata, 0, sizeof(Edje_List_Foreach_Data));
    eina_hash_foreach(_edje_text_class_member_hash,
                      _edje_text_class_list_foreach, &fdata);
-
    return fdata.list;
 }
 
 static Eina_Bool
-_edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+_edje_text_class_list_foreach(const Eina_Hash *hash __UNUSED__, const void *key, void *data __UNUSED__, void *fdata)
 {
    Edje_List_Foreach_Data *fd;
 
@@ -695,13 +989,16 @@ _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data
    return EINA_TRUE;
 }
 
-/** Sets Edje text class
+/**
+ * @brief Sets Edje text class.
+ *
  * @param obj A valid Evas_Object handle
  * @param text_class The text class name
  * @param font Font name
  * @param size Font Size
  *
- * Sets the text class for the Edje.
+ * This function sets the text class for the Edje.
+ *
  */
 EAPI void
 edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char *font, Evas_Font_Size size)
@@ -735,6 +1032,9 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char
 
 	     /* Update edje */
 	     ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	     ed->text_part_change = 1;
+#endif
 	     _edje_recalc(ed);
 	     return;
 	  }
@@ -756,23 +1056,33 @@ edje_object_text_class_set(Evas_Object *obj, const char *text_class, const char
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *rp;
+
 	rp = ed->table_parts[i];
 	if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
-	  edje_object_text_class_set(rp->swallowed_object, text_class, font, size);
+	  edje_object_text_class_set(rp->swallowed_object, text_class, 
+                                     font, size);
      }
 
    /* Add to edje's text class list */
    ed->text_classes = eina_list_append(ed->text_classes, tc);
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ed->text_part_change = 1;
+#endif
    _edje_textblock_style_all_update(ed);
    _edje_recalc(ed);
 }
 
-/** Check if Edje part exists
+/**
+ * @brief Check if Edje part exists.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name to check
- * @return 0 on Error\n
- * 1 if Edje part exists
+ *
+ * @return 0 on Error, 1 if Edje part exists.
+ *
+ * This function returns if a part exists in the edje.
+ *
  */
 EAPI int
 edje_object_part_exists(const Evas_Object *obj, const char *part)
@@ -788,16 +1098,20 @@ edje_object_part_exists(const Evas_Object *obj, const char *part)
 }
 
 /**
- * Gets the Evas_Object corresponding to a given part.
- * You should never modify the state of the returned object
- * (with evas_object_move() or evas_object_hide() for example),
- * but you can safely query info about its current state
- * (with evas_object_visible_get() or evas_object_color_get() for example)
+ * @brief Gets the evas object from a part.
  *
  * @param obj A valid Evas_Object handle
  * @param part The Edje part
- * @return Returns the Evas_Object corresponding to the given part,
- * or NULL on failure (if the part doesn't exist)
+ * @return Returns the Evas_Object corresponding to the given part, or
+ * NULL on failure (if the part doesn't exist)
+ *
+ * This functio gets the Evas_Object corresponding to a given part.
+ *
+ * You should never modify the state of the returned object (with
+ * evas_object_move() or evas_object_hide() for example), but you can
+ * safely query info about its current state (with
+ * evas_object_visible_get() or evas_object_color_get() for example)
+ *
  **/
 EAPI const Evas_Object *
 edje_object_part_object_get(const Evas_Object *obj, const char *part)
@@ -816,7 +1130,9 @@ edje_object_part_object_get(const Evas_Object *obj, const char *part)
    return rp->object;
 }
 
-/** Get the geometry of an Edje part
+/**
+ * @brief Get the geometry of an Edje part.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The Edje part
  * @param x The x coordinate pointer
@@ -824,7 +1140,7 @@ edje_object_part_object_get(const Evas_Object *obj, const char *part)
  * @param w The width pointer
  * @param h The height pointer
  *
- * Gets the geometry of an Edje part
+ * This function gets the geometry of an Edje part.
  *
  * It is valid to pass NULL as any of @a x, @a y, @a w or @a h, whose
  * values you are uninterested in.
@@ -864,6 +1180,19 @@ edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coo
 }
 
 /* FIXDOC: New Function */
+/**
+ * @brief Set the object text callback.
+ *
+ * @param obj A valid Evas_Object handle
+ * @param func The callback function to handle the text change
+ * @param data The data associated to the callback function.
+ *
+ * This function gets the geometry of an Edje part
+ *
+ * It is valid to pass NULL as any of @a x, @a y, @a w or @a h, whose
+ * values you are uninterested in.
+ *
+ */
 EAPI void
 edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, const char *part), void *data)
 {
@@ -878,6 +1207,7 @@ edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, Evas_
    for (i = 0; i < ed->table_parts_size; i++)
      {
 	Edje_Real_Part *rp;
+
 	rp = ed->table_parts[i];
 	if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
 	  edje_object_text_change_cb_set(rp->swallowed_object, func, data);
@@ -902,6 +1232,9 @@ _edje_object_part_text_raw_set(Evas_Object *obj, Edje_Real_Part *rp, const char
    else
      if (text) rp->text.text = eina_stringshare_add(text);
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
    if (rp->edje->text_change.func)
      rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
@@ -927,10 +1260,16 @@ edje_object_part_text_set(Evas_Object *obj, const char *part, const char *text)
    _edje_object_part_text_raw_set(obj, rp, part, text);
 }
 
-/** Returns the text of the object part
+/**
+ * @brief Return the text of the object part.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
+ *
  * @return The text string
+ *
+ * This function returns the text associated to the object part.
+ *
  */
 EAPI const char *
 edje_object_part_text_get(const Evas_Object *obj, const char *part)
@@ -956,8 +1295,9 @@ edje_object_part_text_get(const Evas_Object *obj, const char *part)
      }
    return NULL;
 }
+
 static Eina_Bool
-_edje_strbuf_append(char **p_str, size_t *allocated, size_t *used, const char *news, size_t news_len)
+_edje_strbuf_append1(char **p_str, size_t *allocated, size_t *used, const char *news, size_t news_len)
 {
    if (*used + news_len >= *allocated)
      {
@@ -1011,12 +1351,12 @@ _edje_text_escape(const char *text)
 	else
 	  escaped_len = strlen(escaped);
 
-	if (!_edje_strbuf_append(&ret, &ret_len, &used, escaped, escaped_len))
+	if (!_edje_strbuf_append1(&ret, &ret_len, &used, escaped, escaped_len))
 	  return NULL;
 	text += advance;
      }
 
-   if (!_edje_strbuf_append(&ret, &ret_len, &used, "", 1))
+   if (!_edje_strbuf_append1(&ret, &ret_len, &used, "", 1))
      return NULL;
    return ret;
 }
@@ -1045,6 +1385,7 @@ _edje_text_unescape(const char *text)
 	  {
 	     size_t len;
 	     const char *str;
+
 	     if (last)
 	       {
 		  len = text - last;
@@ -1058,7 +1399,7 @@ _edje_text_unescape(const char *text)
 
 	     if (len > 0)
 	       {
-		  if (!_edje_strbuf_append(&ret, &ret_len, &used, str, len))
+		  if (!_edje_strbuf_append1(&ret, &ret_len, &used, str, len))
 		    return NULL;
 	       }
 
@@ -1070,6 +1411,7 @@ _edje_text_unescape(const char *text)
 	     size_t len;
 	     const char *str = evas_textblock_escape_string_range_get
 	       (escape_start, text);
+
 	     if (str)
 	       len = strlen(str);
 	     else
@@ -1078,7 +1420,7 @@ _edje_text_unescape(const char *text)
 		  len = text + 1 - escape_start;
 	       }
 
-	     if (!_edje_strbuf_append(&ret, &ret_len, &used, str, len))
+	     if (!_edje_strbuf_append1(&ret, &ret_len, &used, str, len))
 	       return NULL;
 
 	     escape_start = NULL;
@@ -1092,24 +1434,28 @@ _edje_text_unescape(const char *text)
    if (last && (text > last))
      {
 	size_t len = text - last;
-	if (!_edje_strbuf_append(&ret, &ret_len, &used, last, len))
+	if (!_edje_strbuf_append1(&ret, &ret_len, &used, last, len))
 	  return NULL;
      }
 
-   if (!_edje_strbuf_append(&ret, &ret_len, &used, "", 1))
+   if (!_edje_strbuf_append1(&ret, &ret_len, &used, "", 1))
      return NULL;
    return ret;
 }
 
-/** Sets the raw (non escaped) text for an object part.
- *
- * This will do escape for you if it is a TEXTBLOCK part, that is, if
- * text contain tags, these tags will not be interpreted/parsed by
- * TEXTBLOCK.
+/**
+ * @brief Sets the raw (non escaped) text for an object part.
  *
  * @param obj A valid Evas Object handle
  * @param part The part name
- * @param text The text string
+ * @param text_to_escape The text string
+ *
+ * This funciton will do escape for you if it is a TEXTBLOCK part,
+ * that is, if text contain tags, these tags will not be
+ * interpreted/parsed by TEXTBLOCK.
+ *
+ * @see edje_object_part_text_unescaped_get().
+ *
  */
 EAPI void
 edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const char *text_to_escape)
@@ -1126,20 +1472,27 @@ edje_object_part_text_unescaped_set(Evas_Object *obj, const char *part, const ch
    else if (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK)
      {
 	char *text = _edje_text_escape(text_to_escape);
+
 	_edje_object_part_text_raw_set(obj, rp, part, text);
 	free(text);
      }
 }
 
-/** Returns the text of the object part, without escaping.
- *
- * Counterpart of edje_object_part_text_unescaped_set(). Please notice
- * that the result is newly allocated memory and should be released
- * with free() when done.
+/**
+ * @brief Returns the text of the object part, without escaping.
  *
  * @param obj A valid Evas_Object handle
  * @param part The part name
- * @return The @b allocated text string without escaping, or NULL on problems.
+ * @return The @b allocated text string without escaping, or NULL on
+ * problems.
+ *
+ * This function is the counterpart of
+ * edje_object_part_text_unescaped_set(). Please notice that the
+ * result is newly allocated memory and should be released with free()
+ * when done.
+ *
+ * @see edje_object_part_text_unescaped_set().
+ *
  */
 EAPI char *
 edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
@@ -1172,11 +1525,15 @@ edje_object_part_text_unescaped_get(const Evas_Object *obj, const char *part)
    return NULL;
 }
 
-
-/** Returns the selection text of the object part
+/**
+ * @brief Return the selection text of the object part.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @return The text string
+ *
+ * This function returns selection text of the object part.
+ *
  */
 EAPI const char *
 edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
@@ -1193,9 +1550,14 @@ edje_object_part_text_selection_get(const Evas_Object *obj, const char *part)
    return NULL;
 }
 
-/** sets the selection to be none
+/**
+ * @brief Set the selection to be none.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
+ *
+ * This function sets the selection text to be none.
+ *
  */
 EAPI void
 edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
@@ -1211,9 +1573,14 @@ edje_object_part_text_select_none(const Evas_Object *obj, const char *part)
      _edje_entry_select_none(rp);
 }
 
-/** sets the selection to be everything
+/**
+ * @brief Set the selection to be everything.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
+ *
+ * This function selects all text of the object of the part.
+ *
  */
 EAPI void
 edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
@@ -1229,10 +1596,16 @@ edje_object_part_text_select_all(const Evas_Object *obj, const char *part)
      _edje_entry_select_all(rp);
 }
 
-/** Inserts the text for an object part just before the cursor position
+/**
+ * @brief Insert text for an object part.
+ *
  * @param obj A valid Evas Object handle
  * @param part The part name
  * @param text The text string
+ *
+ * This function inserts the text for an object part just before the
+ * cursor position.
+ *
  */
 EAPI void
 edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *text)
@@ -1248,15 +1621,24 @@ edje_object_part_text_insert(Evas_Object *obj, const char *part, const char *tex
    if (rp->part->entry_mode <= EDJE_ENTRY_EDIT_MODE_NONE) return;
    _edje_entry_text_markup_insert(rp, text);
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
    if (rp->edje->text_change.func)
      rp->edje->text_change.func(rp->edje->text_change.data, obj, part);
 }
 
-/** Returns a list of char * anchor names
+/**
+ * @brief Return a list of char anchor names.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
+ *
  * @return The list of anchors (const char *), do not modify!
+ *
+ * This function returns a list of char anchor names.
+ *
  */
 EAPI const Eina_List *
 edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
@@ -1273,11 +1655,19 @@ edje_object_part_text_anchor_list_get(const Evas_Object *obj, const char *part)
    return NULL;
 }
 
-/** Returns a list of Evas_Textblock_Rectangle * anchor rectangles
+/**
+ * @brief Return a list of Evas_Textblock_Rectangle anchor rectangles.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param anchor The anchor name
- * @return The list of anchor rects (const Evas_Textblock_Rectangle *), do not modify!
+ *
+ * @return The list of anchor rects (const Evas_Textblock_Rectangle
+ * *), do not modify!
+ *
+ * This function return a list of Evas_Textblock_Rectangle anchor
+ * rectangles.
+ *
  */
 EAPI const Eina_List *
 edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *part, const char *anchor)
@@ -1294,13 +1684,17 @@ edje_object_part_text_anchor_geometry_get(const Evas_Object *obj, const char *pa
    return NULL;
 }
 
-/** Returns the cursor geometry of the part relative to the edje object
+/**
+ * @brief Returns the cursor geometry of the part relative to the edje
+ * object.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param x Cursor X position
  * @param y Cursor Y position
  * @param w Cursor width
  * @param h Cursor height
+ *
  */
 EAPI void
 edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
@@ -1325,9 +1719,13 @@ edje_object_part_text_cursor_geometry_get(const Evas_Object *obj, const char *pa
    return;
 }
 
-/** Enables selection if the entyr is an EXPLICIT selection mode type
+/**
+ * @brief Enables selection if the entry is an EXPLICIT selection mode
+ * type.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
+ * @param allow EINA_TRUE to enable, EINA_FALSE otherwise
  */
 EAPI void
 edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part, Eina_Bool allow)
@@ -1343,7 +1741,9 @@ edje_object_part_text_select_allow_set(const Evas_Object *obj, const char *part,
      _edje_entry_select_allow_set(rp, allow);
 }
 
-/** Aborts any selection action on a part
+/**
+ * @brief Aborts any selection action on a part.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  */
@@ -1361,7 +1761,280 @@ edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
      _edje_entry_select_abort(rp);
 }
 
-/** Swallows an object into the edje
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI Eina_Bool
+edje_object_part_text_cursor_next(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return 0;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_next(rp, cur);
+     }
+   return 0;
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI Eina_Bool
+edje_object_part_text_cursor_prev(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return 0;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_prev(rp, cur);
+     }
+   return 0;
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI Eina_Bool
+edje_object_part_text_cursor_up(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return 0;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_up(rp, cur);
+     }
+   return 0;
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI Eina_Bool
+edje_object_part_text_cursor_down(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return 0;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_down(rp, cur);
+     }
+   return 0;
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI void
+edje_object_part_text_cursor_begin_set(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        _edje_entry_cursor_begin(rp, cur);
+     }
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI void
+edje_object_part_text_cursor_end_set(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        _edje_entry_cursor_end(rp, cur);
+     }
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI void
+edje_object_part_text_cursor_copy(const Evas_Object *obj, const char *part, Edje_Cursor src, Edje_Cursor dst)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        _edje_entry_cursor_copy(rp, src, dst);
+     }
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI void
+edje_object_part_text_cursor_line_begin_set(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        _edje_entry_cursor_line_begin(rp, cur);
+     }
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI void
+edje_object_part_text_cursor_line_end_set(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        _edje_entry_cursor_line_end(rp, cur);
+     }
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI Eina_Bool
+edje_object_part_text_cursor_is_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return 0;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_is_format_get(rp, cur);
+     }
+   return 0;
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI Eina_Bool
+edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return 0;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return 0;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_is_visible_format_get(rp, cur);
+     }
+   return 0;
+}
+
+/**
+ * @brief XX
+ * 
+ * @param obj A valid Evas_Object handle
+ * @param part The part name
+ */
+EAPI const char *
+edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *part, Edje_Cursor cur)
+{
+   Edje *ed;
+   Edje_Real_Part *rp;
+
+   ed = _edje_fetch(obj);
+   if ((!ed) || (!part)) return NULL;
+   rp = _edje_real_part_recursive_get(ed, (char *)part);
+   if (!rp) return NULL;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        return _edje_entry_cursor_content_get(rp, cur);
+     }
+   return NULL;
+}
+
+/**
+ * @brief Swallows an object into the edje.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param obj_swallow The object to swallow
@@ -1370,8 +2043,8 @@ edje_object_part_text_select_abort(const Evas_Object *obj, const char *part)
  * for the part affect the swallowed object. (e.g. resize, move, show,
  * raise/lower, etc.).
  *
- * If an object has already been swallowed into this part, then it will
- * first be unswallowed before the new object is swallowed.
+ * If an object has already been swallowed into this part, then it
+ * will first be unswallowed before the new object is swallowed.
  */
 EAPI void
 edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_swallow)
@@ -1394,7 +2067,12 @@ edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object *obj_sw
 
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
-   if (rp->part->type != EDJE_PART_TYPE_SWALLOW) return;
+   if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
+     {
+	fprintf(stderr, "ERROR: cannot unswallow part %s: not swallow type!\n",
+		rp->part->name);
+	return;
+     }
    _edje_real_part_swallow(rp, obj_swallow);
 }
 
@@ -1411,7 +2089,9 @@ _recalc_extern_parent(Evas_Object *obj)
    _edje_recalc(ed);
 }
 
-/** Set the object minimum size
+/**
+ * @brief Set the object minimum size.
+ *
  * @param obj A valid Evas_Object handle
  * @param minw The minimum width
  * @param minh The minimum height
@@ -1434,7 +2114,9 @@ edje_extern_object_min_size_set(Evas_Object *obj, Evas_Coord minw, Evas_Coord mi
      }
 }
 
-/** Set the object maximum size
+/**
+ * @brief Set the object maximum size.
+ *
  * @param obj A valid Evas_Object handle
  * @param maxw The maximum width
  * @param maxh The maximum height
@@ -1457,16 +2139,18 @@ edje_extern_object_max_size_set(Evas_Object *obj, Evas_Coord maxw, Evas_Coord ma
      }
 }
 
-/** Set the object aspect size
+/**
+ * @brief Set the object aspect size.
+ *
  * @param obj A valid Evas_Object handle
  * @param aspect The aspect control axes
  * @param aw The aspect radio width
  * @param ah The aspect ratio height
  *
- * This sets the desired aspect ratio to keep an object that will be swallowed
- * by Edje. The width and height define a preferred size ASPECT and the
- * object may be scaled to be larger or smaller, but retaining the relative
- * scale of both aspect width and height.
+ * This sets the desired aspect ratio to keep an object that will be
+ * swallowed by Edje. The width and height define a preferred size
+ * ASPECT and the object may be scaled to be larger or smaller, but
+ * retaining the relative scale of both aspect width and height.
  */
 EAPI void
 edje_extern_object_aspect_set(Evas_Object *obj, Edje_Aspect_Control aspect, Evas_Coord aw, Evas_Coord ah)
@@ -1631,23 +2315,27 @@ _edje_box_layout_external_new(const char *name, Evas_Object_Box_Layout func, voi
    return l;
 }
 
-/** Registers a custom layout to be used in edje boxes
+/**
+ * @brief Registers a custom layout to be used in edje boxes.
+ *
  * @param name The name of the layout
  * @param func The function defining the layout
- * @param layout_data_get This function gets the custom data pointer for func
- * @param layout_data_free Passed to func to free its private data when needed
+ * @param layout_data_get This function gets the custom data pointer
+ * for func
+ * @param layout_data_free Passed to func to free its private data
+ * when needed
  * @param free_data Frees data
  * @param data Private pointer passed to layout_data_get
  *
- * This function registers custom layouts that can be referred from themes
- * by the registered name.
- * The Evas_Object_Box_Layout functions receive two pointers for internal
- * use, one being private data, and the other the function to free that
- * data when it's not longer needed. From Edje, this private data will be
- * retrieved by calling layout_data_get, and layout_data_free will be the
- * free function passed to func. layout_data_get will be called with data
- * as its parameter, and this one will be freed by free_data whenever the
- * layout is unregistered from Edje.
+ * This function registers custom layouts that can be referred from
+ * themes by the registered name. The Evas_Object_Box_Layout
+ * functions receive two pointers for internal use, one being private
+ * data, and the other the function to free that data when it's not
+ * longer needed. From Edje, this private data will be retrieved by
+ * calling layout_data_get, and layout_data_free will be the free
+ * function passed to func. layout_data_get will be called with data
+ * as its parameter, and this one will be freed by free_data whenever
+ * the layout is unregistered from Edje.
  */
 EAPI void
 edje_box_layout_register(const char *name, Evas_Object_Box_Layout func, void *(*layout_data_get)(void *), void (*layout_data_free)(void *), void (*free_data)(void *), void *data)
@@ -1708,26 +2396,41 @@ edje_box_layout_register(const char *name, Evas_Object_Box_Layout func, void *(*
      }
 }
 
-/** Unswallow an object
+/**
+ * @brief Unswallow an object.
+ *
  * @param obj A valid Evas_Object handle
  * @param obj_swallow The swallowed object
  *
  * Causes the edje to regurgitate a previously swallowed object.  :)
  */
 EAPI void
-edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
+edje_object_part_unswallow(Evas_Object *obj __UNUSED__, Evas_Object *obj_swallow)
 {
    Edje_Real_Part *rp;
 
    if (!obj_swallow) return;
 
    rp = (Edje_Real_Part *)evas_object_data_get(obj_swallow, "\377 edje.swallowing_part");
-   if (rp && rp->swallowed_object == obj_swallow)
+   if (!rp)
+     return;
+   if (rp->part->type != EDJE_PART_TYPE_SWALLOW)
+     {
+	fprintf(stderr, "ERROR: cannot unswallow part %s: not swallow type!\n",
+		rp->part->name);
+	return;
+     }
+   if (rp->swallowed_object == obj_swallow)
      {
 	evas_object_smart_member_del(rp->swallowed_object);
-	evas_object_event_callback_del(rp->swallowed_object,
-                                       EVAS_CALLBACK_FREE,
-                                       _edje_object_part_swallow_free_cb);
+	evas_object_event_callback_del_full(rp->swallowed_object,
+                                            EVAS_CALLBACK_FREE,
+                                            _edje_object_part_swallow_free_cb,
+                                            rp->edje->obj);
+	evas_object_event_callback_del_full(rp->swallowed_object,
+                                            EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                            _edje_object_part_swallow_changed_hints_cb,
+                                            rp);
 	evas_object_clip_unset(rp->swallowed_object);
 	evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
 
@@ -1740,12 +2443,17 @@ edje_object_part_unswallow(Evas_Object *obj, Evas_Object *obj_swallow)
 	rp->swallow_params.max.w = 0;
 	rp->swallow_params.max.h = 0;
 	rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	rp->invalidate = 1;
+#endif
 	_edje_recalc_do(rp->edje);
 	return;
      }
 }
 
-/** Get the object currently swallowed by a part
+/**
+ * @brief Get the object currently swallowed by a part.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @return The swallowed object, or NULL if there is none.
@@ -1767,7 +2475,9 @@ edje_object_part_swallow_get(const Evas_Object *obj, const char *part)
    return rp->swallowed_object;
 }
 
-/** Get the minimum size for an object
+/**
+ * @brief Get the minimum size for an object.
+ *
  * @param obj A valid Evas_Object handle
  * @param minw Minimum width pointer
  * @param minh Minimum height pointer
@@ -1791,12 +2501,14 @@ edje_object_size_min_get(const Evas_Object *obj, Evas_Coord *minw, Evas_Coord *m
    if (minh) *minh = ed->collection->prop.min.h;
 }
 
-/** Get the maximum size for an object
+/**
+ * @brief Get the maximum size for an object.
+ *
  * @param obj A valid Evas_Object handle
  * @param maxw Maximum width pointer
  * @param maxh Maximum height pointer
  *
- * Gets the object's maximum size values from the Edje.  These are set
+ * Gets the object's maximum size values from the Edje. These are set
  * to zero if no Edje is connected to the Evas Object.
  */
 EAPI void
@@ -1835,7 +2547,9 @@ edje_object_size_max_get(const Evas_Object *obj, Evas_Coord *maxw, Evas_Coord *m
      }
 }
 
-/** Force a Size/Geometry calculation
+/**
+ * @brief Force a Size/Geometry calculation.
+ *
  * @param obj A valid Evas_Object handle
  *
  * Forces the object @p obj to recalculation layout regardless of
@@ -1850,7 +2564,10 @@ edje_object_calc_force(Evas_Object *obj)
    ed = _edje_fetch(obj);
    if (!ed) return;
    ed->dirty = 1;
-   
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
+
    pf2 = _edje_freeze_val;
    pf = ed->freeze;
    
@@ -1863,7 +2580,9 @@ edje_object_calc_force(Evas_Object *obj)
    _edje_freeze_val = pf2;
 }
 
-/** Calculate minimum size
+/**
+ * @brief Calculate minimum size.
+ *
  * @param obj A valid Evas_Object handle
  * @param minw Minimum width pointer
  * @param minh Minimum height pointer
@@ -1921,6 +2640,9 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
 
 	ok = 0;
 	ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+	ed->all_part_change = 1;
+#endif
 	_edje_recalc_do(ed);
 	if (reset_maxwh)
 	  {
@@ -1938,33 +2660,34 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
 	     w = ep->w - ep->req.w;
 	     h = ep->h - ep->req.h;
 	     didw = 0;
-	     if (!((ep->chosen_description) &&
-		   (ep->chosen_description->fixed.w)))
+	     if (ep->chosen_description)
 	       {
-		  if (w > maxw)
+		  if (!ep->chosen_description->fixed.w)
 		    {
-		       maxw = w;
-		       ok = 1;
-		       pep = ep;
-		       didw = 1;
-		    }
-		  if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
-		    {
-		       /* FIXME: do something */
-		    }
-	       }
-	     if (!((ep->chosen_description) &&
-		   (ep->chosen_description->fixed.h)))
-	       {
-		  if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
-			(!ep->chosen_description->text.min_x) &&
-			(didw)))
-		    {
-		       if (h > maxh)
+		       if (w > maxw)
 			 {
-			    maxh = h;
+			    maxw = w;
 			    ok = 1;
 			    pep = ep;
+			    didw = 1;
+			 }
+		       if ((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK))
+			 {
+			    /* FIXME: do something */
+			 }
+		    }
+		  if (!ep->chosen_description->fixed.h)
+		    {
+		       if (!((ep->part->type == EDJE_PART_TYPE_TEXTBLOCK) &&
+			     (!ep->chosen_description->text.min_x) &&
+			     (didw)))
+			 {
+			    if (h > maxh)
+			      {
+				 maxh = h;
+				 ok = 1;
+				 pep = ep;
+			      }
 			 }
 		    }
 	       }
@@ -1999,11 +2722,16 @@ edje_object_size_min_restricted_calc(Evas_Object *obj, Evas_Coord *minw, Evas_Co
    ed->w = pw;
    ed->h = ph;
    ed->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   ed->all_part_change = 1;
+#endif
    _edje_recalc(ed);
    ed->calc_only = 0;
 }
 
-/** Returns the state of the Edje part
+/**
+ * @brief Returns the state of the Edje part.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param val_ret
@@ -2033,9 +2761,10 @@ edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val
    if (!rp)
      {
 	if (val_ret) *val_ret = 0;
+	printf("part not found\n");
 	return "";
      }
-   if (!rp->chosen_description)
+   if (rp->chosen_description)
      {
 	if (val_ret) *val_ret = rp->chosen_description->state.value;
 	if (rp->chosen_description->state.name)
@@ -2056,7 +2785,9 @@ edje_object_part_state_get(const Evas_Object *obj, const char *part, double *val
    return "";
 }
 
-/** Determine dragable directions
+/**
+ * @brief Determine dragable directions.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  *
@@ -2085,7 +2816,9 @@ edje_object_part_drag_dir_get(const Evas_Object *obj, const char *part)
    return EDJE_DRAG_DIR_NONE;
 }
 
-/** Set the dragable object location
+/**
+ * @brief Set the dragable object location.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The x value
@@ -2103,7 +2836,8 @@ edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, d
    if ((!ed) || (!part)) return;
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
-   if (rp->drag.down.count > 0) return;
+   if (!rp->drag) return;
+   if (rp->drag->down.count > 0) return;
    if (rp->part->dragable.confine_id != -1)
      {
 	dx = CLAMP(dx, 0.0, 1.0);
@@ -2111,14 +2845,19 @@ edje_object_part_drag_value_set(Evas_Object *obj, const char *part, double dx, d
      }
    if (rp->part->dragable.x < 0) dx = 1.0 - dx;
    if (rp->part->dragable.y < 0) dy = 1.0 - dy;
-   if ((rp->drag.val.x == dx) && (rp->drag.val.y == dy)) return;
-   rp->drag.val.x = dx;
-   rp->drag.val.y = dy;
+   if ((rp->drag->val.x == dx) && (rp->drag->val.y == dy)) return;
+   rp->drag->val.x = dx;
+   rp->drag->val.y = dy;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_dragable_pos_set(rp->edje, rp, dx, dy);
    _edje_emit(rp->edje, "drag,set", rp->part->name);
 }
 
-/** Get the dragable object location
+/**
+ * @brief Get the dragable object location.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The X value pointer
@@ -2146,21 +2885,23 @@ edje_object_part_drag_value_get(const Evas_Object *obj, const char *part, double
    _edje_recalc_do(ed);
 
    rp = _edje_real_part_recursive_get(ed, (char *)part);
-   if (!rp)
+   if (!rp || !rp->drag)
      {
 	if (dx) *dx = 0;
 	if (dy) *dy = 0;
 	return;
      }
-   ddx = rp->drag.val.x;
-   ddy = rp->drag.val.y;
+   ddx = rp->drag->val.x;
+   ddy = rp->drag->val.y;
    if (rp->part->dragable.x < 0) ddx = 1.0 - ddx;
    if (rp->part->dragable.y < 0) ddy = 1.0 - ddy;
    if (dx) *dx = ddx;
    if (dy) *dy = ddy;
 }
 
-/** Set the dragable object size
+/**
+ * @brief Set the dragable object size.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dw The drag width
@@ -2178,18 +2919,24 @@ edje_object_part_drag_size_set(Evas_Object *obj, const char *part, double dw, do
    if ((!ed) || (!part)) return;
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
+   if (!rp->drag) return;
    if (dw < 0.0) dw = 0.0;
    else if (dw > 1.0) dw = 1.0;
    if (dh < 0.0) dh = 0.0;
    else if (dh > 1.0) dh = 1.0;
-   if ((rp->drag.size.x == dw) && (rp->drag.size.y == dh)) return;
-   rp->drag.size.x = dw;
-   rp->drag.size.y = dh;
+   if ((rp->drag->size.x == dw) && (rp->drag->size.y == dh)) return;
+   rp->drag->size.x = dw;
+   rp->drag->size.y = dh;
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
-/** Get the dragable object size
+/**
+ * @brief Get the dragable object size.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dw The drag width pointer
@@ -2215,17 +2962,19 @@ edje_object_part_drag_size_get(const Evas_Object *obj, const char *part, double
    _edje_recalc_do(ed);
 
    rp = _edje_real_part_recursive_get(ed, (char *)part);
-   if (!rp)
+   if (!rp || !rp->drag)
      {
 	if (dw) *dw = 0;
 	if (dh) *dh = 0;
 	return;
      }
-   if (dw) *dw = rp->drag.size.x;
-   if (dh) *dh = rp->drag.size.y;
+   if (dw) *dw = rp->drag->size.x;
+   if (dh) *dh = rp->drag->size.y;
 }
 
-/** Sets the drag step increment
+/**
+ * @brief Sets the drag step increment.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The x step ammount
@@ -2243,15 +2992,21 @@ edje_object_part_drag_step_set(Evas_Object *obj, const char *part, double dx, do
    if ((!ed) || (!part)) return;
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
+   if (!rp->drag) return;
    if (dx < 0.0) dx = 0.0;
    else if (dx > 1.0) dx = 1.0;
    if (dy < 0.0) dy = 0.0;
    else if (dy > 1.0) dy = 1.0;
-   rp->drag.step.x = dx;
-   rp->drag.step.y = dy;
+   rp->drag->step.x = dx;
+   rp->drag->step.y = dy;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
 }
 
-/** Gets the drag step increment values.
+/**
+ * @brief Gets the drag step increment values.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part
  * @param dx The x step increment pointer
@@ -2277,17 +3032,19 @@ edje_object_part_drag_step_get(const Evas_Object *obj, const char *part, double
    _edje_recalc_do(ed);
 
    rp = _edje_real_part_recursive_get(ed, (char *)part);
-   if (!rp)
+   if (!rp || !rp->drag)
      {
 	if (dx) *dx = 0;
 	if (dy) *dy = 0;
 	return;
      }
-   if (dx) *dx = rp->drag.step.x;
-   if (dy) *dy = rp->drag.step.y;
+   if (dx) *dx = rp->drag->step.x;
+   if (dy) *dy = rp->drag->step.y;
 }
 
-/** Sets the page step increments
+/**
+ * @brief Sets the page step increments.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The x page step increment
@@ -2305,15 +3062,21 @@ edje_object_part_drag_page_set(Evas_Object *obj, const char *part, double dx, do
    if ((!ed) || (!part)) return;
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
+   if (!rp->drag) return;
    if (dx < 0.0) dx = 0.0;
    else if (dx > 1.0) dx = 1.0;
    if (dy < 0.0) dy = 0.0;
    else if (dy > 1.0) dy = 1.0;
-   rp->drag.page.x = dx;
-   rp->drag.page.y = dy;
+   rp->drag->page.x = dx;
+   rp->drag->page.y = dy;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
 }
 
-/** Gets the page step increments
+/**
+ * @brief Gets the page step increments.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The dx page increment pointer
@@ -2339,17 +3102,19 @@ edje_object_part_drag_page_get(const Evas_Object *obj, const char *part, double
    _edje_recalc_do(ed);
 
    rp = _edje_real_part_recursive_get(ed, (char *)part);
-   if (!rp)
+   if (!rp || !rp->drag)
      {
 	if (dx) *dx = 0;
 	if (dy) *dy = 0;
 	return;
      }
-   if (dx) *dx = rp->drag.page.x;
-   if (dy) *dy = rp->drag.page.y;
+   if (dx) *dx = rp->drag->page.x;
+   if (dy) *dy = rp->drag->page.y;
 }
 
-/** Steps the dragable x,y steps
+/**
+ * @brief Steps the dragable x,y steps.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The x step
@@ -2369,26 +3134,32 @@ edje_object_part_drag_step(Evas_Object *obj, const char *part, double dx, double
    if ((!ed) || (!part)) return;
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
-   if (rp->drag.down.count > 0) return;
-   px = rp->drag.val.x;
-   py = rp->drag.val.y;
-   rp->drag.val.x += dx * rp->drag.step.x * rp->part->dragable.x;
-   rp->drag.val.y += dy * rp->drag.step.y * rp->part->dragable.y;
-   rp->drag.val.x = CLAMP (rp->drag.val.x, 0.0, 1.0);
-   rp->drag.val.y = CLAMP (rp->drag.val.y, 0.0, 1.0);
-   if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return;
-   _edje_dragable_pos_set(rp->edje, rp, rp->drag.val.x, rp->drag.val.y);
+   if (!rp->drag) return;
+   if (rp->drag->down.count > 0) return;
+   px = rp->drag->val.x;
+   py = rp->drag->val.y;
+   rp->drag->val.x += dx * rp->drag->step.x * rp->part->dragable.x;
+   rp->drag->val.y += dy * rp->drag->step.y * rp->part->dragable.y;
+   rp->drag->val.x = CLAMP (rp->drag->val.x, 0.0, 1.0);
+   rp->drag->val.y = CLAMP (rp->drag->val.y, 0.0, 1.0);
+   if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
+   _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
    _edje_emit(rp->edje, "drag,step", rp->part->name);
 }
 
-/** Pages x,y steps
+/**
+ * @brief Pages x,y steps.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param dx The x step
  * @param dy The y step
  *
- * Pages x,y where the increment is defined by edje_object_part_drag_page_set.\n
- * WARNING: Paging is bugged!
+ * Pages x,y where the increment is defined by
+ * edje_object_part_drag_page_set.\n WARNING: Paging is bugged!
  */
 EAPI void
 edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double dy)
@@ -2401,21 +3172,26 @@ edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double
    if ((!ed) || (!part)) return;
    rp = _edje_real_part_recursive_get(ed, (char *)part);
    if (!rp) return;
-   if (rp->drag.down.count > 0) return;
-   px = rp->drag.val.x;
-   py = rp->drag.val.y;
-   rp->drag.val.x += dx * rp->drag.page.x * rp->part->dragable.x;
-   rp->drag.val.y += dy * rp->drag.page.y * rp->part->dragable.y;
-   rp->drag.val.x = CLAMP (rp->drag.val.x, 0.0, 1.0);
-   rp->drag.val.y = CLAMP (rp->drag.val.y, 0.0, 1.0);
-   if ((px == rp->drag.val.x) && (py == rp->drag.val.y)) return;
-   _edje_dragable_pos_set(rp->edje, rp, rp->drag.val.x, rp->drag.val.y);
+   if (!rp->drag) return;
+   if (rp->drag->down.count > 0) return;
+   px = rp->drag->val.x;
+   py = rp->drag->val.y;
+   rp->drag->val.x += dx * rp->drag->page.x * rp->part->dragable.x;
+   rp->drag->val.y += dy * rp->drag->page.y * rp->part->dragable.y;
+   rp->drag->val.x = CLAMP (rp->drag->val.x, 0.0, 1.0);
+   rp->drag->val.y = CLAMP (rp->drag->val.y, 0.0, 1.0);
+   if ((px == rp->drag->val.x) && (py == rp->drag->val.y)) return;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
+   _edje_dragable_pos_set(rp->edje, rp, rp->drag->val.x, rp->drag->val.y);
    _edje_emit(rp->edje, "drag,page", rp->part->name);
 }
 
 void
 _edje_box_init(void)
 {
+
 }
 
 void
@@ -2429,7 +3205,9 @@ _edje_box_shutdown(void)
    _edje_box_layout_registry = NULL;
 }
 
-/** Appends an object to the box
+/**
+ * @brief Appends an object to the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param child The object to append
@@ -2437,7 +3215,7 @@ _edje_box_shutdown(void)
  * @return 1: Successfully added.\n
  * 0: An error occured.
  *
- * Appends child to the box indicated by part.\n
+ * Appends child to the box indicated by part.
  */
 EAPI Eina_Bool
 edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *child)
@@ -2455,7 +3233,9 @@ edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *chi
    return _edje_real_part_box_append(rp, child);
 }
 
-/** Prepends an object to the box
+/**
+ * @brief Prepends an object to the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param child The object to prepend
@@ -2463,7 +3243,7 @@ edje_object_part_box_append(Evas_Object *obj, const char *part, Evas_Object *chi
  * @return 1: Successfully added.\n
  * 0: An error occured.
  *
- * Prepends child to the box indicated by part.\n
+ * Prepends child to the box indicated by part.
  */
 EAPI Eina_Bool
 edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *child)
@@ -2481,7 +3261,9 @@ edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *ch
    return _edje_real_part_box_prepend(rp, child);
 }
 
-/** Adds an object to the box
+/**
+ * @brief Adds an object to the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param child The object to insert
@@ -2490,7 +3272,8 @@ edje_object_part_box_prepend(Evas_Object *obj, const char *part, Evas_Object *ch
  * @return 1: Successfully added.\n
  * 0: An error occured.
  *
- * Inserts child in the box given by part, in the position marked by reference.\n
+ * Inserts child in the box given by part, in the position marked by
+ * reference.
  */
 EAPI Eina_Bool
 edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Object *child, const Evas_Object *reference)
@@ -2508,7 +3291,9 @@ edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Obje
    return _edje_real_part_box_insert_before(rp, child, reference);
 }
 
-/** Inserts an object to the box
+/**
+ * @brief Inserts an object to the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param child The object to insert
@@ -2517,7 +3302,8 @@ edje_object_part_box_insert_before(Evas_Object *obj, const char *part, Evas_Obje
  * @return 1: Successfully added.\n
  * 0: An error occured.
  *
- * Adds child to the box indicated by part, in the position given by pos.\n
+ * Adds child to the box indicated by part, in the position given by
+ * pos.
  */
 EAPI Eina_Bool
 edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *child, unsigned int pos)
@@ -2535,15 +3321,16 @@ edje_object_part_box_insert_at(Evas_Object *obj, const char *part, Evas_Object *
    return _edje_real_part_box_insert_at(rp, child, pos);
 }
 
-/** Removes an object from the box
+/**
+ * @brief Removes an object from the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param child The object to remove
  *
- * @return 1: Successfully removed.\n
- * 0: An error occured.
+ * @return Pointer to the object removed, or NULL.
  *
- * Removes child from the box indicated by part.\n
+ * Removes child from the box indicated by part.
  */
 EAPI Evas_Object *
 edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *child)
@@ -2561,15 +3348,17 @@ edje_object_part_box_remove(Evas_Object *obj, const char *part, Evas_Object *chi
    return _edje_real_part_box_remove(rp, child);
 }
 
-/** Removes an object from the box
+/**
+ * @brief Removes an object from the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param pos
  *
- * @return 1: Successfully removed.\n
- * 0: An error occured.
+ * @return Pointer to the object removed, or NULL.
  *
- * Removes from the box indicated by part, the object in the position pos.\n
+ * Removes from the box indicated by part, the object in the position
+ * pos.
  */
 EAPI Evas_Object *
 edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int pos)
@@ -2587,7 +3376,9 @@ edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int
    return _edje_real_part_box_remove_at(rp, pos);
 }
 
-/** Removes all elements from the box
+/**
+ * @brief Removes all elements from the box.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param clear Delete objects on removal
@@ -2596,7 +3387,7 @@ edje_object_part_box_remove_at(Evas_Object *obj, const char *part, unsigned int
  * 0: An error occured.
  *
  * Removes all the external objects from the box indicated by part.
- * Elements created from the theme will not be removed.\n
+ * Elements created from the theme will not be removed.
  */
 EAPI Eina_Bool
 edje_object_part_box_remove_all(Evas_Object *obj, const char *part, Eina_Bool clear)
@@ -2619,7 +3410,11 @@ static void
 _edje_box_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
 {
    Edje_Real_Part *rp = data;
+
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
@@ -2630,6 +3425,9 @@ _edje_box_child_add(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
@@ -2640,6 +3438,9 @@ _edje_box_child_remove(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_box_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
@@ -2725,9 +3526,8 @@ Eina_Bool
 _edje_real_part_box_remove_all(Edje_Real_Part *rp, Eina_Bool clear)
 {
    Eina_List *children;
-   int i;
+   int i = 0;
 
-   i = 0;
    children = evas_object_box_children_get(rp->object);
    while (children)
      {
@@ -2751,7 +3551,11 @@ static void
 _edje_table_child_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *child __UNUSED__, void *einfo __UNUSED__)
 {
    Edje_Real_Part *rp = data;
+
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
@@ -2762,6 +3566,9 @@ _edje_table_child_add(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
@@ -2772,13 +3579,18 @@ _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
      (child, EVAS_CALLBACK_DEL, _edje_table_child_del_cb, rp);
 
    rp->edje->dirty = 1;
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
    _edje_recalc(rp->edje);
 }
 
-/** Packs an object into the table
+/**
+ * @brief Packs an object into the table.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
- * @param child The object to pack in
+ * @param child_obj The object to pack in
  * @param col The column to place it in
  * @param row The row to place it in
  * @param colspan Columns the child will take
@@ -2787,7 +3599,7 @@ _edje_table_child_remove(Edje_Real_Part *rp, Evas_Object *child)
  * @return 1: Successfully added.\n
  * 0: An error occured.
  *
- * Packs an object into the table indicated by part.\n
+ * Packs an object into the table indicated by part.
  */
 EAPI Eina_Bool
 edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
@@ -2805,15 +3617,17 @@ edje_object_part_table_pack(Evas_Object *obj, const char *part, Evas_Object *chi
    return _edje_real_part_table_pack(rp, child_obj, col, row, colspan, rowspan);
 }
 
-/** Removes an object from the table
+/**
+ * @brief Removes an object from the table.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
- * @param child The object to pack in
+ * @param child_obj The object to pack in
  *
  * @return 1: Successfully removed.\n
  * 0: An error occured.
  *
- * Removes an object from the table indicated by part.\n
+ * Removes an object from the table indicated by part.
  */
 EAPI Eina_Bool
 edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *child_obj)
@@ -2831,7 +3645,9 @@ edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *c
    return _edje_real_part_table_unpack(rp, child_obj);
 }
 
-/** Gets the number of columns and rows the table has
+/**
+ * @brief Gets the number of columns and rows the table has.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param cols Pointer where to store number of columns (can be NULL)
@@ -2840,7 +3656,7 @@ edje_object_part_table_unpack(Evas_Object *obj, const char *part, Evas_Object *c
  * @return 1: Successfully get some data.\n
  * 0: An error occured.
  *
- * Retrieves the size of the table in number of columns and rows.\n
+ * Retrieves the size of the table in number of columns and rows.
  */
 EAPI Eina_Bool
 edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part, int *cols, int *rows)
@@ -2859,7 +3675,9 @@ edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part
    return EINA_TRUE;
 }
 
-/** Removes all object from the table
+/**
+ * @brief Removes all object from the table.
+ *
  * @param obj A valid Evas_Object handle
  * @param part The part name
  * @param clear If set, will delete subobjs on remove
@@ -2867,8 +3685,8 @@ edje_object_part_table_col_row_size_get(const Evas_Object *obj, const char *part
  * @return 1: Successfully clear table.\n
  * 0: An error occured.
  *
- * Removes all object from the table indicated by part, except
- * the internal ones set from the theme.\n
+ * Removes all object from the table indicated by part, except the
+ * internal ones set from the theme.
  */
 EAPI Eina_Bool
 edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear)
@@ -2890,7 +3708,8 @@ edje_object_part_table_clear(Evas_Object *obj, const char *part, Eina_Bool clear
 Eina_Bool
 _edje_real_part_table_pack(Edje_Real_Part *rp, Evas_Object *child_obj, unsigned short col, unsigned short row, unsigned short colspan, unsigned short rowspan)
 {
-   Eina_Bool ret = evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
+   Eina_Bool ret = 
+     evas_object_table_pack(rp->object, child_obj, col, row, colspan, rowspan);
 
    _edje_table_child_add(rp, child_obj);
 
@@ -2917,6 +3736,7 @@ _edje_real_part_table_clear(Edje_Real_Part *rp, Eina_Bool clear)
    while (children)
      {
 	Evas_Object *child_obj = children->data;
+
 	_edje_table_child_remove(rp, child_obj);
 	if (!evas_object_data_get(child_obj, "\377 edje.table_item"))
 	  {
@@ -2933,6 +3753,7 @@ _edje_real_part_recursive_get(Edje *ed, const char *part)
 {
    Edje_Real_Part *rp;
    char **path;
+
    path = ecore_str_split(part, EDJE_PART_PATH_SEPARATOR_STRING, 0);
    if (!path) return NULL;
 
@@ -2948,6 +3769,7 @@ Edje_Real_Part *
 _edje_real_part_recursive_get_helper(Edje *ed, char **path)
 {
    Edje_Real_Part *rp;
+
    //printf("  lookup: %s on %s\n", path[0], ed->parent ? ed->parent : "-");
    rp = _edje_real_part_get(ed, path[0]);
    if (path[1] == NULL) return rp;
@@ -3011,9 +3833,7 @@ _edje_color_class_member_add(Edje *ed, const char *color_class)
    if ((!ed) || (!color_class)) return;
    members = eina_hash_find(_edje_color_class_member_hash, color_class);
    if (members)
-     {
-        eina_hash_del(_edje_color_class_member_hash, color_class, members);
-     }
+     eina_hash_del(_edje_color_class_member_hash, color_class, members);
 
    members = eina_list_prepend(members, ed);
    if (!_edje_color_class_member_hash) _edje_color_class_member_hash = eina_hash_string_superfast_new(NULL);
@@ -3032,17 +3852,15 @@ _edje_color_class_member_del(Edje *ed, const char *color_class)
    eina_hash_del(_edje_color_class_member_hash, color_class, members);
    members = eina_list_remove(members, ed);
    if (members)
-     {
-	eina_hash_add(_edje_color_class_member_hash, color_class, members);
-     }
+     eina_hash_add(_edje_color_class_member_hash, color_class, members);
 }
 
 /**
- * Used to free the member lists that are stored in the text_class
- * and color_class hashtables.
+ * Used to free the member lists that are stored in the text_class and
+ * color_class hashtables.
  */
 static Eina_Bool
-member_list_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+member_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
 {
    eina_list_free(data);
    return EINA_TRUE;
@@ -3058,7 +3876,7 @@ _edje_color_class_members_free(void)
 }
 
 static Eina_Bool
-color_class_hash_list_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+color_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
 {
    Edje_Color_Class *cc;
 
@@ -3115,15 +3933,14 @@ _edje_text_class_member_add(Edje *ed, const char *text_class)
 
    /* Remove members list */
    if (members)
-     {
-        eina_hash_del(_edje_text_class_member_hash, text_class, members);
-     }
+     eina_hash_del(_edje_text_class_member_hash, text_class, members);
 
    /* Update the member list */
    members = eina_list_prepend(members, ed);
 
    /* Add the member list back */
-   if (!_edje_text_class_member_hash) _edje_text_class_member_hash = eina_hash_string_superfast_new(NULL);
+   if (!_edje_text_class_member_hash) 
+     _edje_text_class_member_hash = eina_hash_string_superfast_new(NULL);
    eina_hash_add(_edje_text_class_member_hash, text_class, members);
 }
 
@@ -3140,9 +3957,7 @@ _edje_text_class_member_del(Edje *ed, const char *text_class)
 
    members = eina_list_remove(members, ed);
    if (members)
-     {
-        eina_hash_add(_edje_text_class_member_hash, text_class, members);
-     }
+     eina_hash_add(_edje_text_class_member_hash, text_class, members);
 }
 
 void
@@ -3155,7 +3970,7 @@ _edje_text_class_members_free(void)
 }
 
 static Eina_Bool
-text_class_hash_list_free(const Eina_Hash *hash, const void *key, void *data, void *fdata)
+text_class_hash_list_free(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
 {
    Edje_Text_Class *tc;
 
@@ -3226,6 +4041,7 @@ int
 _edje_unblock(Edje *ed)
 {
    int ret = 0;
+
    if (!ed) return ret;
 
    ed->block--;
@@ -3247,7 +4063,7 @@ _edje_block_violate(Edje *ed)
 {
    if (ed->block > 0) ed->block_break = 1;
 }
-
+ 
 void
 _edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
@@ -3260,46 +4076,25 @@ _edje_object_part_swallow_free_cb(void *data, Evas *e, Evas_Object *obj, void *e
    event_info = NULL;
 }
 
-void
-_edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
+static void
+_edje_real_part_swallow_hints_update(Edje_Real_Part *rp)
 {
    char *type;
 
-   if (rp->swallowed_object)
-     {
-	evas_object_smart_member_del(rp->swallowed_object);
-	evas_object_event_callback_del(rp->swallowed_object,
-				       EVAS_CALLBACK_FREE,
-				       _edje_object_part_swallow_free_cb);
-	evas_object_clip_unset(rp->swallowed_object);
-	evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
-        if (rp->part->mouse_events)
-          _edje_callbacks_del(rp->swallowed_object);
-	rp->swallowed_object = NULL;
-     }
-   if (!obj_swallow) return;
-   rp->swallowed_object = obj_swallow;
-   evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
-   if (rp->clip_to)
-     evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
-   else evas_object_clip_set(rp->swallowed_object, rp->edje->clipper);
-   evas_object_stack_above(rp->swallowed_object, rp->object);
-   evas_object_event_callback_add(rp->swallowed_object, EVAS_CALLBACK_FREE,
-				  _edje_object_part_swallow_free_cb,
-				  rp->edje->obj);
-   type = (char *)evas_object_type_get(obj_swallow);
-   rp->swallow_params.min.w = 0;
+   type = (char *)evas_object_type_get(rp->swallowed_object);
+   
    rp->swallow_params.min.w = 0;
+   rp->swallow_params.min.h = 0;
    rp->swallow_params.max.w = -1;
    rp->swallow_params.max.h = -1;
    if ((type) && (!strcmp(type, "edje")))
      {
 	Evas_Coord w, h;
 
-	edje_object_size_min_get(obj_swallow, &w, &h);
+	edje_object_size_min_get(rp->swallowed_object, &w, &h);
 	rp->swallow_params.min.w = w;
 	rp->swallow_params.min.h = h;
-	edje_object_size_max_get(obj_swallow, &w, &h);
+	edje_object_size_max_get(rp->swallowed_object, &w, &h);
 	rp->swallow_params.max.w = w;
 	rp->swallow_params.max.h = h;
      }
@@ -3308,7 +4103,7 @@ _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
      {
 	Evas_Coord w, h;
 
-	evas_object_geometry_get(obj_swallow, NULL, NULL, &w, &h);
+	evas_object_geometry_get(rp->swallowed_object, NULL, NULL, &w, &h);
 	rp->swallow_params.min.w = w;
 	rp->swallow_params.min.h = h;
 	rp->swallow_params.max.w = w;
@@ -3318,27 +4113,96 @@ _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
 	Evas_Coord w1, h1, w2, h2, aw, ah;
 	Evas_Aspect_Control am;
 
-	evas_object_size_hint_min_get(obj_swallow, &w1, &h1);
-	evas_object_size_hint_max_get(obj_swallow, &w2, &h2);
-	evas_object_size_hint_aspect_get(obj_swallow, &am, &aw, &ah);
+	evas_object_size_hint_min_get(rp->swallowed_object, &w1, &h1);
+	evas_object_size_hint_max_get(rp->swallowed_object, &w2, &h2);
+	evas_object_size_hint_aspect_get(rp->swallowed_object, &am, &aw, &ah);
 	rp->swallow_params.min.w = w1;
 	rp->swallow_params.min.h = h1;
 	if (w2 > 0) rp->swallow_params.max.w = w2;
 	if (h2 > 0) rp->swallow_params.max.h = h2;
   	switch (am)
 	  {
-	   case EVAS_ASPECT_CONTROL_NONE: rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE; break;
-	   case EVAS_ASPECT_CONTROL_NEITHER: rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER; break;
-	   case EVAS_ASPECT_CONTROL_HORIZONTAL: rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL; break;
-	   case EVAS_ASPECT_CONTROL_VERTICAL: rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL; break;
-	   case EVAS_ASPECT_CONTROL_BOTH: rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH; break;
-	   default: break;
+	   case EVAS_ASPECT_CONTROL_NONE: 
+             rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NONE; 
+             break;
+	   case EVAS_ASPECT_CONTROL_NEITHER: 
+             rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_NEITHER; 
+             break;
+	   case EVAS_ASPECT_CONTROL_HORIZONTAL: 
+             rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_HORIZONTAL; 
+             break;
+	   case EVAS_ASPECT_CONTROL_VERTICAL: 
+             rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_VERTICAL;
+             break;
+	   case EVAS_ASPECT_CONTROL_BOTH: 
+             rp->swallow_params.aspect.mode = EDJE_ASPECT_CONTROL_BOTH; 
+             break;
+	   default: 
+             break;
 	  }
 	rp->swallow_params.aspect.w = aw;
 	rp->swallow_params.aspect.h = ah;
 	evas_object_data_set(rp->swallowed_object, "\377 edje.swallowing_part", rp);
      }
 
+#ifdef EDJE_CALC_CACHE
+     rp->invalidate = 1;
+#endif
+}
+
+void
+_edje_object_part_swallow_changed_hints_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Edje_Real_Part *rp;
+   
+   rp = data;
+   _edje_real_part_swallow_hints_update(rp);
+   rp->edje->dirty = 1;
+   _edje_recalc(rp->edje);
+   return;
+   e = NULL;
+   event_info = NULL;
+}
+
+void
+_edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
+{
+   if (rp->swallowed_object)
+     {
+        if (rp->swallowed_object != obj_swallow)
+          {
+             _edje_real_part_swallow_clear(rp);
+             rp->swallowed_object = NULL;
+          }
+        else
+          {
+             _edje_real_part_swallow_hints_update(rp);
+             rp->edje->dirty = 1;
+             _edje_recalc(rp->edje);
+             return;
+          }
+     }
+#ifdef EDJE_CALC_CACHE
+   rp->invalidate = 1;
+#endif
+   if (!obj_swallow) return;
+   rp->swallowed_object = obj_swallow;
+   evas_object_smart_member_add(rp->swallowed_object, rp->edje->obj);
+   if (rp->clip_to)
+     evas_object_clip_set(rp->swallowed_object, rp->clip_to->object);
+   else evas_object_clip_set(rp->swallowed_object, rp->edje->clipper);
+   evas_object_stack_above(rp->swallowed_object, rp->object);
+   evas_object_event_callback_add(rp->swallowed_object, 
+                                  EVAS_CALLBACK_FREE,
+				  _edje_object_part_swallow_free_cb,
+				  rp->edje->obj);
+   evas_object_event_callback_add(rp->swallowed_object, 
+                                  EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+				  _edje_object_part_swallow_changed_hints_cb,
+				  rp);
+   
+   _edje_real_part_swallow_hints_update(rp);
+   
    if (rp->part->mouse_events)
      {
         _edje_callbacks_add(obj_swallow, rp->edje, rp);
@@ -3357,3 +4221,21 @@ _edje_real_part_swallow(Edje_Real_Part *rp, Evas_Object *obj_swallow)
    rp->edje->dirty = 1;
    _edje_recalc(rp->edje);
 }
+
+void
+_edje_real_part_swallow_clear(Edje_Real_Part *rp)
+{
+   evas_object_smart_member_del(rp->swallowed_object);
+   evas_object_event_callback_del_full(rp->swallowed_object,
+                                       EVAS_CALLBACK_FREE,
+                                       _edje_object_part_swallow_free_cb,
+                                       rp->edje->obj);
+   evas_object_event_callback_del_full(rp->swallowed_object,
+                                       EVAS_CALLBACK_CHANGED_SIZE_HINTS,
+                                       _edje_object_part_swallow_changed_hints_cb,
+                                       rp);
+   evas_object_clip_unset(rp->swallowed_object);
+   evas_object_data_del(rp->swallowed_object, "\377 edje.swallowing_part");
+   if (rp->part->mouse_events)
+     _edje_callbacks_del(rp->swallowed_object);
+}
diff --git a/src/lib/edje_var.c b/src/lib/edje_var.c
index 19868f1..4ba8b36 100644
--- a/src/lib/edje_var.c
+++ b/src/lib/edje_var.c
@@ -44,7 +44,7 @@ _edje_var_timer_cb(void *data)
 }
 
 static int
-_edje_var_anim_cb(void *data)
+_edje_var_anim_cb(void *data __UNUSED__)
 {
    Eina_List *l, *tl = NULL;
    double t;
@@ -253,7 +253,7 @@ _edje_var_string_id_get(Edje *ed, const char *string)
 }
 
 int
-_edje_var_var_int_get(Edje *ed, Edje_Var *var)
+_edje_var_var_int_get(Edje *ed __UNUSED__, Edje_Var *var)
 {
    /* auto-cast */
    if (var->type == EDJE_VAR_STRING)
@@ -290,7 +290,7 @@ _edje_var_var_int_get(Edje *ed, Edje_Var *var)
 }
 
 void
-_edje_var_var_int_set(Edje *ed, Edje_Var *var, int v)
+_edje_var_var_int_set(Edje *ed __UNUSED__, Edje_Var *var, int v)
 {
    /* auto-cast */
    if (var->type == EDJE_VAR_STRING)
@@ -322,7 +322,7 @@ _edje_var_var_int_set(Edje *ed, Edje_Var *var, int v)
 }
 
 double
-_edje_var_var_float_get(Edje *ed, Edje_Var *var)
+_edje_var_var_float_get(Edje *ed __UNUSED__, Edje_Var *var)
 {
    /* auto-cast */
    if (var->type == EDJE_VAR_STRING)
@@ -359,7 +359,7 @@ _edje_var_var_float_get(Edje *ed, Edje_Var *var)
 }
 
 void
-_edje_var_var_float_set(Edje *ed, Edje_Var *var, double v)
+_edje_var_var_float_set(Edje *ed __UNUSED__, Edje_Var *var, double v)
 {
    /* auto-cast */
    if (var->type == EDJE_VAR_STRING)
@@ -392,7 +392,7 @@ _edje_var_var_float_set(Edje *ed, Edje_Var *var, double v)
 }
 
 const char *
-_edje_var_var_str_get(Edje *ed, Edje_Var *var)
+_edje_var_var_str_get(Edje *ed __UNUSED__, Edje_Var *var)
 {
    /* auto-cast */
    if (var->type == EDJE_VAR_INT)
@@ -428,7 +428,7 @@ _edje_var_var_str_get(Edje *ed, Edje_Var *var)
 }
 
 void
-_edje_var_var_str_set(Edje *ed, Edje_Var *var, const char *str)
+_edje_var_var_str_set(Edje *ed __UNUSED__, Edje_Var *var, const char *str)
 {
    /* auto-cast */
    if (var->type == EDJE_VAR_STRING)
diff --git a/utils/Makefile.in b/utils/Makefile.in
index a0f62e8..74a9ed6 100644
--- a/utils/Makefile.in
+++ b/utils/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.10.1 from Makefile.am.
+# Makefile.in generated by automake 1.10.2 from Makefile.am.
 # @configure_input@
 
 # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
@@ -105,6 +105,8 @@ LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
+LUA_CFLAGS = @LUA_CFLAGS@
+LUA_LIBS = @LUA_LIBS@
 MAKEINFO = @MAKEINFO@
 MKDIR_P = @MKDIR_P@
 NM = @NM@
@@ -176,6 +178,7 @@ mandir = @mandir@
 mkdir_p = @mkdir_p@
 oldincludedir = @oldincludedir@
 pdfdir = @pdfdir@
+pkgconfig_requires_private = @pkgconfig_requires_private@
 pkgpyexecdir = @pkgpyexecdir@
 pkgpythondir = @pkgpythondir@
 prefix = @prefix@
@@ -190,6 +193,7 @@ sharedstatedir = @sharedstatedir@
 srcdir = @srcdir@
 sysconfdir = @sysconfdir@
 target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 version_info = @version_info@
@@ -204,8 +208,8 @@ $(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
 	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
 	      exit 1;; \
 	  esac; \
 	done; \

-- 
Enlightenment DR17 graphical layout and animation library



More information about the Pkg-e-commits mailing list