diff --git a/aclocal.m4 b/aclocal.m4
index eef9beb..d9b5fbb 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -118,6 +118,8 @@
 AC_REQUIRE([AC_PROG_LD])dnl
 AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
 AC_REQUIRE([AC_PROG_NM])dnl
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+
 AC_REQUIRE([AC_PROG_LN_S])dnl
 AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
 AC_REQUIRE([AC_OBJEXT])dnl
@@ -285,9 +287,12 @@
   lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
   lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
   ;;
-irix*)
+irix* | nonstopux*)
   symcode='[[BCDEGRST]]'
   ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
 solaris* | sysv5*)
   symcode='[[BDT]]'
   ;;
@@ -384,7 +389,7 @@
 	  save_CFLAGS="$CFLAGS"
 	  LIBS="conftstm.$ac_objext"
 	  CFLAGS="$CFLAGS$no_builtin_flag"
-	  if AC_TRY_EVAL(ac_link) && test -s conftest; then
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS="$save_LIBS"
@@ -928,7 +933,7 @@
       # like `-m68040'.
       lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
       ;;
-    beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       # PIC is the default for these OSes.
       ;;
     darwin* | rhapsody*)
@@ -971,7 +976,7 @@
       lt_cv_prog_cc_pic='+Z'
       ;;
 
-    irix5* | irix6*)
+    irix5* | irix6* | nonstopux*)
       lt_cv_prog_cc_wl='-Wl,'
       lt_cv_prog_cc_static='-non_shared'
       # PIC (with -KPIC) is the default.
@@ -1015,11 +1020,7 @@
     sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
       lt_cv_prog_cc_pic='-KPIC'
       lt_cv_prog_cc_static='-Bstatic'
-      if test "x$host_vendor" = xsni; then
-	lt_cv_prog_cc_wl='-LD'
-      else
-	lt_cv_prog_cc_wl='-Wl,'
-      fi
+      lt_cv_prog_cc_wl='-Wl,'
       ;;
 
     uts4*)
@@ -1384,7 +1385,7 @@
     # If the export-symbols file already is a .def file (1st line
     # is EXPORTS), use it as is.
     # If DATA tags from a recent dlltool are present, honour them!
-    archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+    archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then
 	cp $export_symbols $output_objdir/$soname-def;
       else
 	echo EXPORTS > $output_objdir/$soname-def;
@@ -1393,6 +1394,7 @@
 	 set dummy \$symbol;
 	 case \[$]# in
 	   2) echo "   \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+	   4) echo "   \[$]2 \[$]3 \[$]4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;;
 	   *) echo "     \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;;
 	 esac;
 	 _lt_hint=`expr 1 + \$_lt_hint`;
@@ -1505,10 +1507,12 @@
       # need to do runtime linking.
       case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
 	for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  case $ld_flag in
+	  *-brtl*)
 	    aix_use_runtimelinking=yes
 	    break
-	  fi
+	  ;;
+	  esac
 	done
       esac
 
@@ -1622,8 +1626,9 @@
     esac
     # FIXME: Relying on posixy $() will cause problems for
     #        cross-compilation, but unfortunately the echo tests do not
-    #        yet detect zsh echo's removal of \ escapes.
-    archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
+    #        yet detect zsh echo's removal of \ escapes.  Also zsh mangles
+    #	     `"' quotes if we put them in here... so don't!
+    archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)'
     # We need to add '_' to the symbols in $export_symbols first
     #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
     hardcode_direct=yes
@@ -1675,13 +1680,14 @@
     export_dynamic_flag_spec='${wl}-E'
     ;;
 
-  irix5* | irix6*)
+  irix5* | irix6* | nonstopux*)
     if test "$GCC" = yes; then
       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
     else
       archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='-rpath $libdir'
     fi
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
     hardcode_libdir_separator=:
     link_all_deplibs=yes
     ;;
@@ -1709,7 +1715,7 @@
     hardcode_direct=yes
     hardcode_shlibpath_var=no
     if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       export_dynamic_flag_spec='${wl}-E'
     else
@@ -1719,7 +1725,7 @@
 	hardcode_libdir_flag_spec='-R$libdir'
         ;;
       *)
-        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
         hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
         ;;
       esac
@@ -1831,13 +1837,23 @@
     ;;
 
   sysv4)
-    if test "x$host_vendor" = xsno; then
-      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes # is this really true???
-    else
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-    fi
+    case $host_vendor in
+      sni)
+        archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+        hardcode_direct=yes # is this really true???
+        ;;
+      siemens)
+        ## LD is ld it makes a PLAMLIB
+        ## CC just makes a GrossModule.
+        archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+        reload_cmds='$CC -r -o $output$reload_objs'
+        hardcode_direct=no
+        ;;
+      motorola)
+        archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+        hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+        ;;
+    esac
     runpath_var='LD_RUN_PATH'
     hardcode_shlibpath_var=no
     ;;
@@ -1978,6 +1994,9 @@
 
 aix4* | aix5*)
   version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
   if test "$host_cpu" = ia64; then
     # AIX 5 supports IA64
     library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
@@ -2016,6 +2035,7 @@
     fi
     shlibpath_var=LIBPATH
   fi
+  hardcode_into_libs=yes
   ;;
 
 amigaos*)
@@ -2063,7 +2083,7 @@
     ;;
   yes,mingw*)
     library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
-    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"`
     ;;
   yes,pw32*)
     library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
@@ -2146,14 +2166,17 @@
   postinstall_cmds='chmod 555 $lib'
   ;;
 
-irix5* | irix6*)
-  version_type=irix
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)          version_type=irix ;;
+  esac
   need_lib_prefix=no
   need_version=no
   soname_spec='${libname}${release}.so$major'
   library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
   case $host_os in
-  irix5*)
+  irix5* | nonstopux*)
     libsuff= shlibsuff=
     ;;
   *)
@@ -2198,6 +2221,26 @@
   # people can always --disable-shared, the test was removed, and we
   # assume the GNU/Linux dynamic linker is in use.
   dynamic_linker='GNU/Linux ld.so'
+
+  # Find out which ABI we are using (multilib Linux x86_64 hack).
+  libsuff=
+  case "$host_cpu" in
+  x86_64*|s390x*)
+    echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+    if AC_TRY_EVAL(ac_compile); then
+      case `/usr/bin/file conftest.$ac_objext` in
+      *64-bit*)
+        libsuff=64
+        ;;
+      esac
+    fi
+    rm -rf conftest*
+    ;;
+  *)
+    ;;
+  esac
+  sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}"
+  sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
   ;;
 
 netbsd*)
@@ -2257,11 +2300,12 @@
 osf3* | osf4* | osf5*)
   version_type=osf
   need_version=no
-  soname_spec='${libname}${release}.so'
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
   sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  hardcode_into_libs=yes
   ;;
 
 sco3.2v5*)
@@ -2304,6 +2348,12 @@
   case $host_vendor in
     sni)
       shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
       ;;
     motorola)
       need_lib_prefix=no
@@ -2458,7 +2508,7 @@
   # Now quote all the things that may contain metacharacters while being
   # careful not to overquote the AC_SUBSTed values.  We take copies of the
   # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS \
+  for var in echo old_CC old_CFLAGS SED \
     AR AR_FLAGS CC LD LN_S NM SHELL \
     reload_flag reload_cmds wl \
     pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
@@ -2520,8 +2570,11 @@
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
+# A sed that does not truncate output.
+SED=$lt_SED
+
 # Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
+Xsed="${SED} -e s/^X//"
 
 # The HP-UX ksh and POSIX shell print the target directory to stdout
 # if CDPATH is set.
@@ -3282,7 +3335,7 @@
 # AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies
 #  -- PORTME fill in with the dynamic library characteristics
 AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
-[AC_CACHE_CHECK([how to recognise dependant libraries],
+[AC_CACHE_CHECK([how to recognise dependent libraries],
 lt_cv_deplibs_check_method,
 [lt_cv_file_magic_cmd='$MAGIC_CMD'
 lt_cv_file_magic_test_file=
@@ -3357,9 +3410,9 @@
   lt_cv_file_magic_test_file=/usr/lib/libc.sl
   ;;
 
-irix5* | irix6*)
+irix5* | irix6* | nonstopux*)
   case $host_os in
-  irix5*)
+  irix5* | nonstopux*)
     # this will be overridden with pass_all, but let us keep it just in case
     lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
     ;;
@@ -3381,7 +3434,7 @@
 # This must be Linux ELF.
 linux-gnu*)
   case $host_cpu in
-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* )
+  alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64* | s390* | x86_64*)
     lt_cv_deplibs_check_method=pass_all ;;
   *)
     # glibc up to 2.1.1 does not perform some relocations on ARM
@@ -3452,6 +3505,9 @@
     lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
     lt_cv_file_magic_test_file=/lib/libc.so
     ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
   esac
   ;;
 esac
@@ -3517,12 +3573,12 @@
 ])
 
 # AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl convenience library and INCLTDL to the include flags for
+# the libltdl convenience library and LTDLINCL to the include flags for
 # the libltdl header and adds --enable-ltdl-convenience to the
-# configure arguments.  Note that LIBLTDL and INCLTDL are not
+# configure arguments.  Note that LIBLTDL and LTDLINCL are not
 # AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called.  If DIR is not
 # provided, it is assumed to be `libltdl'.  LIBLTDL will be prefixed
-# with '${top_builddir}/' and INCLTDL will be prefixed with
+# with '${top_builddir}/' and LTDLINCL will be prefixed with
 # '${top_srcdir}/' (note the single quotes!).  If your package is not
 # flat and you're not using automake, define top_builddir and
 # top_srcdir appropriately in the Makefiles.
@@ -3534,16 +3590,18 @@
       ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
   esac
   LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
-  INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
 ])
 
 # AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl installable library and INCLTDL to the include flags for
+# the libltdl installable library and LTDLINCL to the include flags for
 # the libltdl header and adds --enable-ltdl-install to the configure
-# arguments.  Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
+# arguments.  Note that LIBLTDL and LTDLINCL are not AC_SUBSTed, nor is
 # AC_CONFIG_SUBDIRS called.  If DIR is not provided and an installed
 # libltdl is not found, it is assumed to be `libltdl'.  LIBLTDL will
-# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
+# be prefixed with '${top_builddir}/' and LTDLINCL will be prefixed
 # with '${top_srcdir}/' (note the single quotes!).  If your package is
 # not flat and you're not using automake, define top_builddir and
 # top_srcdir appropriately in the Makefiles.
@@ -3561,12 +3619,14 @@
   if test x"$enable_ltdl_install" = x"yes"; then
     ac_configure_args="$ac_configure_args --enable-ltdl-install"
     LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
-    INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+    LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
   else
     ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
     LIBLTDL="-lltdl"
-    INCLTDL=
+    LTDLINCL=
   fi
+  # For backwards non-gettext consistent compatibility...
+  INCLTDL="$LTDLINCL"
 ])
 
 # old names
@@ -3581,6 +3641,95 @@
 # This is just to silence aclocal about the macro not being used
 ifelse([AC_DISABLE_FAST_INSTALL])
 
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_executable_p="test -f"
+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
+      if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+        _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+
+  # Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/sed$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+  _max=0
+  _count=0
+  # Add /usr/xpg4/bin/sed as it is typically found on Solaris
+  # along with /bin/sed that truncates output.
+  for _sed in $_sed_list /usr/xpg4/bin/sed; do
+    test ! -f ${_sed} && break
+    cat /dev/null > "$tmp/sed.in"
+    _count=0
+    echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in"
+    # Check for GNU sed and select it if it is found.
+    if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then
+      lt_cv_path_SED=${_sed}
+      break
+    fi
+    while true; do
+      cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp"
+      mv "$tmp/sed.tmp" "$tmp/sed.in"
+      cp "$tmp/sed.in" "$tmp/sed.nl"
+      echo >>"$tmp/sed.nl"
+      ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break
+      cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break
+      # 40000 chars as input seems more than enough
+      test $_count -gt 10 && break
+      _count=`expr $_count + 1`
+      if test $_count -gt $_max; then
+        _max=$_count
+        lt_cv_path_SED=$_sed
+      fi
+    done
+  done
+  rm -rf "$tmp"
+])
+if test "X$SED" != "X"; then
+  lt_cv_path_SED=$SED
+else
+  SED=$lt_cv_path_SED
+fi
+AC_MSG_RESULT([$SED])
+])
+
 # Do all the work for Automake.                            -*- Autoconf -*-
 
 # This macro actually does too much some checks are only needed if
diff --git a/config.h.in b/config.h.in
index e27fa33..39b59f8 100644
--- a/config.h.in
+++ b/config.h.in
@@ -18,7 +18,8 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
-/* Define to 1 if your system has a working `malloc' function. */
+/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
+   to 0 otherwise. */
 #undef HAVE_MALLOC
 
 /* Define to 1 if you have the <memory.h> header file. */
@@ -114,6 +115,9 @@
 /* Define to empty if `const' does not conform to ANSI C. */
 #undef const
 
+/* Define to rpl_malloc if the replacement function should be used. */
+#undef malloc
+
 /* Define to `int' if <sys/types.h> does not define. */
 #undef mode_t
 
diff --git a/configure b/configure
index f9d86bf..847ffa1 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.53 for openggsn 0.61b.
+# Generated by GNU Autoconf 2.57 for openggsn 0.61b.
 #
 # Report bugs to <jj@openggsn.org>.
 #
@@ -8,6 +8,239 @@
 # Free Software Foundation, Inc.
 # This configure script is free software; the Free Software Foundation
 # gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization.  ##
+## --------------------- ##
+
+# Be Bourne compatible
+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
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+  set -o posix
+fi
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+  as_unset=unset
+else
+  as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+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 -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)$' \| \
+	 .     : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\/\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+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=';'
+  else
+    PATH_SEPARATOR=:
+  fi
+  rm -f conf$$.sh
+fi
+
+
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
+  # Find who we are.  Look in the path if we contain no path at all
+  # relative or not.
+  case $0 in
+    *[\\/]* ) as_myself=$0 ;;
+    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+       ;;
+  esac
+  # We did not find ourselves, most probably we were run as `sh COMMAND'
+  # in which case we are not to be found in the path.
+  if test "x$as_myself" = x; then
+    as_myself=$0
+  fi
+  if test ! -f "$as_myself"; then
+    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+   { (exit 1); exit 1; }; }
+  fi
+  case $CONFIG_SHELL in
+  '')
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for as_base in sh bash ksh sh5; do
+	 case $as_dir in
+	 /*)
+	   if ("$as_dir/$as_base" -c '
+  as_lineno_1=$LINENO
+  as_lineno_2=$LINENO
+  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+  test "x$as_lineno_1" != "x$as_lineno_2" &&
+  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+	     CONFIG_SHELL=$as_dir/$as_base
+	     export CONFIG_SHELL
+	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+	   fi;;
+	 esac
+       done
+done
+;;
+  esac
+
+  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+  # uniformly replaced by the line number.  The first 'sed' inserts a
+  # line-number line before each line; the second 'sed' does the real
+  # work.  The second script uses 'N' to pair each line-number line
+  # with the numbered line, and appends trailing '-' during
+  # substitution so that $LINENO is not a special case at line end.
+  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
+  sed '=' <$as_myself |
+    sed '
+      N
+      s,$,-,
+      : loop
+      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+      t loop
+      s,-$,,
+      s,^['$as_cr_digits']*\n,,
+    ' >$as_me.lineno &&
+  chmod +x $as_me.lineno ||
+    { 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
+  # (the dirname of $[0] is not the place where we might find the
+  # original and so on.  Autoconf is especially sensible to this).
+  . ./$as_me.lineno
+  # Exit status is that of the last command.
+  exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+  *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T='	' ;;
+  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+  # We could just check for DJGPP; but this test a) works b) is more generic
+  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+  if test -f conf$$.exe; then
+    # Don't use ln at all; we don't have any links
+    as_ln_s='cp -p'
+  else
+    as_ln_s='ln -s'
+  fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+  as_ln_s=ln
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" 	$as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
 
 # Find the correct PATH separator.  Usually this is `:', but
 # DJGPP uses `;' like DOS.
@@ -168,228 +401,6 @@
 
 
 
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
-  set -o posix
-fi
-
-# NLS nuisances.
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
-    { $as_unset LANG || test "${LANG+set}" != set; } ||
-      { LANG=C; export LANG; }
-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
-    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
-      { LC_ALL=C; export LC_ALL; }
-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
-    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
-      { LC_TIME=C; export LC_TIME; }
-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
-    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
-      { LC_CTYPE=C; export LC_CTYPE; }
-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
-    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
-      { LANGUAGE=C; export LANGUAGE; }
-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
-    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
-      { LC_COLLATE=C; export LC_COLLATE; }
-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
-    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
-      { LC_NUMERIC=C; export LC_NUMERIC; }
-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
-    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
-      { LC_MESSAGES=C; export LC_MESSAGES; }
-
-
-# Name of the executable.
-as_me=`(basename "$0") 2>/dev/null ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)$' \| \
-	 .     : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
-  	  /^X\/\(\/\/\)$/{ s//\1/; q; }
-  	  /^X\/\(\/\).*/{ s//\1/; q; }
-  	  s/.*/./; q'`
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-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" >conftest.sh
-  echo  "exit 0"   >>conftest.sh
-  chmod +x conftest.sh
-  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conftest.sh
-fi
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2"  || {
-  # Find who we are.  Look in the path if we contain no path at all
-  # relative or not.
-  case $0 in
-    *[\\/]* ) as_myself=$0 ;;
-    *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
-       ;;
-  esac
-  # We did not find ourselves, most probably we were run as `sh COMMAND'
-  # in which case we are not to be found in the path.
-  if test "x$as_myself" = x; then
-    as_myself=$0
-  fi
-  if test ! -f "$as_myself"; then
-    { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
-   { (exit 1); exit 1; }; }
-  fi
-  case $CONFIG_SHELL in
-  '')
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for as_base in sh bash ksh sh5; do
-	 case $as_dir in
-	 /*)
-	   if ("$as_dir/$as_base" -c '
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
-	     CONFIG_SHELL=$as_dir/$as_base
-	     export CONFIG_SHELL
-	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
-	   fi;;
-	 esac
-       done
-done
-;;
-  esac
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line before each line; the second 'sed' does the real
-  # work.  The second script uses 'N' to pair each line-number line
-  # with the numbered line, and appends trailing '-' during
-  # substitution so that $LINENO is not a special case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # second 'sed' script.  Blame Lee E. McMahon for sed's syntax.  :-)
-  sed '=' <$as_myself |
-    sed '
-      N
-      s,$,-,
-      : loop
-      s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
-      t loop
-      s,-$,,
-      s,^['$as_cr_digits']*\n,,
-    ' >$as_me.lineno &&
-  chmod +x $as_me.lineno ||
-    { 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
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensible to this).
-  . ./$as_me.lineno
-  # Exit status is that of the last command.
-  exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
-  *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T='	' ;;
-  *c*,*  ) ECHO_N=-n ECHO_C= ECHO_T= ;;
-  *)       ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  # We could just check for DJGPP; but this test a) works b) is more generic
-  # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
-  if test -f conf$$.exe; then
-    # Don't use ln at all; we don't have any links
-    as_ln_s='cp -p'
-  else
-    as_ln_s='ln -s'
-  fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" 	$as_nl"
-
-# CDPATH.
-$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
-
-
 # Name of the host.
 # hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
 # so uname gets run too.
@@ -401,6 +412,7 @@
 # Initializations.
 #
 ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
 cross_compiling=no
 subdirs=
 MFLAGS=
@@ -457,6 +469,8 @@
 # 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 datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA AWK CPP CXX CXXFLAGS ac_ct_CXX RANLIB ac_ct_RANLIB build build_cpu build_vendor build_os host host_cpu host_vendor host_os LN_S ECHO STRIP ac_ct_STRIP EGREP LIBTOOL EXEC_LDFLAGS LIBOBJS PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh INSTALL_STRIP_PROGRAM SET_MAKE DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE CXXDEPMODE LTLIBOBJS'
+ac_subst_files=''
 
 # Initialize some variables set by options.
 ac_init_help=
@@ -880,6 +894,9 @@
    { (exit 1); exit 1; }; }
   fi
 fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+  { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+   { (exit 1); exit 1; }; }
 srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
 ac_env_build_alias_set=${build_alias+set}
 ac_env_build_alias_value=$build_alias
@@ -1067,7 +1084,7 @@
 # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
 # absolute.
 ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
 ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
 ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
 
@@ -1094,7 +1111,7 @@
 if $ac_init_version; then
   cat <<\_ACEOF
 openggsn configure 0.61b
-generated by GNU Autoconf 2.53
+generated by GNU Autoconf 2.57
 
 Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
 Free Software Foundation, Inc.
@@ -1109,7 +1126,7 @@
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by openggsn $as_me 0.61b, which was
-generated by GNU Autoconf 2.53.  Invocation command line was
+generated by GNU Autoconf 2.57.  Invocation command line was
 
   $ $0 $@
 
@@ -1161,27 +1178,54 @@
 
 # Keep a trace of the command line.
 # Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
 # Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
 ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
 ac_sep=
-for ac_arg
+ac_must_keep_next=false
+for ac_pass in 1 2
 do
-  case $ac_arg in
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n ) continue ;;
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    continue ;;
-  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
-    ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-  esac
-  case " $ac_configure_args " in
-    *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-    *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
-       ac_sep=" " ;;
-  esac
-  # Get rid of the leading space.
+  for ac_arg
+  do
+    case $ac_arg in
+    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+    | -silent | --silent | --silen | --sile | --sil)
+      continue ;;
+    *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+    2)
+      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+      if test $ac_must_keep_next = true; then
+        ac_must_keep_next=false # Got value, back to normal.
+      else
+        case $ac_arg in
+          *=* | --config-cache | -C | -disable-* | --disable-* \
+          | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+          | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+          | -with-* | --with-* | -without-* | --without-* | --x)
+            case "$ac_configure_args0 " in
+              "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+            esac
+            ;;
+          -* ) ac_must_keep_next=true ;;
+        esac
+      fi
+      ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+      # Get rid of the leading space.
+      ac_sep=" "
+      ;;
+    esac
+  done
 done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
 
 # When interrupted or exit'd, cleanup temporary files, and complete
 # config.log.  We remove comments because anyway the quotes in there
@@ -1192,6 +1236,7 @@
   # Save into config.log some information that might help in debugging.
   {
     echo
+
     cat <<\_ASBOX
 ## ---------------- ##
 ## Cache variables. ##
@@ -1214,6 +1259,35 @@
     esac;
 }
     echo
+
+    cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=$`echo $ac_var`
+      echo "$ac_var='"'"'$ac_val'"'"'"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=$`echo $ac_var`
+        echo "$ac_var='"'"'$ac_val'"'"'"
+      done | sort
+      echo
+    fi
+
     if test -s confdefs.h; then
       cat <<\_ASBOX
 ## ----------- ##
@@ -1221,7 +1295,7 @@
 ## ----------- ##
 _ASBOX
       echo
-      sed "/^$/d" confdefs.h
+      sed "/^$/d" confdefs.h | sort
       echo
     fi
     test "$ac_signal" != 0 &&
@@ -1387,9 +1461,10 @@
 
 
 
+
 # Add the stamp file to the list of files AC keeps track of,
 # along with our hook.
-ac_config_headers="$ac_config_headers config.h"
+          ac_config_headers="$ac_config_headers config.h"
 
 
 
@@ -1600,9 +1675,7 @@
     # However, it has the same basename, so the bogon will be chosen
     # first if we set CC to just the basename; use the full file name.
     shift
-    set dummy "$as_dir/$ac_word" ${1+"$@"}
-    shift
-    ac_cv_prog_CC="$@"
+    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
   fi
 fi
 fi
@@ -1707,8 +1780,10 @@
 fi
 
 
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;}
+test -z "$CC" && { { 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
+See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 
 # Provide some information about the compiler.
@@ -1733,14 +1808,12 @@
 
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -1750,7 +1823,7 @@
 }
 _ACEOF
 ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe"
+ac_clean_files="$ac_clean_files a.out 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.
@@ -1769,26 +1842,39 @@
 # Be careful to initialize this variable, since it used to be cached.
 # Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
 ac_cv_exeext=
-for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null;
-                ls a.out conftest 2>/dev/null;
-                ls a.* conftest.* 2>/dev/null`; do
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+  test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;;
-    a.out ) # We found the default executable, but exeext='' is most
-            # certainly right.
-            break;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-          # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
-          export ac_cv_exeext
-          break;;
-    * ) break;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+        ;;
+    conftest.$ac_ext )
+        # This is the source file.
+        ;;
+    [ab].out )
+        # We found the default executable, but exeext='' is most
+        # certainly right.
+        break;;
+    *.* )
+        ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+        # FIXME: I believe we export ac_cv_exeext for Libtool,
+        # but it would be cool to find out if it's true.  Does anybody
+        # maintain Libtool? --akim.
+        export ac_cv_exeext
+        break;;
+    * )
+        break;;
   esac
 done
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5
-echo "$as_me: error: C compiler cannot create executables" >&2;}
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { 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
+See \`config.log' for more details." >&2;}
    { (exit 77); exit 77; }; }
 fi
 
@@ -1815,9 +1901,11 @@
 	cross_compiling=yes
     else
 	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'." >&5
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
 echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'." >&2;}
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
     fi
   fi
@@ -1825,7 +1913,7 @@
 echo "$as_me:$LINENO: result: yes" >&5
 echo "${ECHO_T}yes" >&6
 
-rm -f a.out a.exe conftest$ac_cv_exeext
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
 ac_clean_files=$ac_clean_files_save
 # Check the compiler produces executables we can run.  If not, either
 # the compiler is broken, or we cross compile.
@@ -1845,9 +1933,10 @@
 # catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
 # work properly (i.e., refer to `conftest.exe'), while it won't with
 # `rm'.
-for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+for ac_file in conftest.exe conftest conftest.*; do
+  test -f "$ac_file" || continue
   case $ac_file in
-    *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
     *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
           export ac_cv_exeext
           break;;
@@ -1855,8 +1944,10 @@
   esac
 done
 else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;}
+  { { 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
+See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 fi
 
@@ -1874,14 +1965,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -1898,16 +1987,19 @@
   (exit $ac_status); }; then
   for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
   case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;;
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
     *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
        break;;
   esac
 done
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;}
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { 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
+See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 fi
 
@@ -1924,14 +2016,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -1958,7 +2048,8 @@
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_compiler_gnu=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -1978,14 +2069,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2009,7 +2098,8 @@
   ac_cv_prog_cc_g=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_prog_cc_g=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -2031,6 +2121,102 @@
     CFLAGS=
   fi
 fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line $LINENO "configure"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+     char **p;
+     int i;
+{
+  return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+  char *s;
+  va_list v;
+  va_start (v,p);
+  s = g (p, va_arg (v,int));
+  va_end (v);
+  return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
+  ;
+  return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX			-qlanglvl=ansi
+# Ultrix and OSF/1	-std1
+# HP-UX 10.20 and later	-Ae
+# HP-UX older versions	-Aa -D_HPUX_SOURCE
+# SVR4			-Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+  CC="$ac_save_CC $ac_arg"
+  rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+  x|xno)
+    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
+    CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
 # Some people use a C++ compiler to compile C.  Since we use `exit',
 # in C++ we need to declare it.  In case someone uses the same compiler
 # for both compiling C and C++ we need to have the C++ compiler decide
@@ -2063,15 +2249,13 @@
 do
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <stdlib.h>
 $ac_declaration
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2095,20 +2279,19 @@
   :
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 continue
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_declaration
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2132,7 +2315,8 @@
   break
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 done
@@ -2145,7 +2329,8 @@
 
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 ac_ext=c
@@ -2319,18 +2504,28 @@
 do
   # Use a header file that comes with gcc, so configuring glibc
   # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
-#include <assert.h>
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
                      Syntax error
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -2347,7 +2542,8 @@
   :
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   # Broken: fails on valid input.
 continue
 fi
@@ -2357,13 +2553,17 @@
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -2381,7 +2581,8 @@
 continue
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   # Passes both tests.
 ac_preproc_ok=:
 break
@@ -2410,18 +2611,28 @@
 do
   # Use a header file that comes with gcc, so configuring glibc
   # with a fresh cross-compiler works.
+  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+  # <limits.h> exists even on freestanding compilers.
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp. "Syntax error" is here to catch this case.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
-#include <assert.h>
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
                      Syntax error
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -2438,7 +2649,8 @@
   :
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   # Broken: fails on valid input.
 continue
 fi
@@ -2448,13 +2660,17 @@
   # can be detected and how.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <ac_nonexistent.h>
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -2472,7 +2688,8 @@
 continue
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   # Passes both tests.
 ac_preproc_ok=:
 break
@@ -2485,8 +2702,10 @@
 if $ac_preproc_ok; then
   :
 else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+  { { 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
+See \`config.log' for more details." >&2;}
    { (exit 1); exit 1; }; }
 fi
 
@@ -2616,14 +2835,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2650,7 +2867,8 @@
   ac_compiler_gnu=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_compiler_gnu=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -2670,14 +2888,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2701,7 +2917,8 @@
   ac_cv_prog_cxx_g=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_prog_cxx_g=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -2734,15 +2951,13 @@
 do
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <stdlib.h>
 $ac_declaration
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2766,20 +2981,19 @@
   :
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 continue
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_declaration
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -2803,7 +3017,8 @@
   break
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
 done
@@ -3185,6 +3400,91 @@
 echo "$as_me:$LINENO: result: $NM" >&5
 echo "${ECHO_T}$NM" >&6
 
+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
+if test "${lt_cv_path_SED+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_executable_p="test -f"
+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
+      if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+        _sed_list="$_sed_list $as_dir/$ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+
+  # Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+  trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+  trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/sedXXXXXX") 2>/dev/null` &&
+  test -n "$tmp" && test -d "$tmp"
+}  ||
+{
+  tmp=$TMPDIR/sed$$-$RANDOM
+  (umask 077 && mkdir $tmp)
+} ||
+{
+   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   { (exit 1); exit 1; }
+}
+  _max=0
+  _count=0
+  # Add /usr/xpg4/bin/sed as it is typically found on Solaris
+  # along with /bin/sed that truncates output.
+  for _sed in $_sed_list /usr/xpg4/bin/sed; do
+    test ! -f ${_sed} && break
+    cat /dev/null > "$tmp/sed.in"
+    _count=0
+    echo ${ECHO_N-$ac_n} "0123456789${ECHO_C-$ac_c}" >"$tmp/sed.in"
+    # Check for GNU sed and select it if it is found.
+    if "${_sed}" --version 2>&1 < /dev/null | egrep '(GNU)' > /dev/null; then
+      lt_cv_path_SED=${_sed}
+      break
+    fi
+    while true; do
+      cat "$tmp/sed.in" "$tmp/sed.in" >"$tmp/sed.tmp"
+      mv "$tmp/sed.tmp" "$tmp/sed.in"
+      cp "$tmp/sed.in" "$tmp/sed.nl"
+      echo >>"$tmp/sed.nl"
+      ${_sed} -e 's/a$//' < "$tmp/sed.nl" >"$tmp/sed.out" || break
+      cmp -s "$tmp/sed.out" "$tmp/sed.nl" || break
+      # 40000 chars as input seems more than enough
+      test $_count -gt 10 && break
+      _count=`expr $_count + 1`
+      if test $_count -gt $_max; then
+        _max=$_count
+        lt_cv_path_SED=$_sed
+      fi
+    done
+  done
+  rm -rf "$tmp"
+
+fi
+
+if test "X$SED" != "X"; then
+  lt_cv_path_SED=$SED
+else
+  SED=$lt_cv_path_SED
+fi
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
 echo "$as_me:$LINENO: checking whether ln -s works" >&5
 echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
 LN_S=$as_ln_s
@@ -3196,8 +3496,8 @@
 echo "${ECHO_T}no, using $LN_S" >&6
 fi
 
-echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5
-echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
 if test "${lt_cv_deplibs_check_method+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
@@ -3274,9 +3574,9 @@
   lt_cv_file_magic_test_file=/usr/lib/libc.sl
   ;;
 
-irix5* | irix6*)
+irix5* | irix6* | nonstopux*)
   case $host_os in
-  irix5*)
+  irix5* | nonstopux*)
     # this will be overridden with pass_all, but let us keep it just in case
     lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
     ;;
@@ -3298,7 +3598,7 @@
 # This must be Linux ELF.
 linux-gnu*)
   case $host_cpu in
-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* )
+  alpha* | hppa* | i*86 | mips | mipsel | powerpc* | sparc* | ia64* | s390* | x86_64*)
     lt_cv_deplibs_check_method=pass_all ;;
   *)
     # glibc up to 2.1.1 does not perform some relocations on ARM
@@ -3369,6 +3669,9 @@
     lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
     lt_cv_file_magic_test_file=/lib/libc.so
     ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
   esac
   ;;
 esac
@@ -3423,9 +3726,12 @@
   lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
   lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/  {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (lt_ptr) \&\2},/p'"
   ;;
-irix*)
+irix* | nonstopux*)
   symcode='[BCDEGRST]'
   ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
 solaris* | sysv5*)
   symcode='[BDT]'
   ;;
@@ -3534,7 +3840,7 @@
   (eval $ac_link) 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && test -s conftest; then
+  (exit $ac_status); } && test -s conftest$ac_exeext; then
 	    pipe_works=yes
 	  fi
 	  LIBS="$save_LIBS"
@@ -3582,6 +3888,21 @@
 fi
 
 
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+    then ac_cv_prog_egrep='grep -E'
+    else ac_cv_prog_egrep='egrep'
+    fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
 echo "$as_me:$LINENO: checking for ANSI C header files" >&5
 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
 if test "${ac_cv_header_stdc+set}" = set; then
@@ -3589,48 +3910,59 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
 #include <float.h>
 
+int
+main ()
+{
+
+  ;
+  return 0;
+}
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  ac_cv_header_stdc=no
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <string.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
+  $EGREP "memchr" >/dev/null 2>&1; then
   :
 else
   ac_cv_header_stdc=no
@@ -3643,12 +3975,16 @@
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <stdlib.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
+  $EGREP "free" >/dev/null 2>&1; then
   :
 else
   ac_cv_header_stdc=no
@@ -3664,13 +4000,18 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <ctype.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
 #else
-# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+# define ISLOWER(c) \
+                   (('a' <= (c) && (c) <= 'i') \
                      || ('j' <= (c) && (c) <= 'r') \
                      || ('s' <= (c) && (c) <= 'z'))
 # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
@@ -3703,11 +4044,12 @@
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
@@ -3742,7 +4084,11 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_includes_default
 
 #include <$ac_header>
@@ -3762,7 +4108,8 @@
   eval "$as_ac_Header=yes"
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 eval "$as_ac_Header=no"
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -3797,7 +4144,11 @@
 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_includes_default
 #include <$ac_header>
 _ACEOF
@@ -3816,7 +4167,8 @@
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_header_compiler=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -3828,13 +4180,17 @@
 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -3851,7 +4207,8 @@
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   ac_header_preproc=no
 fi
 rm -f conftest.err conftest.$ac_ext
@@ -3864,14 +4221,32 @@
     { 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 preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
   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: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_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
@@ -3897,6 +4272,7 @@
 
 
 
+
 # Only perform the check for file, if the check method requires it
 case $deplibs_check_method in
 file_magic*)
@@ -4212,7 +4588,7 @@
 case $host in
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 4215 "configure"' > conftest.$ac_ext
+  echo '#line 4591 "configure"' > conftest.$ac_ext
   if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
   (eval $ac_compile) 2>&5
   ac_status=$?
@@ -4252,14 +4628,12 @@
 
      cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -4283,7 +4657,8 @@
   lt_cv_cc_needs_belf=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 lt_cv_cc_needs_belf=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -4455,7 +4830,7 @@
       # like `-m68040'.
       lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
       ;;
-    beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
       # PIC is the default for these OSes.
       ;;
     darwin* | rhapsody*)
@@ -4498,7 +4873,7 @@
       lt_cv_prog_cc_pic='+Z'
       ;;
 
-    irix5* | irix6*)
+    irix5* | irix6* | nonstopux*)
       lt_cv_prog_cc_wl='-Wl,'
       lt_cv_prog_cc_static='-non_shared'
       # PIC (with -KPIC) is the default.
@@ -4542,11 +4917,7 @@
     sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
       lt_cv_prog_cc_pic='-KPIC'
       lt_cv_prog_cc_static='-Bstatic'
-      if test "x$host_vendor" = xsni; then
-	lt_cv_prog_cc_wl='-LD'
-      else
-	lt_cv_prog_cc_wl='-Wl,'
-      fi
+      lt_cv_prog_cc_wl='-Wl,'
       ;;
 
     uts4*)
@@ -4586,14 +4957,12 @@
     CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
     cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -4632,7 +5001,8 @@
 
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
       lt_cv_prog_cc_pic_works=no
 
 fi
@@ -4675,14 +5045,12 @@
   LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -4706,7 +5074,8 @@
   lt_cv_prog_cc_static_works=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
   LDFLAGS="$save_LDFLAGS"
@@ -4748,7 +5117,7 @@
 save_CFLAGS="$CFLAGS"
 CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
 compiler_c_o=no
-if { (eval echo configure:4751: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
+if { (eval echo configure:5120: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
   # The compiler can only warn and ignore the option if not recognized
   # So say no if there are warnings
   if test -s out/conftest.err; then
@@ -4790,14 +5159,12 @@
   ac_objext=lo
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -4828,7 +5195,8 @@
 
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   ac_objext="$save_objext"
@@ -4876,14 +5244,12 @@
   compiler_rtti_exceptions=no
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -4914,7 +5280,8 @@
 
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
   CFLAGS="$save_CFLAGS"
@@ -5086,7 +5453,7 @@
     # If the export-symbols file already is a .def file (1st line
     # is EXPORTS), use it as is.
     # If DATA tags from a recent dlltool are present, honour them!
-    archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
+    archive_expsym_cmds='if test "x`sed 1q $export_symbols`" = xEXPORTS; then
 	cp $export_symbols $output_objdir/$soname-def;
       else
 	echo EXPORTS > $output_objdir/$soname-def;
@@ -5095,6 +5462,7 @@
 	 set dummy \$symbol;
 	 case \$# in
 	   2) echo "   \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
+	   4) echo "   \$2 \$3 \$4 ; " >> $output_objdir/$soname-def; _lt_hint=`expr \$_lt_hint - 1`;;
 	   *) echo "     \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;;
 	 esac;
 	 _lt_hint=`expr 1 + \$_lt_hint`;
@@ -5207,10 +5575,12 @@
       # need to do runtime linking.
       case $host_os in aix4.[23]|aix4.[23].*|aix5*)
 	for ld_flag in $LDFLAGS; do
-	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	  case $ld_flag in
+	  *-brtl*)
 	    aix_use_runtimelinking=yes
 	    break
-	  fi
+	  ;;
+	  esac
 	done
       esac
 
@@ -5324,8 +5694,9 @@
     esac
     # FIXME: Relying on posixy $() will cause problems for
     #        cross-compilation, but unfortunately the echo tests do not
-    #        yet detect zsh echo's removal of \ escapes.
-    archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
+    #        yet detect zsh echo's removal of \ escapes.  Also zsh mangles
+    #	     `"' quotes if we put them in here... so don't!
+    archive_cmds='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs && $CC $(test .$module = .yes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib ${lib}-master.o $deplibs$linker_flags $(test .$module != .yes && echo -install_name $rpath/$soname $verstring)'
     # We need to add '_' to the symbols in $export_symbols first
     #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
     hardcode_direct=yes
@@ -5377,13 +5748,14 @@
     export_dynamic_flag_spec='${wl}-E'
     ;;
 
-  irix5* | irix6*)
+  irix5* | irix6* | nonstopux*)
     if test "$GCC" = yes; then
       archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
     else
       archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+      hardcode_libdir_flag_spec='-rpath $libdir'
     fi
-    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
     hardcode_libdir_separator=:
     link_all_deplibs=yes
     ;;
@@ -5411,7 +5783,7 @@
     hardcode_direct=yes
     hardcode_shlibpath_var=no
     if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
-      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
       hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
       export_dynamic_flag_spec='${wl}-E'
     else
@@ -5421,7 +5793,7 @@
 	hardcode_libdir_flag_spec='-R$libdir'
         ;;
       *)
-        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
+        archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
         hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
         ;;
       esac
@@ -5533,13 +5905,23 @@
     ;;
 
   sysv4)
-    if test "x$host_vendor" = xsno; then
-      archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=yes # is this really true???
-    else
-      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
-      hardcode_direct=no #Motorola manual says yes, but my tests say they lie
-    fi
+    case $host_vendor in
+      sni)
+        archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+        hardcode_direct=yes # is this really true???
+        ;;
+      siemens)
+        ## LD is ld it makes a PLAMLIB
+        ## CC just makes a GrossModule.
+        archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+        reload_cmds='$CC -r -o $output$reload_objs'
+        hardcode_direct=no
+        ;;
+      motorola)
+        archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+        hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+        ;;
+    esac
     runpath_var='LD_RUN_PATH'
     hardcode_shlibpath_var=no
     ;;
@@ -5687,6 +6069,9 @@
 
 aix4* | aix5*)
   version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
   if test "$host_cpu" = ia64; then
     # AIX 5 supports IA64
     library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
@@ -5725,6 +6110,7 @@
     fi
     shlibpath_var=LIBPATH
   fi
+  hardcode_into_libs=yes
   ;;
 
 amigaos*)
@@ -5772,7 +6158,7 @@
     ;;
   yes,mingw*)
     library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
-    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
+    sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g" -e "s,=/,/,g"`
     ;;
   yes,pw32*)
     library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'
@@ -5855,14 +6241,17 @@
   postinstall_cmds='chmod 555 $lib'
   ;;
 
-irix5* | irix6*)
-  version_type=irix
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)          version_type=irix ;;
+  esac
   need_lib_prefix=no
   need_version=no
   soname_spec='${libname}${release}.so$major'
   library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
   case $host_os in
-  irix5*)
+  irix5* | nonstopux*)
     libsuff= shlibsuff=
     ;;
   *)
@@ -5907,6 +6296,30 @@
   # people can always --disable-shared, the test was removed, and we
   # assume the GNU/Linux dynamic linker is in use.
   dynamic_linker='GNU/Linux ld.so'
+
+  # Find out which ABI we are using (multilib Linux x86_64 hack).
+  libsuff=
+  case "$host_cpu" in
+  x86_64*|s390x*)
+    echo '#line 6304 "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
+  (exit $ac_status); }; then
+      case `/usr/bin/file conftest.$ac_objext` in
+      *64-bit*)
+        libsuff=64
+        ;;
+      esac
+    fi
+    rm -rf conftest*
+    ;;
+  *)
+    ;;
+  esac
+  sys_lib_dlsearch_path_spec="/lib${libsuff} /usr/lib${libsuff}"
+  sys_lib_search_path_spec="/lib${libsuff} /usr/lib${libsuff} /usr/local/lib${libsuff}"
   ;;
 
 netbsd*)
@@ -5966,11 +6379,12 @@
 osf3* | osf4* | osf5*)
   version_type=osf
   need_version=no
-  soname_spec='${libname}${release}.so'
-  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
   shlibpath_var=LD_LIBRARY_PATH
   sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
   sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  hardcode_into_libs=yes
   ;;
 
 sco3.2v5*)
@@ -6013,6 +6427,12 @@
   case $host_vendor in
     sni)
       shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      export_dynamic_flag_spec='${wl}-Blargedynsym'
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
       ;;
     motorola)
       need_lib_prefix=no
@@ -6135,37 +6555,44 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 /* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char shl_load (); below.  */
-#include <assert.h>
+    which can conflict with char shl_load (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
+{
 #endif
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char shl_load ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
 #if defined (__stub_shl_load) || defined (__stub___shl_load)
 choke me
 #else
-f = shl_load;
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
 #endif
 
+int
+main ()
+{
+return f != shl_load;
   ;
   return 0;
 }
@@ -6185,7 +6612,8 @@
   ac_cv_func_shl_load=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_func_shl_load=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -6204,7 +6632,11 @@
 LIBS="-ldld  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
@@ -6213,12 +6645,6 @@
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char shl_load ();
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -6242,7 +6668,8 @@
   ac_cv_lib_dld_shl_load=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_lib_dld_shl_load=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -6260,37 +6687,44 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 /* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char dlopen (); below.  */
-#include <assert.h>
+    which can conflict with char dlopen (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
+{
 #endif
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char dlopen ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
 #if defined (__stub_dlopen) || defined (__stub___dlopen)
 choke me
 #else
-f = dlopen;
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
 #endif
 
+int
+main ()
+{
+return f != dlopen;
   ;
   return 0;
 }
@@ -6310,7 +6744,8 @@
   ac_cv_func_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_func_dlopen=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -6329,7 +6764,11 @@
 LIBS="-ldl  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
@@ -6338,12 +6777,6 @@
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char dlopen ();
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -6367,7 +6800,8 @@
   ac_cv_lib_dl_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_lib_dl_dlopen=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -6387,7 +6821,11 @@
 LIBS="-lsvld  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
@@ -6396,12 +6834,6 @@
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char dlopen ();
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -6425,7 +6857,8 @@
   ac_cv_lib_svld_dlopen=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_lib_svld_dlopen=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -6445,7 +6878,11 @@
 LIBS="-ldld  $LIBS"
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
@@ -6454,12 +6891,6 @@
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char dld_link ();
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -6483,7 +6914,8 @@
   ac_cv_lib_dld_dld_link=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_lib_dld_dld_link=no
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -6541,7 +6973,7 @@
     lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 6544 "configure"
+#line 6976 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -6639,7 +7071,7 @@
     lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
   lt_status=$lt_dlunknown
   cat > conftest.$ac_ext <<EOF
-#line 6642 "configure"
+#line 7074 "configure"
 #include "confdefs.h"
 
 #if HAVE_DLFCN_H
@@ -6822,7 +7254,7 @@
   # Now quote all the things that may contain metacharacters while being
   # careful not to overquote the AC_SUBSTed values.  We take copies of the
   # variables and quote the copies for generation of the libtool script.
-  for var in echo old_CC old_CFLAGS \
+  for var in echo old_CC old_CFLAGS SED \
     AR AR_FLAGS CC LD LN_S NM SHELL \
     reload_flag reload_cmds wl \
     pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
@@ -6884,8 +7316,11 @@
 # configuration script generated by Autoconf, you may include it under
 # the same distribution terms that you use for the rest of that program.
 
+# A sed that does not truncate output.
+SED=$lt_SED
+
 # Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
+Xsed="${SED} -e s/^X//"
 
 # The HP-UX ksh and POSIX shell print the target directory to stdout
 # if CDPATH is set.
@@ -7389,48 +7824,59 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <stdlib.h>
 #include <stdarg.h>
 #include <string.h>
 #include <float.h>
 
+int
+main ()
+{
+
+  ;
+  return 0;
+}
 _ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
-  (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>&5
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null; then
-  if test -s conftest.err; then
-    ac_cpp_err=$ac_c_preproc_warn_flag
-  else
-    ac_cpp_err=
-  fi
-else
-  ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
+  (exit $ac_status); } &&
+         { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
   ac_cv_header_stdc=yes
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
-  ac_cv_header_stdc=no
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
 fi
-rm -f conftest.err conftest.$ac_ext
+rm -f conftest.$ac_objext conftest.$ac_ext
 
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <string.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "memchr" >/dev/null 2>&1; then
+  $EGREP "memchr" >/dev/null 2>&1; then
   :
 else
   ac_cv_header_stdc=no
@@ -7443,12 +7889,16 @@
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <stdlib.h>
 
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "free" >/dev/null 2>&1; then
+  $EGREP "free" >/dev/null 2>&1; then
   :
 else
   ac_cv_header_stdc=no
@@ -7464,13 +7914,18 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <ctype.h>
 #if ((' ' & 0x0FF) == 0x020)
 # define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
 # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
 #else
-# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+# define ISLOWER(c) \
+                   (('a' <= (c) && (c) <= 'i') \
                      || ('j' <= (c) && (c) <= 'r') \
                      || ('s' <= (c) && (c) <= 'z'))
 # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
@@ -7503,11 +7958,12 @@
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ( exit $ac_status )
 ac_cv_header_stdc=no
 fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 fi
@@ -7528,7 +7984,11 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <sys/types.h>
 #include <sys/wait.h>
 #ifndef WEXITSTATUS
@@ -7538,12 +7998,6 @@
 # define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
 #endif
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -7569,7 +8023,8 @@
   ac_cv_header_sys_wait_h=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_header_sys_wait_h=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -7613,7 +8068,11 @@
 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_includes_default
 #include <$ac_header>
 _ACEOF
@@ -7632,7 +8091,8 @@
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_header_compiler=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -7644,13 +8104,17 @@
 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -7667,7 +8131,8 @@
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   ac_header_preproc=no
 fi
 rm -f conftest.err conftest.$ac_ext
@@ -7680,14 +8145,32 @@
     { 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 preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
   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: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_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
@@ -7711,103 +8194,6 @@
 
 
 # Checks for typedefs, structures, and compiler characteristics.
-echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
-echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_stdc=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-# Don't try gcc -ansi; that turns off useful extensions and
-# breaks some systems' header files.
-# AIX			-qlanglvl=ansi
-# Ultrix and OSF/1	-std1
-# HP-UX 10.20 and later	-Ae
-# HP-UX older versions	-Aa -D_HPUX_SOURCE
-# SVR4			-Xc -D__EXTENSIONS__
-for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-         { ac_try='test -s conftest.$ac_objext'
-  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
-  (eval $ac_try) 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  ac_cv_prog_cc_stdc=$ac_arg
-break
-else
-  echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext
-done
-rm -f conftest.$ac_ext conftest.$ac_objext
-CC=$ac_save_CC
-
-fi
-
-case "x$ac_cv_prog_cc_stdc" in
-  x|xno)
-    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
-    CC="$CC $ac_cv_prog_cc_stdc" ;;
-esac
-
 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
 if test "${ac_cv_c_const+set}" = set; then
@@ -7815,14 +8201,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -7892,7 +8276,8 @@
   ac_cv_c_const=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_c_const=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -7914,14 +8299,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_includes_default
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -7948,7 +8331,8 @@
   ac_cv_type_mode_t=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_type_mode_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -7972,14 +8356,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_includes_default
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -8006,7 +8388,8 @@
   ac_cv_type_size_t=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_type_size_t=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -8030,17 +8413,15 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <sys/types.h>
 #include <sys/time.h>
 #include <time.h>
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -8065,7 +8446,8 @@
   ac_cv_header_time=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_cv_header_time=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -8091,12 +8473,16 @@
     ac_pattern="Autoconf.*'x'"
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <sgtty.h>
 Autoconf TIOCGETP
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "$ac_pattern" >/dev/null 2>&1; then
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
   ac_cv_prog_gcc_traditional=yes
 else
   ac_cv_prog_gcc_traditional=no
@@ -8107,12 +8493,16 @@
   if test $ac_cv_prog_gcc_traditional = no; then
     cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <termio.h>
 Autoconf TCGETA
 _ACEOF
 if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  egrep "$ac_pattern" >/dev/null 2>&1; then
+  $EGREP "$ac_pattern" >/dev/null 2>&1; then
   ac_cv_prog_gcc_traditional=yes
 fi
 rm -f conftest*
@@ -8144,7 +8534,11 @@
 echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 $ac_includes_default
 #include <$ac_header>
 _ACEOF
@@ -8163,7 +8557,8 @@
   ac_header_compiler=yes
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ac_header_compiler=no
 fi
 rm -f conftest.$ac_objext conftest.$ac_ext
@@ -8175,13 +8570,17 @@
 echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
 cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #include <$ac_header>
 _ACEOF
 if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
   (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
   ac_status=$?
-  egrep -v '^ *\+' conftest.er1 >conftest.err
+  grep -v '^ *+' conftest.er1 >conftest.err
   rm -f conftest.er1
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
@@ -8198,7 +8597,8 @@
   ac_header_preproc=yes
 else
   echo "$as_me: failed program was:" >&5
-  cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
   ac_header_preproc=no
 fi
 rm -f conftest.err conftest.$ac_ext
@@ -8211,14 +8611,32 @@
     { 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 preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_ASBOX
+    ) |
+      sed "s/^/$as_me: WARNING:     /" >&2
+    ;;
   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: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+    (
+      cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to bug-autoconf@gnu.org. ##
+## ------------------------------------ ##
+_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
@@ -8240,29 +8658,27 @@
 
 done
 
-echo "$as_me:$LINENO: checking for working malloc" >&5
-echo $ECHO_N "checking for working malloc... $ECHO_C" >&6
-if test "${ac_cv_func_malloc_works+set}" = set; then
+echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5
+echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6
+if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   if test "$cross_compiling" = yes; then
-  ac_cv_func_malloc_works=no
+  ac_cv_func_malloc_0_nonnull=no
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 #if STDC_HEADERS || HAVE_STDLIB_H
 # include <stdlib.h>
 #else
 char *malloc ();
 #endif
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -8282,27 +8698,41 @@
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }; }; then
-  ac_cv_func_malloc_works=yes
+  ac_cv_func_malloc_0_nonnull=yes
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ( exit $ac_status )
-ac_cv_func_malloc_works=no
+ac_cv_func_malloc_0_nonnull=no
 fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
-echo "$as_me:$LINENO: result: $ac_cv_func_malloc_works" >&5
-echo "${ECHO_T}$ac_cv_func_malloc_works" >&6
-if test $ac_cv_func_malloc_works = yes; then
+echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5
+echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6
+if test $ac_cv_func_malloc_0_nonnull = yes; then
 
 cat >>confdefs.h <<\_ACEOF
 #define HAVE_MALLOC 1
 _ACEOF
 
+else
+  cat >>confdefs.h <<\_ACEOF
+#define HAVE_MALLOC 0
+_ACEOF
+
+   LIBOBJS="$LIBOBJS malloc.$ac_objext"
+
+cat >>confdefs.h <<\_ACEOF
+#define malloc rpl_malloc
+_ACEOF
+
 fi
 
+
+
 echo "$as_me:$LINENO: checking for working memcmp" >&5
 echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
 if test "${ac_cv_func_memcmp_working+set}" = set; then
@@ -8313,14 +8743,12 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
 int
 main ()
 {
@@ -8368,11 +8796,12 @@
 else
   echo "$as_me: program exited with status $ac_status" >&5
 echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 ( exit $ac_status )
 ac_cv_func_memcmp_working=no
 fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+rm -f core core.* *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
 fi
 fi
 echo "$as_me:$LINENO: result: $ac_cv_func_memcmp_working" >&5
@@ -8397,37 +8826,44 @@
 else
   cat >conftest.$ac_ext <<_ACEOF
 #line $LINENO "configure"
-#include "confdefs.h"
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
 /* System header to define __stub macros and hopefully few prototypes,
-    which can conflict with char $ac_func (); below.  */
-#include <assert.h>
+    which can conflict with char $ac_func (); below.
+    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+    <limits.h> exists even on freestanding compilers.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
 /* Override any gcc2 internal prototype to avoid an error.  */
 #ifdef __cplusplus
 extern "C"
+{
 #endif
 /* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
 char $ac_func ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-#  ifdef __cplusplus
-     extern "C"
-#  endif
-   int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
 /* The GNU C library defines this for functions which it implements
     to always fail with ENOSYS.  Some functions are actually named
     something starting with __ and the normal name is an alias.  */
 #if defined (__stub_$ac_func) || defined (__stub___$ac_func)
 choke me
 #else
-f = $ac_func;
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
 #endif
 
+int
+main ()
+{
+return f != $ac_func;
   ;
   return 0;
 }
@@ -8447,7 +8883,8 @@
   eval "$as_ac_var=yes"
 else
   echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
 eval "$as_ac_var=no"
 fi
 rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
@@ -8536,15 +8973,15 @@
 echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
 fi
 
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
 if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
   echo $ECHO_N "(cached) $ECHO_C" >&6
 else
   cat >conftest.make <<\_ACEOF
 all:
-	@echo 'ac_maketemp="${MAKE}"'
+	@echo 'ac_maketemp="$(MAKE)"'
 _ACEOF
 # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
 eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
@@ -8576,7 +9013,7 @@
 rmdir .deps 2>/dev/null
 
 
-ac_config_commands="$ac_config_commands depfiles"
+          ac_config_commands="$ac_config_commands depfiles"
 
 
 am_make=${MAKE-make}
@@ -8913,7 +9350,7 @@
 
 
 
-ac_config_files="$ac_config_files Makefile doc/Makefile ggsn/Makefile gtp/Makefile intl/Makefile po/Makefile sgsnemu/Makefile src/Makefile tests/Makefile openggsn.spec"
+                                                                                                    ac_config_files="$ac_config_files Makefile doc/Makefile ggsn/Makefile gtp/Makefile intl/Makefile po/Makefile sgsnemu/Makefile src/Makefile tests/Makefile openggsn.spec"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -8925,7 +9362,7 @@
 # config.status only pays attention to the cache file if you give it
 # the --recheck option to rerun configure.
 #
-# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
 # loading this file, other *unset* `ac_cv_foo' will be assigned the
 # following values.
 
@@ -8960,7 +9397,7 @@
      t end
      /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
      : end' >>confcache
-if cmp -s $cache_file confcache; then :; else
+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 "updating cache $cache_file"
     cat confcache >$cache_file
@@ -8991,6 +9428,21 @@
 
 DEFS=-DHAVE_CONFIG_H
 
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+  # 1. Remove the extension, and $U if already installed.
+  ac_i=`echo "$ac_i" |
+         sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+  # 2. Add them.
+  ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+  ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
 if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
   { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -9012,11 +9464,12 @@
 # configure, is in config.log if it exists.
 
 debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
 SHELL=\${CONFIG_SHELL-$SHELL}
 _ACEOF
 
 cat >>$CONFIG_STATUS <<\_ACEOF
-
 ## --------------------- ##
 ## M4sh Initialization.  ##
 ## --------------------- ##
@@ -9025,11 +9478,13 @@
 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
+  # is contrary to our usage.  Disable this feature.
+  alias -g '${1+"$@"}'='"$@"'
 elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
   set -o posix
 fi
 
-# NLS nuisances.
 # Support unset when possible.
 if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
   as_unset=unset
@@ -9037,34 +9492,42 @@
   as_unset=false
 fi
 
-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
-    { $as_unset LANG || test "${LANG+set}" != set; } ||
-      { LANG=C; export LANG; }
-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
-    { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
-      { LC_ALL=C; export LC_ALL; }
-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
-    { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
-      { LC_TIME=C; export LC_TIME; }
-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
-    { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
-      { LC_CTYPE=C; export LC_CTYPE; }
-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
-    { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
-      { LANGUAGE=C; export LANGUAGE; }
-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
-    { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
-      { LC_COLLATE=C; export LC_COLLATE; }
-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
-    { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
-      { LC_NUMERIC=C; export LC_NUMERIC; }
-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
-    { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
-      { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+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 -n "`(eval $as_var=C; export $as_var) 2>&1`"); then
+    eval $as_var=C; export $as_var
+  else
+    $as_unset $as_var
+  fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+  as_expr=expr
+else
+  as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+  as_basename=basename
+else
+  as_basename=false
+fi
 
 
 # Name of the executable.
-as_me=`(basename "$0") 2>/dev/null ||
+as_me=`$as_basename "$0" ||
 $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
 	 X"$0" : 'X\(//\)$' \| \
 	 X"$0" : 'X\(/\)$' \| \
@@ -9075,6 +9538,7 @@
   	  /^X\/\(\/\).*/{ s//\1/; q; }
   	  s/.*/./; q'`
 
+
 # PATH needs CR, and LINENO needs CR and PATH.
 # Avoid depending upon Character Ranges.
 as_cr_letters='abcdefghijklmnopqrstuvwxyz'
@@ -9085,15 +9549,15 @@
 
 # The user is always right.
 if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conftest.sh
-  echo  "exit 0"   >>conftest.sh
-  chmod +x conftest.sh
-  if (PATH=".;."; conftest.sh) >/dev/null 2>&1; 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=';'
   else
     PATH_SEPARATOR=:
   fi
-  rm -f conftest.sh
+  rm -f conf$$.sh
 fi
 
 
@@ -9142,6 +9606,8 @@
   as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
   test "x$as_lineno_1" != "x$as_lineno_2" &&
   test "x$as_lineno_3"  = "x$as_lineno_2" ') 2>/dev/null; then
+	     $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+	     $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
 	     CONFIG_SHELL=$as_dir/$as_base
 	     export CONFIG_SHELL
 	     exec "$CONFIG_SHELL" "$0" ${1+"$@"}
@@ -9215,6 +9681,12 @@
 fi
 rm -f conf$$ conf$$.exe conf$$.file
 
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p=:
+else
+  as_mkdir_p=false
+fi
+
 as_executable_p="test -f"
 
 # Sed expression to map a string onto a valid CPP name.
@@ -9231,7 +9703,7 @@
 IFS=" 	$as_nl"
 
 # CDPATH.
-$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
+$as_unset CDPATH
 
 exec 6>&1
 
@@ -9248,7 +9720,7 @@
 cat >&5 <<_CSEOF
 
 This file was extended by openggsn $as_me 0.61b, which was
-generated by GNU Autoconf 2.53.  Invocation command line was
+generated by GNU Autoconf 2.57.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -9288,6 +9760,7 @@
 
   -h, --help       print this help, then exit
   -V, --version    print version number, then exit
+  -q, --quiet      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]
@@ -9310,7 +9783,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
 openggsn config.status 0.61b
-configured by $0, generated by GNU Autoconf 2.53,
+configured by $0, generated by GNU Autoconf 2.57,
   with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
 
 Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
@@ -9331,25 +9804,25 @@
   --*=*)
     ac_option=`expr "x$1" : 'x\([^=]*\)='`
     ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
-    shift
-    set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
-    shift
+    ac_shift=:
     ;;
-  -*);;
+  -*)
+    ac_option=$1
+    ac_optarg=$2
+    ac_shift=shift
+    ;;
   *) # This is not an option, so the user has probably given explicit
      # arguments.
+     ac_option=$1
      ac_need_defaults=false;;
   esac
 
-  case $1 in
+  case $ac_option in
   # Handling of the options.
 _ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
-    exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
-_ACEOF
 cat >>$CONFIG_STATUS <<\_ACEOF
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    ac_cs_recheck=: ;;
   --version | --vers* | -V )
     echo "$ac_cs_version"; exit 0 ;;
   --he | --h)
@@ -9364,13 +9837,16 @@
   --debug | --d* | -d )
     debug=: ;;
   --file | --fil | --fi | --f )
-    shift
-    CONFIG_FILES="$CONFIG_FILES $1"
+    $ac_shift
+    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
     ac_need_defaults=false;;
   --header | --heade | --head | --hea )
-    shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $1"
+    $ac_shift
+    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
     ac_need_defaults=false;;
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil | --si | --s)
+    ac_cs_silent=: ;;
 
   # This is an error.
   -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
@@ -9385,6 +9861,20 @@
   shift
 done
 
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+  exec 6>/dev/null
+  ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+  echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+  exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
 _ACEOF
 
 cat >>$CONFIG_STATUS <<_ACEOF
@@ -9431,6 +9921,9 @@
   test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
 fi
 
+# Have a temporary directory for convenience.  Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
 # Create a temporary directory, and hook for its removal unless debugging.
 $debug ||
 {
@@ -9439,17 +9932,17 @@
 }
 
 # Create a (secure) tmp directory for tmp files.
-: ${TMPDIR=/tmp}
+
 {
-  tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+  tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
   test -n "$tmp" && test -d "$tmp"
 }  ||
 {
-  tmp=$TMPDIR/cs$$-$RANDOM
+  tmp=./confstat$$-$RANDOM
   (umask 077 && mkdir $tmp)
 } ||
 {
-   echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+   echo "$me: cannot create a temporary directory in ." >&2
    { (exit 1); exit 1; }
 }
 
@@ -9526,6 +10019,7 @@
 s,@ECHO@,$ECHO,;t t
 s,@STRIP@,$STRIP,;t t
 s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s,@EGREP@,$EGREP,;t t
 s,@LIBTOOL@,$LIBTOOL,;t t
 s,@EXEC_LDFLAGS@,$EXEC_LDFLAGS,;t t
 s,@LIBOBJS@,$LIBOBJS,;t t
@@ -9548,6 +10042,7 @@
 s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
 s,@CCDEPMODE@,$CCDEPMODE,;t t
 s,@CXXDEPMODE@,$CXXDEPMODE,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
 CEOF
 
 _ACEOF
@@ -9618,25 +10113,30 @@
   	  /^X\(\/\/\)$/{ s//\1/; q; }
   	  /^X\(\/\).*/{ s//\1/; q; }
   	  s/.*/./; q'`
-  { case "$ac_dir" in
-  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
-  *)                      as_incr_dir=.;;
-esac
-as_dummy="$ac_dir"
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
-  case $as_mkdir_dir in
-    # Skip DOS drivespec
-    ?:) as_incr_dir=$as_mkdir_dir ;;
-    *)
-      as_incr_dir=$as_incr_dir/$as_mkdir_dir
-      test -d "$as_incr_dir" ||
-        mkdir "$as_incr_dir" ||
-	{ { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }
-    ;;
-  esac
-done; }
+  { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$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" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
 
   ac_builddir=.
 
@@ -9666,7 +10166,7 @@
 # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
 # absolute.
 ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
 ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
 ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
 
@@ -9856,7 +10356,7 @@
 # Break up conftest.defines because some shells have a limit on the size
 # of here documents, and old seds have small limits too (100 cmds).
 echo '  # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo '  if egrep "^[ 	]*#[ 	]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo '  if grep "^[ 	]*#[ 	]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
 echo '  # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
 echo '  :' >>$CONFIG_STATUS
 rm -f conftest.tail
@@ -9880,7 +10380,7 @@
   mv conftest.tail conftest.defines
 done
 rm -f conftest.defines
-echo '  fi # egrep' >>$CONFIG_STATUS
+echo '  fi # grep' >>$CONFIG_STATUS
 echo >>$CONFIG_STATUS
 
 # Break up conftest.undefs because some shells have a limit on the size
@@ -9920,7 +10420,7 @@
   cat $tmp/in >>$tmp/config.h
   rm -f $tmp/in
   if test x"$ac_file" != x-; then
-    if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
+    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;}
     else
@@ -9936,25 +10436,30 @@
   	  /^X\(\/\/\)$/{ s//\1/; q; }
   	  /^X\(\/\).*/{ s//\1/; q; }
   	  s/.*/./; q'`
-      { case "$ac_dir" in
-  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
-  *)                      as_incr_dir=.;;
-esac
-as_dummy="$ac_dir"
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
-  case $as_mkdir_dir in
-    # Skip DOS drivespec
-    ?:) as_incr_dir=$as_mkdir_dir ;;
-    *)
-      as_incr_dir=$as_incr_dir/$as_mkdir_dir
-      test -d "$as_incr_dir" ||
-        mkdir "$as_incr_dir" ||
-	{ { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
-   { (exit 1); exit 1; }; }
-    ;;
-  esac
-done; }
+      { if $as_mkdir_p; then
+    mkdir -p "$ac_dir"
+  else
+    as_dir="$ac_dir"
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$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" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+   { (exit 1); exit 1; }; }; }
 
       rm -f $ac_file
       mv $tmp/config.h $ac_file
@@ -10019,7 +10524,7 @@
 # Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
 # absolute.
 ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
+ac_abs_top_builddir=`cd "$ac_dir" && cd ${ac_top_builddir}. && pwd`
 ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
 ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
 
@@ -10088,25 +10593,30 @@
   	  /^X\(\/\/\)$/{ s//\1/; q; }
   	  /^X\(\/\).*/{ s//\1/; q; }
   	  s/.*/./; q'`
-    { case $dirpart/$fdir in
-  [\\/]* | ?:[\\/]* ) as_incr_dir=;;
-  *)                      as_incr_dir=.;;
-esac
-as_dummy=$dirpart/$fdir
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
-  case $as_mkdir_dir in
-    # Skip DOS drivespec
-    ?:) as_incr_dir=$as_mkdir_dir ;;
-    *)
-      as_incr_dir=$as_incr_dir/$as_mkdir_dir
-      test -d "$as_incr_dir" ||
-        mkdir "$as_incr_dir" ||
-	{ { echo "$as_me:$LINENO: error: cannot create $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create $dirpart/$fdir" >&2;}
-   { (exit 1); exit 1; }; }
-    ;;
-  esac
-done; }
+    { if $as_mkdir_p; then
+    mkdir -p $dirpart/$fdir
+  else
+    as_dir=$dirpart/$fdir
+    as_dirs=
+    while test ! -d "$as_dir"; do
+      as_dirs="$as_dir $as_dirs"
+      as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$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" |
+    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+  	  /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+  	  /^X\(\/\/\)$/{ s//\1/; q; }
+  	  /^X\(\/\).*/{ s//\1/; q; }
+  	  s/.*/./; q'`
+    done
+    test ! -n "$as_dirs" || mkdir $as_dirs
+  fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+   { (exit 1); exit 1; }; }; }
 
     # echo "creating $dirpart/$file"
     echo '# dummy' > "$dirpart/$file"
@@ -10135,8 +10645,11 @@
 # need to make the FD available again.
 if test "$no_create" != yes; then
   ac_cs_success=:
+  ac_config_status_args=
+  test "$silent" = yes &&
+    ac_config_status_args="$ac_config_status_args --quiet"
   exec 5>/dev/null
-  $SHELL $CONFIG_STATUS || ac_cs_success=false
+  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
   exec 5>>config.log
   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
   # would make configure fail if this is the last instruction.
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 163e602..25da64c 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -109,12 +109,15 @@
 
 int delete_context(struct pdp_t *pdp) {
   if (debug) printf("Deleting PDP context\n");
-  ippool_freeip(ippool, (struct ippoolm_t *) pdp->peer);
+  if (pdp->peer)
+    ippool_freeip(ippool, (struct ippoolm_t *) pdp->peer);
+  else
+    sys_err(LOG_ERR, __FILE__, __LINE__, 0, "Peer not defined!");
   return 0;
 }
 
 
-int create_context(struct pdp_t *pdp) {
+int create_context_ind(struct pdp_t *pdp) {
   struct in_addr addr;
   struct ippoolm_t *member;
 
@@ -126,12 +129,16 @@
   memcpy(pdp->qos_neg0, pdp->qos_req0, sizeof(pdp->qos_neg));
   memcpy(&pdp->pco_neg, &pco, sizeof(pdp->pco_neg));
 
+  memcpy(pdp->qos_neg.v, pdp->qos_req.v, pdp->qos_req.l); /* TODO */
+  pdp->qos_neg.l = pdp->qos_req.l;
+  
   if (pdp_euaton(&pdp->eua, &addr)) {
     addr.s_addr = 0; /* Request dynamic */
   }
 
   if (ippool_newip(ippool, &member, &addr)) {
-    return EOF; /* Allready in use, or no more available */
+    gtp_create_context_resp(gsn, pdp, GTPCAUSE_NO_RESOURCES);
+    return 0; /* Allready in use, or no more available */
   }
 
   pdp_ntoeua(&member->addr, &pdp->eua);
@@ -139,6 +146,7 @@
   pdp->ipif = tun; /* TODO */
   member->peer = pdp;
 
+  gtp_create_context_resp(gsn, pdp, GTPCAUSE_ACC_REQ);
   return 0; /* Success */
 }
 
@@ -157,7 +165,7 @@
   }
   
   if (ipm->peer) /* Check if a peer protocol is defined */
-    gtp_gpdu(gsn, (struct pdp_t*) ipm->peer, pack, len);
+    gtp_data_req(gsn, (struct pdp_t*) ipm->peer, pack, len);
   return 0;
 }
 
@@ -368,11 +376,13 @@
 	    "Failed to create gtp");
     exit(1);
   }
-  if (gsn->fd > maxfd) maxfd = gsn->fd;
+  if (gsn->fd0 > maxfd) maxfd = gsn->fd0;
+  if (gsn->fd1c > maxfd) maxfd = gsn->fd1c;
+  if (gsn->fd1u > maxfd) maxfd = gsn->fd1u;
 
-  gtp_set_cb_gpdu(gsn, encaps_tun);
+  gtp_set_cb_data_ind(gsn, encaps_tun);
   gtp_set_cb_delete_context(gsn, delete_context);
-  gtp_set_cb_create_context(gsn, create_context);
+  gtp_set_cb_create_context_ind(gsn, create_context_ind);
 
 
   /* Create a tunnel interface */
@@ -396,7 +406,9 @@
 	
     FD_ZERO(&fds);
     if (tun) FD_SET(tun->fd, &fds);
-    FD_SET(gsn->fd, &fds);
+    FD_SET(gsn->fd0, &fds);
+    FD_SET(gsn->fd1c, &fds);
+    FD_SET(gsn->fd1u, &fds);
     
     gtp_retranstimeout(gsn, &idleTime);
     switch (select(maxfd + 1, &fds, NULL, NULL, &idleTime)) {
@@ -417,9 +429,15 @@
       sys_err(LOG_ERR, __FILE__, __LINE__, 0,
 	      "TUN read failed (fd)=(%d)", tun->fd);
     }
-
-    if (FD_ISSET(gsn->fd, &fds))
-      gtp_decaps(gsn);
+    
+    if (FD_ISSET(gsn->fd0, &fds))
+      gtp_decaps0(gsn);
+    
+    if (FD_ISSET(gsn->fd1c, &fds))
+      gtp_decaps1c(gsn);
+    
+    if (FD_ISSET(gsn->fd1u, &fds))
+      gtp_decaps1u(gsn);
     
   }
 
diff --git a/gtp/gtp.c b/gtp/gtp.c
index 7d36dbb..27d8a03 100644
--- a/gtp/gtp.c
+++ b/gtp/gtp.c
@@ -122,171 +122,162 @@
   return pdp_freepdp(pdp);
 }
 
-int gtp_create_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid,
-		       struct in_addr* inetaddr) {
-  int version = 0;
-
-  return gtp_create_pdp_req(gsn, version, aid, inetaddr, pdp);
-}
-
-int gtp_create_context2(struct gsn_t *gsn, void *aid, 
-			struct in_addr* inetaddr,
-			int selmode, uint64_t imsi, int nsapi,
-			uint8_t *qos, int qoslen,
-			char *apn, int apnlen,
-			char *msisdn, int msisdnlen,
-			uint8_t *pco, int pcolen) {
-  int version = 0;
-
-  struct pdp_t *pdp;
-
-  if (qoslen > sizeof(pdp->qos_req0)) {
-    gtp_err(LOG_ERR, __FILE__, __LINE__, 0, "QoS length too big");
-    return -1;
-  }
-
-  if (apnlen > sizeof(pdp->apn_use.v)) {
-    gtp_err(LOG_ERR, __FILE__, __LINE__, 0, "APN length too big");
-    return -1;
-  }
-
-  if (msisdnlen > sizeof(pdp->msisdn.v)) {
-    gtp_err(LOG_ERR, __FILE__, __LINE__, 0, "MSISDN length too big");
-    return -1;
-  }
-
-  if (pcolen > sizeof(pdp->pco_req.v)) {
-    gtp_err(LOG_ERR, __FILE__, __LINE__, 0, "PCO length too big");
-    return -1;
-  }
-
-  /* New pdp allocated here:*/
-  pdp_newpdp(&pdp, imsi, nsapi, NULL); 
-
-  pdp->peer = aid;
-  pdp->ipif = NULL;
-
-  pdp->selmode = selmode; 
-
-  memcpy(pdp->qos_req0, qos, qoslen);  /* Length checked above */
-  pdp->apn_use.l = apnlen;
-  memcpy(pdp->apn_use.v, apn, apnlen); /* Length checked above */
-
-  pdp->gsnlc.l = sizeof(gsn->gsnc);
-  memcpy(pdp->gsnlc.v, &gsn->gsnc, sizeof(gsn->gsnc));
-  pdp->gsnlu.l = sizeof(gsn->gsnc);
-  memcpy(pdp->gsnlu.v, &gsn->gsnc, sizeof(gsn->gsnc));
-
-  pdp->msisdn.l = msisdnlen;
-  memcpy(pdp->msisdn.v, msisdn, msisdnlen);
-
-  ipv42eua(&pdp->eua, NULL); /* Request dynamic IP address */
-
-  pdp->pco_req.l = pcolen;
-  memcpy(pdp->pco_req.v, pco, pcolen);
-
-  return gtp_create_pdp_req(gsn, version, aid, inetaddr, pdp);
-}
-
-int gtp_update_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid,
-		       struct in_addr* inetaddr) {
-  int version = 0;
-  
-  return gtp_update_pdp_req(gsn, version, aid, inetaddr, pdp);
-}
-
-int gtp_delete_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid) {
-  int version = 0;
-  return gtp_delete_pdp_req(gsn, version, aid, pdp);
-}
-
 /* gtp_gpdu */
 
 extern int gtp_fd(struct gsn_t *gsn) {
-  return gsn->fd;
+  return gsn->fd0;
 }
 
 /* gtp_decaps */
 /* gtp_retrans */
 /* gtp_retranstimeout */
 
+
+int gtp_set_cb_unsup_ind(struct gsn_t *gsn,
+			 int (*cb) (struct sockaddr_in *peer)) {
+  gsn->cb_unsup_ind = cb;
+  return 0;
+}
+
+
+/* API: Initialise delete context callback */
+/* Called whenever a pdp context is deleted for any reason */
 int gtp_set_cb_delete_context(struct gsn_t *gsn,
-			      int (*cb_delete_context) (struct pdp_t* pdp)) 
+      int (*cb) (struct pdp_t* pdp)) 
 {
-  gsn->cb_delete_context = cb_delete_context;
+  gsn->cb_delete_context = cb;
   return 0;
 }
 
-int gtp_set_cb_create_context(struct gsn_t *gsn,
-			      int (*cb_create_context) (struct pdp_t* pdp)) 
-{
-  gsn->cb_create_context = cb_create_context;
-  return 0;
-}
-
-/*
-
-  int gtp_set_cb_create_pdp_conf(struct gsn_t *gsn, 
-  int (*cb) (struct pdp_t*, int)) 
-  {
-   gsn->cb_create_pdp_conf = cb;
-  return 0;
-  }
-
- int gtp_set_cb_update_pdp_conf(struct gsn_t *gsn, 
-			       int (*cb) (struct pdp_t*, int, int)) 
- {
-   gsn->cb_update_pdp_conf = cb;
-   return 0;
-} 
-
-in t gtp_set_cb_delete_pdp_conf(struct gsn_t *gsn, 
-int (*cb) (struct pdp_t*, int)) 
- { 
-gsn->cb_delete_pdp_conf = cb;
-return 0;
-}
-
-*/
-
 int gtp_set_cb_conf(struct gsn_t *gsn,
 		    int (*cb) (int type, int cause, 
-			       struct pdp_t* pdp, void *aid)) {
+			       struct pdp_t* pdp, void *cbp)) {
   gsn->cb_conf = cb;
   return 0;
 }
 
-extern int gtp_set_cb_gpdu(struct gsn_t *gsn,
-			   int (*cb_gpdu) (struct pdp_t* pdp,
+extern int gtp_set_cb_data_ind(struct gsn_t *gsn,
+			   int (*cb_data_ind) (struct pdp_t* pdp,
 					   void* pack,
 					   unsigned len)) 
 {
-  gsn->cb_gpdu = cb_gpdu;
+  gsn->cb_data_ind = cb_data_ind;
   return 0;
 }
 
-
-void get_default_gtp(int version, void *packet) {
+/**
+ * get_default_gtp()
+ * Generate a GPRS Tunneling Protocol signalling packet header, depending
+ * on GTP version and message type. pdp is used for teid/flow label.
+ * *packet must be allocated by the calling function, and be large enough
+ * to hold the packet header.
+ * returns the length of the header. 0 on error.
+ **/
+static int get_default_gtp(int version, u_int8_t type, void *packet) {
   struct gtp0_header *gtp0_default = (struct gtp0_header*) packet;
   struct gtp1_header_long *gtp1_default = (struct gtp1_header_long*) packet;
   switch (version) {
   case 0:
     /* Initialise "standard" GTP0 header */
-    memset(gtp0_default, 0, sizeof(gtp0_default));
+    memset(gtp0_default, 0, sizeof(struct gtp0_header));
     gtp0_default->flags=0x1e;
+    gtp0_default->type=hton8(type);
     gtp0_default->spare1=0xff;
     gtp0_default->spare2=0xff;
     gtp0_default->spare3=0xff;
     gtp0_default->number=0xff;
-  break;
+    return GTP0_HEADER_SIZE;
   case 1:
     /* Initialise "standard" GTP1 header */
-    memset(gtp1_default, 0, sizeof(gtp1_default));
-    gtp0_default->flags=0x1e;
-    break;
+    /* 29.060: 8.2: S=1 and PN=0 */
+    /* 29.060 9.3.1: For GTP-U messages Echo Request, Echo Response */
+    /* and Supported Extension Headers Notification, the S field shall be */
+    /* set to 1 */
+    /* Currently extension headers are not supported */
+    memset(gtp1_default, 0, sizeof(struct gtp1_header_long));
+    gtp1_default->flags=0x32; /* No extension, enable sequence, no N-PDU */
+    gtp1_default->type=hton8(type);
+    return GTP1_HEADER_SIZE_LONG;
+  default:
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown GTP packet version");
+    return 0;
   }
 }
 
+/**
+ * get_seq()
+ * Get sequence number of a packet.
+ * Returns 0 on error
+ **/
+static uint16_t get_seq(void *pack) {
+  union gtp_packet *packet = (union gtp_packet *) pack;
+
+  if ((packet->flags & 0xe0) == 0x00) { /* Version 0 */
+    return ntoh16(packet->gtp0.h.seq);
+  }
+  else if ((packet->flags & 0xe2) == 0x22) { /* Version 1 with seq */
+    return ntoh16(packet->gtp1l.h.seq);
+  } else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown packet flag");
+    return 0;
+  }
+}
+
+/**
+ * get_tid()
+ * Get tunnel identifier of a packet.
+ * Returns 0 on error
+ **/
+static uint64_t get_tid(void *pack) {
+  union gtp_packet *packet = (union gtp_packet *) pack;
+  
+  if ((packet->flags & 0xe0) == 0x00) { /* Version 0 */
+    return packet->gtp0.h.tid;
+  }
+  return 0;
+}
+
+/**
+ * get_hlen()
+ * Get the header length of a packet.
+ * Returns 0 on error
+ **/
+static uint16_t get_hlen(void *pack) {
+  union gtp_packet *packet = (union gtp_packet *) pack;
+
+  if ((packet->flags & 0xe0) == 0x00) { /* Version 0 */
+    return GTP0_HEADER_SIZE;
+  }
+  else if ((packet->flags & 0xe2) == 0x22) { /* Version 1 with seq */
+    return GTP1_HEADER_SIZE_LONG;
+  }
+  else if ((packet->flags & 0xe7) == 0x20) { /* Short version 1 */
+    return GTP1_HEADER_SIZE_SHORT;
+  } else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown packet flag");
+    return 0;
+  }
+}
+
+/**
+ * get_tei()
+ * Get the tunnel endpoint identifier (flow label) of a packet.
+ * Returns 0xffffffff on error.
+ **/
+static uint32_t get_tei(void *pack) {
+  union gtp_packet *packet = (union gtp_packet *) pack;
+
+  if ((packet->flags & 0xe0) == 0x00) { /* Version 0 */
+    return ntoh16(packet->gtp0.h.flow);
+  }
+  else if ((packet->flags & 0xe0) == 0x20) { /* Version 1 */
+    return ntoh32(packet->gtp1l.h.tei);
+  }
+  else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown packet flag");
+    return 0xffffffff;
+  }
+}
 
 
 int print_packet(void *packet, unsigned len)
@@ -362,8 +353,8 @@
  * Create pdp context: The SGSN may send create context request even if
  *   a context allready exist (imsi+nsapi?). This means that the reply will
      automatically dublicate the original response. It might however have
- *   sideeffects in the application which is asked twice to allocate
- *   validate the login.
+ *   side effects in the application which is asked twice to validate
+ *   the login.
  * Update pdp context: Automatically dublicates the original response???
  * Delete pdp context. Automatically in gtp0, but in gtp1 will generate
  *   a nonexist reply message.
@@ -390,28 +381,57 @@
  * gtp_conf:
  *   Remove an incoming confirmation from the queue
  * gtp_resp:
- *   Send off a responce to a request. Use the same sequence
+ *   Send off a response to a request. Use the same sequence
  *   number in the response as in the request.
  * gtp_retrans:
  *   Retransmit any outstanding packets which have exceeded
  *   a predefined timeout.
  *************************************************************/
 
-int gtp_req(struct gsn_t *gsn, int version, union gtp_packet *packet, 
-	    int len, struct in_addr *inetaddr, void *aid) {
+int gtp_req(struct gsn_t *gsn, int version, struct pdp_t *pdp,
+	    union gtp_packet *packet, int len, 
+	    struct in_addr *inetaddr, void *cbp) {
   struct sockaddr_in addr;
   struct qmsg_t *qmsg;
+  int fd;
+
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
   addr.sin_addr = *inetaddr;
-  addr.sin_port = htons(GTP0_PORT);
 
-  packet->gtp0.h.seq = hton16(gsn->seq_next);
+  if ((packet->flags & 0xe0) == 0x00) { /* Version 0 */
+    addr.sin_port = htons(GTP0_PORT);
+    packet->gtp0.h.length = hton16(len - GTP0_HEADER_SIZE);
+    packet->gtp0.h.seq = hton16(gsn->seq_next);
+    if (pdp)
+      packet->gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + 
+	((uint64_t)pdp->nsapi << 60);
+    if (pdp && ((packet->gtp0.h.type == GTP_GPDU) ||
+		(packet->gtp0.h.type == GTP_ERROR)))
+      packet->gtp0.h.flow=hton16(pdp->flru);
+    else if (pdp)
+      packet->gtp0.h.flow=hton16(pdp->flrc);
+    fd = gsn->fd0;
+  }
+  else if ((packet->flags & 0xe2) == 0x22) { /* Version 1 with seq */
+    addr.sin_port = htons(GTP1C_PORT);
+    packet->gtp1l.h.length = hton16(len - GTP1_HEADER_SIZE_SHORT);
+    packet->gtp1l.h.seq = hton16(gsn->seq_next);
+    if (pdp && ((packet->gtp1l.h.type == GTP_GPDU) ||
+		(packet->gtp1l.h.type == GTP_ERROR)))
+      packet->gtp1l.h.tei=hton32(pdp->teid_gn);
+    else if (pdp)
+      packet->gtp1l.h.tei=hton32(pdp->teic_gn);
+    fd = gsn->fd1c;
+  } else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown packet flag");
+    return -1;
+  }
   
-  if (sendto(gsn->fd, packet, len, 0,
+  if (sendto(fd, packet, len, 0,
 	     (struct sockaddr *) &addr, sizeof(addr)) < 0) {
     gsn->err_sendto++;
-    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", gsn->fd, (unsigned long) &packet, len, strerror(errno));
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", fd, (unsigned long) &packet, len, strerror(errno));
     return -1;
   }
 
@@ -425,8 +445,9 @@
     qmsg->l = len;
     qmsg->timeout = time(NULL) + 3; /* When to timeout */
     qmsg->retrans = 0;   /* No retransmissions so far */
-    qmsg->aid = aid;
+    qmsg->cbp = cbp;
     qmsg->type = ntoh8(packet->gtp0.h.type);
+    qmsg->fd = fd;
   }
   gsn->seq_next++; /* Count up this time */
   return 0;
@@ -437,10 +458,21 @@
  * return 0 on success, EOF if packet was not found */
 
 int gtp_conf(struct gsn_t *gsn, int version, struct sockaddr_in *peer,
-	     union gtp_packet *packet, int len, uint8_t *type, void **aid) {
-  int seq = ntoh16(packet->gtp0.h.seq);
+	     union gtp_packet *packet, int len, uint8_t *type, void **cbp) {
 
-  if (queue_freemsg_seq(gsn->queue_req, peer, seq, type, aid)) {
+  uint16_t seq;
+
+  if ((packet->gtp0.h.flags & 0xe0) == 0x00)
+    seq = ntoh16(packet->gtp0.h.seq);
+  else if ((packet->gtp1l.h.flags & 0xe2) == 0x22)
+    seq = ntoh16(packet->gtp1l.h.seq);
+  else {
+    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, packet, len,
+		"Unknown GTP packet version");
+    return EOF;
+  }
+
+  if (queue_freemsg_seq(gsn->queue_req, peer, seq, type, cbp)) {
     gsn->err_seq++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, packet, len,
 		"Confirmation packet not found in queue");
@@ -462,14 +494,14 @@
 	 (qmsg->timeout <= now)) {
     /*printf("Retrans timeout found: %d\n", (int) time(NULL));*/
     if (qmsg->retrans > 3) { /* To many retrans */
-      if (gsn->cb_conf) gsn->cb_conf(qmsg->type, EOF, NULL, qmsg->aid);
+      if (gsn->cb_conf) gsn->cb_conf(qmsg->type, EOF, NULL, qmsg->cbp);
       queue_freemsg(gsn->queue_req, qmsg);
     }
     else {
-      if (sendto(gsn->fd, &qmsg->p, qmsg->l, 0,
+      if (sendto(qmsg->fd, &qmsg->p, qmsg->l, 0,
 		 (struct sockaddr *) &qmsg->peer, sizeof(struct sockaddr_in)) < 0) {
 	gsn->err_sendto++;
-	gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", gsn->fd, (unsigned long) &qmsg->p, qmsg->l, strerror(errno));
+	gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd0=%d, msg=%lx, len=%d) failed: Error = %s", gsn->fd0, (unsigned long) &qmsg->p, qmsg->l, strerror(errno));
       }
       queue_back(gsn->queue_req, qmsg);
       qmsg->timeout = now + 3;
@@ -506,30 +538,44 @@
   return 0;
 }
 
-int gtp_resp(int version, struct gsn_t *gsn, union gtp_packet *packet,
-	     int len, struct sockaddr_in *peer) {
+int gtp_resp(int version, struct gsn_t *gsn, struct pdp_t *pdp, 
+	     union gtp_packet *packet, int len,
+	     struct sockaddr_in *peer, int fd, 
+	     uint16_t seq, uint64_t tid) {
   struct qmsg_t *qmsg;
-  uint16_t seq;
 
-  seq = ntoh16(packet->gtp0.h.seq);
-  
-  /* print message */
-  /*
-  printf("gtp_resp: to %s:UDP%u\n",
-	 inet_ntoa(peer->sin_addr),
-	 ntohs(peer->sin_port));
-  print_packet(packet, len); 
-  */
-
-  if (fcntl(gsn->fd, F_SETFL, 0)) {
-    gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
+  if ((packet->flags & 0xe0) == 0x00) { /* Version 0 */
+    packet->gtp0.h.length = hton16(len - GTP0_HEADER_SIZE);
+    packet->gtp0.h.seq = hton16(seq);
+    packet->gtp0.h.tid = tid;
+    if (pdp && ((packet->gtp0.h.type == GTP_GPDU) ||
+		(packet->gtp0.h.type == GTP_ERROR)))
+      packet->gtp0.h.flow=hton16(pdp->flru);
+    else if (pdp)
+      packet->gtp0.h.flow=hton16(pdp->flrc);
+  }
+  else if ((packet->flags & 0xe2) == 0x22) { /* Version 1 with seq */
+    packet->gtp1l.h.length = hton16(len - GTP1_HEADER_SIZE_SHORT);
+    packet->gtp1l.h.seq = hton16(seq);
+    if (pdp && (fd == gsn->fd1u))
+      packet->gtp1l.h.tei=hton32(pdp->teid_gn);
+    else if (pdp)
+      packet->gtp1l.h.tei=hton32(pdp->teic_gn);
+  }
+  else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown packet flag");
     return -1;
   }
   
-  if (sendto(gsn->fd, packet, len, 0,
+  if (fcntl(fd, F_SETFL, 0)) {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
+    return -1;
+  }
+
+  if (sendto(fd, packet, len, 0,
 	     (struct sockaddr *) peer, sizeof(struct sockaddr_in)) < 0) {
     gsn->err_sendto++;
-    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", gsn->fd, (unsigned long) &packet, len, strerror(errno));
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", fd, (unsigned long) &packet, len, strerror(errno));
     return -1;
   }
 
@@ -543,8 +589,9 @@
     qmsg->l = len;
     qmsg->timeout = time(NULL) + 60; /* When to timeout */
     qmsg->retrans = 0;   /* No retransmissions so far */
-    qmsg->aid = NULL;
+    qmsg->cbp = NULL;
     qmsg->type = 0;
+    qmsg->fd = fd;
   }
   return 0;
 }
@@ -556,27 +603,18 @@
   if(queue_seqget(gsn->queue_resp, &qmsg, peer, seq)) {
     return EOF; /* Notfound */
   }
-  else {
-    /* print message */
-    
-    /*printf("gtp_dublicate: to %s:UDP%u\n",
-	   inet_ntoa(peer->sin_addr),
-	   ntohs(peer->sin_port));
-    print_packet(&qmsg->p, qmsg->l);
-    */
 
-    if (fcntl(gsn->fd, F_SETFL, 0)) {
-      gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
-      return -1;
-    }
-
-    if (sendto(gsn->fd, &qmsg->p, qmsg->l, 0,
-	       (struct sockaddr *) peer, sizeof(struct sockaddr_in)) < 0) {
-      gsn->err_sendto++;
-      gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", gsn->fd, (unsigned long) &qmsg->p, qmsg->l, strerror(errno));
-    }
-    return 0;
+  if (fcntl(qmsg->fd, F_SETFL, 0)) {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
+    return -1;
   }
+  
+  if (sendto(qmsg->fd, &qmsg->p, qmsg->l, 0,
+	     (struct sockaddr *) peer, sizeof(struct sockaddr_in)) < 0) {
+    gsn->err_sendto++;
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", qmsg->fd, (unsigned long) &qmsg->p, qmsg->l, strerror(errno));
+  }
+  return 0;
 }
 
 
@@ -629,7 +667,6 @@
 	    int mode) 
 {
   struct sockaddr_in addr;
-  int gtp_fd;
   
   syslog(LOG_ERR, "GTP: gtp_newgsn() started");
 
@@ -649,33 +686,69 @@
   pdp_init();
 
   /* Initialise call back functions */
-  (*gsn)->cb_create_context = 0;
+  (*gsn)->cb_create_context_ind = 0;
   (*gsn)->cb_delete_context = 0;
+  (*gsn)->cb_unsup_ind = 0;
   (*gsn)->cb_conf = 0;
-  (*gsn)->cb_gpdu = 0;
+  (*gsn)->cb_data_ind = 0;
 
-  if ((gtp_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
+  /* Store function parameters */
+  (*gsn)->gsnc = *listen;
+  (*gsn)->gsnu = *listen;
+  (*gsn)->mode = mode;
+
+
+  /* Create GTP version 0 socket */
+  if (((*gsn)->fd0 = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
     (*gsn)->err_socket++;
     gtp_err(LOG_ERR, __FILE__, __LINE__, "socket(domain=%d, type=%d, protocol=%d) failed: Error = %s", AF_INET, SOCK_DGRAM, 0, strerror(errno));
     return -1;
   }
-  (*gsn)->fd = gtp_fd;
-
-  (*gsn)->gsnc = *listen;
-  (*gsn)->gsnu = *listen;
-
-  (*gsn)->mode = mode;
     
   memset(&addr, 0, sizeof(addr));
-  
   addr.sin_family = AF_INET;
-  /*  addr.sin_addr = *inetaddr; */
   addr.sin_addr = *listen;  /* Same IP for user traffic and signalling*/
   addr.sin_port = htons(GTP0_PORT);
   
-  if (bind(gtp_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+  if (bind((*gsn)->fd0, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
     (*gsn)->err_socket++;
-    gtp_err(LOG_ERR, __FILE__, __LINE__, "bind(fd=%d, addr=%lx, len=%d) failed: Error = %s", gtp_fd, (unsigned long) &addr, sizeof(addr), strerror(errno));
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "bind(fd0=%d, addr=%lx, len=%d) failed: Error = %s", (*gsn)->fd0, (unsigned long) &addr, sizeof(addr), strerror(errno));
+    return -1;
+  }
+
+  /* Create GTP version 1 control plane socket */
+  if (((*gsn)->fd1c = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
+    (*gsn)->err_socket++;
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "socket(domain=%d, type=%d, protocol=%d) failed: Error = %s", AF_INET, SOCK_DGRAM, 0, strerror(errno));
+    return -1;
+  }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr = *listen;  /* Same IP for user traffic and signalling*/
+  addr.sin_port = htons(GTP1C_PORT);
+  
+  if (bind((*gsn)->fd1c, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+    (*gsn)->err_socket++;
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "bind(fd1c=%d, addr=%lx, len=%d) failed: Error = %s", (*gsn)->fd1c, (unsigned long) &addr, sizeof(addr), strerror(errno));
+    return -1;
+  }
+
+  /* Create GTP version 1 user plane socket */
+  if (((*gsn)->fd1u = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
+    (*gsn)->err_socket++;
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "socket(domain=%d, type=%d, protocol=%d) failed: Error = %s", AF_INET, SOCK_DGRAM, 0, strerror(errno));
+    return -1;
+  }
+
+  memset(&addr, 0, sizeof(addr));
+  addr.sin_family = AF_INET;
+  addr.sin_addr = *listen;  /* Same IP for user traffic and signalling*/
+  addr.sin_port = htons(GTP1U_PORT);
+  
+  if (bind((*gsn)->fd1u, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+    (*gsn)->err_socket++;
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "bind(fd1c=%d, addr=%lx, len=%d) failed: Error = %s", (*gsn)->fd1c, (unsigned long) &addr, sizeof(addr), strerror(errno));
     return -1;
   }
 
@@ -687,6 +760,10 @@
   /* Clean up retransmit queues */
   queue_free(gsn->queue_req);
   queue_free(gsn->queue_resp);
+  
+  close(gsn->fd0);
+  close(gsn->fd1c);
+  close(gsn->fd1u);
 
   free(gsn);
   return 0;
@@ -722,67 +799,56 @@
  *************************************************************/
 
 /* Send off an echo request */
-int gtp_echo_req(struct gsn_t *gsn, struct in_addr *inetaddr)
+int gtp_echo_req(struct gsn_t *gsn, int version, void *cbp,
+		 struct in_addr *inetaddr)
 {
   union gtp_packet packet;
-
-  get_default_gtp(0, &packet);
-  packet.gtp0.h.type = hton8(GTP_ECHO_REQ);
-  packet.gtp0.h.length = hton16(0);
-
-  return gtp_req(gsn, 0, &packet, GTP0_HEADER_SIZE, inetaddr, NULL);
+  int length = get_default_gtp(version, GTP_ECHO_REQ, &packet);
+  return gtp_req(gsn, version, NULL, &packet, length, inetaddr, cbp);
 }
 
-/* Send of an echo reply */
-int gtp_echo_resp(struct gsn_t *gsn, struct sockaddr_in *peer,
+/* Send off an echo reply */
+int gtp_echo_resp(struct gsn_t *gsn, int version,
+		  struct sockaddr_in *peer, int fd,
 		  void *pack, unsigned len)
 {
   union gtp_packet packet;
-  int length = 0;
-  
-  get_default_gtp(0, &packet);
-
-  gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_RECOVERY, 
-	    gsn->restart_counter);
-  
-  packet.gtp0.h.type = hton8(GTP_ECHO_RSP);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.seq = ((union gtp_packet*)pack)->gtp0.h.seq;
-
-  return gtp_resp(0, gsn, &packet, GTP0_HEADER_SIZE+length, peer);
+  int length = get_default_gtp(version, GTP_ECHO_RSP, &packet);
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_RECOVERY, gsn->restart_counter);
+  return gtp_resp(version, gsn, NULL, &packet, length, peer, fd, 
+		  get_seq(pack), get_tid(pack));
 }
 
 
 /* Handle a received echo request */
-int gtp_echo_ind(struct gsn_t *gsn, struct sockaddr_in *peer,
-		 void *pack, unsigned len) {
+int gtp_echo_ind(struct gsn_t *gsn, int version, struct sockaddr_in *peer, 
+		 int fd, void *pack, unsigned len) {
 
-  uint16_t seq = ntoh16(((union gtp_packet*)pack)->gtp0.h.seq);
+  /* Check if it was a dublicate request */
+  if(!gtp_dublicate(gsn, 0, peer, get_seq(pack))) return 0;
 
-  if(!gtp_dublicate(gsn, 0, peer, seq)) {
-    return 0; /* We allready send of response once */
-  }
-
-
-  /* Now send off a reply to the peer */
-  return gtp_echo_resp(gsn, peer, pack, len);
+  /* Send off reply to request */
+  return gtp_echo_resp(gsn, version, peer, fd, pack, len);
 }
 
 /* Handle a received echo reply */
-int gtp_echo_conf(struct gsn_t *gsn, struct sockaddr_in *peer,
+int gtp_echo_conf(struct gsn_t *gsn, int version, struct sockaddr_in *peer,
 		  void *pack, unsigned len) {
   union gtpie_member *ie[GTPIE_SIZE];
   unsigned char recovery;
-  void *aid = NULL;
+  void *cbp = NULL;
   uint8_t type = 0;
+  int hlen = get_hlen(pack);
 
   /* Remove packet from queue */
-  if (gtp_conf(gsn, 0, peer, pack, len, &type, &aid)) return EOF;
+  if (gtp_conf(gsn, version, peer, pack, len, &type, &cbp)) return EOF;
 
-  if (gtpie_decaps(ie, pack+sizeof(struct gtp0_header), len-sizeof(struct gtp0_header))) {
+  /* Extract information elements into a pointer array */
+  if (gtpie_decaps(ie, version, pack+hlen, len-hlen)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, NULL, cbp);
     return EOF;
   }
   
@@ -790,10 +856,13 @@
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory field");
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, NULL, cbp);
     return EOF;
   }
 
-  if (gsn->cb_conf) gsn->cb_conf(type, 0, NULL, aid); /* TODO: Should return recovery in callback */
+  /* Echo reply packages does not have a cause information element */
+  /* Instead we return the recovery number in the callback function */
+  if (gsn->cb_conf) gsn->cb_conf(type, recovery, NULL, cbp);
 
   return 0;
 }
@@ -809,34 +878,22 @@
  * only listen to the GTP0 port, and therefore will never receive
  * anything else than GTP0 */
 
-int gtp_unsup_resp(struct gsn_t *gsn, struct sockaddr_in *peer,
-		   void *pack, unsigned len)
+int gtp_unsup_req(struct gsn_t *gsn, int version, struct sockaddr_in *peer,
+		  int fd, void *pack, unsigned len)
 {
   union gtp_packet packet;
-  int length = 0;
 
-  get_default_gtp(0, &packet);
-  packet.gtp0.h.type = hton8(GTP_NOT_SUPPORTED);
-  packet.gtp0.h.length = hton16(0);
-  
-  return gtp_resp(0, gsn, &packet, GTP0_HEADER_SIZE+length, peer);
+  /* GTP 1 is the highest supported protocol */
+  int hlen = get_default_gtp(1, GTP_NOT_SUPPORTED, &packet);
+  return gtp_resp(version, gsn, NULL, &packet, hlen, peer, fd, 0, 0);
 }
 
 /* Handle a Version Not Supported message */
-int gtp_unsup_conf(struct gsn_t *gsn, struct sockaddr_in *peer, void *pack, unsigned len) {
+int gtp_unsup_ind(struct gsn_t *gsn, struct sockaddr_in *peer, 
+		  void *pack, unsigned len) {
 
-  /* TODO: Need to check the validity of header and information elements */
-  /* TODO: Implement callback to application */
-  /* As long as we only support GTP0 we should never receive this message */
-  /* Should be implemented as part of GTP1 support */
+  if (gsn->cb_unsup_ind) gsn->cb_unsup_ind(peer);
   
-  /* print received message */
-  /*
-  printf("gtp_unsup_ind: from %s:UDP%u\n",
-	 inet_ntoa(peer->sin_addr),
-	 ntohs(peer->sin_port));
-  print_packet(pack, len);
-  */
   return 0;
 }
 
@@ -852,284 +909,404 @@
  * information.
  *************************************************************/
 
-/* Send Create PDP Context Request */
-extern int gtp_create_pdp_req(struct gsn_t *gsn, int version, void *aid,
-			      struct in_addr* inetaddr, struct pdp_t *pdp) {
+/* API: Send Create PDP Context Request */
+extern int gtp_create_context_req(struct gsn_t *gsn, struct pdp_t *pdp, 
+				  void *cbp, struct in_addr* inetaddr) {
   union gtp_packet packet;
-  int length = 0;
+  int length = get_default_gtp(pdp->version, GTP_CREATE_PDP_REQ, &packet);
 
-  get_default_gtp(0, &packet);
-  
-  if (0==0) { /* Always GTP0 */
-
-    gtpie_tv0(packet.gtp0.p, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
+  if (pdp->version == 0)
+    gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
 	      sizeof(pdp->qos_req0), pdp->qos_req0);
-    gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_RECOVERY, 
-	      gsn->restart_counter);
-    gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_SELECTION_MODE,
-	      pdp->selmode);
-    gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_DI, 
-	      pdp->fllu);
-    gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_C,
-	      pdp->fllc);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_EUA, 
-	      pdp->eua.l, pdp->eua.v);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_APN, 
-	      pdp->apn_use.l, pdp->apn_use.v);
 
-    if (pdp->pco_req.l) { /* Optional PCO */
-      gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_PCO, 
-		pdp->pco_req.l, pdp->pco_req.v);
-    }
-
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	      pdp->gsnlc.l, pdp->gsnlc.v);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	      pdp->gsnlu.l, pdp->gsnlu.v);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_MSISDN,
-	      pdp->msisdn.l, pdp->msisdn.v);
-    
-
-
-  } else { /* GTP1 */
-    gtpie_tv0(packet.gtp1s.p, &length, GTP_MAX, GTPIE_IMSI, 
+  if (pdp->version == 1)
+    gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_IMSI, 
 	      sizeof(pdp->imsi), (uint8_t*) &pdp->imsi);
-    gtpie_tv1(packet.gtp1s.p, &length, GTP_MAX, GTPIE_RECOVERY, 
-	      gsn->restart_counter);
-    gtpie_tv1(packet.gtp1s.p, &length, GTP_MAX, GTPIE_SELECTION_MODE,
-	      pdp->selmode);
-    gtpie_tv4(packet.gtp1s.p, &length, GTP_MAX, GTPIE_TEI_DI, 
-	      pdp->teid_own);
-    gtpie_tv4(packet.gtp1s.p, &length, GTP_MAX, GTPIE_TEI_C,
-	      pdp->teic_own);
-    gtpie_tv1(packet.gtp1s.p, &length, GTP_MAX, GTPIE_NSAPI, 
-	      pdp->nsapi);
-    /*gtpie_tv1(packet.gtp1s.p, &length, GTP_MAX, GTPIE_NSAPI, 
-      pdp->nsapil); For use by several QoS profiles for the same address */
-    gtpie_tv2(packet.gtp1s.p, &length, GTP_MAX, GTPIE_CHARGING_C,
-	      pdp->cch_pdp);
-    gtpie_tv2(packet.gtp1s.p, &length, GTP_MAX, GTPIE_TRACE_REF,
-	      pdp->traceref);
-    gtpie_tv2(packet.gtp1s.p, &length, GTP_MAX, GTPIE_TRACE_TYPE,
-	      pdp->tracetype);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_EUA, 
-	      pdp->eua.l, pdp->eua.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_APN, 
-	      pdp->apn_use.l, pdp->apn_use.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_PCO, 
-	      pdp->pco_req.l, pdp->pco_req.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	      pdp->gsnlc.l, pdp->gsnlc.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	      pdp->gsnlu.l, pdp->gsnlu.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_MSISDN,
-	      pdp->msisdn.l, pdp->msisdn.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_QOS_PROFILE,
-	      pdp->qos_req.l, pdp->qos_req.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_TFT,
-	      pdp->tft.l, pdp->tft.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_TRIGGER_ID,
-	      pdp->triggerid.l, pdp->triggerid.v);
-    gtpie_tlv(packet.gtp1s.p, &length, GTP_MAX, GTPIE_OMC_ID,
-	      pdp->omcid.l, pdp->omcid.v);
-  }
-  packet.gtp0.h.type = hton8(GTP_CREATE_PDP_REQ);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = 0;
-  packet.gtp0.h.tid = pdp->tid;
 
-  gtp_req(gsn, 0, &packet, GTP0_HEADER_SIZE+length, inetaddr, aid);
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_RECOVERY, 
+	    gsn->restart_counter);
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_SELECTION_MODE,
+	    pdp->selmode);
+
+  if (pdp->version == 0) {
+    gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_DI, 
+	      pdp->fllu);
+    gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_C,
+	      pdp->fllc);
+  }
+
+  if (pdp->version == 1) {
+    gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_DI,
+	      pdp->teid_own);
+    gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_C,
+	      pdp->teic_own);
+  }
+
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_NSAPI, 
+	    pdp->nsapi);
+
+  /*gtpie_tv1(packet.gtp1l.p, &length, GTP_MAX, GTPIE_NSAPI, 
+    pdp->nsapil); For use by several QoS profiles for the same address */
+
+  if (pdp->version == 1) {
+    gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_CHARGING_C,
+	      pdp->cch_pdp);
+  }
+
+  /* TODO 
+  gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_TRACE_REF,
+	    pdp->traceref);
+  gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_TRACE_TYPE,
+	    pdp->tracetype); */
+
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_EUA, 
+	    pdp->eua.l, pdp->eua.v);
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_APN, 
+	    pdp->apn_use.l, pdp->apn_use.v);
+
+  if (pdp->pco_req.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_PCO, 
+	      pdp->pco_req.l, pdp->pco_req.v);
+  
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+	    pdp->gsnlc.l, pdp->gsnlc.v);
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+	    pdp->gsnlu.l, pdp->gsnlu.v);
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_MSISDN,
+	    pdp->msisdn.l, pdp->msisdn.v);
+
+  if (pdp->version == 1) 
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE,
+	      pdp->qos_req.l, pdp->qos_req.v);
+
+
+  if ((pdp->version == 1) && pdp->tft.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_TFT,
+	      pdp->tft.l, pdp->tft.v);
+  
+  if ((pdp->version == 1) && pdp->triggerid.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_TRIGGER_ID,
+	      pdp->triggerid.l, pdp->triggerid.v);
+  
+  if ((pdp->version == 1) && pdp->omcid.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_OMC_ID,
+	      pdp->omcid.l, pdp->omcid.v);
+  
+  gtp_req(gsn, pdp->version, pdp, &packet, length, inetaddr, cbp);
 
   return 0;
 }
 
-/* Send Create PDP Context Response */
-int gtp_create_pdp_resp(struct gsn_t *gsn, int version,
-			struct sockaddr_in *peer, 
-			void *pack, unsigned len, 
-			struct pdp_t *pdp, uint8_t cause)
+
+/* API: Application response to context indication */
+int gtp_create_context_resp(struct gsn_t *gsn, struct pdp_t *pdp, int cause) {
+
+  /* Now send off a reply to the peer */
+  gtp_create_pdp_resp(gsn, pdp->version, pdp, cause);
+ 
+  if (cause != GTPCAUSE_ACC_REQ) {
+    pdp_freepdp(pdp);
+  }
+  
+  return 0;
+}
+
+/* API: Register create context indication callback */
+int gtp_set_cb_create_context_ind(struct gsn_t *gsn,
+      int (*cb_create_context_ind) (struct pdp_t* pdp)) 
 {
+  gsn->cb_create_context_ind = cb_create_context_ind;
+  return 0;
+}
+
+
+/* Send Create PDP Context Response */
+int gtp_create_pdp_resp(struct gsn_t *gsn, int version, struct pdp_t *pdp, 
+			uint8_t cause) {
   union gtp_packet packet;
-  int length = 0;
+  int length = get_default_gtp(version, GTP_CREATE_PDP_RSP, &packet);
 
-  get_default_gtp(0, &packet);
-
-  gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_CAUSE, cause);
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause);
 
   if (cause == GTPCAUSE_ACC_REQ) {
-    gtpie_tv0(packet.gtp0.p, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
-	      sizeof(pdp->qos_neg0), pdp->qos_neg0);
-    gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_REORDER,
+
+    if (version == 0) 
+      gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
+		sizeof(pdp->qos_neg0), pdp->qos_neg0);
+
+    gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_REORDER,
 	      pdp->reorder);
-    gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_RECOVERY, 
+    gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_RECOVERY, 
 	      gsn->restart_counter);
-    gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_DI, 
-	      pdp->fllu);
-    gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_C,
-	      pdp->fllc);
-    gtpie_tv4(packet.gtp0.p, &length, GTP_MAX, GTPIE_CHARGING_ID,
+
+    if (version == 0) {
+      gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_DI, 
+		pdp->fllu);
+      gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_C,
+		pdp->fllc);
+    }
+
+    if (version == 1) {
+      gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_DI, 
+		pdp->teid_own);
+      gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_C,
+		pdp->teic_own);
+    }
+
+    gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_CHARGING_ID,
 	      0x12345678);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_EUA, 
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_EUA, 
 	      pdp->eua.l, pdp->eua.v);
 
     if (pdp->pco_neg.l) { /* Optional PCO */
-      gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_PCO,
+      gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_PCO,
 		pdp->pco_neg.l, pdp->pco_neg.v);
     }
 
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
 	      pdp->gsnlc.l, pdp->gsnlc.v);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
 	      pdp->gsnlu.l, pdp->gsnlu.v);
+
+    if (version == 1)
+      gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE,
+		pdp->qos_neg.l, pdp->qos_neg.v);
+
+    /* TODO: Charging gateway address */
   }
 
-  packet.gtp0.h.type = hton8(GTP_CREATE_PDP_RSP);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = hton16(pdp->flrc);
-  packet.gtp0.h.seq = ((union gtp_packet*)pack)->gtp0.h.seq;
-  packet.gtp0.h.tid = ((union gtp_packet*)pack)->gtp0.h.tid;
-
-  return gtp_resp(0, gsn, &packet, GTP0_HEADER_SIZE+length, peer);
+  return gtp_resp(version, gsn, pdp, &packet, length, &pdp->sa_peer, 
+		  pdp->fd, pdp->seq, pdp->tid);
 }
 
 /* Handle Create PDP Context Request */
 int gtp_create_pdp_ind(struct gsn_t *gsn, int version,
-		       struct sockaddr_in *peer, void *pack, unsigned len) {
+			struct sockaddr_in *peer, int fd, 
+			void *pack, unsigned len) {
   struct pdp_t *pdp, *pdp_old; 
   struct pdp_t pdp_buf;
   union gtpie_member* ie[GTPIE_SIZE];
   uint8_t recovery;
-  uint64_t imsi;
-  uint8_t nsapi;
-  int auth = 0; /* Allow access if no callback is defined */
 
-  uint16_t seq = ntoh16(((union gtp_packet*)pack)->gtp0.h.seq);
+  uint16_t seq = get_seq(pack);
+  int hlen = get_hlen(pack);
 
-  if(!gtp_dublicate(gsn, 0, peer, seq)) {
-    return 0; /* We allready send of response once */
+  if(!gtp_dublicate(gsn, 0, peer, seq)) return 0;
+
+  pdp = &pdp_buf;
+  memset(pdp, 0, sizeof(struct pdp_t));
+
+  if (version == 0) {
+    pdp->imsi = ((union gtp_packet*)pack)->gtp0.h.tid & 0x0fffffffffffffff;
+    pdp->nsapi = (((union gtp_packet*)pack)->gtp0.h.tid & 0xf000000000000000) >> 60;
   }
 
+  pdp->seq = seq;
+  pdp->sa_peer = *peer;
+  pdp->fd = fd;
+  pdp->version = version;
+
   /* Decode information elements */
-  if (gtpie_decaps(ie, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
+  if (gtpie_decaps(ie, version, pack+hlen, len-hlen)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
     if (0 == version)
       return EOF;
     else
-      return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-				 GTPCAUSE_INVALID_MESSAGE);
+      return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_INVALID_MESSAGE);
   }
 
-  pdp = &pdp_buf;
-  memset(pdp, 0, sizeof(struct pdp_t));
-
-  /* Extract IMSI and NSAPI from header */
-  imsi = ((union gtp_packet*)pack)->gtp0.h.tid & 0x0fffffffffffffff;
-  nsapi = (((union gtp_packet*)pack)->gtp0.h.tid & 0xf000000000000000) >> 60;
-
-  /* pdp_newpdp(&pdp, imsi, nsapi); TODO: Need to remove again */
-
-  if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0,
-		   pdp->qos_req0, sizeof(pdp->qos_req0))) {
-    gsn->missing++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-			       GTPCAUSE_MAN_IE_MISSING);
+  if (version == 0) {
+    if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0,
+		     pdp->qos_req0, sizeof(pdp->qos_req0))) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_MAN_IE_MISSING);
+    }
   }
 
-  /* Extract recovery (optional) */
+
+  if (version == 1) {
+    /* IMSI (conditional) */
+    if (gtpie_gettv0(ie, GTPIE_IMSI, 0, &pdp->imsi, sizeof(pdp->imsi))) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+  }
+
+  /* Recovery (optional) */
   if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) {
     /* TODO: Handle received recovery IE */
   }
 
+  /* Selection mode (conditional) */
   if (gtpie_gettv0(ie, GTPIE_SELECTION_MODE, 0,
 		   &pdp->selmode, sizeof(pdp->selmode))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
+    return gtp_create_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
 
-  if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) {
-    gsn->missing++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-			       GTPCAUSE_MAN_IE_MISSING);
+  if (version == 0) {
+    if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+    
+    if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
   }
 
-  if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) {
-    gsn->missing++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-			       GTPCAUSE_MAN_IE_MISSING);
+
+  if (version == 1) {
+    /* TEID (mandatory) */
+    if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &pdp->teid_gn)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+
+    /* TEIC (conditional) */
+    if (gtpie_gettv4(ie, GTPIE_TEI_C, 0, &pdp->teic_gn)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+
+    /* NSAPI (mandatory) */
+    if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &pdp->nsapi)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+
+    /* Linked NSAPI (conditional) */
+    if (gtpie_gettv1(ie, GTPIE_NSAPI, 1, &pdp->linked_nsapi)) {
+      /* TODO: Handle linked NSAPI */
+      /* Currently the Secondary PDP Context Activation Procedure is not */
+      /* supported */
+    } else {
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Found Linked NSAPI");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_NOT_SUPPORTED);
+    }
   }
 
+  /* Charging Characteriatics (optional) */
+  /* Trace reference (optional) */
+  /* Trace type (optional) */
+  /* Charging Characteriatics (optional) */
+
+  /* End User Address (conditional) */
   if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l,
 		     &pdp->eua.v, sizeof(pdp->eua.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
+    return gtp_create_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
 
+  /* APN */
   if (gtpie_gettlv(ie, GTPIE_APN, 0, &pdp->apn_req.l,
 		     &pdp->apn_req.v, sizeof(pdp->apn_req.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
+    return gtp_create_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
 
   /* Extract protocol configuration options (optional) */
   if (!gtpie_gettlv(ie, GTPIE_PCO, 0, &pdp->pco_req.l,
 		    &pdp->pco_req.v, sizeof(pdp->pco_req.v))) {
-    /* TODO: Handle PCO IE */
   }
 
+  /* SGSN address for signalling (mandatory) */
   if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 0, &pdp->gsnrc.l,
 		     &pdp->gsnrc.v, sizeof(pdp->gsnrc.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
+    return gtp_create_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
 
+  /* SGSN address for user traffic (mandatory) */
   if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp->gsnru.l,
 		     &pdp->gsnru.v, sizeof(pdp->gsnru.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
+    return gtp_create_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
   
+  /* MSISDN (conditional) */
   if (gtpie_gettlv(ie, GTPIE_MSISDN, 0, &pdp->msisdn.l,
 		   &pdp->msisdn.v, sizeof(pdp->msisdn.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
+    return gtp_create_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
 
+  if (version == 1) {
+    /* QoS (mandatory) */
+    if (gtpie_gettlv(ie, GTPIE_QOS_PROFILE, 0, &pdp->qos_req.l,
+		     &pdp->qos_req.v, sizeof(pdp->qos_req.v))) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_create_pdp_resp(gsn, version, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+
+    /* TFT (conditional) */
+    if (gtpie_gettlv(ie, GTPIE_TFT, 0, &pdp->tft.l,
+		     &pdp->tft.v, sizeof(pdp->tft.v))) {
+    }
+    
+    /* Trigger ID */
+    /* OMC identity */
+  }
+
+  /* Initialize our own IP addresses */
   in_addr2gsna(&pdp->gsnlc, &gsn->gsnc);
   in_addr2gsna(&pdp->gsnlu, &gsn->gsnu);
 
   if (GTP_DEBUG) printf("gtp_create_pdp_ind: Before pdp_tidget\n");
 
-  if (!pdp_tidget(&pdp_old, ((union gtp_packet*)pack)->gtp0.h.tid)) {
+  if (!pdp_getimsi(&pdp_old, pdp->imsi, pdp->nsapi)) {
     /* Found old pdp with same tid. Now the voodoo begins! */
+    /* 09.60 / 29.060 allows create on existing context to "steal" */
+    /* the context which was allready established */
     /* We check that the APN, selection mode and MSISDN is the same */
     if (GTP_DEBUG) printf("gtp_create_pdp_ind: Old context found\n"); 
-    if (   (pdp->apn_req.l == pdp_old->apn_req.l) 
+    if ((pdp->apn_req.l == pdp_old->apn_req.l) 
 	&& (!memcmp(pdp->apn_req.v, pdp_old->apn_req.v, pdp->apn_req.l)) 
 	&& (pdp->selmode == pdp_old->selmode)
 	&& (pdp->msisdn.l == pdp_old->msisdn.l) 
@@ -1147,18 +1324,20 @@
       pdp_old->flru = pdp->flru;
       pdp_old->flrc = pdp->flrc;
 
+      /* Copy remote tei */
+      pdp_old->teid_gn = pdp->teid_gn;
+      pdp_old->teic_gn = pdp->teic_gn;
+
       /* Copy peer GSN address */
       pdp_old->gsnrc.l = pdp->gsnrc.l;
       memcpy(&pdp_old->gsnrc.v, &pdp->gsnrc.v, pdp->gsnrc.l);
       pdp_old->gsnru.l = pdp->gsnru.l;
       memcpy(&pdp_old->gsnru.v, &pdp->gsnru.v, pdp->gsnru.l);
       
-      /* pdp_freepdp(pdp); not nessasary anymore since never allocated */
       pdp = pdp_old;
       
       /* Confirm to peer that things were "successful" */
-      return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-				 GTPCAUSE_ACC_REQ);
+      return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_ACC_REQ);
     }
     else { /* This is not the same PDP context. Delete the old one. */
 
@@ -1166,59 +1345,53 @@
       
       if (gsn->cb_delete_context) gsn->cb_delete_context(pdp_old);
       pdp_freepdp(pdp_old);
-
+      
       if (GTP_DEBUG) printf("gtp_create_pdp_ind: Deleted...\n");      
     }
   }
 
-  pdp_newpdp(&pdp, imsi, nsapi, pdp);
+  pdp_newpdp(&pdp, pdp->imsi, pdp->nsapi, pdp);
 
   /* Callback function to validata login */
-  if (gsn->cb_create_context !=0) 
-    auth = gsn->cb_create_context(pdp);
-
-  /* Now send off a reply to the peer */
-  if (!auth) {
-    return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-			       GTPCAUSE_ACC_REQ);
-  }
+  if (gsn->cb_create_context_ind !=0) 
+    return gsn->cb_create_context_ind(pdp);
   else {
-    gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-			GTPCAUSE_USER_AUTH_FAIL);
-    pdp_freepdp(pdp);
-    return 0;
+    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		"No create_context_ind callback defined");
+    return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_NOT_SUPPORTED);
   }
 }
 
 
 /* Handle Create PDP Context Response */
 int gtp_create_pdp_conf(struct gsn_t *gsn, int version,
-			struct sockaddr_in *peer, 
-			void *pack, unsigned len) {
+			 struct sockaddr_in *peer, 
+			 void *pack, unsigned len) {
   struct pdp_t *pdp; 
   union gtpie_member *ie[GTPIE_SIZE];
   uint8_t cause, recovery;
-  void *aid = NULL;
+  void *cbp = NULL;
   uint8_t type = 0;
+  int hlen = get_hlen(pack);
 
   /* Remove packet from queue */
-  if (gtp_conf(gsn, 0, peer, pack, len, &type, &aid)) return EOF;
+  if (gtp_conf(gsn, version, peer, pack, len, &type, &cbp)) return EOF;
   
   /* Find the context in question */
-  if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
+  if (pdp_getgtp1(&pdp, get_tei(pack))) {
     gsn->err_unknownpdp++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Unknown PDP context");
-    if (gsn->cb_conf) gsn->cb_conf(type, EOF, NULL, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, NULL, cbp);
     return EOF;
   }
 
   /* Decode information elements */
-  if (gtpie_decaps(ie, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
+  if (gtpie_decaps(ie, version, pack+hlen, len-hlen)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
-    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     return EOF;
   }
 
@@ -1227,7 +1400,7 @@
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     return EOF;
   }
 
@@ -1239,53 +1412,71 @@
   /* Extract protocol configuration options (optional) */
   if (!gtpie_gettlv(ie, GTPIE_PCO, 0, &pdp->pco_req.l,
 		    &pdp->pco_req.v, sizeof(pdp->pco_req.v))) {
-    /* TODO: Handle PCO IE */
   }
 
   /* Check all conditional information elements */
   if (GTPCAUSE_ACC_REQ == cause) {
 
-    if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0,   /* TODO: HACK only gtp0 */
-		     &pdp->qos_neg0, sizeof(pdp->qos_neg0))) {
-      gsn->missing++;
-      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
-      return EOF;
+    if (version == 0) {
+      if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0,
+		       &pdp->qos_neg0, sizeof(pdp->qos_neg0))) {
+	gsn->missing++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Missing conditional information field");
+	if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
+	return EOF;
+      }
     }
-    /* pdp->qos_neg.l = 3;  * TODO: HACK only gtp0 */
     
     if (gtpie_gettv1(ie, GTPIE_REORDER, 0, &pdp->reorder)) {
       gsn->missing++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
       return EOF;
     }
 
-    if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) {
-      gsn->missing++;
-      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
-      return EOF;
-    }
+    if (version == 0) {
+      if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) {
+	gsn->missing++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Missing conditional information field");
+	if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
+	return EOF;
+      }
     
-    if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) {
-      gsn->missing++;
-      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
-      return EOF;
+      if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) {
+	gsn->missing++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Missing conditional information field");
+	if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
+	return EOF;
+      }
+    }
+
+    if (version == 1) {
+      if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &pdp->teid_gn)) {
+	gsn->missing++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Missing conditional information field");
+	if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
+	return EOF;
+      }
+    
+      if (gtpie_gettv4(ie, GTPIE_TEI_C, 0, &pdp->teic_gn)) {
+	gsn->missing++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Missing conditional information field");
+	if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
+	return EOF;
+      }
     }
     
     if (gtpie_gettv4(ie, GTPIE_CHARGING_ID, 0, &pdp->cid)) {
       gsn->missing++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
-      return gtp_create_pdp_resp(gsn, version, peer, pack, len, pdp, 
-				 GTPCAUSE_MAN_IE_MISSING);
+      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     }
     
     if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l,
@@ -1293,7 +1484,7 @@
       gsn->missing++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
       return EOF;
     }
     
@@ -1302,7 +1493,7 @@
       gsn->missing++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
       return EOF;
     }
     
@@ -1311,178 +1502,375 @@
       gsn->missing++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
       return EOF;
     }
-  }
 
-  if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, aid);
+    if (version == 1) {
+      if (gtpie_gettlv(ie, GTPIE_QOS_PROFILE, 0, &pdp->qos_neg.l,
+		       &pdp->qos_neg.v, sizeof(pdp->qos_neg.v))) {
+	gsn->missing++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Missing conditional information field");
+	if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
+	return EOF;
+      }
+    }
+    
+  }
+  
+  if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, cbp);
 
   return 0;
 }
 
-/* Send Update PDP Context Request */
-extern int gtp_update_pdp_req(struct gsn_t *gsn, int version, void *aid,
-			      struct in_addr* inetaddr, struct pdp_t *pdp) {
-  union gtp_packet packet;
-  int length = 0;
 
-  get_default_gtp(0, &packet);
+/* API: Send Update PDP Context Request */
+int gtp_update_context(struct gsn_t *gsn, struct pdp_t *pdp, void *cbp,
+		       struct in_addr* inetaddr) {
+  union gtp_packet packet;
+  int length = get_default_gtp(pdp->version, GTP_UPDATE_PDP_REQ, &packet);
   
-  gtpie_tv0(packet.gtp0.p, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
-	    sizeof(pdp->qos_req0), pdp->qos_req0);
-  gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_RECOVERY, 
+  if (pdp->version == 0)
+    gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
+	      sizeof(pdp->qos_req0), pdp->qos_req0);
+
+  if (pdp->version == 1)
+    gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_IMSI, 
+	      sizeof(pdp->imsi), (uint8_t*) &pdp->imsi);
+
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_RECOVERY, 
 	    gsn->restart_counter);
-  gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_DI, 
-	    pdp->fllu);
-  gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_C,
-	    pdp->fllc);
-  gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	    pdp->gsnlc.l, pdp->gsnlc.v);
-  gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	    pdp->gsnlu.l, pdp->gsnlu.v);
-  
-  packet.gtp0.h.type = hton8(GTP_UPDATE_PDP_REQ);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = 0;
-  packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + ((uint64_t)pdp->nsapi << 60);
 
-  return gtp_req(gsn, 0, &packet, GTP0_HEADER_SIZE+length, inetaddr, aid);
-}
-
-/* Send Update PDP Context Response */
-int gtp_update_pdp_resp(struct gsn_t *gsn, int version,
-			struct sockaddr_in *peer, 
-			void *pack, unsigned len, 
-			struct pdp_t *pdp, uint8_t cause)
-{
-  union gtp_packet packet;
-  int length = 0;
-
-  get_default_gtp(0, &packet);
-
-  gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_CAUSE, cause);
-
-  if (cause == GTPCAUSE_ACC_REQ) {
-    gtpie_tv0(packet.gtp0.p, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
-	      sizeof(pdp->qos_sub0), pdp->qos_sub0);
-    gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_RECOVERY, 
-	      gsn->restart_counter);
-    gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_DI, 
+  if (pdp->version == 0) {
+    gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_DI, 
 	      pdp->fllu);
-    gtpie_tv2(packet.gtp0.p, &length, GTP_MAX, GTPIE_FL_C,
+    gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_C,
 	      pdp->fllc);
-    gtpie_tv4(packet.gtp0.p, &length, GTP_MAX, GTPIE_CHARGING_ID,
-	      0x12345678);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	      pdp->gsnlc.l, pdp->gsnlc.v);
-    gtpie_tlv(packet.gtp0.p, &length, GTP_MAX, GTPIE_GSN_ADDR, 
-	      pdp->gsnlu.l, pdp->gsnlu.v);
   }
 
-  packet.gtp0.h.type = hton8(GTP_UPDATE_PDP_RSP);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = hton16(pdp->flrc);
-  packet.gtp0.h.seq = ((union gtp_packet*)pack)->gtp0.h.seq;
-  packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + ((uint64_t)pdp->nsapi << 60);
+  if (pdp->version == 1) {
+    gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_DI,
+	      pdp->teid_own);
+    gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_C,
+	      pdp->teic_own);
+  }
 
-  return gtp_resp(0, gsn, &packet, GTP0_HEADER_SIZE+length, peer);
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_NSAPI, 
+	    pdp->nsapi);
+
+  /* TODO 
+  gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_TRACE_REF,
+	    pdp->traceref);
+  gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_TRACE_TYPE,
+	    pdp->tracetype); */
+
+  /* TODO if ggsn update message
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_EUA, 
+	    pdp->eua.l, pdp->eua.v);
+  */
+
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+	    pdp->gsnlc.l, pdp->gsnlc.v);
+  gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+	    pdp->gsnlu.l, pdp->gsnlu.v);
+
+  if (pdp->version == 1) 
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE,
+	      pdp->qos_req.l, pdp->qos_req.v);
+
+
+  if ((pdp->version == 1) && pdp->tft.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_TFT,
+	      pdp->tft.l, pdp->tft.v);
+  
+  if ((pdp->version == 1) && pdp->triggerid.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_TRIGGER_ID,
+	      pdp->triggerid.l, pdp->triggerid.v);
+  
+  if ((pdp->version == 1) && pdp->omcid.l)
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_OMC_ID,
+	      pdp->omcid.l, pdp->omcid.v);
+  
+  gtp_req(gsn, pdp->version, NULL, &packet, length, inetaddr, cbp);
+
+  return 0;
 }
 
+
+/* Send Update PDP Context Response */
+int gtp_update_pdp_resp(struct gsn_t *gsn, int version, 
+			struct sockaddr_in *peer, int fd, 
+			void *pack, unsigned len,
+			struct pdp_t *pdp, uint8_t cause) {
+  
+  union gtp_packet packet;
+  int length = get_default_gtp(version, GTP_CREATE_PDP_RSP, &packet);
+  
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause);
+  
+  if (cause == GTPCAUSE_ACC_REQ) {
+    
+    if (version == 0) 
+      gtpie_tv0(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE0, 
+		sizeof(pdp->qos_neg0), pdp->qos_neg0);
+
+    gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_RECOVERY, 
+	      gsn->restart_counter);
+
+    if (version == 0) {
+      gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_DI, 
+		pdp->fllu);
+      gtpie_tv2(&packet, &length, GTP_MAX, GTPIE_FL_C,
+		pdp->fllc);
+    }
+
+    if (version == 1) {
+      gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_DI, 
+		pdp->teid_own);
+      gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_TEI_C,
+		pdp->teic_own);
+    }
+
+    gtpie_tv4(&packet, &length, GTP_MAX, GTPIE_CHARGING_ID,
+	      0x12345678); /* TODO */
+
+    /* If ggsn 
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_EUA, 
+	      pdp->eua.l, pdp->eua.v); */
+
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+	      pdp->gsnlc.l, pdp->gsnlc.v);
+    gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_GSN_ADDR, 
+	      pdp->gsnlu.l, pdp->gsnlu.v);
+
+    if (version == 1)
+      gtpie_tlv(&packet, &length, GTP_MAX, GTPIE_QOS_PROFILE,
+		pdp->qos_neg.l, pdp->qos_neg.v);
+
+    /* TODO: Charging gateway address */
+  }
+
+  return gtp_resp(version, gsn, pdp, &packet, length, &pdp->sa_peer, 
+		  pdp->fd, pdp->seq, pdp->tid);
+}
+
+
 /* Handle Update PDP Context Request */
 int gtp_update_pdp_ind(struct gsn_t *gsn, int version,
-		       struct sockaddr_in *peer, void *pack, unsigned len) {
-  struct pdp_t *pdp, *pdp2; 
-  struct pdp_t pdp_buf;
+		       struct sockaddr_in *peer, int fd, 
+		       void *pack, unsigned len) {
+  struct pdp_t *pdp;
+  struct pdp_t pdp_backup;
   union gtpie_member* ie[GTPIE_SIZE];
   uint8_t recovery;
 
-  uint16_t seq = ntoh16(((union gtp_packet*)pack)->gtp0.h.seq);
+  uint16_t seq = get_seq(pack);
+  int hlen = get_hlen(pack);
 
+  uint64_t imsi;
+  uint8_t nsapi;
+  
   /* Is this a dublicate ? */
-  if(!gtp_dublicate(gsn, 0, peer, seq)) {
+  if(!gtp_dublicate(gsn, version, peer, seq)) {
     return 0; /* We allready send of response once */
   }
 
-  /* Find the pdp context in question */
-  if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
-    gsn->err_unknownpdp++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Unknown PDP context");
-    return gtp_update_pdp_resp(gsn, version, peer, pack, len, NULL,
-			       GTPCAUSE_NON_EXIST);
-  }
   
   /* Decode information elements */
-  if (gtpie_decaps(ie, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
+  if (gtpie_decaps(ie, version, pack+hlen, len-hlen)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
     if (0 == version)
       return EOF;
     else
-      return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp, 
-				 GTPCAUSE_INVALID_MESSAGE);
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len,
+				 NULL, GTPCAUSE_INVALID_MESSAGE);
   }
 
-  pdp2 = &pdp_buf;
-  memcpy(pdp2, pdp, sizeof (struct pdp_t)); /* Generate local copy */
+  /* Finding PDP: */
+  /* For GTP0 we use the tunnel identifier to provide imsi and nsapi. */
+  /* For GTP1 we must use imsi and nsapi if imsi is present. Otherwise */
+  /* we have to use the tunnel endpoint identifier */
+  if (version == 0) {
+    imsi = ((union gtp_packet*)pack)->gtp0.h.tid & 0x0fffffffffffffff;
+    nsapi = (((union gtp_packet*)pack)->gtp0.h.tid & 0xf000000000000000) >> 60;
 
-  if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0,   /* TODO: HACK only gtp0 */
-		     &pdp2->qos_req0, sizeof(pdp2->qos_req0))) {
-    gsn->missing++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Missing mandatory information field");
-    return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp2,
-			       GTPCAUSE_MAN_IE_MISSING);
+    /* Find the context in question */
+    if (pdp_getimsi(&pdp, imsi, nsapi)) {
+      gsn->err_unknownpdp++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Unknown PDP context");
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, 
+				 NULL, GTPCAUSE_NON_EXIST);
+    }
   }
-  /* pdp2->qos_req.l = 3;  * TODO: HACK only gtp0 */
+  else if (version == 1) {
+    /* NSAPI (mandatory) */
+    if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &nsapi)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len,
+				 NULL, GTPCAUSE_MAN_IE_MISSING);
+    }
 
-  /* Extract recovery (optional) */
+    /* IMSI (conditional) */
+    if (gtpie_gettv0(ie, GTPIE_IMSI, 0, &imsi, sizeof(imsi))) {
+      /* Find the context in question */
+      if (pdp_getgtp1(&pdp, get_tei(pack))) {
+	gsn->err_unknownpdp++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Unknown PDP context");
+	return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len,
+				   NULL, GTPCAUSE_NON_EXIST);
+      }
+    }
+    else {
+      /* Find the context in question */
+      if (pdp_getimsi(&pdp, imsi, nsapi)) {
+	gsn->err_unknownpdp++;
+	gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		    "Unknown PDP context");
+	return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len,
+				   NULL, GTPCAUSE_NON_EXIST);
+      }
+    }
+  }
+  else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Unknown version");
+    return EOF;
+  }
+
+  /* Make a backup copy in case anything is wrong */
+  memcpy(&pdp_backup, pdp, sizeof(pdp_backup));
+
+  if (version == 0) {
+    if (gtpie_gettv0(ie, GTPIE_QOS_PROFILE0, 0,
+		     pdp->qos_req0, sizeof(pdp->qos_req0))) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, 
+				 pdp, GTPCAUSE_MAN_IE_MISSING);
+    }
+  }
+
+  /* Recovery (optional) */
   if (!gtpie_gettv1(ie, GTPIE_RECOVERY, 0, &recovery)) {
     /* TODO: Handle received recovery IE */
   }
 
-  if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp2->flru)) {
+  if (version == 0) {
+    if (gtpie_gettv2(ie, GTPIE_FL_DI, 0, &pdp->flru)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+    
+    if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp->flrc)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+  }
+
+
+  if (version == 1) {
+    /* TEID (mandatory) */
+    if (gtpie_gettv4(ie, GTPIE_TEI_DI, 0, &pdp->teid_gn)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+
+    /* TEIC (conditional) */
+    /* If TEIC is not included it means that we have allready received it */
+    if (gtpie_gettv4(ie, GTPIE_TEI_C, 0, &pdp->teic_gn)) {
+    }
+
+    /* NSAPI (mandatory) */
+    if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &pdp->nsapi)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
+  }
+  
+  /* Trace reference (optional) */
+  /* Trace type (optional) */
+
+  /* End User Address (conditional) TODO: GGSN Initiated
+  if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l,
+		     &pdp->eua.v, sizeof(pdp->eua.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp2, 
+    memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+    return gtp_update_pdp_resp(gsn, version, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
-  }
+  } */
 
-  if (gtpie_gettv2(ie, GTPIE_FL_C, 0, &pdp2->flrc)) {
+
+  /* SGSN address for signalling (mandatory) */
+  /* It is weird that this is mandatory when TEIC is conditional */
+  if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 0, &pdp->gsnrc.l,
+		     &pdp->gsnrc.v, sizeof(pdp->gsnrc.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp2, 
+    memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+    return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
 
-  if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 0, &pdp2->gsnrc.l,
-		     &pdp2->gsnrc.v, sizeof(pdp2->gsnrc.v))) {
+  /* SGSN address for user traffic (mandatory) */
+  if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp->gsnru.l,
+		     &pdp->gsnru.v, sizeof(pdp->gsnru.v))) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp2, 
+    memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+    return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
 			       GTPCAUSE_MAN_IE_MISSING);
   }
+  
+  if (version == 1) {
+    /* QoS (mandatory) */
+    if (gtpie_gettlv(ie, GTPIE_QOS_PROFILE, 0, &pdp->qos_req.l,
+		     &pdp->qos_req.v, sizeof(pdp->qos_req.v))) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      memcpy(pdp, &pdp_backup, sizeof(pdp_backup));
+      return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
+				 GTPCAUSE_MAN_IE_MISSING);
+    }
 
-  if (gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp2->gsnru.l,
-		     &pdp2->gsnru.v, sizeof(pdp2->gsnru.v))) {
-    gsn->missing++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Missing mandatory information field");
-    return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp2, 
-			       GTPCAUSE_MAN_IE_MISSING);
+    /* TFT (conditional) */
+    if (gtpie_gettlv(ie, GTPIE_TFT, 0, &pdp->tft.l,
+		     &pdp->tft.v, sizeof(pdp->tft.v))) {
+    }
+    
+    /* OMC identity */
   }
 
-  /* OK! It seames as if we received a valid message */
-
-  memcpy(pdp, pdp2, sizeof (struct pdp_t)); /* Update original pdp */
-
   /* Confirm to peer that things were "successful" */
-  return gtp_update_pdp_resp(gsn, version, peer, pack, len, pdp, 
+  return gtp_update_pdp_resp(gsn, version, peer, fd, pack, len, pdp, 
 			     GTPCAUSE_ACC_REQ);
 }
 
@@ -1494,27 +1882,27 @@
   struct pdp_t *pdp; 
   union gtpie_member *ie[GTPIE_SIZE];
   uint8_t cause, recovery;
-  void *aid = NULL;
+  void *cbp = NULL;
   uint8_t type = 0;
   
   /* Remove packet from queue */
-  if (gtp_conf(gsn, 0, peer, pack, len, &type, &aid)) return EOF;
+  if (gtp_conf(gsn, 0, peer, pack, len, &type, &cbp)) return EOF;
 
   /* Find the context in question */
   if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
     gsn->err_unknownpdp++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Unknown PDP context");
-    if (gsn->cb_conf) gsn->cb_conf(type, cause, NULL, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, cause, NULL, cbp);
     return EOF;
   }
 
   /* Decode information elements */
-  if (gtpie_decaps(ie, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
+  if (gtpie_decaps(ie, 0, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
-    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     if (gsn->cb_delete_context) gsn->cb_delete_context(pdp);
     pdp_freepdp(pdp);
     return EOF;
@@ -1525,7 +1913,7 @@
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
-    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     if (gsn->cb_delete_context) gsn->cb_delete_context(pdp);
     pdp_freepdp(pdp);
     return EOF;
@@ -1538,7 +1926,7 @@
 
   /* Check all conditional information elements */
   if (GTPCAUSE_ACC_REQ != cause) {
-    if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, cbp);
     if (gsn->cb_delete_context) gsn->cb_delete_context(pdp);
     pdp_freepdp(pdp);
     return 0;
@@ -1556,7 +1944,7 @@
       gsn->missing++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		  "Missing conditional information field");
-      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, aid);
+      if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
       if (gsn->cb_delete_context) gsn->cb_delete_context(pdp);
       pdp_freepdp(pdp);
       return EOF;
@@ -1576,55 +1964,51 @@
     gtpie_gettlv(ie, GTPIE_GSN_ADDR, 1, &pdp->gsnru.l,
 		 &pdp->gsnru.v, sizeof(pdp->gsnru.v));
     
-    if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, aid);
+    if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, cbp);
     return 0; /* Succes */
   }
 }
 
-/* Send Delete PDP Context Request */
-extern int gtp_delete_pdp_req(struct gsn_t *gsn, int version, void *aid,
-			      struct pdp_t *pdp) {
-  union gtp_packet packet;
-  int length = 0;
-  struct in_addr addr;
 
+/* API: Send Delete PDP Context Request */
+int gtp_delete_context_req(struct gsn_t *gsn, struct pdp_t *pdp, void *cbp) {
+  union gtp_packet packet;
+  int length = get_default_gtp(pdp->version, GTP_CREATE_PDP_REQ, &packet);
+  struct in_addr addr;
+  
   if (gsna2in_addr(&addr, &pdp->gsnrc)) {
     gsn->err_address++;
     gtp_err(LOG_ERR, __FILE__, __LINE__, "GSN address conversion failed");
     return EOF;
   }
+  
+  if (pdp->version == 1) {
+    gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_NSAPI, 
+	      pdp->nsapi);
 
-  get_default_gtp(0, &packet);
+    gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_TEARDOWN,
+	      0xff);
+  }
 
-  packet.gtp0.h.type = hton8(GTP_DELETE_PDP_REQ);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = hton16(pdp->flrc);
-  packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + ((uint64_t)pdp->nsapi << 60);
-
-  return gtp_req(gsn, 0, &packet, GTP0_HEADER_SIZE+length, &addr, aid);
+  get_default_gtp(pdp->version, GTP_DELETE_PDP_REQ, &packet);
+  
+  return gtp_req(gsn, pdp->version, pdp, &packet, length, &addr, cbp);
 }
 
+
 /* Send Delete PDP Context Response */
 int gtp_delete_pdp_resp(struct gsn_t *gsn, int version,
-			struct sockaddr_in *peer, 
+			struct sockaddr_in *peer, int fd,
 			void *pack, unsigned len, 
 			struct pdp_t *pdp, uint8_t cause)
 {
   union gtp_packet packet;
-  int length = 0;
-  uint16_t flow = 0;
-  
-  if (pdp) flow = hton16(pdp->flrc);
-  
-  get_default_gtp(0, &packet);
+  int length = get_default_gtp(version, GTP_DELETE_PDP_RSP, &packet);
 
-  gtpie_tv1(packet.gtp0.p, &length, GTP_MAX, GTPIE_CAUSE, cause);
+  gtpie_tv1(&packet, &length, GTP_MAX, GTPIE_CAUSE, cause);
 
-  packet.gtp0.h.type = hton8(GTP_DELETE_PDP_RSP);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = flow;
-  packet.gtp0.h.seq = ((union gtp_packet*)pack)->gtp0.h.seq;
-  packet.gtp0.h.tid = ((union gtp_packet*)pack)->gtp0.h.tid;
+  gtp_resp(version, gsn, pdp, &packet, length, peer, fd,
+	   get_seq(pack),get_tid(pack));
 
   if (pdp) {
     /* Callback function to allow application to clean up */
@@ -1632,47 +2016,74 @@
     pdp_freepdp(pdp); /* Clean up PDP context */
   }
   
-  return gtp_resp(0, gsn, &packet, GTP0_HEADER_SIZE+length, peer);
+  return 0;
 }
 
 /* Handle Delete PDP Context Request */
 int gtp_delete_pdp_ind(struct gsn_t *gsn, int version,
-		       struct sockaddr_in *peer, void *pack, unsigned len) {
-  struct pdp_t *pdp; 
+		       struct sockaddr_in *peer, int fd,
+		       void *pack, unsigned len) {
+  struct pdp_t *pdp;
   union gtpie_member* ie[GTPIE_SIZE];
-  uint16_t seq = ntoh16(((union gtp_packet*)pack)->gtp0.h.seq);
+  
+  uint16_t seq = get_seq(pack);
+  int hlen = get_hlen(pack);
 
+  uint8_t nsapi;
+  uint8_t teardown;
+  
   /* Is this a dublicate ? */
-  if(!gtp_dublicate(gsn, 0, peer, seq)) {
-    return 0;
+  if(!gtp_dublicate(gsn, version, peer, seq)) {
+    return 0; /* We allready send off response once */
   }
 
-  /* Find the pdp context in question */
-  if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
+  /* Find the context in question */
+  if (pdp_getgtp1(&pdp, get_tei(pack))) {
     gsn->err_unknownpdp++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Unknown PDP context");
-    if (0 == version)
-      return gtp_delete_pdp_resp(gsn, version, peer, pack, len, NULL,
-				 GTPCAUSE_ACC_REQ);
-    else
-      return gtp_delete_pdp_resp(gsn, version, peer, pack, len, NULL,
-				 GTPCAUSE_NON_EXIST);
+    return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len,
+			       NULL, GTPCAUSE_NON_EXIST);
   }
   
   /* Decode information elements */
-  if (gtpie_decaps(ie, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
+  if (gtpie_decaps(ie, version, pack+hlen, len-hlen)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
     if (0 == version)
       return EOF;
     else
-      return gtp_delete_pdp_resp(gsn, version, peer, pack, len, pdp, 
-				 GTPCAUSE_INVALID_MESSAGE);
+      return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len,
+				 NULL, GTPCAUSE_INVALID_MESSAGE);
   }
 
-  return gtp_delete_pdp_resp(gsn, version, peer, pack, len, pdp,
+  if (version == 1) {
+    /* NSAPI (mandatory) */
+    if (gtpie_gettv1(ie, GTPIE_NSAPI, 0, &nsapi)) {
+      gsn->missing++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Missing mandatory information field");
+      return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len,
+				 NULL, GTPCAUSE_MAN_IE_MISSING);
+    }
+
+    /* TODO: When multiple contexts with the same IP address exists
+       we need to tear down each one individually or as a group depending
+       on the value of teardown */
+    
+    /* Teardown (conditional) */
+    if (gtpie_gettv1(ie, GTPIE_TEARDOWN, 0, &teardown)) {
+      return 0; /* 29.060 7.3.5 Ignore message */
+      /* gsn->missing++;
+	 gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+      "Missing mandatory information field");
+		  return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len,
+      NULL, GTPCAUSE_MAN_IE_MISSING); */
+    }
+  }
+  
+  return gtp_delete_pdp_resp(gsn, version, peer, fd, pack, len, pdp,
 			     GTPCAUSE_ACC_REQ);
 }
 
@@ -1684,33 +2095,37 @@
   struct pdp_t *pdp; 
   union gtpie_member *ie[GTPIE_SIZE];
   uint8_t cause;
-  void *aid = NULL;
+  void *cbp = NULL;
   uint8_t type = 0;
-
+  int hlen = get_hlen(pack);
+  
   /* Remove packet from queue */
-  if (gtp_conf(gsn, 0, peer, pack, len, &type, &aid)) return EOF;
+  if (gtp_conf(gsn, version, peer, pack, len, &type, &cbp)) return EOF;
   
   /* Find the context in question */
-  if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
+  if (pdp_getgtp1(&pdp, get_tei(pack))) {
     gsn->err_unknownpdp++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Unknown PDP context");
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, NULL, cbp);
     return EOF;
   }
 
   /* Decode information elements */
-  if (gtpie_decaps(ie, pack+GTP0_HEADER_SIZE, len-GTP0_HEADER_SIZE)) {
+  if (gtpie_decaps(ie, version, pack+hlen, len-hlen)) {
     gsn->invalid++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Invalid message format");
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     return EOF;
   }
 
-  /* Extract cause value */
+  /* Extract cause value (mandatory) */
   if (gtpie_gettv1(ie, GTPIE_CAUSE, 0, &cause)) {
     gsn->missing++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Missing mandatory information field");
+    if (gsn->cb_conf) gsn->cb_conf(type, EOF, pdp, cbp);
     return EOF;
   }
 
@@ -1719,12 +2134,12 @@
     gsn->err_cause++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Unexpected cause value received: %d", cause);
-    return EOF;
   }
 
-  /* Callback function to allow application to clean up */
-  if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, aid);
+  /* Callback function to notify application */
+  if (gsn->cb_conf) gsn->cb_conf(type, cause, pdp, cbp);
 
+  /* Callback function to allow application to clean up */
   if (gsn->cb_delete_context) gsn->cb_delete_context(pdp);
   pdp_freepdp(pdp);  
   
@@ -1733,21 +2148,14 @@
 
 /* Send Error Indication (response to a GPDU message */
 int gtp_error_ind_resp(struct gsn_t *gsn, int version,
-		       struct sockaddr_in *peer, 
+		       struct sockaddr_in *peer, int fd,
 		       void *pack, unsigned len)
 {
   union gtp_packet packet;
-  int length = 0;
+  int length = get_default_gtp(version, GTP_ERROR, &packet);
   
-  get_default_gtp(0, &packet);
-  
-  packet.gtp0.h.type = hton8(GTP_ERROR);
-  packet.gtp0.h.length = hton16(length);
-  packet.gtp0.h.flow = 0;
-  packet.gtp0.h.seq = ((union gtp_packet*)pack)->gtp0.h.seq;
-  packet.gtp0.h.tid = ((union gtp_packet*)pack)->gtp0.h.tid;
-  
-  return gtp_resp(0, gsn, &packet, GTP0_HEADER_SIZE+length, peer);
+  return gtp_resp(version, gsn, NULL, &packet, length, peer, fd,
+		  get_seq(pack), get_tid(pack));
 }
 
 /* Handle Error Indication */
@@ -1774,78 +2182,93 @@
 }
 
 int gtp_gpdu_ind(struct gsn_t *gsn, int version,
-		 struct sockaddr_in *peer,
-		 void *pack,
-		 unsigned len) {
+		  struct sockaddr_in *peer, int fd,
+		  void *pack, unsigned len) {
+
+  int hlen = GTP1_HEADER_SIZE_SHORT;
 
   /* Need to include code to verify packet src and dest addresses */
   struct pdp_t *pdp; 
-  
-  if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
-    gsn->err_unknownpdp++;
-    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
-		"Unknown PDP context");
-    return gtp_error_ind_resp(gsn, version, peer, pack, len);
- 
-  }
 
+  if (version == 0) {
+    if (pdp_getgtp0(&pdp, ntoh16(((union gtp_packet*)pack)->gtp0.h.flow))) {
+      gsn->err_unknownpdp++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Unknown PDP context");
+      return gtp_error_ind_resp(gsn, version, peer, fd, pack, len);
+    }
+    hlen = GTP0_HEADER_SIZE;
+  }
+  else if (version == 1) {
+    if (pdp_getgtp1(&pdp, ntoh32(((union gtp_packet*)pack)->gtp1l.h.tei))) {
+      gsn->err_unknownpdp++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		  "Unknown PDP context");
+      return gtp_error_ind_resp(gsn, version, peer, fd, pack, len);
+    }
+
+    /* Is this a long or a short header ? */
+    if (((union gtp_packet*)pack)->gtp1l.h.flags & 0x07)
+      hlen = GTP1_HEADER_SIZE_LONG;
+    else
+      hlen = GTP1_HEADER_SIZE_SHORT;
+  }
+  else {
+    gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
+		"Unknown version");
+  }
+  
   /* If the GPDU was not from the peer GSN tell him to delete context */
   if (memcmp(&peer->sin_addr, pdp->gsnru.v, pdp->gsnru.l)) { /* TODO Range? */
     gsn->err_unknownpdp++;
     gtp_errpack(LOG_ERR, __FILE__, __LINE__, peer, pack, len,
 		"Unknown PDP context");
-    return gtp_error_ind_resp(gsn, version, peer, pack, len);
+    return gtp_error_ind_resp(gsn, version, peer, fd, pack, len);
   }
-  
+
   /* Callback function */
-  if (gsn->cb_gpdu !=0)
-    return gsn->cb_gpdu(pdp, pack+20, len-20); /* TODO ???? */
+  if (gsn->cb_data_ind !=0)
+    return gsn->cb_data_ind(pdp, pack+hlen, len-hlen);
 
   return 0;
 }
 
 
+
 /* Receives GTP packet and sends off for further processing 
  * Function will check the validity of the header. If the header
  * is not valid the packet is either dropped or a version not 
  * supported is returned to the peer. 
  * TODO: Need to decide on return values! */
-int gtp_decaps(struct gsn_t *gsn)
+int gtp_decaps0(struct gsn_t *gsn)
 {
   unsigned char buffer[PACKET_MAX + 64 /*TODO: ip header */ ];
-  int status, ip_len = 0;
   struct sockaddr_in peer;
   int peerlen;
+  int status;
   struct gtp0_header *pheader;
   int version = 0; /* GTP version should be determined from header!*/
+  int fd = gsn->fd0;
 
   /* TODO: Need strategy of userspace buffering and blocking */
   /* Currently read is non-blocking and send is blocking. */
   /* This means that the program have to wait for busy send calls...*/
 
   while (1) { /* Loop until no more to read */
-    if (fcntl(gsn->fd, F_SETFL, O_NONBLOCK)) {
+    if (fcntl(gsn->fd0, F_SETFL, O_NONBLOCK)) {
       gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
       return -1;
     }
     peerlen = sizeof(peer);
     if ((status = 
-	 recvfrom(gsn->fd, buffer, sizeof(buffer), 0,
+	 recvfrom(gsn->fd0, buffer, sizeof(buffer), 0,
 		  (struct sockaddr *) &peer, &peerlen)) < 0 ) {
-      if (errno == EAGAIN) return -1;
+      if (errno == EAGAIN) return 0;
       gsn->err_readfrom++;
-      gtp_err(LOG_ERR, __FILE__, __LINE__, "recvfrom(fd=%d, buffer=%lx, len=%d) failed: status = %d error = %s", gsn->fd, (unsigned long) buffer, sizeof(buffer), status, status ? strerror(errno) : "No error");
+      gtp_err(LOG_ERR, __FILE__, __LINE__, "recvfrom(fd0=%d, buffer=%lx, len=%d) failed: status = %d error = %s", gsn->fd0, (unsigned long) buffer, sizeof(buffer), status, status ? strerror(errno) : "No error");
       return -1;
     }
   
-    /* Strip off IP header, if present: TODO Is this nessesary? */
-    if ((buffer[0] & 0xF0) == 0x40) {
-      ip_len = (buffer[0] & 0xF) * 4;
-      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
-		  "IP header found in return from read");
-      continue;
-    }
-    
     /* Need at least 1 byte in order to check version */
     if (status < (1)) {
       gsn->empty++;
@@ -1854,30 +2277,184 @@
       continue;
     }
     
-    /* TODO: Remove these ERROR MESSAGES 
-       gtp_err(LOG_ERR, __FILE__, __LINE__, "Discarding packet - too small");
-       gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
-       "Discarding packet - too small"); */
+    pheader = (struct gtp0_header *) (buffer);
     
-    pheader = (struct gtp0_header *) (buffer + ip_len);
-    
-    /* Version should be gtp0 (or earlier in theory) */
+    /* Version should be gtp0 (or earlier) */
+    /* 09.60 is somewhat unclear on this issue. On gsn->fd0 we expect only */
+    /* GTP 0 messages. If other version message is received we reply that we */
+    /* only support version 0, implying that this is the only version */
+    /* supported on this port */
     if (((pheader->flags & 0xe0) > 0x00)) {
       gsn->unsup++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
 		  "Unsupported GTP version");
-      gtp_unsup_resp(gsn, &peer, buffer, status); /* 29.60: 11.1.1 */
+      gtp_unsup_req(gsn, 0, &peer, gsn->fd0, buffer, status); /* 29.60: 11.1.1 */
       continue;
     }
     
     /* Check length of gtp0 packet */
-    if (((pheader->flags & 0xe0) == 0x00) && (status < GTP0_HEADER_SIZE)) {
+    if (status < GTP0_HEADER_SIZE) {
       gsn->tooshort++;
       gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
 		  "GTP0 packet too short");
       continue;  /* Silently discard 29.60: 11.1.2 */
     }
 
+    /* Check packet length field versus length of packet */
+    if (status != (ntoh16(pheader->length) + GTP0_HEADER_SIZE)) {
+      gsn->tooshort++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "GTP packet length field does not match actual length");
+      continue;  /* Silently discard */
+    }
+    
+    if ((gsn->mode == GTP_MODE_GGSN) && 
+	((pheader->type == GTP_CREATE_PDP_RSP) ||
+	 (pheader->type == GTP_UPDATE_PDP_RSP) ||
+	 (pheader->type == GTP_DELETE_PDP_RSP))) {
+      gsn->unexpect++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unexpected GTP Signalling Message");
+      continue;  /* Silently discard 29.60: 11.1.4 */
+    }
+
+    if ((gsn->mode == GTP_MODE_SGSN) && 
+	((pheader->type == GTP_CREATE_PDP_REQ) ||
+	 (pheader->type == GTP_UPDATE_PDP_REQ) ||
+	 (pheader->type == GTP_DELETE_PDP_REQ))) {
+      gsn->unexpect++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unexpected GTP Signalling Message");
+      continue;  /* Silently discard 29.60: 11.1.4 */
+    }
+
+    switch (pheader->type) {
+    case GTP_ECHO_REQ:
+      gtp_echo_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    case GTP_ECHO_RSP:
+      gtp_echo_conf(gsn, version, &peer, buffer, status);
+      break;
+    case GTP_NOT_SUPPORTED:
+      gtp_unsup_ind(gsn, &peer, buffer, status);
+      break;
+    case GTP_CREATE_PDP_REQ:
+      gtp_create_pdp_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    case GTP_CREATE_PDP_RSP:
+      gtp_create_pdp_conf(gsn, version, &peer, buffer, status);
+      break;
+    case GTP_UPDATE_PDP_REQ:
+      gtp_update_pdp_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    case GTP_UPDATE_PDP_RSP:
+      gtp_update_pdp_conf(gsn, version, &peer, buffer, status);
+      break;
+    case GTP_DELETE_PDP_REQ:
+      gtp_delete_pdp_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    case GTP_DELETE_PDP_RSP:
+      gtp_delete_pdp_conf(gsn, version, &peer, buffer, status);
+      break;
+    case GTP_ERROR:
+      gtp_error_ind_conf(gsn, version, &peer, buffer, status);
+      break;
+    case GTP_GPDU:
+      gtp_gpdu_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    default:
+      gsn->unknown++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unknown GTP message type received");
+      break;
+    }
+  }
+}
+
+
+int gtp_decaps1c(struct gsn_t *gsn)
+{
+  unsigned char buffer[PACKET_MAX + 64 /*TODO: ip header */ ];
+  struct sockaddr_in peer;
+  int peerlen;
+  int status;
+  struct gtp1_header_short *pheader;
+  int version = 1; /* GTP version should be determined from header!*/
+  int fd = gsn->fd1c;
+
+  /* TODO: Need strategy of userspace buffering and blocking */
+  /* Currently read is non-blocking and send is blocking. */
+  /* This means that the program have to wait for busy send calls...*/
+
+  while (1) { /* Loop until no more to read */
+    if (fcntl(gsn->fd1c, F_SETFL, O_NONBLOCK)) {
+      gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
+      return -1;
+    }
+    peerlen = sizeof(peer);
+    if ((status = 
+	 recvfrom(gsn->fd1c, buffer, sizeof(buffer), 0,
+		  (struct sockaddr *) &peer, &peerlen)) < 0 ) {
+      if (errno == EAGAIN) return 0;
+      gsn->err_readfrom++;
+      gtp_err(LOG_ERR, __FILE__, __LINE__, "recvfrom(fd1c=%d, buffer=%lx, len=%d) failed: status = %d error = %s", gsn->fd1c, (unsigned long) buffer, sizeof(buffer), status, status ? strerror(errno) : "No error");
+      return -1;
+    }
+  
+    /* Need at least 1 byte in order to check version */
+    if (status < (1)) {
+      gsn->empty++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Discarding packet - too small");
+      continue;
+    }
+    
+    pheader = (struct gtp1_header_short *) (buffer);
+    
+    /* Version must be no larger than GTP 1 */
+    if (((pheader->flags & 0xe0) > 0x20)) {
+      gsn->unsup++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unsupported GTP version");
+      gtp_unsup_req(gsn, 1, &peer, gsn->fd1c, buffer, status);/*29.60: 11.1.1*/
+      continue;
+    }
+
+    /* Version must be at least GTP 1 */
+    /* 29.060 is somewhat unclear on this issue. On gsn->fd1c we expect only */
+    /* GTP 1 messages. If GTP 0 message is received we silently discard */
+    /* the message */
+    if (((pheader->flags & 0xe0) < 0x20)) {
+      gsn->unsup++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unsupported GTP version");
+      continue;
+    }
+
+    /* Check packet flag field */
+    if (((pheader->flags & 0xf7) != 0x32)) {
+      gsn->unsup++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unsupported packet flag");
+      continue;
+    }
+
+    /* Check length of packet */
+    if (status < GTP1_HEADER_SIZE_LONG) {
+      gsn->tooshort++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "GTP packet too short");
+      continue;  /* Silently discard 29.60: 11.1.2 */
+    }
+
+    /* Check packet length field versus length of packet */
+    if (status != (ntoh16(pheader->length) + GTP1_HEADER_SIZE_SHORT)) {
+      gsn->tooshort++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "GTP packet length field does not match actual length");
+      continue;  /* Silently discard */
+    }
+
     if ((gsn->mode == GTP_MODE_GGSN) && 
 	((pheader->type == GTP_CREATE_PDP_RSP) ||
 	 (pheader->type == GTP_UPDATE_PDP_RSP) ||
@@ -1898,48 +2475,36 @@
       continue;  /* Silently discard 29.60: 11.1.4 */
     }
 
-
-    
     switch (pheader->type) {
     case GTP_ECHO_REQ:
-      gtp_echo_ind(gsn, &peer, buffer+ip_len, status - ip_len);
+      gtp_echo_ind(gsn, version, &peer, fd, buffer, status);
       break;
     case GTP_ECHO_RSP:
-      gtp_echo_conf(gsn, &peer, buffer+ip_len, status - ip_len);
+      gtp_echo_conf(gsn, version, &peer, buffer, status);
       break;
     case GTP_NOT_SUPPORTED:
-      gtp_unsup_conf(gsn, &peer, buffer+ip_len, status - ip_len);
+      gtp_unsup_ind(gsn, &peer, buffer, status);
       break;
     case GTP_CREATE_PDP_REQ:
-      gtp_create_pdp_ind(gsn, version, &peer, buffer+ip_len, 
-			 status - ip_len);
+      gtp_create_pdp_ind(gsn, version, &peer, fd, buffer, status);
       break;
     case GTP_CREATE_PDP_RSP:
-      gtp_create_pdp_conf(gsn, version, &peer, buffer+ip_len, 
-			  status - ip_len);
+      gtp_create_pdp_conf(gsn, version, &peer, buffer, status);
       break;
     case GTP_UPDATE_PDP_REQ:
-      gtp_update_pdp_ind(gsn, version, &peer, buffer+ip_len, 
-			 status - ip_len);
+      gtp_update_pdp_ind(gsn, version, &peer, fd, buffer, status);
       break;
     case GTP_UPDATE_PDP_RSP:
-      gtp_update_pdp_conf(gsn, version, &peer, buffer+ip_len, 
-			  status - ip_len);
+      gtp_update_pdp_conf(gsn, version, &peer, buffer, status);
       break;
     case GTP_DELETE_PDP_REQ:
-      gtp_delete_pdp_ind(gsn, version, &peer, buffer+ip_len, 
-			 status - ip_len);
+      gtp_delete_pdp_ind(gsn, version, &peer, fd, buffer, status);
       break;
     case GTP_DELETE_PDP_RSP:
-      gtp_delete_pdp_conf(gsn, version, &peer, buffer+ip_len, 
-			  status - ip_len);
+      gtp_delete_pdp_conf(gsn, version, &peer, buffer, status);
       break;
     case GTP_ERROR:
-      gtp_error_ind_conf(gsn, version, &peer, buffer+ip_len, 
-			 status - ip_len);
-      break;
-    case GTP_GPDU:
-      gtp_gpdu_ind(gsn, version, &peer, buffer+ip_len, status - ip_len);
+      gtp_error_ind_conf(gsn, version, &peer, buffer, status);
       break;
     default:
       gsn->unknown++;
@@ -1950,46 +2515,178 @@
   }
 }
 
-int gtp_gpdu(struct gsn_t *gsn, struct pdp_t* pdp, 
+int gtp_decaps1u(struct gsn_t *gsn)
+{
+  unsigned char buffer[PACKET_MAX + 64 /*TODO: ip header */ ];
+  struct sockaddr_in peer;
+  int peerlen;
+  int status;
+  struct gtp1_header_short *pheader;
+  int version = 1; /* GTP version should be determined from header!*/
+  int fd = gsn->fd1u;
+
+  /* TODO: Need strategy of userspace buffering and blocking */
+  /* Currently read is non-blocking and send is blocking. */
+  /* This means that the program have to wait for busy send calls...*/
+
+  while (1) { /* Loop until no more to read */
+    if (fcntl(gsn->fd1u, F_SETFL, O_NONBLOCK)) {
+      gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
+      return -1;
+    }
+    peerlen = sizeof(peer);
+    if ((status = 
+	 recvfrom(gsn->fd1u, buffer, sizeof(buffer), 0,
+		  (struct sockaddr *) &peer, &peerlen)) < 0 ) {
+      if (errno == EAGAIN) return 0;
+      gsn->err_readfrom++;
+      gtp_err(LOG_ERR, __FILE__, __LINE__, "recvfrom(fd1u=%d, buffer=%lx, len=%d) failed: status = %d error = %s", gsn->fd1u, (unsigned long) buffer, sizeof(buffer), status, status ? strerror(errno) : "No error");
+      return -1;
+    }
+  
+    /* Need at least 1 byte in order to check version */
+    if (status < (1)) {
+      gsn->empty++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Discarding packet - too small");
+      continue;
+    }
+    
+    pheader = (struct gtp1_header_short *) (buffer);
+    
+    /* Version must be no larger than GTP 1 */
+    if (((pheader->flags & 0xe0) > 0x20)) {
+      gsn->unsup++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unsupported GTP version");
+      gtp_unsup_req(gsn, 1, &peer, gsn->fd1c, buffer, status);/*29.60: 11.1.1*/
+      continue;
+    }
+
+    /* Version must be at least GTP 1 */
+    /* 29.060 is somewhat unclear on this issue. On gsn->fd1c we expect only */
+    /* GTP 1 messages. If GTP 0 message is received we silently discard */
+    /* the message */
+    if (((pheader->flags & 0xe0) < 0x20)) {
+      gsn->unsup++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unsupported GTP version");
+      continue;
+    }
+
+    /* Check packet flag field (allow both with and without sequence number)*/
+    if (((pheader->flags & 0xf5) != 0x30)) {
+      gsn->unsup++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unsupported packet flag");
+      continue;
+    }
+
+    /* Check length of packet */
+    if (status < GTP1_HEADER_SIZE_SHORT) {
+      gsn->tooshort++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "GTP packet too short");
+      continue;  /* Silently discard 29.60: 11.1.2 */
+    }
+
+    /* Check packet length field versus length of packet */
+    if (status != (ntoh16(pheader->length) + GTP1_HEADER_SIZE_SHORT)) {
+      gsn->tooshort++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "GTP packet length field does not match actual length");
+      continue;  /* Silently discard */
+    }
+    
+    switch (pheader->type) {
+    case GTP_ECHO_REQ:
+      gtp_echo_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    case GTP_ECHO_RSP:
+      gtp_echo_conf(gsn, version, &peer, buffer, status);
+      break;
+    case GTP_ERROR:
+      gtp_error_ind_conf(gsn, version, &peer, buffer, status);
+      break;
+      /* Supported header extensions */
+    case GTP_GPDU:
+      gtp_gpdu_ind(gsn, version, &peer, fd, buffer, status);
+      break;
+    default:
+      gsn->unknown++;
+      gtp_errpack(LOG_ERR, __FILE__, __LINE__, &peer, buffer, status,
+		  "Unknown GTP message type received");
+      break;
+    }
+  }
+}
+
+int gtp_data_req(struct gsn_t *gsn, struct pdp_t* pdp, 
 	     void *pack, unsigned len)
 {
   union gtp_packet packet;
   struct sockaddr_in addr;
-
-  /*printf("gtp_encaps start\n");
-    print_packet(pack, len);*/
+  int fd;
+  int length;
 
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
-
   memcpy(&addr.sin_addr, pdp->gsnru.v,pdp->gsnru.l); /* TODO range check */
-  addr.sin_port = htons(GTP0_PORT);
 
-  get_default_gtp(0, &packet);
-  packet.gtp0.h.type = hton8(GTP_GPDU);
-  packet.gtp0.h.length = hton16(len);
-  packet.gtp0.h.seq = hton16(pdp->gtpsntx++);
-  packet.gtp0.h.flow = hton16(pdp->flru);
-  packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + ((uint64_t)pdp->nsapi << 60);
+  if (pdp->version == 0) {
+    
+    length = GTP0_HEADER_SIZE+len;
+    addr.sin_port = htons(GTP0_PORT);
+    fd = gsn->fd0;
+    
+    get_default_gtp(0, GTP_GPDU, &packet);
+    packet.gtp0.h.length = hton16(len);
+    packet.gtp0.h.seq = hton16(pdp->gtpsntx++);
+    packet.gtp0.h.flow = hton16(pdp->flru);
+    packet.gtp0.h.tid = (pdp->imsi & 0x0fffffffffffffff) + ((uint64_t)pdp->nsapi << 60);
 
-  if (len > sizeof (union gtp_packet) - sizeof(struct gtp0_header)) {
-    gsn->err_memcpy++;
-    gtp_err(LOG_ERR, __FILE__, __LINE__, 
-	    "Memcpy failed");
-    return EOF;
+    if (len > sizeof (union gtp_packet) - sizeof(struct gtp0_header)) {
+      gsn->err_memcpy++;
+      gtp_err(LOG_ERR, __FILE__, __LINE__, 
+	      "Memcpy failed");
+      return EOF;
     }
+    memcpy(packet.gtp0.p, pack, len); /* TODO Should be avoided! */
+  }
+  else if (pdp->version == 1) {
+    
+    length = GTP1_HEADER_SIZE_LONG+len;
+    addr.sin_port = htons(GTP1U_PORT);
+    fd = gsn->fd1u;
 
-  if (fcntl(gsn->fd, F_SETFL, 0)) {
+    get_default_gtp(1, GTP_GPDU, &packet);
+    packet.gtp1l.h.length = hton16(len-GTP1_HEADER_SIZE_SHORT+
+				   GTP1_HEADER_SIZE_LONG);
+    packet.gtp1l.h.seq = hton16(pdp->gtpsntx++);
+
+    if (len > sizeof (union gtp_packet) - sizeof(struct gtp1_header_long)) {
+      gsn->err_memcpy++;
+      gtp_err(LOG_ERR, __FILE__, __LINE__, 
+	      "Memcpy failed");
+      return EOF;
+    }
+    memcpy(packet.gtp1l.p, pack, len); /* TODO Should be avoided! */
+  }
+  else {
+    gtp_err(LOG_ERR, __FILE__, __LINE__, 
+	    "Unknown version");
+    return EOF;
+  }
+
+  if (fcntl(fd, F_SETFL, 0)) {
     gtp_err(LOG_ERR, __FILE__, __LINE__, "fnctl()");
     return -1;
   }
 
-  memcpy(packet.gtp0.p, pack, len); /* TODO Should be avoided! */
-  
-  if (sendto(gsn->fd, &packet, GTP0_HEADER_SIZE+len, 0,
+  if (sendto(fd, &packet, length, 0,
 	     (struct sockaddr *) &addr, sizeof(addr)) < 0) {
     gsn->err_sendto++;
-    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", gsn->fd, (unsigned long) &packet, GTP0_HEADER_SIZE+len, strerror(errno));
+    gtp_err(LOG_ERR, __FILE__, __LINE__, "Sendto(fd=%d, msg=%lx, len=%d) failed: Error = %s", fd, (unsigned long) &packet, GTP0_HEADER_SIZE+len, strerror(errno));
     return EOF;
   }
   return 0;
diff --git a/gtp/gtp.h b/gtp/gtp.h
index d21cbb4..123339b 100644
--- a/gtp/gtp.h
+++ b/gtp/gtp.h
@@ -89,6 +89,55 @@
 /* 242-254 For future use. */
 #define GTP_GPDU            255 /* G-PDU */
 
+
+/* GTP information element cause codes from 29.060 v3.9.0 7.7 */
+/*                                                            */
+#define GTPCAUSE_REQ_IMSI                   0 /* Request IMSI */
+#define GTPCAUSE_REQ_IMEI                   1 /* Request IMEI */
+#define GTPCAUSE_REQ_IMSI_IMEI              2 /* Request IMSI and IMEI */
+#define GTPCAUSE_NO_ID_NEEDED               3 /* No identity needed */
+#define GTPCAUSE_MS_REFUSES_X               4 /* MS refuses */
+#define GTPCAUSE_MS_NOT_RESP_X              5 /* MS is not GPRS responding */
+#define GTPCAUSE_006                        6 /* For future use 6-48 */
+#define GTPCAUSE_049                       49 /* Cause values reserved for GPRS charging protocol use (See GTP' in GSM 12.15) 49-63 */
+#define GTPCAUSE_064                       64 /* For future use 64-127 */
+#define GTPCAUSE_ACC_REQ                  128 /* Request accepted */
+#define GTPCAUSE_129                      129 /* For future use 129-176 */
+#define GTPCAUSE_177                      177 /* Cause values reserved for GPRS charging protocol use (See GTP' In GSM 12.15) 177-191 */
+#define GTPCAUSE_NON_EXIST                192 /* Non-existent */
+#define GTPCAUSE_INVALID_MESSAGE          193 /* Invalid message format */
+#define GTPCAUSE_IMSI_NOT_KNOWN           194 /* IMSI not known */
+#define GTPCAUSE_MS_DETACHED              195 /* MS is GPRS detached */
+#define GTPCAUSE_MS_NOT_RESP              196 /* MS is not GPRS responding */
+#define GTPCAUSE_MS_REFUSES               197 /* MS refuses */
+#define GTPCAUSE_198                      198 /* For future use */
+#define GTPCAUSE_NO_RESOURCES             199 /* No resources available */
+#define GTPCAUSE_NOT_SUPPORTED            200 /* Service not supported */
+#define GTPCAUSE_MAN_IE_INCORRECT         201 /* Mandatory IE incorrect */
+#define GTPCAUSE_MAN_IE_MISSING           202 /* Mandatory IE missing */
+#define GTPCAUSE_OPT_IE_INCORRECT         203 /* Optional IE incorrect */
+#define GTPCAUSE_SYS_FAIL                 204 /* System failure */
+#define GTPCAUSE_ROAMING_REST             205 /* Roaming Restriction */
+#define GTPCAUSE_PTIMSI_MISMATCH          206 /* P-TMSI signature mismatch */
+#define GTPCAUSE_CONN_SUSP                207 /* GPRS connection suspended */
+#define GTPCAUSE_AUTH_FAIL                208 /* Authentication failure */
+#define GTPCAUSE_USER_AUTH_FAIL           209 /* User authentication failed */
+#define GTPCAUSE_CONTEXT_NOT_FOUND        210 /* Context not found */
+#define GTPCAUSE_ADDR_OCCUPIED            211 /* All dynamic PDP addresses are occupied */
+#define GTPCAUSE_NO_MEMORY                212 /* No memory is available */
+#define GTPCAUSE_RELOC_FAIL               213 /* Relocation failure */
+#define GTPCAUSE_UNKNOWN_MAN_EXTHEADER    214 /* Unknown mandatory extension header */
+#define GTPCAUSE_SEM_ERR_TFT              215 /* Semantic error in the TFT operation */
+#define GTPCAUSE_SYN_ERR_TFT              216 /* Syntactic error in the TFT operation */
+#define GTPCAUSE_SEM_ERR_FILTER           217 /* Semantic errors in packet filter(s) */
+#define GTPCAUSE_SYN_ERR_FILTER           218 /* Syntactic errors in packet filter(s) */
+#define GTPCAUSE_MISSING_APN              219 /* Missing or unknown APN*/
+#define GTPCAUSE_UNKNOWN_PDP              220 /* Unknown PDP address or PDP type */
+#define GTPCAUSE_221                      221 /* For Future Use 221-240 */
+#define GTPCAUSE_241                      241 /* Cause Values Reserved For Gprs Charging Protocol Use (See Gtp' In Gsm 12.15) 241-255 */
+
+
+
 /* GTP 0 header. 
  * Explanation to some of the fields:
  * SNDCP NPDU Number flag = 0 except for inter SGSN handover situations
@@ -100,49 +149,49 @@
  * Tunnel ID is IMSI+NSAPI. Unique identifier of PDP context. Is somewhat
  *   redundant because the header also includes flow. */
 
-struct gtp0_header {            /*    Descriptions from 3GPP 09.60 */
-	u_int8_t  flags;        /* 01 bitfield, with typical values */
-                                /*    000..... Version: 1 (0) */
-                                /*    ...1111. Spare (7) */
-                                /*    .......0 SNDCP N-PDU Number flag (0) */
-	u_int8_t  type;	        /* 02 Message type. T-PDU = 0xff */
-	u_int16_t length;	/* 03 Length (of G-PDU excluding header) */
-	u_int16_t seq;	        /* 05 Sequence Number */
-	u_int16_t flow;	        /* 07 Flow Label ( = 0 for signalling) */
-	u_int8_t  number;	/* 09 SNDCP N-PDU LCC Number ( 0 = 0xff) */
-	u_int8_t  spare1;	/* 10 Spare */
-	u_int8_t  spare2;	/* 11 Spare */
-	u_int8_t  spare3;	/* 12 Spare */
-	u_int64_t tid;		/* 13 Tunnel ID */
-};                              /* 20 */
+struct gtp0_header {    /*    Descriptions from 3GPP 09.60 */
+  u_int8_t  flags;      /* 01 bitfield, with typical values */
+                        /*    000..... Version: 1 (0) */
+                        /*    ...1111. Spare (7) */
+                        /*    .......0 SNDCP N-PDU Number flag (0) */
+  u_int8_t  type;	        /* 02 Message type. T-PDU = 0xff */
+  u_int16_t length;	/* 03 Length (of G-PDU excluding header) */
+  u_int16_t seq;	        /* 05 Sequence Number */
+  u_int16_t flow;	        /* 07 Flow Label ( = 0 for signalling) */
+  u_int8_t  number;	/* 09 SNDCP N-PDU LCC Number ( 0 = 0xff) */
+  u_int8_t  spare1;	/* 10 Spare */
+  u_int8_t  spare2;	/* 11 Spare */
+  u_int8_t  spare3;	/* 12 Spare */
+  u_int64_t tid;	/* 13 Tunnel ID */
+};                      /* 20 */
 
-struct gtp1_header_short {      /*     Descriptions from 3GPP 29060 */
-	u_int8_t  flags;        /* 01 bitfield, with typical values */
-                                /*    000..... Version: 1 */
-                                /*    ...1.... Protocol Type: GTP=1, GTP'=0 */
-                                /*    ....1... Spare = 1 */
-                                /*    .....1.. Extension header flag: 1 */
-                                /*    ......1. Sequence number flag: 1 */
-                                /*    .......0 PN: N-PDU Number flag */
-	u_int8_t  type;		/* 02 Message type. T-PDU = 0xff */
-	u_int16_t length;	/* 03 Length (of IP packet or signalling) */
-	u_int64_t tid;		/* 05 - 08 Tunnel ID */
+struct gtp1_header_short { /*    Descriptions from 3GPP 29060 */
+  u_int8_t  flags;         /* 01 bitfield, with typical values */
+                           /*    001..... Version: 1 */
+                           /*    ...1.... Protocol Type: GTP=1, GTP'=0 */
+                           /*    ....0... Spare = 0 */
+                           /*    .....0.. Extension header flag: 0 */
+                           /*    ......0. Sequence number flag: 0 */
+                           /*    .......0 PN: N-PDU Number flag */
+  u_int8_t  type;	   /* 02 Message type. T-PDU = 0xff */
+  u_int16_t length;	   /* 03 Length (of IP packet or signalling) */
+  u_int32_t tei;           /* 05 - 08 Tunnel Endpoint ID */
 };
 
-struct gtp1_header_long {       /*     Descriptions from 3GPP 29060 */
-	u_int8_t  flags;        /* 01 bitfield, with typical values */
-                                /*    000..... Version: 1 */
-                                /*    ...1.... Protocol Type: GTP=1, GTP'=0 */
-                                /*    ....1... Spare = 1 */
-                                /*    .....1.. Extension header flag: 1 */
-                                /*    ......1. Sequence number flag: 1 */
-                                /*    .......0 PN: N-PDU Number flag */
-	u_int8_t  type;		/* 02 Message type. T-PDU = 0xff */
-	u_int16_t length;	/* 03 Length (of IP packet or signalling) */
-	u_int64_t tid;		/* 05 Tunnel ID */
-	u_int16_t seq;	        /* 10 Sequence Number */
-	u_int8_t  npdu;		/* 11 N-PDU Number */
-	u_int8_t  next;		/* 12 Next extension header type. Empty = 0 */
+struct gtp1_header_long {  /*    Descriptions from 3GPP 29060 */
+  u_int8_t  flags;         /* 01 bitfield, with typical values */
+                           /*    001..... Version: 1 */
+                           /*    ...1.... Protocol Type: GTP=1, GTP'=0 */
+                           /*    ....0... Spare = 0 */
+                           /*    .....0.. Extension header flag: 0 */
+                           /*    ......1. Sequence number flag: 1 */
+                           /*    .......0 PN: N-PDU Number flag */
+  u_int8_t  type;	   /* 02 Message type. T-PDU = 0xff */
+  u_int16_t length;	   /* 03 Length (of IP packet or signalling) */
+  u_int32_t tei;	   /* 05 Tunnel Endpoint ID */
+  u_int16_t seq;	   /* 10 Sequence Number */
+  u_int8_t  npdu;	   /* 11 N-PDU Number */
+  u_int8_t  next;	   /* 12 Next extension header type. Empty = 0 */
 };
 
 struct gtp0_packet {
@@ -162,9 +211,9 @@
 
 union gtp_packet {
   u_int8_t flags;
-  struct gtp0_packet       gtp0;
-  struct gtp1_packet_short gtp1s;
-  struct gtp1_packet_long  gtp1l;
+  struct gtp0_packet        gtp0;
+  struct gtp1_packet_short  gtp1s;
+  struct gtp1_packet_long   gtp1l;
 } __attribute__((packed)) h;
 
 
@@ -188,7 +237,9 @@
 struct gsn_t {
   /* Parameters related to the network interface */
 
-  int         fd;       /* File descriptor to network interface */
+  int         fd0;      /* GTP0 file descriptor */
+  int         fd1c;     /* GTP1 control plane file descriptor */
+  int         fd1u;     /* GTP0 user plane file descriptor */
   int       mode;       /* Mode of operation: GGSN or SGSN */
   struct in_addr gsnc;  /* IP address of this gsn for signalling */
   struct in_addr gsnu;  /* IP address of this gsn for user traffic */
@@ -206,9 +257,10 @@
 
   /* Call back functions */
   int (*cb_delete_context) (struct pdp_t*);
-  int (*cb_create_context) (struct pdp_t*);
-  int (*cb_conf) (int type, int cause, struct pdp_t *pdp, void* aid);
-  int (*cb_gpdu) (struct pdp_t* pdp, void* pack, unsigned len);
+  int (*cb_create_context_ind) (struct pdp_t*);
+  int (*cb_unsup_ind) (struct sockaddr_in *peer);
+  int (*cb_conf) (int type, int cause, struct pdp_t *pdp, void* cbp);
+  int (*cb_data_ind) (struct pdp_t* pdp, void* pack, unsigned len);
 
   /* Counters */
   
@@ -247,100 +299,92 @@
 		      uint64_t imsi, uint8_t nsapi);
 extern int gtp_freepdp(struct gsn_t *gsn, struct pdp_t *pdp);
 
-extern int gtp_create_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid,
-			      struct in_addr* inetaddr);
-extern int gtp_update_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid,
-			      struct in_addr* inetaddr);
-extern int gtp_delete_context(struct gsn_t *gsn, struct pdp_t *pdp, void *aid);
+extern int gtp_create_context_req(struct gsn_t *gsn, struct pdp_t *pdp, 
+				  void *cbp, struct in_addr* inetaddr);
 
-extern int 
-gtp_create_context2(struct gsn_t *gsn, void *aid, 
-		    struct in_addr* inetaddr,
-		    int selmode, uint64_t imsi, int nsapi,
-		    uint8_t *qos, int qoslen,
-		    char *apn, int apnlen,
-		    char *msisdn, int msisdnlen,
-		    uint8_t *pco, int pcolen);
+extern int gtp_set_cb_create_context_ind(struct gsn_t *gsn,
+	     int (*cb_create_context_ind) (struct pdp_t* pdp));
 
-extern int gtp_gpdu(struct gsn_t *gsn, struct pdp_t *pdp,
-		    void *pack, unsigned len);
+extern int gtp_create_context_resp(struct gsn_t *gsn, struct pdp_t *pdp, 
+				   int cause);
+
+extern int gtp_update_context(struct gsn_t *gsn, struct pdp_t *pdp, 
+			      void *cbp, struct in_addr* inetaddr);
+
+extern int gtp_delete_context_req(struct gsn_t *gsn, struct pdp_t *pdp, 
+				  void *cbp);
+
+extern int gtp_data_req(struct gsn_t *gsn, struct pdp_t *pdp,
+			void *pack, unsigned len);
+
+extern int gtp_set_cb_data_ind(struct gsn_t *gsn,
+             int (*cb_data_ind) (struct pdp_t* pdp, void* pack, unsigned len));
+
 
 extern int gtp_fd(struct gsn_t *gsn);
-extern int gtp_decaps(struct gsn_t *gsn);
+extern int gtp_decaps0(struct gsn_t *gsn);
+extern int gtp_decaps1c(struct gsn_t *gsn);
+extern int gtp_decaps1u(struct gsn_t *gsn);
 extern int gtp_retrans(struct gsn_t *gsn);
 extern int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout);
 
-/*
-extern int gtp_set_cb_newpdp(struct gsn_t *gsn, 
-			     int (*cb) (struct pdp_t*));
-extern int gtp_set_cb_freepdp(struct gsn_t *gsn, 
-			      int (*cb) (struct pdp_t*));
-extern int gtp_set_cb_create_pdp_ind(struct gsn_t *gsn, 
-				     int (*cb) (struct pdp_t*));
-extern int gtp_set_cb_create_pdp_conf(struct gsn_t *gsn, 
-				      int (*cb) (struct pdp_t*, int));
-extern int gtp_set_cb_update_pdp_conf(struct gsn_t *gsn, 
-				      int (*cb) (struct pdp_t*, int, int));
-extern int gtp_set_cb_delete_pdp_ind(struct gsn_t *gsn, 
-				     int (*cb) (struct pdp_t*));
-extern int gtp_set_cb_delete_pdp_conf(struct gsn_t *gsn, 
-				      int (*cb) (struct pdp_t*, int));
-*/
-
 extern int gtp_set_cb_delete_context(struct gsn_t *gsn, 
 	     int (*cb_delete_context) (struct pdp_t* pdp));
-extern int gtp_set_cb_create_context(struct gsn_t *gsn,
-	     int (*cb_create_context) (struct pdp_t* pdp));
+/*extern int gtp_set_cb_create_context(struct gsn_t *gsn,
+  int (*cb_create_context) (struct pdp_t* pdp)); */
+
+extern int gtp_set_cb_unsup_ind(struct gsn_t *gsn,
+				int (*cb) (struct sockaddr_in *peer));
+
+
 extern int gtp_set_cb_conf(struct gsn_t *gsn,
-             int (*cb) (int type, int cause, struct pdp_t* pdp, void *aid));
-extern int gtp_set_cb_gpdu(struct gsn_t *gsn,
-	     int (*cb_gpdu) (struct pdp_t* pdp, void* pack, unsigned len));
+             int (*cb) (int type, int cause, struct pdp_t* pdp, void *cbp));
 
 
 /* Internal functions (not part of the API */
 
-extern int gtp_echo_req(struct gsn_t *gsn, struct in_addr *inetaddrs);
-extern int gtp_echo_resp(struct gsn_t *gsn, struct sockaddr_in *peer,
+extern int gtp_echo_req(struct gsn_t *gsn, int version, void *cbp,
+			struct in_addr *inetaddrs);
+extern int gtp_echo_resp(struct gsn_t *gsn, int version, 
+			 struct sockaddr_in *peer, int fd,
 			 void *pack, unsigned len);
-extern int gtp_echo_ind(struct gsn_t *gsn, struct sockaddr_in *peer,
+extern int gtp_echo_ind(struct gsn_t *gsn, int version, 
+			struct sockaddr_in *peer, int fd, 
 			void *pack, unsigned len);
-extern int gtp_echo_conf(struct gsn_t *gsn, struct sockaddr_in *peer,
+extern int gtp_echo_conf(struct gsn_t *gsn, int version, 
+			 struct sockaddr_in *peer,
 			 void *pack, unsigned len);
 
-extern int gtp_unsup_resp(struct gsn_t *gsn, struct sockaddr_in *peer,
-			  void *pack, unsigned len);
-extern int gtp_unsup_conf(struct gsn_t *gsn, struct sockaddr_in *peer,
-			  void *pack, unsigned len);
+extern int gtp_unsup_req(struct gsn_t *gsn, int version, 
+			 struct sockaddr_in *peer,
+			 int fd, void *pack, unsigned len);
+extern int gtp_unsup_ind(struct gsn_t *gsn, struct sockaddr_in *peer,
+			 void *pack, unsigned len);
 
-extern int gtp_create_pdp_req(struct gsn_t *gsn, int version, void *aid,
-			      struct in_addr* inetaddr, struct pdp_t *pdp);
-
-extern int gtp_create_pdp_resp(struct gsn_t *gsn, int version,
-			       struct sockaddr_in *peer, 
-			       void *pack, unsigned len, 
+extern int gtp_create_pdp_resp(struct gsn_t *gsn, int version, 
 			       struct pdp_t *pdp, uint8_t cause);
 
 extern int gtp_create_pdp_ind(struct gsn_t *gsn, int version,
-			      struct sockaddr_in *peer, 
+			      struct sockaddr_in *peer, int fd,
 			      void *pack, unsigned len);
 
 extern int gtp_create_pdp_conf(struct gsn_t *gsn, int version,
 			       struct sockaddr_in *peer,
 			       void *pack, unsigned len);
 
-extern int gtp_update_pdp_req(struct gsn_t *gsn, int version, void *aid,
+extern int gtp_update_pdp_req(struct gsn_t *gsn, int version, void *cbp,
 			      struct in_addr* inetaddr, struct pdp_t *pdp);
 
-extern int gtp_delete_pdp_req(struct gsn_t *gsn, int version, void *aid,
+extern int gtp_delete_pdp_req(struct gsn_t *gsn, int version, void *cbp,
 			      struct pdp_t *pdp);
 
 extern int gtp_delete_pdp_resp(struct gsn_t *gsn, int version,
-			       struct sockaddr_in *peer, 
+			       struct sockaddr_in *peer, int fd,
 			       void *pack, unsigned len, 
 			       struct pdp_t *pdp, uint8_t cause);
 
 extern int gtp_delete_pdp_ind(struct gsn_t *gsn, int version,
-			      struct sockaddr_in *peer, 
+			      struct sockaddr_in *peer, int fd,
 			      void *pack, unsigned len);
 
 extern int gtp_delete_pdp_conf(struct gsn_t *gsn, int version,
diff --git a/gtp/gtpie.c b/gtp/gtpie.c
index 8fd4a20..68f912f 100644
--- a/gtp/gtpie.c
+++ b/gtp/gtpie.c
@@ -79,6 +79,14 @@
   return 0;
 }
 
+int gtpie_tv8(void *p, int *length, int size, u_int8_t t, u_int64_t v) {
+  if ((*length + 9) >= size) return 1;
+  ((union gtpie_member*) (p + *length))->tv8.t = hton8(t);
+  ((union gtpie_member*) (p + *length))->tv8.v = hton64(v);
+  *length += 9;
+  return 0;
+}
+
 int gtpie_getie(union gtpie_member* ie[], int type, int instance) {
   int j;
   for (j=0; j< GTPIE_SIZE; j++) {
@@ -157,7 +165,18 @@
   return 0;
 }
 
-int gtpie_decaps(union gtpie_member* ie[], void *pack, unsigned len) {
+int gtpie_gettv8(union gtpie_member* ie[], int type, int instance, 
+		 uint64_t *dst){
+  int ien;
+  ien = gtpie_getie(ie, type, instance);
+  if (ien>=0)
+    *dst = ntoh64(ie[ien]->tv8.v);
+  else
+    return EOF;
+  return 0;
+}
+
+int gtpie_decaps(union gtpie_member* ie[], int version, void *pack, unsigned len) {
   int i;
   int j = 0;
   unsigned char *p;
@@ -175,9 +194,9 @@
 	printf("%02x ", (unsigned char)*(char *)(p+i));
 	if (!((i+1)%16)) printf("\n");
       };
-    printf("\n");
+      printf("\n");
     }
-
+    
     switch (*p) {
     case GTPIE_CAUSE:             /* TV GTPIE types with value length 1 */
     case GTPIE_REORDER:
@@ -194,14 +213,26 @@
       if (j<GTPIE_SIZE) {
 	ie[j] = (union gtpie_member*) p;
 	if (GTPIE_DEBUG) printf("GTPIE TV1 found. Type %d, value %d\n", 
-	       ie[j]->tv1.t, ie[j]->tv1.v);
+				ie[j]->tv1.t, ie[j]->tv1.v);
 	p+= 1 + 1;
 	j++;
       }
       break;
-    case GTPIE_FL_DI:           /* TV GTPIE types with value length 2 */
+    case GTPIE_FL_DI:           /* TV GTPIE types with value length 2 or 4 */
     case GTPIE_FL_C:
-    case GTPIE_PFI:  
+      if (version != 0) {
+	if (j<GTPIE_SIZE) {     /* GTPIE_TEI_DI & GTPIE_TEI_C with length 4 */
+	  /* case GTPIE_TEI_DI: gtp1 */
+	  /* case GTPIE_TEI_C:  gtp1 */
+	  ie[j] = (union gtpie_member*) p;
+	  if (GTPIE_DEBUG) printf("GTPIE TV 4 found. Type %d, value %d\n",
+				  ie[j]->tv4.t, ie[j]->tv4.v);
+	  p+= 1 + 4;
+	  j++;
+	}
+	break;
+      }
+    case GTPIE_PFI:             /* TV GTPIE types with value length 2 */
     case GTPIE_CHARGING_C:
     case GTPIE_TRACE_REF:
     case GTPIE_TRACE_TYPE:
@@ -227,9 +258,9 @@
     case GTPIE_TLLI:            /* TV GTPIE types with value length 4 */
     case GTPIE_P_TMSI:
     case GTPIE_CHARGING_ID:
+      /* case GTPIE_TEI_DI: Handled by GTPIE_FL_DI */
+      /* case GTPIE_TEI_C:  Handled by GTPIE_FL_DI */
       if (j<GTPIE_SIZE) {
-	/*    case GTPIE_TEI_DI: gtp1 */
-	/*    case GTPIE_TEI_C: gtp1 */
 	ie[j] = (union gtpie_member*) p;
 	if (GTPIE_DEBUG) printf("GTPIE TV 4 found. Type %d, value %d\n",
 				ie[j]->tv4.t, ie[j]->tv4.v);
diff --git a/gtp/gtpie.h b/gtp/gtpie.h
index 58a36e9..f8990dc 100644
--- a/gtp/gtpie.h
+++ b/gtp/gtpie.h
@@ -25,6 +25,29 @@
 #define hton32(x) htonl(x)
 #define ntoh32(x) ntohl(x)
 
+#if BYTE_ORDER == LITTLE_ENDIAN
+static __inline u_int64_t
+hton64(u_int64_t q)
+{
+        register u_int32_t u, l;
+        u = q >> 32;
+        l = (u_int32_t) q;
+
+        return htonl(u) | ((u_int64_t)htonl(l) << 32);
+}
+
+#define ntoh64(_x)        hton64(_x)
+
+#elif BYTE_ORDER == BIG_ENDIAN
+
+#define hton64(_x)        (_x)
+#define ntoh64(_x)        hton64(_x)
+
+#else
+#error  "Please fix <machine/endian.h>"
+#endif
+
+
 #define GTPIE_SIZE 256          /* Max number of information elements */
 #define GTPIE_MAX  0xffff       /* Max length of information elements */
 #define GTPIE_MAX_TV 28         /* Max length of type value pair */
@@ -91,52 +114,6 @@
 /* 252-254 Reserved for the GPRS charging protocol (see GTP' in GSM 12.15) */
 #define GTPIE_PRIVATE       255 /* Private Extension */
 
-/* GTP information element cause codes from 29.060 v3.9.0 7.7 */
-/*                                                            */
-#define GTPCAUSE_REQ_IMSI                   0 /* Request IMSI */
-#define GTPCAUSE_REQ_IMEI                   1 /* Request IMEI */
-#define GTPCAUSE_REQ_IMSI_IMEI              2 /* Request IMSI and IMEI */
-#define GTPCAUSE_NO_ID_NEEDED               3 /* No identity needed */
-#define GTPCAUSE_MS_REFUSES_X               4 /* MS refuses */
-#define GTPCAUSE_MS_NOT_RESP_X              5 /* MS is not GPRS responding */
-#define GTPCAUSE_006                        6 /* For future use 6-48 */
-#define GTPCAUSE_049                       49 /* Cause values reserved for GPRS charging protocol use (See GTP' in GSM 12.15) 49-63 */
-#define GTPCAUSE_064                       64 /* For future use 64-127 */
-#define GTPCAUSE_ACC_REQ                  128 /* Request accepted */
-#define GTPCAUSE_129                      129 /* For future use 129-176 */
-#define GTPCAUSE_177                      177 /* Cause values reserved for GPRS charging protocol use (See GTP' In GSM 12.15) 177-191 */
-#define GTPCAUSE_NON_EXIST                192 /* Non-existent */
-#define GTPCAUSE_INVALID_MESSAGE          193 /* Invalid message format */
-#define GTPCAUSE_IMSI_NOT_KNOWN           194 /* IMSI not known */
-#define GTPCAUSE_MS_DETACHED              195 /* MS is GPRS detached */
-#define GTPCAUSE_MS_NOT_RESP              196 /* MS is not GPRS responding */
-#define GTPCAUSE_MS_REFUSES               197 /* MS refuses */
-#define GTPCAUSE_198                      198 /* For future use */
-#define GTPCAUSE_NO_RESOURCES             199 /* No resources available */
-#define GTPCAUSE_NOT_SUPPORTED            200 /* Service not supported */
-#define GTPCAUSE_MAN_IE_INCORRECT         201 /* Mandatory IE incorrect */
-#define GTPCAUSE_MAN_IE_MISSING           202 /* Mandatory IE missing */
-#define GTPCAUSE_OPT_IE_INCORRECT         203 /* Optional IE incorrect */
-#define GTPCAUSE_SYS_FAIL                 204 /* System failure */
-#define GTPCAUSE_ROAMING_REST             205 /* Roaming Restriction */
-#define GTPCAUSE_PTIMSI_MISMATCH          206 /* P-TMSI signature mismatch */
-#define GTPCAUSE_CONN_SUSP                207 /* GPRS connection suspended */
-#define GTPCAUSE_AUTH_FAIL                208 /* Authentication failure */
-#define GTPCAUSE_USER_AUTH_FAIL           209 /* User authentication failed */
-#define GTPCAUSE_CONTEXT_NOT_FOUND        210 /* Context not found */
-#define GTPCAUSE_ADDR_OCCUPIED            211 /* All dynamic PDP addresses are occupied */
-#define GTPCAUSE_NO_MEMORY                212 /* No memory is available */
-#define GTPCAUSE_RELOC_FAIL               213 /* Relocation failure */
-#define GTPCAUSE_UNKNOWN_MAN_EXTHEADER    214 /* Unknown mandatory extension header */
-#define GTPCAUSE_SEM_ERR_TFT              215 /* Semantic error in the TFT operation */
-#define GTPCAUSE_SYN_ERR_TFT              216 /* Syntactic error in the TFT operation */
-#define GTPCAUSE_SEM_ERR_FILTER           217 /* Semantic errors in packet filter(s) */
-#define GTPCAUSE_SYN_ERR_FILTER           218 /* Syntactic errors in packet filter(s) */
-#define GTPCAUSE_MISSING_APN              219 /* Missing or unknown APN*/
-#define GTPCAUSE_UNKNOWN_PDP              220 /* Unknown PDP address or PDP type */
-#define GTPCAUSE_221                      221 /* For Future Use 221-240 */
-#define GTPCAUSE_241                      241 /* Cause Values Reserved For Gprs Charging Protocol Use (See Gtp' In Gsm 12.15) 241-255 */
-
 
 /* GTP information element structs in network order */
 struct gtpie_ext {              /* Extension header */
@@ -267,8 +244,11 @@
 			uint16_t *dst);
 extern int gtpie_gettv4(union gtpie_member* ie[], int type, int instance, 
 			uint32_t *dst);
+extern int gtpie_gettv8(union gtpie_member* ie[], int type, int instance, 
+			uint64_t *dst);
 
-extern int gtpie_decaps(union gtpie_member* ie[], void *pack, unsigned len);
+extern int gtpie_decaps(union gtpie_member* ie[], int version,
+			void *pack, unsigned len);
 extern int gtpie_encaps(union gtpie_member* ie[], void *pack, unsigned *len);
 extern int gtpie_encaps2(union gtpie_member ie[], int size,
 		  void *pack, unsigned *len);
diff --git a/gtp/pdp.c b/gtp/pdp.c
index 2c05bdb..493b9b4 100644
--- a/gtp/pdp.c
+++ b/gtp/pdp.c
@@ -128,7 +128,7 @@
       (*pdp)->fllc     = (uint16_t) n;
       (*pdp)->fllu     = (uint16_t) n;
       (*pdp)->teic_own = (uint32_t) n;
-      (*pdp)->teic_own = (uint32_t) n;
+      (*pdp)->teid_own = (uint32_t) n;
       pdp_tidset(*pdp, pdp_gettid(imsi, nsapi));
       return 0;
     }
@@ -227,6 +227,11 @@
   return EOF; /* End of linked list and not found */
 }
 
+int pdp_getimsi(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi) {
+  return pdp_tidget(pdp, 
+		    (imsi & 0x0fffffffffffffff) + ((uint64_t)nsapi << 60));
+}
+
 /*
 int pdp_iphash(void* ipif, struct ul66_t *eua) {
   /#printf("IPhash %ld\n", lookup(eua->v, eua->l, ipif) % PDP_MAX);#/
diff --git a/gtp/pdp.h b/gtp/pdp.h
index b4f9986..90a1871 100644
--- a/gtp/pdp.h
+++ b/gtp/pdp.h
@@ -123,6 +123,7 @@
   struct ul255_t apn_sub;/* The APN received from the HLR. */
   struct ul255_t apn_use;/* The APN Network Identifier currently used. */
   uint8_t     nsapi;    /* Network layer Service Access Point Identifier. (4 bit) */
+  uint8_t     linked_nsapi;  /* (Linked NSAPI) (4 bit) */
   uint16_t    ti;       /* Transaction Identifier. (4 or 12 bit) */
 
   uint32_t    teic_own; /* (Own Tunnel Endpoint Identifier Control) */
@@ -136,7 +137,7 @@
   uint16_t    flrc;     /* (Remote gn/gp Flow Label Control, gtp0) */
   uint16_t    flru;     /* (Remote gn/gp Flow Label Data I, gtp0) */
 
-  struct ul_t tft;      /* Traffic flow template. */
+  struct ul255_t tft;   /* Traffic flow template. */
   /*struct ul16_t sgsnc;  * The IP address of the SGSN currently serving this MS. (Control plane) */
   /*struct ul16_t sgsnu;  * The IP address of the SGSN currently serving this MS. (User plane) */
   /*struct ul16_t ggsnc;  * The IP address of the GGSN currently used. (Control plane) */
@@ -173,7 +174,15 @@
   struct ul255_t pco_req;  /* Requested packet control options. */
   struct ul255_t pco_neg;  /* Negotiated packet control options. */
   uint32_t    selmode;  /* Selection mode. */
-  uint64_t    tid;      /* (Combination of imsi and nsapi) */
+
+  /* Additional parameters used by library */
+
+  int         version;  /* Protocol version currently in use. 0 or 1 */
+
+  uint64_t    tid;      /* Combination of imsi and nsapi */
+  u_int16_t   seq;      /* Sequence number of last request */
+  struct sockaddr_in sa_peer; /* Address of last request */
+  int fd;               /* File descriptor request was received on */
 };
 
 
@@ -185,13 +194,16 @@
 int pdp_getpdp(struct pdp_t **pdp);
 
 int pdp_getgtp0(struct pdp_t **pdp, uint16_t fl);
-int pdp_getgtp1(struct pdp_t **pdp, uint32_t teid);
+int pdp_getgtp1(struct pdp_t **pdp, uint32_t tei);
+
+int pdp_getimsi(struct pdp_t **pdp, uint64_t imsi, uint8_t nsapi);
 
 int pdp_tidhash(uint64_t tid);
 int pdp_tidset(struct pdp_t *pdp, uint64_t tid);
 int pdp_tiddel(struct pdp_t *pdp);
 int pdp_tidget(struct pdp_t **pdp, uint64_t tid);
 
+
 /*
 int pdp_iphash(void* ipif, struct ul66_t *eua);
 int pdp_ipset(struct pdp_t *pdp, void* ipif, struct ul66_t *eua);
diff --git a/gtp/queue.c b/gtp/queue.c
index 900f240..845b4ba 100644
--- a/gtp/queue.c
+++ b/gtp/queue.c
@@ -77,6 +77,8 @@
   if (QUEUE_DEBUG) printf("End queue_seqset\n");
   return 0;
 }
+
+
 int queue_seqdel(struct queue_t *queue, struct qmsg_t *qmsg) {
   int hash = queue_seqhash(&qmsg->peer, qmsg->seq);
   struct qmsg_t *qmsg2;
@@ -234,14 +236,14 @@
 }
 
 int queue_freemsg_seq(struct queue_t *queue, struct sockaddr_in *peer, 
-		      uint16_t seq, uint8_t *type, void **aid) {
+		      uint16_t seq, uint8_t *type, void **cbp) {
   struct qmsg_t *qmsg;
   if (queue_seqget(queue, &qmsg, peer, seq)) {
-    *aid = NULL;
+    *cbp = NULL;
     *type = 0;
     return EOF;
   }
-  *aid = qmsg->aid;
+  *cbp = qmsg->cbp;
   *type = qmsg->type;
   if (queue_freemsg(queue, qmsg)) {
     return EOF;
diff --git a/gtp/queue.h b/gtp/queue.h
index 076a3ef..1e226c9 100644
--- a/gtp/queue.h
+++ b/gtp/queue.h
@@ -30,10 +30,11 @@
 struct qmsg_t {           /* Holder for queued packets */
   int state;              /* 0=empty, 1=full */
   uint16_t seq;           /* The sequence number */
-  u_int8_t type;         /* The type of packet */
-  void *aid;              /* Application specific pointer */
+  u_int8_t type;          /* The type of packet */
+  void *cbp;              /* Application specific pointer */
   union gtp_packet p;     /* The packet stored */
   int l;                  /* Length of the packet */
+  int fd;                 /* Socket packet was sent to / received from */
   struct sockaddr_in peer;/* Address packet was sent to / received from */
   struct qmsg_t *seqnext; /* Pointer to next in sequence hash list */
   int next;               /* Pointer to the next in queue. -1: Last */
@@ -70,7 +71,7 @@
 		 struct sockaddr_in  *peer, uint16_t seq);
 /* Free message based on sequence number */
 int queue_freemsg_seq(struct queue_t *queue, struct sockaddr_in *peer,
-		      uint16_t seq, uint8_t *type, void **aid);
+		      uint16_t seq, uint8_t *type, void **cbp);
 
 
 #endif	/* !_QUEUE_H */
diff --git a/sgsnemu/sgsnemu.c b/sgsnemu/sgsnemu.c
index 1148755..577428f 100644
--- a/sgsnemu/sgsnemu.c
+++ b/sgsnemu/sgsnemu.c
@@ -739,7 +739,7 @@
   pack.checksum = ~sum;
 
   ntransmitted++;
-  return gtp_gpdu(gsn, pdp, &pack, 28 + datasize);
+  return gtp_data_req(gsn, pdp, &pack, 28 + datasize);
 }
 		
 
@@ -771,7 +771,7 @@
   }
   
   if (ipm->pdp) /* Check if a peer protocol is defined */
-    gtp_gpdu(gsn, ipm->pdp, pack, len);
+    gtp_data_req(gsn, ipm->pdp, pack, len);
   return 0;
 }
 
@@ -818,13 +818,13 @@
   return 0;
 }
 
-int echo_conf(struct pdp_t *pdp, int cause) {
-  if (cause <0) {
+int echo_conf(int recovery) {
+  if (recovery <0) {
     printf("Echo request timed out\n");
     state = 0; 
   }
   else
-    printf("Received echo response.\n");
+    printf("Received echo response\n");
   return 0;
 }
 
@@ -832,7 +832,7 @@
   /* if (cause < 0) return 0; Some error occurred. We don't care */
   switch (type) {
   case GTP_ECHO_REQ:
-    return echo_conf(pdp, cause);
+    return echo_conf(cause);
   case GTP_CREATE_PDP_REQ:
     if (cause !=128) return 0; /* Request not accepted. We don't care */
     return create_pdp_conf(pdp, cause);
@@ -878,14 +878,16 @@
 	    "Failed to create gtp");
     exit(1);
   }
-  if (gsn->fd > maxfd) maxfd = gsn->fd;
+  if (gsn->fd0 > maxfd) maxfd = gsn->fd0;
+  if (gsn->fd1c > maxfd) maxfd = gsn->fd1c;
+  if (gsn->fd1u > maxfd) maxfd = gsn->fd1u;
 
   gtp_set_cb_delete_context(gsn, delete_context);
   gtp_set_cb_conf(gsn, conf);
   if (options.createif) 
-    gtp_set_cb_gpdu(gsn, encaps_tun);
+    gtp_set_cb_data_ind(gsn, encaps_tun);
   else
-    gtp_set_cb_gpdu(gsn, encaps_ping);
+    gtp_set_cb_data_ind(gsn, encaps_ping);
 
   if (options.createif) {
     printf("Setting up interface\n");
@@ -907,7 +909,8 @@
 
   /* See if anybody is there */
   printf("Sending off echo request\n");
-  gtp_echo_req(gsn, &options.remote); /* See if remote is alive ? */
+  gtp_echo_req(gsn, 1, NULL, &options.remote); /* See if remote is alive ? */
+  gtp_echo_req(gsn, 0, NULL, &options.remote); /* See if remote is alive ? */
 
   for(n=0; n<options.contexts; n++) {
     printf("Setting up PDP context #%d\n", n);
@@ -927,6 +930,11 @@
     else {
       memcpy(pdp->qos_req0, options.qos.v, options.qos.l);
     }
+
+    /* TODO */
+    pdp->qos_req.l = 4;
+    pdp->qos_req.v[0] = 0x00;
+    memcpy(pdp->qos_req.v+1, options.qos.v, options.qos.l);
     
     pdp->selmode = 0x01; /* MS provided APN, subscription not verified */
     
@@ -964,9 +972,11 @@
       memcpy(pdp->pco_req.v, options.pco.v, options.pco.l);
     }
     
+    pdp->version = 1; /* First try with version 1 */
+
     /* Create context */
     /* We send this of once. Retransmissions are handled by gtplib */
-    gtp_create_context(gsn, pdp, NULL, &options.remote);
+    gtp_create_context_req(gsn, pdp, NULL, &options.remote);
   }    
 
   state = 1;  /* Enter wait_connection state */
@@ -1015,7 +1025,7 @@
       for(n=0; n<options.contexts; n++) {
 	/* Delete context */
 	printf("Disconnecting PDP context #%d\n", n);
-	gtp_delete_context(gsn, iparr[n].pdp, NULL);
+	gtp_delete_context_req(gsn, iparr[n].pdp, NULL);
 	if ((options.pinghost.s_addr !=0) && ntransmitted) ping_finish();
       }
     }
@@ -1041,7 +1051,9 @@
 
     FD_ZERO(&fds);
     if (tun) FD_SET(tun->fd, &fds);
-    FD_SET(gsn->fd, &fds);
+    FD_SET(gsn->fd0, &fds);
+    FD_SET(gsn->fd1c, &fds);
+    FD_SET(gsn->fd1u, &fds);
     
     gtp_retranstimeout(gsn, &idleTime);
     ping_timeout(&idleTime);
@@ -1066,9 +1078,14 @@
 	      "TUN decaps failed");
     }
     
-    if (FD_ISSET(gsn->fd, &fds))
-      gtp_decaps(gsn);
-    
+    if (FD_ISSET(gsn->fd0, &fds))
+      gtp_decaps0(gsn);
+
+    if (FD_ISSET(gsn->fd1c, &fds))
+      gtp_decaps1c(gsn);
+
+    if (FD_ISSET(gsn->fd1u, &fds))
+      gtp_decaps1u(gsn);
   }
   
   gtp_free(gsn); /* Clean up the gsn instance */
