diff --git a/2.3/BLFS/Makefile b/2.3/BLFS/Makefile
new file mode 100644
index 0000000..e82f1d4
--- /dev/null
+++ b/2.3/BLFS/Makefile
@@ -0,0 +1,38 @@
+# From the Build Scripts Written By: Jim Gifford <lfs@jg555.com>
+# Modified By: Joe Ciccone <jciccone@linuxfromscratch.org
+# Additional changes: George Boudreau <georgeb@linuxfromscratch.org>
+
+# $Id$
+
+TOPDIR=$(shell pwd)
+CONFIG_CONFIG_IN = Config.in
+CONFIG = menu
+
+all: 	menuconfig
+
+$(CONFIG)/conf:
+	$(MAKE) -B -C $(CONFIG) conf
+
+$(CONFIG)/mconf:
+	$(MAKE) -B -C $(CONFIG) ncurses conf mconf
+
+menuconfig: $(CONFIG)/mconf
+	@./update_book.sh none
+	@./gen_config.sh
+	@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
+	@./gen_pkg_book.sh
+
+config: $(CONFIG)/conf
+	@$(CONFIG)/conf $(CONFIG_CONFIG_IN)
+
+# Clean up
+
+clean:
+	rm -f configuration configuration.old error
+	- $(MAKE) -C $(CONFIG) clean
+
+clean-target:
+	rm -f error
+	- $(MAKE) -C $(CONFIG) clean
+
+.PHONY: all menuconfig config clean clean-target $(CONFIG)/conf $(CONFIG)/mconf
diff --git a/2.3/BLFS/TODO b/2.3/BLFS/TODO
new file mode 100644
index 0000000..b2d5ee0
--- /dev/null
+++ b/2.3/BLFS/TODO
@@ -0,0 +1,20 @@
+#####
+#
+# Project TODO list
+#
+# $Id$
+#####
+
+
+--   Review generated scripts for bugs trying to figure out if are due fails
+     in the BLFS book XML tagging (that will implied that the book need be
+     fixed) or are required variations due book layout. If the latter, try
+     to fix it via XSL, documenting in README.BLFS that issues that can't be
+     fixed.
+
+     This is an on-going and never-end task due that, ideally, each commit to
+     the BLFS book should be revised and validated, but our time is limited.
+
+--   Bugs hunting.
+
+--   Find a better way to define circular dependencies.
\ No newline at end of file
diff --git a/2.3/BLFS/envars.conf b/2.3/BLFS/envars.conf
new file mode 100644
index 0000000..d3b8986
--- /dev/null
+++ b/2.3/BLFS/envars.conf
@@ -0,0 +1,91 @@
+#####
+#
+# Configuration file for the BLFS module
+#
+# $Id$
+#
+# Set default envars used in the build scripts
+#
+#####
+
+#======== Common envars ==========
+
+#--- Set a well-known working locale when building software
+export LC_ALL=C
+
+#--- The local repository for packages/file
+#    Any missing file will be downloaded and archived here,
+#    if the user has the right priviledges.
+export SRC_ARCHIVE=$SRC_ARCHIVE
+
+#--- Server used if the file isn't found in SRC_ARCHIVE.
+# As a last resort, the file will dowloaded from upstream, if possible.
+#
+# The server path MUST be set as listed in
+# http://www.linuxfromscratch.org/blfs/download.html
+export FTP_SERVER=ftp://anduin.linuxfromscratch.org/BLFS/
+
+
+#--- The sources directory.
+#    Full path to the top level directory where packages will be stored,
+#    unpacked, and compiled.
+export SRC_DIR=$HOME/sources
+
+
+#======== Xorg7 envars ===========
+
+#--- Installation prefix
+export XORG_PREFIX=/usr
+
+#--- Configure switches
+export XORG_CONFIG="--prefix=$XORG_PREFIX --sysconfdir=/etc --mandir=$XORG_PREFIX/share/man --localstatedir=/var"
+
+#======== GNOME envars ===========
+
+#--- Installation prefix
+export GNOME_PREFIX=/usr
+
+#--- If you want to install GNOME on a non standart prefix, uncomment
+#    the next export lines and edit it if needed.
+#    See also the GNOME Pre-installation Configuration HTML page for
+#    aditional required commands.
+#export PATH=$PATH:$GNOME_PREFIX/bin
+#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$GNOME_PREFIX/lib/pkgconfig
+#export GNOME_LIBCONFIG_PATH=/usr/lib:$GNOME_PREFIX/lib
+
+#======== KDE envars =============
+
+#--- Installation prefix
+export KDE_PREFIX=/usr
+
+#--- If you want to install KDE on a non standart prefix, uncomment
+#    the next export lines and edit it if needed.
+#    See also the KDE Pre-installation Configuration HTML page for
+#    aditional required commands.
+#export PATH=$PATH:$KDE_PREFIX/bin
+#export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$KDE_PREFIX/lib/pkgconfig
+
+
+
+#======== Optimizations =============
+
+# Global optimization settings can be placed here. This settings can be
+# overrided by settings in the packages build scripts.
+
+# WARNING: The use of build optimizations may be dangerous.
+#   You should know what you are doing and be sure that the
+#   optimization settings placed below are what you want.
+#   It there are build issues or the system doesn't work as
+#   expected, please rebuild without optimizations before
+#   asking for support.
+
+#export MAKEFLAGS="-j3"
+
+#export CFLAGS="-O3 -pipe"
+#export CXXFLAGS=$CFLAGS
+#export LDFLAGS="-s"
+
+#export OTHER_CFLAGS=$CFLAGS
+#export OTHER_CXXFLAGS=$CXXFLAGS
+#export OTHER_LDFLAGS=$LDFLAGS
+
diff --git a/2.3/BLFS/gen-makefile.sh b/2.3/BLFS/gen-makefile.sh
new file mode 100755
index 0000000..936ce49
--- /dev/null
+++ b/2.3/BLFS/gen-makefile.sh
@@ -0,0 +1,264 @@
+#!/bin/bash
+#
+# $Id$
+#
+set -e
+
+# TEMPORARY VARIABLES.. development use only
+declare MKFILE=Makefile
+declare PREV_PACKAGE=""
+declare BUILD_SCRIPTS=scripts
+declare TRACKING_DIR=tracking-dir
+
+HEADER="# This file is automatically generated by gen-makefile.sh
+# YOU MAY NEED TO EDIT THIS FILE MANUALLY
+#
+# Generated on `date \"+%F %X %Z\"`"
+
+
+#----------------------------------#
+__wrt_target() {                   # Create target and initialize log file
+#----------------------------------#
+  local i=$1
+  local PREV=$2
+(
+cat << EOF
+
+$i:  $PREV
+	@\$(call echo_message, Building)
+	@/bin/bash progress_bar.sh \$@ \$\$PPID &
+EOF
+) >> $MKFILE.tmp
+}
+
+
+
+#----------------------------------#
+__write_build_cmd() {              #
+#----------------------------------#
+(
+cat << EOF
+	@source ../envars.conf && ${BUILD_SCRIPTS}/\$@ >logs/\$@ 2>&1
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+__wrt_touch() {                    #
+#----------------------------------#
+  local pkg_name=$1
+  local pkg_ver=$2
+  local alsa_ver=$(grep "^alsa[[:space:]]" ../packages | cut -f3)
+  local kde_core_ver=$(grep "^kde-core[[:space:]]" ../packages | cut -f3)
+  local xorg7_ver=$(grep "^xorg7[[:space:]]" ../packages | cut -f3)
+
+  if [[ -n "$pkg_ver" ]] ; then
+(
+cat << EOF
+	@rm -f \$(TRACKING_DIR)/${pkg_name#*-?-}-{0..9}* && \\
+	touch \$(TRACKING_DIR)/${pkg_name#*-?-}-${pkg_ver}
+EOF
+) >> $MKFILE.tmp
+  fi
+
+  case $pkg_name in
+    *-alsa-lib ) #this the unique mandatory package for ALSA support.
+(
+cat << EOF
+	@rm -f \$(TRACKING_DIR)/alsa-{0..9}* && \\
+	touch \$(TRACKING_DIR)/alsa-${alsa_ver}
+EOF
+) >> $MKFILE.tmp
+      ;;
+    *-kdebase )
+(
+cat << EOF
+	@rm -f \$(TRACKING_DIR)/kde-core-{0..9}* && \\
+	touch \$(TRACKING_DIR)/kde-core-${kde_core_ver}
+EOF
+) >> $MKFILE.tmp
+      ;;
+    *-xorg7-driver ) # xtrerm2 and rman are optional
+(
+cat << EOF
+	@rm -f \$(TRACKING_DIR)/xorg7-{0..9}* && \\
+	touch \$(TRACKING_DIR)/xorg7-${xorg7_ver}
+EOF
+) >> $MKFILE.tmp
+      ;;
+  esac
+
+(
+cat << EOF
+	@touch  \$@ && \\
+	sleep .25 && \\
+	echo -e "\n\n "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
+	echo --------------------------------------------------------------------------------\$(WHITE)
+EOF
+) >> $MKFILE.tmp
+}
+
+
+#----------------------------#
+__write_entry() {            #
+#----------------------------#
+  local script_name=$1
+  local pkg_ver=$2
+
+  echo -n "${tab_}${tab_} entry for <$script_name>"
+
+  #--------------------------------------------------------------------#
+  #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+  #--------------------------------------------------------------------#
+  #
+  # Drop in the name of the target on a new line, and the previous target
+  # as a dependency. Also call the echo_message function.
+  __wrt_target "${script_name}" "$PREV_PACKAGE"
+  __write_build_cmd
+
+  # Include a touch of the target name so make can check
+  # if it's already been made.
+  __wrt_touch "${script_name}" "${pkg_ver}"
+  #
+  #--------------------------------------------------------------------#
+  #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+  #--------------------------------------------------------------------#
+  echo " .. OK"
+}
+
+#----------------------------#
+__write_meta_pkg_touch() {   #
+#----------------------------#
+  local meta_pkg=$1
+  local pkg_ver=$(grep "^${meta_pkg}[[:space:]]" ../packages | cut -f3)
+  local gnome_core_ver=$(grep "^gnome-core[[:space:]]" ../packages | cut -f3)
+  local kde_full_ver=$(grep "^kde-full[[:space:]]" ../packages | cut -f3)
+
+(
+cat << EOF
+
+999-z-$meta_pkg:  $PREV_PACKAGE
+	@rm -f \$(TRACKING_DIR)/${meta_pkg}-{0..9}* && \\
+	touch \$(TRACKING_DIR)/${meta_pkg}-${pkg_ver}
+EOF
+) >> $MKFILE.tmp
+
+  case $meta_pkg in
+    gnome-full )
+(
+cat << EOF
+	@rm -f \$(TRACKING_DIR)/gnome-core-{0..9}* && \\
+	touch \$(TRACKING_DIR)/gnome-core-${gnome_core_ver}
+EOF
+) >> $MKFILE.tmp
+      ;;
+    kde-koffice )
+(
+cat << EOF
+	@rm -f \$(TRACKING_DIR)/kde-full-{0..9}* && \\
+	touch \$(TRACKING_DIR)/kde-full-${kde_full_ver}
+EOF
+) >> $MKFILE.tmp
+      ;;
+  esac
+
+(
+cat << EOF
+	@touch  \$@
+EOF
+) >> $MKFILE.tmp
+
+}
+
+#----------------------------#
+generate_Makefile () {       #
+#----------------------------#
+
+
+  echo "${tab_}Creating Makefile... ${BOLD}START${OFF}"
+
+  # Start with a clean files
+  >$MKFILE
+  >$MKFILE.tmp
+
+
+  for package_script in scripts/* ; do
+    this_script=`basename $package_script`
+    pkg_ver=$(grep "^${this_script#*-?-}[[:space:]]" ../packages | cut -f3)
+    pkg_list="$pkg_list ${this_script}"
+    __write_entry "${this_script}" "${pkg_ver}"
+    PREV_PACKAGE=${this_script}
+  done
+
+  PACKAGE=$(basename $PWD)
+
+   # alsa, kde-core and xorg7 are also available dependencies, thus handled
+   # in another way.
+  case $PACKAGE in
+    gnome-core | \
+    gnome-full | \
+    kde-full | \
+    kde-koffice )  pkg_list="$pkg_list 999-z-${PACKAGE}"
+                  __write_meta_pkg_touch "${PACKAGE}"
+                  ;;
+  esac
+
+
+  # Add a header, some variables and include the function file
+  # to the top of the real Makefile.
+(
+    cat << EOF
+$HEADER
+
+PACKAGE= $PACKAGE
+TRACKING_DIR= $TRACKING_DIR
+
+BOLD= ""
+RED= ""
+GREEN= ""
+ORANGE= ""
+BLUE= ""
+WHITE= ""
+
+define echo_message
+  @echo \$(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo \$(BOLD)\$(1) target \$(BLUE)\$@\$(BOLD)
+  @echo \$(WHITE)
+endef
+
+
+define fin_message
+  @echo \$(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo \$(BOLD) Build complete for the package \$(BLUE)\$(PACKAGE)\$(BOLD) and its dependencies
+  @echo \$(WHITE)
+endef
+
+all : $pkg_list
+	@\$(call fin_message )
+EOF
+) > $MKFILE
+
+  cat $MKFILE.tmp >> $MKFILE
+  echo "${tab_}Creating Makefile... ${BOLD}DONE${OFF}"
+
+  rm $MKFILE.tmp
+
+}
+
+if [[ -e Config.in ]] ; then
+  echo -e "\n\tThis script must be run from inside a target package directory.\n"
+  exit 1
+fi
+
+if [[ ! -d scripts ]] ; then
+  echo -e "\n\tNo ./scripts/ directory has been found.\n"
+  exit 1
+fi
+
+generate_Makefile
+
+cp ../progress_bar.sh .
+
+mkdir -p logs
diff --git a/2.3/BLFS/gen_config.sh b/2.3/BLFS/gen_config.sh
new file mode 100755
index 0000000..89c169e
--- /dev/null
+++ b/2.3/BLFS/gen_config.sh
@@ -0,0 +1,276 @@
+#!/bin/bash
+#
+# $Id$
+#
+
+export outFile=Config.in	# file for reading and writing to.
+export inFile=packages		# file for reading and writing to.
+
+declare PKG_NAME
+declare PKG_XML_FILE
+declare PKG_DIR
+declare PKG_VER
+declare INST_VER
+declare INST_STRING
+declare SAVE_IFS=${IFS}
+declare -a DIR_TREE
+declare PREV_DIR1="none"
+declare PREV_DIR2="none"
+declare MENU_SET1="n"
+declare MENU_SET2="n"
+
+> $outFile
+
+#---------------------#
+#         MAIN        #
+#---------------------#
+: <<enddoc
+  This script will create a Config.in file from the contents
+  of the file <packages>.
+  Packages previously installed will not be included.
+enddoc
+
+echo -en "\tGenerating Config.in from package data ..."
+while [ 0 ]
+do
+
+#  read -r || break 1
+  read || break 1
+
+  set -- $REPLY
+  PKG_NAME=$1
+  PKG_XML_FILE=$(basename $2)
+  PKG_DIR=$(dirname $2)
+  PKG_VER=$3
+  INST_VER=$4
+    # These are the META packages.
+  if [ $PKG_DIR = "." ]; then
+    SET_COMMENT=y
+      # Do not include previously installed packages
+    if [ -n "${PKG_VER}" ] && [ "x${PKG_VER}" = "x${INST_VER}" ]; then
+      continue
+    fi
+      # Set installed version for updated meta-packages
+    [ -n "${INST_VER}" ] && INST_STRING="[installed ${INST_VER}]"
+
+    META_PKG=$(echo ${PKG_NAME} | tr [a-z] [A-Z])
+(
+cat << EOF
+	config	CONFIG_$META_PKG
+		bool	"$META_PKG $PKG_VER $INST_STRING"
+		default	n
+
+		menu	"$(echo ${PKG_NAME} | tr [a-z] [A-Z]) components"
+			depends	CONFIG_$META_PKG
+
+EOF
+) >> $outFile
+
+    unset INST_STRING
+
+         # Include the dependency data for this meta package
+       while [ 0 ]; do
+         read || break 1
+         PKG_NAME=${REPLY}
+         PKG_VER=$(grep "^${PKG_NAME}[[:space:]]" $inFile | cut -f3)
+         INST_VER=$(grep "^${PKG_NAME}[[:space:]]" $inFile | cut -f4)
+           # Skip installed meta-package components
+         if [ -n "${PKG_VER}" ] && [ "x${PKG_VER}" = "x${INST_VER}" ]; then
+           continue
+         fi
+           # Set installed version for updated meta-packages components
+         [ -n "${INST_VER}" ] && INST_STRING="[installed ${INST_VER}]"
+(
+cat << EOF
+	config	DEP_${META_PKG}_${PKG_NAME}
+		bool	"$PKG_NAME ${PKG_VER} ${INST_STRING}"
+		default	y
+
+EOF
+) >> $outFile
+         unset INST_STRING
+       done <./libs/${PKG_NAME}.dep
+     echo -e "endmenu" >> $outFile
+    continue
+  fi
+  [[ "${SET_COMMENT}" = "y" ]] && echo "comment \"\"" >>$outFile; unset SET_COMMENT
+
+    # Deal with targets that are part of a meta-package but that are in the same
+    # directory that non meta-package targets
+  case ${PKG_NAME} in
+     alsa-* | \
+     xorg7-* | \
+     x-config | \
+     x-setup | \
+     libXau | \
+     libxcb | \
+     libXdmcp | \
+     luit | \
+     xbitmaps | \
+     xcb-proto | \
+     xkeyboard-config | \
+     mesalib | \
+     libdrm ) continue ;;
+  esac
+
+    # Skip installed packages
+  if [ -n "${PKG_VER}" ] && [ "x${PKG_VER}" = "x${INST_VER}" ]; then
+    continue
+  fi
+    # Set installed version for updated packages
+  [ -n "${INST_VER}" ] && INST_STRING="[installed ${INST_VER}]"
+
+  IFS="/"
+  DIR_TREE=(${PKG_DIR})
+  IFS="$SAVE_IFS"
+
+    # Define a top level menu
+  if [ "$PREV_DIR1" != "${DIR_TREE[1]}" ]; then
+    [[ "${DIR_TREE[1]}" = "kde" ]] && continue
+    [[ "${DIR_TREE[1]}" = "gnome" ]] && continue
+
+    if [ $MENU_SET1 = "y" ]; then
+      # Close out any open secondary menu
+      if [ $MENU_SET2 = "y" ]; then
+        echo -e "\tendmenu" >> $outFile
+        # Reset 'menu open' flag
+        MENU_SET2="n"
+      fi
+      # Close the current top level menu
+      echo -e "endmenu\n" >> $outFile
+    fi
+    # Open a new top level menu
+    echo -e "menu "$(echo ${DIR_TREE[1]:0:1} | tr [a-z] [A-Z])${DIR_TREE[1]:1}"" >> $outFile
+    MENU_SET1="y"
+  fi
+
+    # Define a secondary menu
+  if [ "$PREV_DIR2" != "${DIR_TREE[2]}" ]; then
+      # Close out the previous open menu structure
+    if [ $MENU_SET2 = "y" ]; then
+      echo -e "\tendmenu\n"  >> $outFile
+    fi
+      # Initialize a new 2nd level menu structure.
+    echo -e "\tmenu "$(echo ${DIR_TREE[2]:0:1} | tr [a-z] [A-Z])${DIR_TREE[2]:1}"" >> $outFile
+    MENU_SET2="y"
+  fi
+(
+cat << EOF
+	config CONFIG_$PKG_NAME
+		bool "$PKG_NAME ${PKG_VER} ${INST_STRING}"
+		default n
+EOF
+) >> $outFile
+
+  unset INST_STRING
+
+  PREV_DIR1=${DIR_TREE[1]}
+  PREV_DIR2=${DIR_TREE[2]}
+done <"$inFile"
+
+if [ $MENU_SET2 = "y" ]; then echo -e "\tendmenu" >> $outFile; fi
+if [ $MENU_SET1 = "y" ]; then echo "endmenu" >> $outFile; fi
+
+(
+cat << EOF
+
+comment	""
+
+menu	"Default packages for resolving dependencies"
+
+choice
+	prompt	"Default print server"
+	config	PS_cups
+		bool	"cups"
+	config	PS_LPRng
+		bool	"LPRng"
+endchoice
+config	PRINT_SERVER
+	string
+	default	cups	if PS_cups
+	default	LPRng	if PS_LPRng
+
+choice
+	prompt	"Mail server"
+	config	MS_sendmail
+		bool	"sendmail"
+	config	MS_postfix
+		bool	"postfix"
+	config	MS_exim
+		bool	"exim"
+endchoice
+config	MAIL_SERVER
+	string
+	default	sendmail	if MS_sendmail
+	default	postfix		if MS_postfix
+	default	exim		if MS_exim
+
+choice
+	prompt	"Postscript package"
+	config	GS_espgs
+		bool	"espgs"
+	config	GS_ghostscript
+		bool	"ghostscript"
+endchoice
+config	GHOSTSCRIPT
+	string
+	default	espgs       if GS_espgs
+	default ghostscript if GS_ghostscript
+
+choice
+	prompt	"Kerberos 5"
+	config	KER_mitkrb
+		bool	"mitkrb"
+	config	KER_heimdal
+		bool	"heimdal"
+endchoice
+config	KBR5
+	string
+	default	heimdal	if KER_heimdal
+	default mitkrb	if KER_mitkrb
+
+choice
+	prompt	"Window package"
+	config	WIN_xorg7
+	bool	"Xorg7"
+	config	WIN_xfree86
+	bool	"xfree86"
+endchoice
+config	X11
+	string
+	default	xorg7	if WIN_xorg7
+	default xfree86	if WIN_xfree86
+endmenu
+
+choice
+	prompt	"Dependency level"
+	default DEPLVL_2
+
+	config	DEPLVL_1
+	bool	"Required dependencies only"
+
+	config	DEPLVL_2
+	bool	"Required and recommended dependencies"
+
+	config	DEPLVL_3
+	bool	"Required, recommended and optional dependencies"
+
+endchoice
+config	optDependency
+	int
+	default	1	if DEPLVL_1
+	default	2	if DEPLVL_2
+	default	3	if DEPLVL_3
+
+
+config	SUDO
+	bool "Build as User"
+	default	y
+	help
+		Select if sudo will be used (you want build as a normal user)
+		        otherwise sudo is not needed (you want build as root)
+EOF
+) >> $outFile
+echo "done"
+
+
diff --git a/2.3/BLFS/gen_pkg_book.sh b/2.3/BLFS/gen_pkg_book.sh
new file mode 100755
index 0000000..9d720b2
--- /dev/null
+++ b/2.3/BLFS/gen_pkg_book.sh
@@ -0,0 +1,178 @@
+#!/bin/bash
+#
+# $Id$
+#
+#  Read and parse the configuration parameters..
+#
+set -e
+
+declare -r ConfigFile="configuration"
+declare TARGET
+declare DEP_LEVEL
+declare SUDO
+declare PKGXML
+declare BLFS_XML
+declare VERBOSITY=1
+
+#--------------------------#
+parse_configuration() {    #
+#--------------------------#
+  local	cntr
+  local	optTARGET
+
+  while [ 0 ]; do
+    read || break 1
+
+    # Garbage collection
+    case ${REPLY} in
+      \#* | '') continue ;;
+    esac
+
+    case "${REPLY}" in
+      CONFIG_ALSA=* | \
+      CONFIG_GNOME-CORE=* | \
+      CONFIG_GNOME-FULL=* | \
+      CONFIG_KDE-CORE=* | \
+      CONFIG_KDE-FULL=* | \
+      CONFIG_KDE-KOFFICE=* | \
+      CONFIG_XORG7=* ) REPLY=${REPLY%=*}  # Strip the trailing '=y' test.. unecessary
+                       echo -n "${REPLY}"
+                       if [[ $((++cntr)) > 1 ]]; then
+                         echo "  <<-- ERROR:: SELECT ONLY 1 PACKAGE AT A TIME, META-PACKAGE NOT SELECTED"
+                       else
+                         echo ""
+                         optTARGET=$(echo $REPLY | cut -d "_" -f2 | tr [A-Z] [a-z])
+                       fi
+                       continue ;;
+
+      # Create global variables for these parameters.
+      optDependency=* | \
+      PRINT_SERVER=*  | \
+      MAIL_SERVER=*   | \
+      GHOSTSCRIPT=*   | \
+      KBR5=*  | \
+      X11=*   | \
+      SUDO=*  )  eval ${REPLY} # Define/set a global variable..
+                      continue ;;
+    esac
+
+    if [[ "${REPLY}" =~ ^CONFIG_ ]]; then
+      echo -n "$REPLY"
+      if [[ $((++cntr)) > 1 ]]; then
+        echo "  <<-- ERROR SELECT ONLY 1 PACKAGE AT A TIME, WILL NOT BUILD"
+      else
+        echo ""
+        optTARGET=$( echo $REPLY | sed -e 's@CONFIG_@@' -e 's@=y@@' )
+      fi
+    fi
+  done <$ConfigFile
+
+  if [[ $optTARGET = "" ]]; then
+    echo -e "\n>>> NO TARGET SELECTED.. applicaton terminated"
+    echo -e "    Run <make> again and select a package to build\n"
+    exit 0
+  fi
+
+  TARGET=$optTARGET
+  DEP_LEVEL=$optDependency
+  SUDO=${SUDO:-n}
+}
+
+#--------------------------#
+validate_configuration() { #
+#--------------------------#
+  local -r dotSTR=".................."
+  local -r PARAM_LIST="TARGET DEP_LEVEL SUDO PRINT_SERVER MAIL_SERVER GHOSTSCRIPT KBR5 X11"
+  local -r PARAM_VALS='${config_param}${dotSTR:${#config_param}} ${L_arrow}${BOLD}${!config_param}${OFF}${R_arrow}'
+  local config_param
+
+  for config_param in ${PARAM_LIST}; do
+    echo -e "`eval echo $PARAM_VALS`"
+  done
+}
+
+#
+# Regenerate the META-package dependencies from the configuration file
+#
+#--------------------------#
+regenerate_deps() {        #
+#--------------------------#
+
+  rm -f libs/*.dep-MOD
+  while [ 0 ]; do
+    read || break 1
+    case ${REPLY} in
+      \#* | '') continue ;;
+    esac
+
+    # Drop the "=y"
+    REPLY=${REPLY%=*}
+    if [[ "${REPLY}" =~ ^DEP_ ]]; then
+      META_PACKAGE=$(echo $REPLY | cut -d "_" -f2 | tr [A-Z] [a-z])
+      DEP_FNAME=$(echo $REPLY | cut -d "_" -f3)
+       echo "${DEP_FNAME}" >>libs/${META_PACKAGE}.dep-MOD
+    fi
+
+  done <$ConfigFile
+  #
+  # Replace to 'old' dependency file with a new one.
+  #
+  for dst in `ls ./libs/*.dep-MOD 2>/dev/null`; do
+    cp -vf $dst ${dst%-MOD}
+  done
+}
+
+#
+# Clean configuration file keeping only global default settings.
+# That prevent "trying to assign nonexistent symbol" messages
+# and assures that there is no TARGET selected from a previous run
+#
+#--------------------------#
+clean_configuration() {    #
+#--------------------------#
+
+tail -n 29 configuration > configuration.tmp
+mv configuration.tmp configuration
+
+}
+
+#---------------------
+# Constants
+source libs/constants.inc
+[[ $? > 0 ]] && echo -e "\n\tERROR: constants.inc did not load..\n" && exit
+
+#---------------------
+# Dependencies module
+source libs/func_dependencies
+[[ $? > 0 ]] && echo -e "\n\tERROR: func_dependencies did not load..\n" && exit
+
+#---------------------
+# parser module
+source libs/func_parser
+[[ $? > 0 ]] && echo -e "\n\tERROR: func_parser did not load..\n" && exit
+
+
+#------- MAIN --------
+if [[ ! -f packages ]] ; then
+  echo -e "\tNo packages file has been found.\n"
+  echo -e "\tExecution aborted.\n"
+  exit 1
+fi
+
+
+parse_configuration
+validate_configuration
+echo "${SD_BORDER}${nl_}"
+echo -n "Are you happy with these settings? yes/no (no): "
+read ANSWER
+if [ x$ANSWER != "xyes" ] ; then
+  echo "${nl_}Rerun make and fix your settings.${nl_}"
+  exit 1
+fi
+echo "${nl_}${SD_BORDER}${nl_}"
+regenerate_deps
+generate_dependency_tree
+generate_TARGET_xml
+generate_target_book
+create_build_scripts "${SUDO}"
+clean_configuration
diff --git a/2.3/BLFS/libs/book.xsl b/2.3/BLFS/libs/book.xsl
new file mode 100644
index 0000000..1a1c6b5
--- /dev/null
+++ b/2.3/BLFS/libs/book.xsl
@@ -0,0 +1,105 @@
+<?xml version='1.0' encoding='ISO-8859-1'?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns="http://www.w3.org/1999/xhtml"
+                version="1.0">
+
+<!-- $Id$ -->
+
+  <!-- NOTE: the base dir (blfs-xml) is set to the proper dir
+  via a sed in ./blfs -->
+  <xsl:import href="../blfs-xml/stylesheets/blfs-chunked.xsl"/>
+
+  <xsl:param name="mail_server" select="sendmail"/>
+
+  <xsl:param name="xwindow" select="xorg7"/>
+
+     <!-- Template from BLFS_XML/stylesheets/xhtml/lfs-xref.xsl.-->
+  <xsl:template match="xref" name="xref">
+
+    <!-- IDs that need be remaped to the proper file -->
+    <xsl:variable name="linkend">
+      <xsl:choose>
+        <xsl:when test="@linkend = 'alsa'">
+          <xsl:text>alsa-lib</xsl:text>
+        </xsl:when>
+        <xsl:when test="@linkend = 'arts'">
+          <xsl:text>aRts</xsl:text>
+        </xsl:when>
+        <xsl:when test="@linkend = 'kde'">
+          <xsl:text>kdelibs</xsl:text>
+        </xsl:when>
+        <xsl:when test="@linkend = 'server-mail'">
+          <xsl:value-of select="$mail_server"/>
+        </xsl:when>
+        <xsl:when test="@linkend = 'x-window-system'">
+          <xsl:value-of select="$xwindow"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="@linkend"/>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:variable>
+
+    <xsl:variable name="targets" select="key('id',$linkend)"/>
+    <!-- -->
+
+    <xsl:variable name="target" select="$targets[1]"/>
+    <xsl:variable name="refelem" select="local-name($target)"/>
+    <xsl:variable name="role" select="@role"/>
+    <xsl:call-template name="check.id.unique">
+      <xsl:with-param name="linkend" select="$linkend"/>
+    </xsl:call-template>
+    <xsl:call-template name="anchor"/>
+    <xsl:choose>
+
+      <!-- Dead links -->
+      <xsl:when test="count($target) = 0">
+        <b>
+          <xsl:value-of select="@linkend"/>
+        </b>
+        <tt>
+          <xsl:text> (in the full book)</xsl:text>
+        </tt>
+      </xsl:when>
+      <!-- -->
+
+      <xsl:when test="$target/@xreflabel">
+        <a>
+          <xsl:attribute name="href">
+            <xsl:call-template name="href.target">
+              <xsl:with-param name="object" select="$target"/>
+            </xsl:call-template>
+          </xsl:attribute>
+          <xsl:call-template name="xref.xreflabel">
+            <xsl:with-param name="target" select="$target"/>
+          </xsl:call-template>
+        </a>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:variable name="href">
+          <xsl:call-template name="href.target">
+            <xsl:with-param name="object" select="$target"/>
+          </xsl:call-template>
+        </xsl:variable>
+        <xsl:apply-templates select="$target" mode="xref-to-prefix"/>
+        <a href="{$href}">
+          <xsl:if test="$target/title or $target/*/title">
+            <xsl:attribute name="title">
+              <xsl:apply-templates select="$target" mode="xref-title"/>
+            </xsl:attribute>
+          </xsl:if>
+          <xsl:apply-templates select="$target" mode="xref-to">
+            <xsl:with-param name="referrer" select="."/>
+            <xsl:with-param name="role" select="$role"/>
+            <xsl:with-param name="xrefstyle">
+              <xsl:value-of select="@xrefstyle"/>
+            </xsl:with-param>
+          </xsl:apply-templates>
+        </a>
+        <xsl:apply-templates select="$target" mode="xref-to-suffix"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/BLFS/libs/constants.inc b/2.3/BLFS/libs/constants.inc
new file mode 100644
index 0000000..9308a7c
--- /dev/null
+++ b/2.3/BLFS/libs/constants.inc
@@ -0,0 +1,35 @@
+#####
+#
+# common constants
+#
+# $Id$
+#####
+
+
+# VT100 colors
+declare -r  BLACK=$'\e[1;30m'
+declare -r  DK_GRAY=$'\e[0;30m'
+
+declare -r  RED=$'\e[31m'
+declare -r  GREEN=$'\e[32m'
+declare -r  YELLOW=$'\e[33m'
+declare -r  BLUE=$'\e[34m'
+declare -r  MAGENTA=$'\e[35m'
+declare -r  CYAN=$'\e[36m'
+declare -r  WHITE=$'\e[37m'
+
+declare -r  OFF=$'\e[0m'
+declare -r  BOLD=$'\e[1m'
+declare -r  REVERSE=$'\e[7m'
+declare -r  HIDDEN=$'\e[8m'
+
+declare -r  tab_=$'\t'
+declare -r  nl_=$'\n'
+
+declare -r   DD_BORDER="${BOLD}==============================================================================${OFF}"
+declare -r   SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
+declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
+
+# bold yellow > <  pair
+declare -r R_arrow=$'\e[1;33m>\e[0m'
+declare -r L_arrow=$'\e[1;33m<\e[0m'
diff --git a/2.3/BLFS/libs/dependencies.xsl b/2.3/BLFS/libs/dependencies.xsl
new file mode 100644
index 0000000..f62a271
--- /dev/null
+++ b/2.3/BLFS/libs/dependencies.xsl
@@ -0,0 +1,47 @@
+<?xml version="1.0"?>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    version="1.0">
+
+  <xsl:output method="text"/>
+
+  <xsl:param name="dependencies" select="2"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//para[@role='optional']"/>
+    <xsl:apply-templates select="//para[@role='recommended']"/>
+    <xsl:apply-templates select="//para[@role='required']"/>
+  </xsl:template>
+
+  <xsl:template match="//text()"/>
+
+  <xsl:template match="para[@role='required']">
+    <xsl:apply-templates select="xref">
+      <xsl:sort select="position()" data-type="number" order="descending"/>
+    </xsl:apply-templates>
+  </xsl:template>
+
+  <xsl:template match="para[@role='recommended']">
+    <xsl:if test="$dependencies != '1'">
+      <xsl:apply-templates select="xref">
+        <xsl:sort select="position()" data-type="number" order="descending"/>
+      </xsl:apply-templates>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="para[@role='optional']">
+    <xsl:if test="$dependencies = '3'">
+      <xsl:apply-templates select="xref">
+        <xsl:sort select="position()" data-type="number" order="descending"/>
+      </xsl:apply-templates>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="xref">
+    <xsl:value-of select="@linkend"/>
+    <xsl:text>&#xA;</xsl:text>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/BLFS/libs/func_dependencies b/2.3/BLFS/libs/func_dependencies
new file mode 100644
index 0000000..1de1e46
--- /dev/null
+++ b/2.3/BLFS/libs/func_dependencies
@@ -0,0 +1,421 @@
+#!/bin/bash
+#
+# $Id$
+#
+set -e
+
+declare -i cntr=0
+declare -a spaceSTR="                                                                   "
+
+#----------------------------#
+generate_dependency_tree() { #
+#----------------------------#
+: <<inline_doc
+    function:   Create a dependency tree for the TARGET
+    input vars: none
+    externals:  vars: TARGET
+                      PKGXML
+		      DEP_LEVEL
+                func: do_dependencies
+    modifies:   vars: PKGXML
+                      BLFS_XML
+    returns:    nothing
+    output:     files: $TARGET.dep
+                       $TARGET-index.xml.tmp
+                       depure.txt
+    on error:   nothing
+    on success: nothing
+inline_doc
+
+  local ENTRY_START
+  local ENTRY_END
+
+  #---------------------
+  # Create the working directory and cd into it
+  if [[ -d $TARGET ]] ; then
+    echo -e "\tERROR: Looks like $TARGET has been already processed."
+    echo -e "\tPlease delete or rename the $TARGET directory.\n"
+    exit 1
+  else
+    mkdir $TARGET && cd $TARGET
+  fi
+
+  #---------------------
+  # XML file of the target package
+  PKGXML=`grep "^$TARGET[[:space:]]" ../packages | cut -f2`
+
+  #---------------------
+  # The BLFS sources directory.
+  BLFS_XML=`echo $PKGXML | sed -e 's,/.*,,'`
+
+  if [[ ! -d ../$BLFS_XML ]] ; then
+    echo -e "\tThe BLFS book sources directory is missing.\n"
+    echo -e "\tExecution aborted.\n"
+    cd .. && rmdir $TARGET
+    exit 1
+  fi
+
+  #---------------------
+  # XInclude stuff
+  ENTRY_START="<xi:include xmlns:xi=\"http://www.w3.org/2003/XInclude\" href=\"../"
+  ENTRY_END="\"/>"
+
+  echo -e "\tGenerating $TARGET dependencies tree ..."
+
+  mkdir dependencies
+
+  #---------------------
+  # Create target package dependencies list
+  case $TARGET in
+    # Skip the creation when all dependencies are circular.
+    alsa-lib | cracklib | libexif | unixodbc ) ;;
+
+    # Meta-packages at target level
+    alsa )
+      cp ../libs/alsa.dep dependencies/
+      ;;
+    gnome-core )
+      cp ../libs/gnome-core.dep dependencies/
+      ;;
+    gnome-full )
+      cp ../libs/gnome-{core,full}.dep dependencies/
+      ;;
+    kde-core )
+      cp ../libs/kde-core.dep dependencies/
+      ;;
+    kde-full )
+      cp ../libs/kde-{core,full}.dep dependencies/
+      ;;
+    kde-koffice )
+      cp ../libs/kde-{core,full,koffice}.dep dependencies/
+      ;;
+    xorg7 )
+      cp ../libs/xorg7.dep dependencies/
+      ;;
+    * ) # Default
+      xsltproc --stringparam dependencies $DEP_LEVEL \
+               -o dependencies/$TARGET.dep \
+               ../libs/dependencies.xsl ../$PKGXML
+      ;;
+  esac
+
+  #---------------------
+  # Start with a clean $TARGET-index.xml.tmp file
+  > $TARGET-index.xml.tmp
+
+  #---------------------
+  # Write the XInclude
+  case $TARGET in
+    # If there is no usefull XML page, skip it.
+    alsa | gnome-core | gnome-full | kde-core | kde-full | kde-koffice | xorg7) ;;
+    * )
+      echo -e "    $ENTRY_START$PKGXML$ENTRY_END" >> $TARGET-index.xml.tmp
+      ;;
+  esac
+
+  #---------------------
+  # If have dependencies, write its XInclude and find sub-dependencies
+  if [[ -f dependencies/$TARGET.dep ]]; then
+    mkdir xincludes && do_dependencies $TARGET
+  fi
+
+  echo -e "\n\t... done"
+}
+
+
+
+#-----------------------#
+do_dependencies()  {    #  Loop to find sub-dependencies  :::WARNING::: THIS IS A RECURVISE FUNCTION
+#-----------------------#
+: <<inline_doc
+    function:   Loop through all the packages and create a sub-dependency tree
+    input vars: $1, package name
+    externals:  vars:  $DEP_LEVEL
+                       $TARGET
+                       $PRINT_SERVER
+                       $KBR5
+                       $GHOSTSCRIPT
+                       $MAILSERVER
+                file:  depure.txt
+                       $TARGET-index.xml.tmp
+                       $PKG.dep
+                       $PKG.inc
+    modifies:   files
+    returns:    nothing
+    output:     file:  $PKG-xinc.tmp
+                       depure.txt
+                       $TARGET-index.xml.tmp
+    on error:   exit
+    on success:
+inline_doc
+
+  set -e
+  local PKG=$1
+  local saveIFS=$IFS
+  local DEP_LV=$DEP_LEVEL
+  local line line2 DEP pkg_ver inst_ver
+
+  #------------------
+  #  If a premade xinclude file exists, use it. If not, create one
+  if [[ -f xincludes/$PKG.xinc ]] ; then
+    IFS=$'\x0A'
+    for line in `cat xincludes/$PKG.xinc` ; do
+      IFS=$saveIFS
+      # Remove the Xinclude entry if found. We want the most newer one.
+      # Using double quotes to let bash expand variables.
+      # Remove also the empty line created. Can not be done in one step
+      # due that d requires the pattner between /, but we have a lot of /
+      # inside the pattner.
+      sed -e "s,^[[:space:]]*$line,," -e '/./!d' -i $TARGET-index.xml.tmp
+      # Write the XInclude
+      echo -e "$line" >> $TARGET-index.xml.tmp
+    done
+    return
+  fi
+
+  #------------------
+  # Start with a clean $PKG.xinc.tmp file
+  > xincludes/$PKG.xinc.tmp
+  for DEP in `cat dependencies/$PKG.dep`; do
+
+    # Special packages that need be remaped
+    case $DEP in
+
+      db ) continue ;; # The proper version of DB is installed in LFS
+
+        # Don't have their own XML file
+      hal-requirements | hal-runtime-dependencies ) continue ;;
+      perl-* | tk-perl )         DEP=perl-modules ;;
+      dbus-* )                   DEP=dbus-bindings ;;
+
+        # Orphan links (proper link must be created when generating the book)
+      arts )                     DEP=aRts ;;
+      kde )                      DEP=kde-core ;;
+
+        # Set values for alternative packages
+      LPRng | cups )             DEP=$PRINT_SERVER ;;
+      mitkrb | heimdal )         DEP=$KBR5 ;;
+      gs | espgs )               DEP=$GHOSTSCRIPT ;;
+      server-mail )              DEP=$MAIL_SERVER ;;
+      x-window-system )
+        case $X11 in
+          xorg7 ) DEP=xorg7 ;;
+              * )
+                  pkg_ver=$(grep "^${X11}[[:space:]]" ../packages | cut -f3)
+                  inst_ver=$(grep "^${X11}[[:space:]]" ../packages | cut -f4)
+                  [ -n "${pkg_ver}" ] && [ "x${pkg_ver}" = "x${inst_ver}" ] && continue
+                  ;;
+        esac
+        ;;
+    esac
+
+    # If DEP has been previouly installed, skip it
+    pkg_ver=$(grep "^${DEP}[[:space:]]" ../packages | cut -f3)
+    inst_ver=$(grep "^${DEP}[[:space:]]" ../packages | cut -f4)
+    [ -n "${pkg_ver}" ] && [ "x${pkg_ver}" = "x${inst_ver}" ] && continue
+
+    #------------------
+    # Prevent circular dependencies
+    # If all dependencies are circular, the creation of the *.dep file
+    # must be skipped, not placed here, to avoid that the script will bomb
+    # due empty *.xinc files
+    case $DEP in
+      akode )
+        # Both are in the same page
+        [[ "$PKG" = "kdemultimedia" ]] && continue
+        ;;
+      aRts )
+        # esound-->aRts-->esound
+        [[ "$PKG" = "esound" ]] && continue
+        ;;
+      dbus-bindings )
+        # True circular dependecy
+        [[ "$PKG" = "dbus-bindings" ]] && continue
+        ;;
+      DocBook )
+        # Used to rebuild the documentation
+        [[ "$PKG" = "linux-pam" ]] && continue
+        ;;
+      docbook-xsl )
+        # Used to rebuild the documentation
+        [[ "$PKG" = "linux-pam" ]] && continue
+        ;;
+      doxygen )
+        # Used to rebuild the documentation
+        [[ "$PKG" = "dbus" ]] && continue
+        [[ "$PKG" = "libdvdcss" ]] && continue
+        [[ "$PKG" = "libusb" ]] && continue
+        [[ "$PKG" = "libxcb" ]] && continue
+        ;;
+      espgs )
+        # Used to rebuild the documentation
+        [[ "$PKG" = "$MAIL_SERVER" ]] && continue
+        ;;
+      ffmpeg )
+        # alsa-plugins-->ffmpeg-->several-->alsa-plugins
+        [[ "$PKG" = "alsa-plugins" ]] && continue
+        ;;
+      fop )
+        # Used to rebuild the documentation
+        [[ "$PKG" = "linux-pam" ]] && continue
+        ;;
+      graphviz )
+        # Used to build the API documentation
+        [[ "$PKG" = "libusb" ]] && continue
+        ;;
+      GTK )
+        # deprecated GTK version
+        [[ "$PKG" = "alsa-tools" ]] && continue
+        ;;
+      gtk2 )
+        # Testsuite only
+        [[ "$PKG" = "cairo" ]] && continue
+        ;;
+      jadetex )
+        # Runtime only
+        [[ "$PKG" = "docbook-utils" ]] && continue
+        ;;
+      $KBR5 )
+        # cyrus-sasl-->postgresql-->$KBR5-->openldap-->cyrus-sasl
+        [[ "$PKG" = "cyrus-sasl" ]] && continue
+        ;;
+      librsvg )
+        # Testsuite only
+        [[ "$PKG" = "cairo" ]] && continue
+        ;;
+      libxslt )
+        # libxml2-->libxslt-->libxml2
+        [[ "$PKG" = "libxml2" ]] && continue
+        ;;
+      Links )
+        # Runtime only
+        [[ "$PKG" = "docbook-utils" ]] && continue
+        ;;
+      lynx )
+        # Runtime only
+        [[ "$PKG" = "docbook-utils" ]] && continue
+        ;;
+      openldap )
+        # cyrus-sasl-->postgresql-->$KBR5-->openldap-->cyrus-sasl
+        [[ "$PKG" = "cyrus-sasl" ]] && continue
+        ;;
+      poppler )
+        # Testsuite only
+        [[ "$PKG" = "cairo" ]] && continue
+        ;;
+      postgresql )
+        # cyrus-sasl-->postgresql-->$KBR5-->openldap-->cyrus-sasl
+        [[ "$PKG" = "cyrus-sasl" ]] && continue
+        ;;
+      tk )
+        # python-->tk-->xorg7-->several combinations-->libxslt-->python
+        [[ "$PKG" = "python" ]] && continue
+        ;;
+      w3m )
+        # Runtime only
+        [[ "$PKG" = "docbook-utils" ]] && continue
+        # Used to rebuild the documentation
+        [[ "$PKG" = "linux-pam" ]] && continue
+        ;;
+    esac
+
+    #------------------
+    # XML file of dependency package
+    DEP_XML=`grep "^$DEP[[:space:]]" ../packages | cut -f2`
+    case $DEP in
+      x-window-system | alsa ) ;; # No page for that (proper link must be created when generating the book)
+      xorg7 ) ;; # This page will be dump in the xorg7.xinc file
+      gnome-core | kde-core | kde-full ) ;; # Invented packages
+      * )
+        # Remove the Xinclude entry if found
+        sed -e "s,^[[:space:]]*$ENTRY_START$DEP_XML$ENTRY_END,," \
+            -e '/./!d' -i xincludes/$PKG.xinc.tmp
+        # Write the XInclude
+        echo -e "    $ENTRY_START$DEP_XML$ENTRY_END" >> xincludes/$PKG.xinc.tmp
+        ;;
+    esac
+
+    #------------------
+    # If not already created, create its dependencies list
+    if [[ ! -f dependencies/$DEP.dep ]] ; then
+      case $DEP in
+        # Skip the creation when all dependencies are circular.
+        alsa-lib | cracklib | libexif | unixodbc ) ;;
+        # Meta-packages at dependency level
+        alsa )
+          cp ../libs/alsa.dep dependencies/
+          ;;
+        kde-core )
+          cp ../libs/kde-core.dep dependencies/
+          ;;
+        x-window-system ) # When X11 is not Xorg7
+          echo -e "x-config\nx-setup\n$X11" > dependencies/x-window-system.dep
+          ;;
+        xorg7 )
+          cp ../libs/xorg7.dep dependencies/
+          ;;
+        * ) xsltproc --stringparam dependencies $DEP_LV \
+               -o dependencies/$DEP.dep ../libs/dependencies.xsl ../$DEP_XML
+          ;;
+      esac
+    fi
+
+    #------------------
+    # If needed, process its dependencies
+    if [[ -f dependencies/$DEP.dep ]] ; then
+      # If a premade xinclude file esist, include it
+      if [[ -f xincludes/$DEP.xinc ]] ; then
+        IFS=$'\x0A'
+        for line2 in `cat xincludes/$DEP.xinc` ; do
+          IFS=$saveIFS
+          # Remove the Xinclude entry if found
+          sed -e "s,^[[:space:]]*$line2,," -e '/./!d' -i xincludes/$PKG.xinc.tmp
+          # Write the XInclude
+          echo -e "$line2" >> xincludes/$PKG.xinc.tmp
+        done
+      #------------------
+      # Create the xinclude file
+      else
+	#
+	# >>>>>> THIS IS A RECURSIVE FUNCTION CALL.. BEWARE OF GREMLINS. <<<<<<
+	#
+	# If the recursion depth is not too great this is an acceptable methodology for a script language
+	# However, uncontrolled recursion will cause a seg-fault due to stack issues with local variables.
+	#
+        set +e
+         [[ "${VERBOSITY}" > 0 ]] && echo -ne "\ncall: $((++cntr))${spaceSTR:0:$cntr}${RED}$DEP${OFF}"
+            do_dependencies $DEP
+         [[ "${VERBOSITY}" > 0 ]] && echo -ne "\n ret: $cntr${spaceSTR:0:$((cntr--))}${GREEN}$DEP${OFF}  Using $DEP Xinc to solve $PKG"
+        set -e
+
+        # Include it when done
+        IFS=$'\x0A'
+        for line2 in `cat xincludes/$DEP.xinc` ; do
+          IFS=$saveIFS
+          # Remove the Xinclude entry if found
+          sed -e "s,^[[:space:]]*$line2,," -e '/./!d' -i xincludes/$PKG.xinc.tmp
+          # Write the XInclude
+          echo -e "$line2" >> xincludes/$PKG.xinc.tmp
+        done
+      fi
+    fi
+  done
+
+  #------------------
+  if [[ "$PKG" = "xorg7" ]] ; then
+    # Add their XInclude
+    PKG_XML=${BLFS_XML}/x/installing/xorg7.xml
+    echo -e "    $ENTRY_START$PKG_XML$ENTRY_END" >> xincludes/$PKG.xinc.tmp
+  fi
+
+  #------------------
+  mv xincludes/$PKG.xinc.tmp xincludes/$PKG.xinc
+  IFS=$'\x0A'
+  for line in `cat xincludes/$PKG.xinc` ; do
+    IFS=$saveIFS
+    # Remove the Xinclude entry if found.
+    sed -e "s,^[[:space:]]*$line,," -e '/./!d' -i $TARGET-index.xml.tmp
+    # Write the XInclude
+    echo -e "$line" >> $TARGET-index.xml.tmp
+  done
+}
diff --git a/2.3/BLFS/libs/func_packages b/2.3/BLFS/libs/func_packages
new file mode 100644
index 0000000..9a75bd0
--- /dev/null
+++ b/2.3/BLFS/libs/func_packages
@@ -0,0 +1,210 @@
+#!/bin/bash
+#
+# $Id$
+#
+set -e
+
+#-----------------------#
+get_pkg_ver() {         # Find package version for a given package ID
+#-----------------------#
+  local pkg_id=$1
+
+  case ${pkg_id} in
+                  # ALSA packages version
+            alsa* ) pkg_id=alsa ;;
+
+                  # KDE packages version
+          kdevelop ) : ;;
+        kde*config ) : ;;
+              kde* ) pkg_id=kde ;;
+
+                  # Xorg7 packages version
+      xorg7-server ) pkg_id=xorg-server ;;
+            xterm2 ) pkg_id=xterm ;;
+            xorg7* ) pkg_id=xorg7 ;;
+
+                   # Others (ID value don't match entity name)
+    wireless_tools ) pkg_id=wireless-tools ;;
+        bind-utils ) pkg_id=bind ;;
+         html-tidy ) pkg_id=tidy ;;
+               jdk ) pkg_id=jdk-src ;;
+          reiserfs ) pkg_id=reiser ;;
+               xfs ) pkg_id=xfsprogs ;;
+  esac
+
+  xmllint --noent ./${BLFS_XML}/book/bookinfo.xml 2>/dev/null | \
+  grep -i " ${pkg_id}-version " | cut -d "\"" -f2
+
+}
+
+#-----------------------#
+get_installed_ver() {   # Find installed package version for a given package ID
+#-----------------------#
+  local pkg_id=$1
+
+  find $TRACKING_DIR -name "${pkg_id}-[[:digit:]]*" | sed "s/.*${pkg_id}-//"
+
+}
+
+#-----------------------#
+generate_packages()  {  # Master packages file
+#-----------------------#
+  local pkg_id file pkg_ver
+  local ALSA_VER GNOME_VER GNOME_MINOR_VER KDE_VER KDE_KOFFICE_VER XORG7_VER
+
+  > packages.tmp
+
+  # Extract Id and path for sect1 files
+  for file in `find $BLFS_XML -name "*.xml"` ; do
+    pkg_id=$(grep "sect1 id" $file | sed -e 's/<sect1 id="//;s/".*//')
+    pkg_ver=$(get_pkg_ver $pkg_id)
+    installed_ver=$(get_installed_ver $pkg_id)
+    [[ ! -z "$pkg_id" ]] && echo -e "$pkg_id\t$file\t$pkg_ver\t$installed_ver" >> packages.tmp
+  done
+
+  # IDs clean-up (unuseful pages or commented-out packages, could be more)
+  sed -i '/template/d;/ntroduction/d;/preface/d;/alsa.xml/d;/xorg.xml/d' packages.tmp
+  sed -i '/obsolete/d;/postlfs-/d;/-client.xml/d;/xorg7.xml/d' packages.tmp
+  sed -i '/courier.xml/d;/-other\t/d;/others-/d;/other-/d;/^ash\t/d' packages.tmp
+  sed -i '/fw-firewall\t/d;/gcc2\t/d;/cvsserver\t/d;/svnserver\t/d' packages.tmp
+  sed -i '/fam\t/d;/libungif\t/d;/ncpfs\t/d;/slrn\t/d;/konq\t/d' packages.tmp
+  sed -i '/gst-plugins\t/d;/openquicktime\t/d;/compressdoc\t/d' packages.tmp
+  sed -i '/errata\t/d;/foreword\t/d;/organization\t/d;/whoread\t/d' packages.tmp
+
+  # Meta-packages version
+  ALSA_VER=$(get_pkg_ver alsa)
+  GNOME_VER=$(get_pkg_ver gnome)
+  GNOME_MINOR_VER=$(get_pkg_ver gnome-minor)
+  KDE_VER=$(get_pkg_ver kde)
+  KDE_INST_VER=$(get_installed_ver kde)
+  KDE_KOFFICE_VER=$(get_pkg_ver koffice)
+  XORG7_VER=$(get_pkg_ver xorg7)
+
+  # Meta-packages installed version
+  ALSA_INST_VER=$(get_installed_ver alsa)
+  GNOME_CORE_INST_VER=$(get_installed_ver gnome-core)
+  GNOME_FULL_INST_VER=$(get_installed_ver gnome-full)
+  KDE_CORE_INST_VER=$(get_installed_ver kde-core)
+  KDE_FULL_INST_VER=$(get_installed_ver kde-full)
+  KDE_KOFFICE_INST_VER=$(get_installed_ver kde-koffice)
+  XORG7_INST_VER=$(get_installed_ver xorg7)
+
+  # Add header with meta-packages pseudo Id
+{
+  cat << EOF
+alsa	$BLFS_XML	$ALSA_VER	$ALSA_INST_VER
+gnome-core	$BLFS_XML	$GNOME_VER$GNOME_MINOR_VER	$GNOME_CORE_INST_VER
+gnome-full	$BLFS_XML	$GNOME_VER$GNOME_MINOR_VER	$GNOME_FULL_INST_VER
+kde-core	$BLFS_XML	$KDE_VER	$KDE_CORE_INST_VER
+kde-full	$BLFS_XML	$KDE_VER	$KDE_FULL_INST_VER
+kde-koffice	$BLFS_XML	$KDE_KOFFICE_VER	$KDE_KOFFICE_INST_VER
+xorg7	$BLFS_XML	$XORG7_VER	$XORG7_INST_VER
+EOF
+} >> packages.tmp
+
+  # Dump packages list
+  sort packages.tmp -b --key=2 --field-separator=/ --output=packages
+
+  # Clean up
+  rm packages.tmp
+}
+
+# Pre-made *.dep files for meta-packages
+
+#--------------------------#
+generate_gnome_core()  {   # GNOME core
+#--------------------------#
+  local line base_xml package
+
+  > gnome-core.dep.tmp
+
+  for line in `grep "xi:include" $BLFS_XML/gnome/core/core.xml` ; do
+    base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
+    package=`grep "gnome/core/$base_xml" packages | cut -f1`
+    [[ -n "$package" ]] && echo $package >> gnome-core.dep.tmp
+  done
+
+  # Replace dummy packages with the proper ones
+  sed -i 's/GNOME-//g' gnome-core.dep.tmp
+
+  tac gnome-core.dep.tmp > libs/gnome-core.dep
+  rm gnome-core.dep.tmp
+}
+
+#--------------------------#
+generate_gnome_full()  {   # GNOME full
+#--------------------------#
+  local line base_xml package
+
+  echo "gnome-core" > gnome-full.dep.tmp
+
+  for line in `grep "xi:include" $BLFS_XML/gnome/add/add.xml` ; do
+    base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
+    package=`grep "gnome/add/$base_xml" packages | cut -f1`
+    [[ -n "$package" ]] && echo $package >> gnome-full.dep.tmp
+  done
+
+  tac gnome-full.dep.tmp > libs/gnome-full.dep
+  rm gnome-full.dep.tmp
+}
+
+#--------------------------#
+generate_kde_core()  {     # KDE core
+#--------------------------#
+  local line base_xml package
+
+  > kde-core.dep.tmp
+
+  for line in `grep "xi:include" $BLFS_XML/kde/core/core.xml` ; do
+    base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
+    package=`grep "kde/core/$base_xml" packages | cut -f1`
+    [[ -n "$package" ]] && echo $package >> kde-core.dep.tmp
+  done
+
+  tac kde-core.dep.tmp > libs/kde-core.dep
+  rm kde-core.dep.tmp
+}
+
+#--------------------------#
+generate_kde_full()  {     # KDE full
+#--------------------------#
+  local line base_xml package
+
+  echo "kde-core" > kde-full.dep.tmp
+
+  for line in `grep "xi:include" $BLFS_XML/kde/add/add.xml` ; do
+    base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
+    package=`grep "kde/add/$base_xml" packages | cut -f1`
+    [[ -n "$package" ]] && echo $package >> kde-full.dep.tmp
+  done
+
+  for line in `grep "xi:include" $BLFS_XML/kde/devel/devel.xml` ; do
+    base_xml=`echo $line | sed 's/^.*href="//;s/".*//'`
+    package=`grep "kde/devel/$base_xml" packages | cut -f1`
+    [[ -n "$package" ]] && echo $package >> kde-full.dep.tmp
+  done
+
+  tac kde-full.dep.tmp > libs/kde-full.dep
+  rm kde-full.dep.tmp
+}
+
+#--------------------------#
+generate_kde_koffice()  {  # KDE full + Koffice
+#--------------------------#
+  echo -e "koffice\nkde-full\nkde-core" > libs/kde-koffice.dep
+}
+
+#--------------------------#
+generate_alsa()  {         # ALSA packages
+#--------------------------#
+  echo -e "alsa-oss\nalsa-firmware\nalsa-tools\nalsa-utils\n\
+alsa-plugins\nalsa-lib" > libs/alsa.dep
+}
+
+#--------------------------#
+generate_xorg7()  {        # Xorg7 packages
+#--------------------------#
+  echo -e "x-config\nx-setup\nrman\nxterm2\nxorg7-driver\nxorg7-server\nluit\n\
+xkeyboard-config\nxorg7-font\nxorg7-data\nxorg7-app\nmesalib\nlibdrm\nxbitmaps\n\
+xorg7-lib\nlibxcb\nxcb-proto\nlibXdmcp\nlibXau\nxorg7-util\nxorg7-proto" > libs/xorg7.dep
+}
diff --git a/2.3/BLFS/libs/func_parser b/2.3/BLFS/libs/func_parser
new file mode 100644
index 0000000..3cf2356
--- /dev/null
+++ b/2.3/BLFS/libs/func_parser
@@ -0,0 +1,151 @@
+#!/bin/bash
+#####
+#
+# Parse the XML documents to create a 'package' book
+#
+# $Id$
+#####
+
+
+#----------------------------#
+generate_TARGET_xml()  {     #
+#----------------------------#
+: <<inline_doc
+    function:   Generate the XML document for the TARGET package
+    input vars: nothing
+    externals:  vars: TARGET
+    modifies:   nothing
+    returns:    nothing
+    output:     file: $TARGET-index.xml
+    on error:   nothing
+    on success: nothing
+inline_doc
+
+  local
+  echo -en "\n\tGenerating $TARGET-index.xml ..."
+
+  #---------------------
+  # Header to $TARGET-index.xml
+{
+cat << EOF
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN"
+  "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" >
+
+<book>
+
+  <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/book/bookinfo.xml"/>
+
+  <preface>
+    <?dbhtml filename="preface.html" dir="preface"?>
+
+    <title>Preface</title>
+
+    <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/introduction/important/locale-issues.xml"/>
+    <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/introduction/important/bootscripts.xml"/>
+
+  </preface>
+
+  <chapter>
+    <?dbhtml filename="chapter.html" dir="installing"?>
+
+    <title>Installing $TARGET in Dependencies Build Order</title>
+
+EOF
+} > $TARGET-index.xml
+
+  #---------------------
+  # Dump $TARGET-index.xml.tmp in reverse order.
+  tac $TARGET-index.xml.tmp >> $TARGET-index.xml
+  rm $TARGET-index.xml.tmp
+
+  #---------------------
+  # Footer of $TARGET-index.xml
+{
+cat << EOF
+
+  </chapter>
+
+  <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/appendices/creat-comm.xml"/>
+  <xi:include xmlns:xi="http://www.w3.org/2003/XInclude" href="../$BLFS_XML/appendices/ac-free-lic.xml"/>
+
+  <index/>
+
+</book>
+
+EOF
+} >> $TARGET-index.xml
+
+  echo "done"
+}
+
+
+#-------------------------#
+generate_target_book() {  #
+#-------------------------#
+: <<inline_doc
+    function:   Create an HTML document of the requested TARGET.
+    input vars: nothing
+    externals:  vars: TARGET
+                      BLFS_XML
+                      MAIL_SERVER
+                      X11
+    modifies:   nothing
+    returns:    nothing
+    output:     file: NUMEROUS FILES
+    on error:   nothing
+    on success: nothing
+inline_doc
+
+  local filename # output filename
+  echo -en  "\n\tGenerating <$TARGET> HTML book from <$BLFS_XML> xml files ..."
+  xsltproc --xinclude --nonet \
+           --stringparam mail_server $MAIL_SERVER \
+           --stringparam xwindow $X11 \
+           --stringparam base.dir HTML/ \
+           ../libs/book.xsl \
+           $TARGET-index.xml > xsltproc.log 2>&1
+  mkdir HTML/{stylesheets,images}
+  cp ../$BLFS_XML/stylesheets/lfs-xsl/*.css HTML/stylesheets
+  cp ../$BLFS_XML/images/*.png HTML/images
+  cd HTML
+  sed -i -e "s@../stylesheets@stylesheets@g" *.html
+  sed -i -e "s@../images@images@g" *.html
+  for filename in `find . -name "*.html"` ; do
+    tidy -config ../../$BLFS_XML/tidy.conf $filename || true
+    sh ../../$BLFS_XML/obfuscate.sh $filename
+    sed -i -e "s@text/html@application/xhtml+xml@g" $filename
+  done
+  cd ..
+  echo "done"
+}
+
+
+#-------------------------#
+create_build_scripts() {  #
+#-------------------------#
+: <<inline_doc
+    function:   Create shell scripts of the requested TARGET.
+    input vars: $1 use sudo n/y
+    externals:  TARGET
+    modifies:   nothing
+    returns:    nothing
+    output:     file: NUMEROUS FILES
+    on error:   nothing
+    on success: nothing
+inline_doc
+
+  # Log separator
+  echo -e "\n\tScripts generation depuration and errors:\n" >> xsltproc.log
+
+  echo -en "\n\tGenerating the build scripts ..."
+  xsltproc --xinclude --nonet \
+           --stringparam sudo $SUDO \
+           -o ./scripts/ ../libs/scripts.xsl \
+           $TARGET-index.xml >> xsltproc.log 2>&1
+    # Make the scripts executable.
+  chmod -R +x scripts
+  cd ..
+  echo -e "done\n"
+
+}
diff --git a/2.3/BLFS/libs/scripts.xsl b/2.3/BLFS/libs/scripts.xsl
new file mode 100644
index 0000000..bb54b23
--- /dev/null
+++ b/2.3/BLFS/libs/scripts.xsl
@@ -0,0 +1,496 @@
+<?xml version="1.0"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exsl="http://exslt.org/common"
+    extension-element-prefixes="exsl"
+    version="1.0">
+
+<!-- $Id$ -->
+
+<!-- XSLT stylesheet to create shell scripts from "linear build" BLFS books. -->
+
+  <!-- Build as user (y) or as root (n)? -->
+  <xsl:param name="sudo" select="y"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//sect1"/>
+  </xsl:template>
+
+<!--=================== Master chunks code ======================-->
+
+  <xsl:template match="sect1">
+    <xsl:if test="(count(descendant::screen/userinput) &gt; 0 and
+                  count(descendant::screen/userinput) &gt;
+                  count(descendant::screen[@role='nodump'])) and
+                  @id != 'locale-issues' and @id != 'xorg7' and
+                  @id != 'x-setup'">
+
+        <!-- The file names -->
+      <xsl:variable name="filename" select="@id"/>
+
+        <!-- Package name (use "Download FTP" by default. If empty, use "Download HTTP" -->
+      <xsl:variable name="package">
+        <xsl:choose>
+          <xsl:when
+            test="string-length(sect2[@role='package']/itemizedlist/listitem[2]/para/ulink/@url)
+            &gt; '10'">
+            <xsl:call-template name="package_name">
+              <xsl:with-param name="url"
+                select="sect2[@role='package']/itemizedlist/listitem[2]/para/ulink/@url"/>
+            </xsl:call-template>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:call-template name="package_name">
+              <xsl:with-param name="url"
+                select="sect2[@role='package']/itemizedlist/listitem[1]/para/ulink/@url"/>
+            </xsl:call-template>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+
+        <!-- FTP dir name -->
+      <xsl:variable name="ftpdir">
+        <xsl:call-template name="ftp_dir">
+          <xsl:with-param name="package" select="$package"/>
+        </xsl:call-template>
+      </xsl:variable>
+
+        <!-- The build order -->
+      <xsl:variable name="position" select="position()"/>
+      <xsl:variable name="order">
+        <xsl:choose>
+          <xsl:when test="string-length($position) = 1">
+            <xsl:text>00</xsl:text>
+            <xsl:value-of select="$position"/>
+          </xsl:when>
+          <xsl:when test="string-length($position) = 2">
+            <xsl:text>0</xsl:text>
+            <xsl:value-of select="$position"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="$position"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+
+      <!-- Depuration code -->
+      <xsl:message>
+        <xsl:text>SCRIPT is </xsl:text>
+        <xsl:value-of select="concat($order,'-',$filename)"/>
+        <xsl:text>&#xA;   PACKAGE is </xsl:text>
+        <xsl:value-of select="$package"/>
+        <xsl:text>&#xA;    FTPDIR is </xsl:text>
+        <xsl:value-of select="$ftpdir"/>
+        <xsl:text>&#xA;&#xA;</xsl:text>
+      </xsl:message>
+
+        <!-- Creating the scripts -->
+      <exsl:document href="{$order}-z-{$filename}" method="text">
+        <xsl:text>#!/bin/bash&#xA;set -e&#xA;&#xA;</xsl:text>
+        <xsl:choose>
+          <!-- Package page -->
+          <xsl:when test="sect2[@role='package'] and not(@id = 'xorg7-app' or
+                          @id = 'xorg7-data' or @id = 'xorg7-driver' or
+                          @id = 'xorg7-font' or @id = 'xorg7-lib' or
+                          @id = 'xorg7-proto' or @id = 'xorg7-util')">
+            <!-- Variables -->
+            <xsl:text>SRC_ARCHIVE=$SRC_ARCHIVE&#xA;</xsl:text>
+            <xsl:text>FTP_SERVER=$FTP_SERVER&#xA;&#xA;PACKAGE=</xsl:text>
+            <xsl:value-of select="$package"/>
+            <xsl:text>&#xA;PKG_DIR=</xsl:text>
+            <xsl:value-of select="$ftpdir"/>
+            <xsl:text>&#xA;SRC_DIR=$SRC_DIR&#xA;&#xA;</xsl:text>
+            <!-- Download code and build commands -->
+            <xsl:apply-templates select="sect2">
+              <xsl:with-param name="package" select="$package"/>
+              <xsl:with-param name="ftpdir" select="$ftpdir"/>
+            </xsl:apply-templates>
+            <!-- Clean-up -->
+            <xsl:if test="not(@id='mesalib')">
+              <xsl:text>cd $SRC_DIR/$PKG_DIR&#xA;</xsl:text>
+              <xsl:text>rm -rf $UNPACKDIR unpacked&#xA;&#xA;</xsl:text>
+            </xsl:if>
+            <xsl:if test="@id='xorg7-server'">
+              <xsl:text>cd $SRC_DIR/MesaLib
+UNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
+rm -rf $UNPACKDIR unpacked&#xA;&#xA;</xsl:text>
+            </xsl:if>
+          </xsl:when>
+          <!-- Xorg7 pseudo-packages -->
+          <xsl:when test="contains(@id,'xorg7') and not(@id = 'xorg7-server')">
+            <xsl:text>SRC_DIR=$SRC_DIR
+
+cd $SRC_DIR
+mkdir -p xc
+cd xc&#xA;</xsl:text>
+            <xsl:apply-templates select="sect2" mode="xorg7"/>
+          </xsl:when>
+          <!-- Non-package page -->
+          <xsl:otherwise>
+            <xsl:apply-templates select=".//screen"/>
+          </xsl:otherwise>
+        </xsl:choose>
+        <xsl:text>exit</xsl:text>
+      </exsl:document>
+
+    </xsl:if>
+  </xsl:template>
+
+<!--======================= Sub-sections code =======================-->
+
+  <xsl:template match="sect2">
+    <xsl:param name="package" select="foo"/>
+    <xsl:param name="ftpdir" select="foo"/>
+    <xsl:choose>
+      <xsl:when test="@role = 'package'">
+        <xsl:text>mkdir -p $SRC_DIR/$PKG_DIR&#xA;</xsl:text>
+        <xsl:text>cd $SRC_DIR/$PKG_DIR&#xA;</xsl:text>
+        <xsl:apply-templates select="itemizedlist/listitem/para">
+          <xsl:with-param name="package" select="$package"/>
+          <xsl:with-param name="ftpdir" select="$ftpdir"/>
+        </xsl:apply-templates>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <xsl:when test="@role = 'installation'">
+        <xsl:text>
+if [[ -e unpacked ]] ; then
+  UNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
+  rm -rf $UNPACKDIR
+fi
+tar -xvf $PACKAGE > unpacked
+UNPACKDIR=`head -n1 unpacked | sed 's@^./@@;s@/.*@@'`
+cd $UNPACKDIR&#xA;</xsl:text>
+        <xsl:apply-templates select=".//screen | .//para/command"/>
+        <xsl:if test="$sudo = 'y'">
+          <xsl:text>sudo /sbin/</xsl:text>
+        </xsl:if>
+        <xsl:text>ldconfig&#xA;&#xA;</xsl:text>
+      </xsl:when>
+      <xsl:when test="@role = 'configuration'">
+        <xsl:apply-templates select=".//screen"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="sect2" mode="xorg7">
+    <xsl:choose>
+      <xsl:when test="@role = 'package'">
+        <xsl:apply-templates select="itemizedlist/listitem/para" mode="xorg7"/>
+      </xsl:when>
+      <xsl:when test="not(@role)">
+        <xsl:text>SRC_ARCHIVE=$SRC_ARCHIVE
+FTP_SERVER=$FTP_SERVER&#xA;</xsl:text>
+        <xsl:apply-templates select=".//screen" mode="sect-ver"/>
+        <xsl:text>mkdir -p ${section}&#xA;cd ${section}&#xA;</xsl:text>
+        <xsl:apply-templates select="../sect2[@role='package']/itemizedlist/listitem/para" mode="xorg7-patch"/>
+        <xsl:text>for line in $(grep -v '^#' ../${sect-ver}.wget) ; do
+  if [[ ! -f ${line} ]] ; then
+    if [[ -f $SRC_ARCHIVE/Xorg/${section}/${line} ]] ; then
+      cp $SRC_ARCHIVE/Xorg/${section}/${line} ${line}
+    elif [[ -f $SRC_ARCHIVE/Xorg/${line} ]] ; then
+      cp $SRC_ARCHIVE/Xorg/${line} ${line}
+    elif [[ -f $SRC_ARCHIVE/${section}/${line} ]] ; then
+      cp $SRC_ARCHIVE/${section}/${line} ${line}
+    elif [[ -f $SRC_ARCHIVE/${line} ]] ; then
+      cp $SRC_ARCHIVE/${line} ${line}
+    else
+      wget ${FTP_SERVER}conglomeration/Xorg/${line} || \
+      wget http://xorg.freedesktop.org/releases/individual/${section}/${line}
+    fi
+  fi
+done
+md5sum -c ../${sect-ver}.md5
+cp ../${sect-ver}.wget ../${sect-ver}.wget.orig
+cp ../${sect-ver}.md5 ../${sect-ver}.md5.orig&#xA;</xsl:text>
+      </xsl:when>
+      <xsl:when test="@role = 'installation'">
+        <xsl:text>for package in $(grep -v '^#' ../${sect-ver}.wget) ; do
+  packagedir=$(echo $package | sed 's/.tar.bz2//')
+  tar -xf ${package}
+  cd ${packagedir}&#xA;</xsl:text>
+        <xsl:apply-templates select=".//screen | .//para/command"/>
+        <xsl:text>  cd ..
+  rm -rf ${packagedir}
+  sed -i "/${package}/d" ../${sect-ver}.wget
+  sed -i "/${package}/d" ../${sect-ver}.md5
+done
+mv ../${sect-ver}.wget.orig ../${sect-ver}.wget
+mv ../${sect-ver}.md5.orig ../${sect-ver}.md5&#xA;</xsl:text>
+        <xsl:if test="$sudo = 'y'">
+          <xsl:text>sudo /sbin/</xsl:text>
+        </xsl:if>
+        <xsl:text>ldconfig&#xA;&#xA;</xsl:text>
+      </xsl:when>
+      <xsl:when test="@role = 'configuration'">
+        <xsl:apply-templates select=".//screen"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+    </xsl:choose>
+  </xsl:template>
+
+<!--==================== Download code =======================-->
+
+  <xsl:template name="package_name">
+    <xsl:param name="url" select="foo"/>
+    <xsl:param name="sub-url" select="substring-after($url,'/')"/>
+    <xsl:choose>
+      <xsl:when test="contains($sub-url,'/')">
+        <xsl:call-template name="package_name">
+          <xsl:with-param name="url" select="$sub-url"/>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:choose>
+          <xsl:when test="contains($sub-url,'?')">
+            <xsl:value-of select="substring-before($sub-url,'?')"/>
+          </xsl:when>
+          <xsl:when test="contains($sub-url,'.patch')"/>
+          <xsl:otherwise>
+            <xsl:value-of select="$sub-url"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template name="ftp_dir">
+    <xsl:param name="package" select="foo"/>
+    <!-- A lot of hardcoded dir names. Not full revised yet. -->
+    <xsl:choose>
+        <!-- cdparanoia -->
+      <xsl:when test="contains($package, '-III')">
+        <xsl:text>cdparanoia</xsl:text>
+      </xsl:when>
+        <!-- DobBook 3.1 -->
+      <xsl:when test="contains($package, 'docbk31')">
+        <xsl:text>docbk</xsl:text>
+      </xsl:when>
+        <!-- gc -->
+      <xsl:when test="contains($package, 'gc6')">
+        <xsl:text>gc</xsl:text>
+      </xsl:when>
+        <!-- ISO-codes -->
+      <xsl:when test="contains($package, 'iso-codes')">
+        <xsl:text>iso-codes</xsl:text>
+      </xsl:when>
+        <!-- JPEG -->
+      <xsl:when test="contains($package, 'jpegsrc')">
+        <xsl:text>jpeg</xsl:text>
+      </xsl:when>
+        <!-- lynx -->
+      <xsl:when test="contains($package, 'lynx')">
+        <xsl:text>lynx</xsl:text>
+      </xsl:when>
+        <!-- ntp -->
+      <xsl:when test="contains($package, 'ntp')">
+        <xsl:text>ntp</xsl:text>
+      </xsl:when>
+        <!-- OpenLDAP -->
+      <xsl:when test="contains($package, 'openldap')">
+        <xsl:text>openldap</xsl:text>
+      </xsl:when>
+        <!-- Open Office -->
+      <xsl:when test="contains($package, 'OOo')">
+        <xsl:text>OOo</xsl:text>
+      </xsl:when>
+        <!-- pine -->
+      <xsl:when test="contains($package, 'pine')">
+        <xsl:text>pine</xsl:text>
+      </xsl:when>
+        <!-- portmap -->
+      <xsl:when test="contains($package, 'portmap')">
+        <xsl:text>portmap</xsl:text>
+      </xsl:when>
+        <!-- psutils -->
+      <xsl:when test="contains($package, 'psutils')">
+        <xsl:text>psutils</xsl:text>
+      </xsl:when>
+        <!-- qpopper -->
+      <xsl:when test="contains($package, 'qpopper')">
+        <xsl:text>qpopper</xsl:text>
+      </xsl:when>
+        <!-- QT -->
+      <xsl:when test="contains($package, 'qt-x')">
+        <xsl:text>qt-x11-free</xsl:text>
+      </xsl:when>
+        <!-- sendmail -->
+      <xsl:when test="contains($package, 'sendmail')">
+        <xsl:text>sendmail</xsl:text>
+      </xsl:when>
+        <!-- Slib -->
+      <xsl:when test="contains($package, 'slib')">
+        <xsl:text>slib</xsl:text>
+      </xsl:when>
+        <!-- TCL -->
+      <xsl:when test="contains($package, 'tcl')">
+        <xsl:text>tcl</xsl:text>
+      </xsl:when>
+        <!-- tcpwrappers -->
+      <xsl:when test="contains($package, 'tcp_wrappers')">
+        <xsl:text>tcp_wrappers</xsl:text>
+      </xsl:when>
+        <!-- TeTeX -->
+      <xsl:when test="contains($package, 'tetex')">
+        <xsl:text>tetex</xsl:text>
+      </xsl:when>
+        <!-- Tidy -->
+      <xsl:when test="contains($package, 'tidy')">
+        <xsl:text>tidy</xsl:text>
+      </xsl:when>
+        <!-- Tk -->
+      <xsl:when test="contains($package, 'tk8')">
+        <xsl:text>tk</xsl:text>
+      </xsl:when>
+        <!-- unzip -->
+      <xsl:when test="contains($package, 'unzip')">
+        <xsl:text>unzip</xsl:text>
+      </xsl:when>
+        <!-- wireless_tools -->
+      <xsl:when test="contains($package, 'wireless_tools')">
+        <xsl:text>wireless_tools</xsl:text>
+      </xsl:when>
+        <!-- whois -->
+      <xsl:when test="contains($package, 'whois')">
+        <xsl:text>whois</xsl:text>
+      </xsl:when>
+        <!-- XOrg -->
+      <xsl:when test="contains($package, 'X11R6')">
+        <xsl:text>Xorg</xsl:text>
+      </xsl:when>
+        <!-- zip -->
+      <xsl:when test="contains($package, 'zip2')">
+        <xsl:text>zip</xsl:text>
+      </xsl:when>
+        <!-- General rule -->
+      <xsl:otherwise>
+        <xsl:variable name="cut"
+          select="translate(substring-after($package, '-'), '0123456789', '0000000000')"/>
+        <xsl:variable name="package2">
+          <xsl:value-of select="substring-before($package, '-')"/>
+          <xsl:text>-</xsl:text>
+          <xsl:value-of select="$cut"/>
+        </xsl:variable>
+        <xsl:value-of select="substring-before($package2, '-0')"/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="itemizedlist/listitem/para">
+    <xsl:param name="package" select="foo"/>
+    <xsl:param name="ftpdir" select="foo"/>
+    <xsl:choose>
+      <!-- This depend on all package pages having both "Download HTTP" and "Download FTP" lines -->
+      <xsl:when test="contains(string(),'HTTP')">
+        <xsl:text>if [[ ! -f $PACKAGE ]] ; then&#xA;</xsl:text>
+        <!-- SRC_ARCHIVE may have subdirectories or not -->
+        <xsl:text>  if [[ -f $SRC_ARCHIVE/$PKG_DIR/$PACKAGE ]] ; then&#xA;</xsl:text>
+        <xsl:text>    cp $SRC_ARCHIVE/$PKG_DIR/$PACKAGE $PACKAGE&#xA;</xsl:text>
+        <xsl:text>  elif [[ -f $SRC_ARCHIVE/$PACKAGE ]] ; then&#xA;</xsl:text>
+        <xsl:text>    cp $SRC_ARCHIVE/$PACKAGE $PACKAGE&#xA;  else&#xA;</xsl:text>
+        <!-- The FTP_SERVER mirror -->
+        <xsl:text>    wget ${FTP_SERVER}conglomeration/$PKG_DIR/$PACKAGE</xsl:text>
+        <!-- Upstream HTTP URL -->
+        <xsl:if test="string-length(ulink/@url) &gt; '10'">
+          <xsl:text> || \&#xA;    wget </xsl:text>
+          <xsl:choose>
+            <xsl:when test="contains(ulink/@url,'?')">
+              <xsl:value-of select="substring-before(ulink/@url,'?')"/>
+            </xsl:when>
+            <xsl:otherwise>
+              <xsl:value-of select="ulink/@url"/>
+            </xsl:otherwise>
+          </xsl:choose>
+        </xsl:if>
+      </xsl:when>
+      <xsl:when test="contains(string(),'FTP')">
+        <!-- Upstream FTP URL -->
+        <xsl:if test="string-length(ulink/@url) &gt; '10'">
+          <xsl:text> || \&#xA;    wget </xsl:text>
+          <xsl:value-of select="ulink/@url"/>
+        </xsl:if>
+        <xsl:text>&#xA;  fi&#xA;fi&#xA;</xsl:text>
+      </xsl:when>
+      <xsl:when test="contains(string(),'MD5')">
+        <xsl:text>echo "</xsl:text>
+        <xsl:value-of select="substring-after(string(),'sum: ')"/>
+        <xsl:text>&#x20;&#x20;$PACKAGE" | md5sum -c -&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Patches -->
+      <xsl:when test="contains(string(ulink/@url),'.patch')">
+        <xsl:text>wget </xsl:text>
+        <xsl:value-of select="ulink/@url"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="itemizedlist/listitem/para" mode="xorg7">
+    <xsl:if test="contains(string(ulink/@url),'.md5') or
+                  contains(string(ulink/@url),'.wget')">
+      <xsl:text>wget </xsl:text>
+      <xsl:value-of select="ulink/@url"/>
+      <xsl:text>&#xA;</xsl:text>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="itemizedlist/listitem/para" mode="xorg7-patch">
+    <xsl:if test="contains(string(ulink/@url),'.patch')">
+      <xsl:text>wget </xsl:text>
+      <xsl:value-of select="ulink/@url"/>
+      <xsl:text>&#xA;</xsl:text>
+    </xsl:if>
+  </xsl:template>
+
+<!--======================== Commands code ==========================-->
+
+  <xsl:template match="screen">
+    <xsl:if test="child::* = userinput and not(@role = 'nodump')">
+      <xsl:if test="@role = 'root' and $sudo = 'y'">
+        <xsl:text>sudo sh -c "</xsl:text>
+      </xsl:if>
+      <xsl:apply-templates select="userinput"/>
+      <xsl:if test="@role = 'root' and $sudo = 'y'">
+        <xsl:text>"</xsl:text>
+      </xsl:if>
+      <xsl:text>&#xA;</xsl:text>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="screen" mode="sect-ver">
+    <xsl:text>section=</xsl:text>
+    <xsl:value-of select="substring-before(substring-after(string(),'mkdir '),' &amp;')"/>
+    <xsl:text>&#xA;sect-ver=</xsl:text>
+    <xsl:value-of select="substring-before(substring-after(string(),'-c ../'),'.md5')"/>
+    <xsl:text>&#xA;</xsl:text>
+  </xsl:template>
+
+  <xsl:template match="para/command">
+    <xsl:if test="(contains(string(),'test') or
+            contains(string(),'check'))">
+      <xsl:text>#</xsl:text>
+      <xsl:value-of select="substring-before(string(),'make')"/>
+      <xsl:text>make -k</xsl:text>
+      <xsl:value-of select="substring-after(string(),'make')"/>
+      <xsl:text> || true&#xA;</xsl:text>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="userinput">
+    <xsl:apply-templates/>
+  </xsl:template>
+
+  <xsl:template match="replaceable">
+    <xsl:choose>
+      <xsl:when test="ancestor::sect1[@id='xorg7-server']">
+        <xsl:text>$SRC_DIR/MesaLib</xsl:text>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>**EDITME</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>EDITME**</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/BLFS/update_book.sh b/2.3/BLFS/update_book.sh
new file mode 100755
index 0000000..e37284c
--- /dev/null
+++ b/2.3/BLFS/update_book.sh
@@ -0,0 +1,108 @@
+#!/bin/bash
+#
+# $Id$
+#
+set -e
+
+declare -r SVN="svn://svn.linuxfromscratch.org"
+
+DOC_MODE=$1  # Action to take, update, get or none
+BLFS_XML=$2  # Book directory
+TREE=$3      # SVN tree for the BLFS book version
+
+[[ -z $BLFS_XML ]] && BLFS_XML=blfs-xml
+[[ -z $DOC_MODE ]] && DOC_MODE=update
+[[ -z $TREE ]] && TREE=trunk/BOOK
+
+TRACKING_DIR=tracking-dir
+
+#---------------------
+# packages module
+source libs/func_packages
+[[ $? > 0 ]] && echo -e "\n\tERROR: func_packages did not load..\n" && exit
+
+#----------------------------#
+BOOK_Source() {              #
+#----------------------------#
+: <<inline_doc
+    function:   Retrieve or upate a copy of the BLFS book
+    input vars: $1 BLFS_XML book sources directory
+                $2 DOC_MODE action get/update
+                $3 TREE     SVN tree when $2=get
+    externals:  none
+    modifies:   $BLFS_XML directory tree
+    returns:    nothing
+    output:
+    on error:   exit
+    on success: text messages
+inline_doc
+
+  case $DOC_MODE in
+    update )
+      if [[ ! -d $BLFS_XML ]] ; then
+        echo -e "\n\t$BLFS_XML is not a directory\n"
+        exit 1
+      fi
+      if [[ ! -f $BLFS_XML/x/x.xml ]] ; then
+        echo -e "\n\tLooks like $BLFS_XML is not a BLFS book sources directory\n"
+        exit 1
+      fi
+
+      if [[ -d $BLFS_XML/.svn ]] ; then
+        echo -e "\n\tUpdating the $BLFS_XML book sources ...\n"
+        pushd $BLFS_XML 1> /dev/null
+          svn up
+        popd 1> /dev/null
+        echo -e "\n\tBook sources updated."
+      else
+        echo -e "\n\tLooks like $BLFS_XML is not a svn working copy."
+        echo -e "\tSkipping BLFS sources update.\n"
+      fi
+      ;;
+
+    get )
+      [[ ! -d $BLFS_XML ]] && mkdir -pv $BLFS_XML
+      svn co $SVN/BLFS/$TREE $BLFS_XML 2>&1
+      ;;
+    * )
+        echo -e "\n\tUnknown option ${DOC_MODE} ignored.\n"
+    ;;
+  esac
+}
+
+[ "${DOC_MODE}" != "none" ] && BOOK_Source
+
+if [ "${DOC_MODE}" = "none" ] ; then
+  echo -en "\n\tGenerating packages database file ..."
+  LC_ALL=C && generate_packages
+  echo "done."
+
+  echo -en "\tGenerating alsa dependencies list ..."
+  generate_alsa
+  echo "done."
+
+  echo -en "\tGenerating gnome-core dependencies list ..."
+  generate_gnome_core
+  echo "done."
+
+  echo -en "\tGenerating gnome-full dependencies list ..."
+  generate_gnome_full
+  echo "done."
+
+  echo -en "\tGenerating kde-core dependencies list ..."
+  generate_kde_core
+  echo "done."
+
+  echo -en "\tGenerating kde-full dependencies list ..."
+  generate_kde_full
+  echo -e "done."
+
+  echo -en "\tGenerating kde-koffice dependencies list ..."
+  generate_kde_koffice
+  echo -e "done."
+
+  echo -en "\tGenerating xorg7 dependencies list ..."
+  generate_xorg7
+  echo "done."
+fi
+
diff --git a/2.3/CLFS/clfs.xsl b/2.3/CLFS/clfs.xsl
new file mode 100644
index 0000000..f0e871e
--- /dev/null
+++ b/2.3/CLFS/clfs.xsl
@@ -0,0 +1,328 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
+  %general-entities;
+]>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exsl="http://exslt.org/common"
+    extension-element-prefixes="exsl"
+    version="1.0">
+
+<!-- XSLT stylesheet to create shell scripts from CLFS books. -->
+
+  <!-- Build method used -->
+  <xsl:param name="method" select="chroot"/>
+
+  <!-- Run test suites?
+       0 = none
+       1 = only Glibc, GCC and Binutils testsuites
+       2 = all testsuites
+       3 = alias to 2
+  -->
+  <xsl:param name="testsuite" select="1"/>
+
+  <!-- Bomb on test suites failures?
+       n = no, I want to build the full system and review the logs
+       y = yes, bomb at the first test suite failure to can review the build dir
+  -->
+  <xsl:param name="bomb-testsuite" select="n"/>
+
+  <!-- Install vim-lang package? -->
+  <xsl:param name="vim-lang" select="y"/>
+
+  <!-- Time zone -->
+  <xsl:param name="timezone" select="GMT"/>
+
+  <!-- Page size -->
+  <xsl:param name="page" select="letter"/>
+
+  <!-- Locale settings -->
+  <xsl:param name="lang" select="C"/>
+
+  <!-- Sparc64 processor type -->
+  <xsl:param name="sparc" select="none"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//sect1"/>
+  </xsl:template>
+
+  <xsl:template match="sect1">
+    <xsl:choose>
+      <xsl:when test="../@id='chapter-partitioning' or
+                      ../@id='chapter-getting-materials' or
+                      ../@id='chapter-final-preps'"/>
+      <xsl:when test="../@id='chapter-testsuite-tools' and $testsuite='0'"/>
+      <xsl:when test="../@id='chapter-boot' and $method='chroot'"/>
+      <xsl:when test="../@id='chapter-chroot' and $method='boot'"/>
+      <xsl:otherwise>
+        <xsl:if test="count(descendant::screen/userinput) &gt; 0 and
+                      count(descendant::screen/userinput) &gt;
+                      count(descendant::screen[@role='nodump'])">
+            <!-- The dirs names -->
+          <xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
+          <xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
+          <xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
+          <xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
+            <!-- The file names -->
+          <xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
+          <xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
+          <xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
+            <!-- The build order -->
+          <xsl:variable name="position" select="position()"/>
+          <xsl:variable name="order">
+            <xsl:choose>
+              <xsl:when test="string-length($position) = 1">
+                <xsl:text>00</xsl:text>
+                <xsl:value-of select="$position"/>
+              </xsl:when>
+              <xsl:when test="string-length($position) = 2">
+                <xsl:text>0</xsl:text>
+                <xsl:value-of select="$position"/>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:value-of select="$position"/>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:variable>
+            <!-- Creating dirs and files -->
+          <exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
+            <xsl:choose>
+              <xsl:when test="@id='ch-chroot-changingowner' or
+                        @id='ch-chroot-creatingdirs' or
+                        @id='ch-chroot-createfiles' or
+                        @id='ch-system-stripping'">
+                <xsl:text>#!/tools/bin/bash&#xA;set +h&#xA;</xsl:text>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:text>#!/bin/bash&#xA;set +h&#xA;</xsl:text>
+              </xsl:otherwise>
+            </xsl:choose>
+            <xsl:if test="not(@id='ch-system-stripping')">
+              <xsl:text>set -e</xsl:text>
+            </xsl:if>
+            <xsl:text>&#xA;</xsl:text>
+            <xsl:if test="sect2[@role='installation'] and
+                          not(@id='ch-system-multiarch-wrapper')">
+              <xsl:text>cd $PKGDIR&#xA;</xsl:text>
+              <xsl:if test="@id='ch-system-vim' and $vim-lang = 'y'">
+                <xsl:text>tar -xvf ../vim-&vim-version;-lang.* --strip-components=1&#xA;</xsl:text>
+              </xsl:if>
+            </xsl:if>
+            <xsl:apply-templates select=".//para/userinput | .//screen"/>
+            <xsl:text>exit</xsl:text>
+          </exsl:document>
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="screen">
+    <xsl:if test="child::* = userinput and not(@role = 'nodump')">
+      <xsl:apply-templates select="userinput" mode="screen"/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="para/userinput">
+    <xsl:if test="(contains(string(),'test') or
+            contains(string(),'check')) and
+            ($testsuite = '2' or $testsuite = '3')">
+      <xsl:choose>
+        <xsl:when test="$bomb-testsuite = 'n'">
+          <xsl:value-of select="substring-before(string(),'make')"/>
+          <xsl:text>make -k</xsl:text>
+          <xsl:value-of select="substring-after(string(),'make')"/>
+          <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates/>
+          <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+          <xsl:if test="contains(string(),' -k ')">
+            <xsl:text> || true</xsl:text>
+          </xsl:if>
+          <xsl:text>&#xA;</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="userinput" mode="screen">
+    <xsl:choose>
+      <!-- Estandarized package formats -->
+      <xsl:when test="contains(string(),'tar.gz')">
+        <xsl:value-of select="substring-before(string(),'tar.gz')"/>
+        <xsl:text>tar.*</xsl:text>
+        <xsl:value-of select="substring-after(string(),'tar.gz')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Setting $LANG for /etc/profile -->
+      <xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
+                contains(string(),'export LANG=')">
+        <xsl:value-of select="substring-before(string(),'export LANG=')"/>
+        <xsl:text>export LANG=</xsl:text>
+        <xsl:value-of select="$lang"/>
+        <xsl:value-of select="substring-after(string(),'charmap]')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Compile the keymap into the kernel has been disabled for 1.0 -->
+      <xsl:when test="contains(string(),'defkeymap')"/>
+      <!-- Copying the kernel config file -->
+      <xsl:when test="string() = 'make mrproper'">
+        <xsl:text>make mrproper&#xA;</xsl:text>
+        <xsl:if test="ancestor::sect1[@id='ch-boot-kernel']">
+          <xsl:text>cp -v ../bootkernel-config .config&#xA;</xsl:text>
+        </xsl:if>
+        <xsl:if test="ancestor::sect1[@id='ch-bootable-kernel']">
+          <xsl:text>cp -v ../kernel-config .config&#xA;</xsl:text>
+        </xsl:if>
+      </xsl:when>
+      <!-- No interactive commands are needed if the .config file is the proper one -->
+      <xsl:when test="contains(string(),'menuconfig')"/>
+      <!-- The Coreutils and Module-Init-Tools test suites are optional -->
+      <xsl:when test="(ancestor::sect1[@id='ch-system-coreutils'] or
+                ancestor::sect1[@id='ch-system-module-init-tools']) and
+                (contains(string(),'check') or
+                contains(string(),'dummy'))">
+        <xsl:choose>
+          <xsl:when test="$testsuite = '0' or $testsuite = '1'"/>
+          <xsl:otherwise>
+            <xsl:if test="not(contains(string(),'check'))">
+              <xsl:apply-templates/>
+              <xsl:text>&#xA;</xsl:text>
+            </xsl:if>
+            <xsl:if test="contains(string(),'check')">
+              <xsl:choose>
+                <xsl:when test="$bomb-testsuite = 'n'">
+                  <xsl:value-of select="substring-before(string(),'check')"/>
+                  <xsl:text>-k check</xsl:text>
+                  <xsl:value-of select="substring-after(string(),'check')"/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:apply-templates/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                  <xsl:if test="contains(string(),' -k ')">
+                    <xsl:text> || true</xsl:text>
+                  </xsl:if>
+                  <xsl:text>&#xA;</xsl:text>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:if>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Fixing toolchain test suites run -->
+      <xsl:when test="string() = 'make check' or
+                string() = 'make -k check'">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:choose>
+              <xsl:when test="$bomb-testsuite = 'n'">
+                <xsl:text>make -k check &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:apply-templates/>
+                <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                <xsl:if test="contains(string(),' -k ')">
+                  <xsl:text> || true</xsl:text>
+                </xsl:if>
+                <xsl:text>&#xA;</xsl:text>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test="contains(string(),'glibc-check-log')">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:value-of select="substring-before(string(),'&gt;g')"/>
+            <xsl:choose>
+              <xsl:when test="$bomb-testsuite = 'n'">
+                <xsl:text>&gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:text>&gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                <xsl:if test="contains(string(),' -k ')">
+                  <xsl:text> || true</xsl:text>
+                </xsl:if>
+                <xsl:text>&#xA;</xsl:text>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test="contains(string(),'test_summary') or
+                contains(string(),'expect -c')">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:apply-templates/>
+            <xsl:text> &gt;&gt; $TEST_LOG&#xA;</xsl:text>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Don't stop on strip run -->
+      <xsl:when test="contains(string(),'strip ')">
+        <xsl:apply-templates/>
+        <xsl:text> || true&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The rest of commands -->
+      <xsl:otherwise>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="replaceable">
+    <xsl:choose>
+      <xsl:when test="ancestor::sect1[@id='ch-system-glibc']">
+        <xsl:value-of select="$timezone"/>
+      </xsl:when>
+      <xsl:when test="ancestor::sect1[@id='ch-system-groff']">
+        <xsl:value-of select="$page"/>
+      </xsl:when>
+      <xsl:when test="ancestor::sect1[@id='ch-cross-tools-flags']">
+        <xsl:choose>
+          <xsl:when test="contains(string(),'BUILD32')">
+            <xsl:choose>
+              <xsl:when test="$sparc = '1' or $sparc = '2'">
+                <xsl:text>-m32 -mcpu=ultrasparc -mtune=ultrasparc</xsl:text>
+              </xsl:when>
+              <xsl:when test="$sparc = '3'">
+                <xsl:text>-m32 -mcpu=ultrasparc3 -mtune=ultrasparc3</xsl:text>
+              </xsl:when>
+            </xsl:choose>
+          </xsl:when>
+          <xsl:when test="contains(string(),'BUILD64')">
+            <xsl:choose>
+              <xsl:when test="$sparc = '1' or $sparc = '2'">
+                <xsl:text>-m64 -mcpu=ultrasparc -mtune=ultrasparc</xsl:text>
+              </xsl:when>
+              <xsl:when test="$sparc = '3'">
+                <xsl:text>-m64 -mcpu=ultrasparc3 -mtune=ultrasparc3</xsl:text>
+              </xsl:when>
+            </xsl:choose>
+          </xsl:when>
+          <xsl:when test="contains(string(),'GCCTARGET')">
+            <xsl:choose>
+              <xsl:when test="$sparc = '1' or $sparc = '2'">
+                <xsl:text>-mcpu=ultrasparc -mtune=ultrasparc</xsl:text>
+              </xsl:when>
+              <xsl:when test="$sparc = '3'">
+                <xsl:text>-mcpu=ultrasparc3 -mtune=ultrasparc3</xsl:text>
+              </xsl:when>
+            </xsl:choose>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>**EDITME</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>EDITME**</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/CLFS/master.sh b/2.3/CLFS/master.sh
new file mode 100644
index 0000000..0c79135
--- /dev/null
+++ b/2.3/CLFS/master.sh
@@ -0,0 +1,1002 @@
+#!/bin/bash
+# $Id$
+
+
+orphan_scripts="" # 2 scripts do not fit BOOT_Makefiles LUSER environment
+
+
+#--------------------------------------#
+host_prep_Makefiles() {                #
+#--------------------------------------#
+  local   CLFS_HOST
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}host prep files  ( SETUP ) ${R_arrow}"
+
+  # defined here, only for ease of reading
+  CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
+(
+cat << EOF
+023-creatingtoolsdir:
+	@\$(call echo_message, Building)
+	@mkdir \$(MOUNT_PT)/tools && \\
+	rm -f /tools && \\
+	ln -s \$(MOUNT_PT)/tools /
+	@\$(call housekeeping)
+
+024-creatingcrossdir: 023-creatingtoolsdir
+	@\$(call echo_message, Building)
+	@mkdir -v \$(MOUNT_PT)/cross-tools && \\
+	rm -f /cross-tools && \\
+	ln -s \$(MOUNT_PT)/cross-tools /
+	@\$(call housekeeping)
+
+025-addinguser:  024-creatingcrossdir
+	@\$(call echo_message, Building)
+	@if [ ! -d \$(LUSER_HOME) ]; then \\
+		groupadd \$(LGROUP); \\
+		useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
+	else \\
+		touch luser-exist; \\
+	fi;
+	@chown \$(LUSER) \$(MOUNT_PT)/tools && \\
+	chown \$(LUSER) \$(MOUNT_PT)/cross-tools && \\
+	chmod -R a+wt \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
+	chmod a+wt \$(SRCSDIR)
+	@\$(call housekeeping)
+
+026-settingenvironment:  025-addinguser
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile  -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
+	fi;
+	@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
+	echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "CLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "PATH=/cross-tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "unset CFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "unset CXXFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_HOST=\"${CLFS_HOST}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_TARGET=\"${TARGET}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_TARGET32=\"${TARGET32}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
+	touch envars && \\
+	chmod -R a+wt \$(MOUNT_PT) && \\
+	chown -R \$(LUSER) \$(MOUNT_PT)/\$(SCRIPT_ROOT)
+	@\$(call housekeeping)
+EOF
+) >> $MKFILE.tmp
+  host_prep=" 023-creatingtoolsdir 024-creatingcrossdir 026-settingenvironment"
+
+}
+
+#--------------------------------------#
+cross_tools_Makefiles() {              #
+#--------------------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}cross tools  ( LUSER ) ${R_arrow}"
+
+  for file in cross-tools/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+    #
+    # Skip this script...
+    case $this_script in
+      *cflags* | *variables* )  # work done in host_prep_Makefiles
+         continue; ;;
+      *) ;;
+    esac
+    #
+    # Set the dependency for the first target.
+    if [ -z $PREV ] ; then PREV=026-settingenvironment ; fi
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    cross_tools="$cross_tools $this_script"
+
+    # Grab the name of the target (minus the -headers or -cross in the case of gcc
+    # and binutils in chapter 5)
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
+                                  -e 's@-static@@' \
+                                  -e 's@-final@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@-n32@@'`
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_wrt_unpack "$pkg_tarball"
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done # for file in ....
+}
+
+#--------------------------------------#
+temptools_Makefiles() {                #
+#--------------------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}temp system  ( LUSER ) ${R_arrow}"
+
+  for file in temp-system/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+    #
+    #  Deal with any odd scripts..
+    case $this_script in
+      *choose) # The choose script will fail if you cannot enter the new environment
+               # If the 'boot' build method was chosen don't run the script
+         [[ $METHOD = "boot" ]] && continue; ;;
+      *) ;;
+    esac
+
+    #
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    temptools="$temptools $this_script"
+
+    #
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'`
+    #
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    # Insert instructions for unpacking the package and to set the PKGDIR variable.
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_wrt_unpack "$pkg_tarball"
+    [[ "$pkg_tarball" != "" ]] && [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+  done # for file in ....
+}
+
+
+#--------------------------------------#
+chroot_Makefiles() {                   #
+#--------------------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}tmptools CHROOT        ( CHROOT ) ${R_arrow}"
+
+  for file in chroot/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+    #
+    # Skipping scripts is done now and not included in the build tree.
+    case $this_script in
+      *chroot*) continue ;;
+    esac
+
+    #
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    case "${this_script}" in
+      *kernfs)     orphan_scripts="${orphan_scripts} ${this_script}"  ;;
+      *)           chroottools="$chroottools $this_script"            ;;
+    esac
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'`
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    # This is very ugly:: util-linux is in /chroot but must be run under LUSER
+    # .. Customized makefile entry
+    case "${this_script}" in
+      *util-linux)
+         LUSER_wrt_target "${this_script}" "$PREV"
+         LUSER_wrt_unpack "$pkg_tarball"
+         [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+         LUSER_wrt_RunAsUser "${file}"
+         LUSER_RemoveBuildDirs "${name}"
+         wrt_touch
+         temptools="$temptools $this_script"
+         continue ;;
+     esac
+
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    # Insert instructions for unpacking the package and changing directories
+    #
+    if [ "$pkg_tarball" != "" ] ; then
+      CHROOT_Unpack "$pkg_tarball"
+      [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    #
+    # Select a script execution method
+    case $this_script in
+      *kernfs)      wrt_RunAsRoot         "${file}"  ;;
+      *)            CHROOT_wrt_RunAsRoot  "${file}"  ;;
+    esac
+    #
+    # Housekeeping...remove the build directory(ies), except if the package build fails.
+    [[ "$pkg_tarball" != "" ]] && CHROOT_wrt_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done # for file in...
+}
+
+
+#--------------------------------------#
+boot_Makefiles() {                     #
+#--------------------------------------#
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}tmptools BOOT  ( LUSER ) ${R_arrow}"
+  #
+  # Create a target bootable partition containing a compile environment. Later
+  #  on we boot into this environment and contine the build.
+  #
+  for file in boot/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # A little housekeeping on the scripts
+    case $this_script in
+      *grub | *aboot | *colo | *silo | *arcload | *lilo )     continue     ;;
+      *whatnext*) continue     ;;
+      *fstab)   [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
+      *kernel)  # if there is no kernel config file do not build the kernel
+                [[ -z $CONFIG ]] && continue
+                  # Copy the config file to /sources with a standardized name
+                cp $BOOT_CONFIG $BUILDDIR/sources/bootkernel-config
+          ;;
+    esac
+    #
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    case "${this_script}" in
+      *changingowner)  orphan_scripts="${orphan_scripts} ${this_script}"  ;;
+      *devices)        orphan_scripts="${orphan_scripts} ${this_script}"  ;;
+      *)               boottools="$boottools $this_script" ;;
+    esac
+    #
+    # Grab the name of the target, strip id number and misc words.
+    case $this_script in
+      *kernel)        name=linux                   ;;
+      *bootscripts)   name="bootscripts-cross-lfs" ;;
+      *udev-rules)    name="udev-cross-lfs"        ;;
+      *grub-build)    name=grub                    ;;
+      *-aboot-build)  name=aboot                   ;;
+      *yaboot-build)  name=yaboot                  ;;
+      *colo-build)    name=colo                    ;;
+      *silo-build)    name=silo                    ;;
+      *arcload-build) name=arcload                 ;;
+      *lilo-build)    name=lilo                    ;;
+      *)              name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-build@@' ` ;;
+    esac
+      # Identify the unique version naming scheme for the clfs bootscripts..(bad boys)
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    # Insert instructions for unpacking the package and changing directories
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_wrt_unpack "$pkg_tarball"
+    [[ "$pkg_tarball" != "" ]] && [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    #
+    # Select a script execution method
+    case $this_script in
+       # The following 2 scripts are defined in the /boot directory but need
+       # to be run as a root user. Set them up here but run them in another phase
+      *changingowner*)  wrt_RunAsRoot "${file}"    ;;
+      *devices*)        wrt_RunAsRoot "${file}"    ;;
+      *fstab*)   if [[ -n "$FSTAB" ]]; then
+                   LUSER_wrt_CopyFstab
+                 else
+                   LUSER_wrt_RunAsUser  "${file}"
+                 fi
+         ;;
+      *)         LUSER_wrt_RunAsUser  "${file}"       ;;
+    esac
+    #
+    # Housekeeping...remove any build directory(ies) except if the package build fails.
+    [[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done
+}
+
+
+#--------------------------------------#
+testsuite_tools_Makefiles() {          #
+#--------------------------------------#
+
+  if [[ "${METHOD}" = "chroot" ]]; then
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(chroot) testsuite tools  ( CHROOT ) ${R_arrow}"
+  else
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(boot) testsuite tools ( ROOT ) ${R_arrow}"
+    PREV=""
+  fi
+
+  for file in testsuite-tools/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    testsuitetools="$testsuitetools $this_script"
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'\
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@'`
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "${this_script}" "$PREV"
+    #
+    CHROOT_Unpack "$pkg_tarball"
+    [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    #
+    CHROOT_wrt_RunAsRoot "${file}"
+    #
+    CHROOT_wrt_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done
+}
+
+
+#--------------------------------------#
+final_system_Makefiles() {             #
+#--------------------------------------#
+  # Set envars and scripts for iteration targets
+  if [[ -z "$1" ]] ; then
+    local N=""
+    # In boot method the makesys phase was initiated in testsuite_tools_makefile
+    [[ "${METHOD}" = "boot" ]] && [[ "$TEST" = 0 ]] && PREV=""
+  else
+    local N=-build_$1
+    local basicsystem=""
+    mkdir final-system$N
+    cp final-system/* final-system$N
+    for script in final-system$N/* ; do
+      # Overwrite existing symlinks, files, and dirs
+      sed -e 's/ln -sv/&f/g' \
+          -e 's/mv -v/&f/g' \
+          -e 's/mkdir -v/&p/g' -i ${script}
+      # Rename the scripts
+      mv ${script} ${script}$N
+    done
+    # Remove Bzip2 binaries before make install (CLFS-1.0 compatibility)
+    sed -e 's@make install@rm -vf /usr/bin/bz*\n&@' -i final-system$N/*-bzip2$N
+    # Delete *old Readline libraries just after make install
+    sed -e 's@make install@&\nrm -v /lib/lib{history,readline}*old@' -i final-system$N/*-readline$N
+  fi
+
+  if [[ "${METHOD}" = "chroot" ]]; then
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(chroot) final system$N ( CHROOT ) ${R_arrow}"
+  else
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(boot) final system$N  ( ROOT ) ${R_arrow}"
+  fi
+
+  for file in final-system$N/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Test if the stripping phase must be skipped.
+    # Skip alsp temp-perl for iterative runs
+    case $this_script in
+      *stripping*) [[ "$STRIP" = "n" ]] && continue ;;
+      *temp-perl*) [[ -n "$N" ]] && continue ;;
+    esac
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
+                                  -e 's@temp-@@' \
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@' \
+                                  -e 's,'$N',,'`
+
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package. We need this here to can skip scripts not needed for
+    # iterations rebuilds
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    if [[ "$pkg_tarball" = "" ]] && [[ -n "$N" ]] ; then
+      case "${this_script}" in
+        *stripping*) ;;
+        *)  continue ;;
+      esac
+    fi
+
+    # Append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    basicsystem="$basicsystem ${this_script}"
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "${this_script}" "$PREV"
+
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      # Touch timestamp file if installed files logs will be created.
+      # But only for the firt build when running iterative builds.
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_TouchTimestamp
+      fi
+      CHROOT_Unpack "$pkg_tarball"
+      # If the testsuites must be run, initialize the log file
+      case $name in
+        binutils | gcc | glibc )
+          [[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${this_script}"
+          ;;
+        * )
+          [[ "$TEST" = "2" ]] || [[ "$TEST" = "3" ]] && CHROOT_wrt_test_log "${this_script}"
+          ;;
+      esac
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    #
+    CHROOT_wrt_RunAsRoot  "${file}"
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      CHROOT_wrt_RemoveBuildDirs "$name"
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check
+    # if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+    # Set system_build envar for iteration targets
+    system_build=$basicsystem
+  done  # for file in final-system/* ...
+}
+
+#--------------------------------------#
+bootscripts_Makefiles() {              #
+#--------------------------------------#
+
+  if [[ "${METHOD}" = "chroot" ]]; then
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(chroot) bootscripts   ( CHROOT ) ${R_arrow}"
+  else
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(boot) bootscripts     ( ROOT ) ${R_arrow}"
+  fi
+
+  for file in bootscripts/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    case $this_script in
+      *udev)     continue ;; # This is not a script but a commentary, we want udev-rules
+      *console*) continue ;; # Use the files that came with the bootscripts
+      *)  ;;
+    esac
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    bootscripttools="$bootscripttools $this_script"
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'\
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@'`
+    case $name in
+      *bootscripts*) name=bootscripts-cross-lfs ;;
+      *udev-rules)   name=udev-cross-lfs ;;
+    esac
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    #
+    if [ "$pkg_tarball" != "" ] ; then
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+      CHROOT_Unpack "$pkg_tarball"
+    fi
+    #
+    CHROOT_wrt_RunAsRoot "${file}"
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      CHROOT_wrt_RemoveBuildDirs "$name"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done  # for file in bootscripts/* ...
+}
+
+#--------------------------------------#
+bootable_Makefiles() {                 #
+#--------------------------------------#
+
+  if [[ "${METHOD}" = "chroot" ]]; then
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(chroot) make bootable ( CHROOT ) ${R_arrow}"
+  else
+    echo "${tab_}${GREEN}Processing... ${L_arrow}(boot) make bootable   ( ROOT ) ${R_arrow}"
+  fi
+
+
+  for file in bootable/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # A little housekeeping on the scripts
+    case $this_script in
+      *grub | *aboot | *colo | *silo | *arcload | *lilo | *reboot* )  continue ;;
+      *fstab)  [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
+      *kernel) # if there is no kernel config file do not build the kernel
+               [[ -z $CONFIG ]] && continue
+                 # Copy the config file to /sources with a standardized name
+               cp $CONFIG $BUILDDIR/sources/kernel-config
+        ;;
+    esac
+    #
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    bootabletools="$bootabletools $this_script"
+    #
+    # Grab the name of the target, strip id number and misc words.
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-build@@' `
+    case $this_script in
+      *kernel*) name=linux
+       ;;
+    esac
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    # Insert instructions for unpacking the package and changing directories
+    #
+    if [ "$pkg_tarball" != "" ] ; then
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+      CHROOT_Unpack "$pkg_tarball"
+    fi
+    #
+    # Select a script execution method
+    case $this_script in
+      *fstab*)   if [[ -n "$FSTAB" ]]; then
+                   CHROOT_wrt_CopyFstab
+                 else
+                   CHROOT_wrt_RunAsRoot  "${file}"
+                 fi
+        ;;
+      *)  CHROOT_wrt_RunAsRoot  "${file}"
+        ;;
+    esac
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      CHROOT_wrt_RemoveBuildDirs "$name"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done
+
+}
+
+
+#--------------------------------------#
+build_Makefile() {                     # Construct a Makefile from the book scripts
+#--------------------------------------#
+  #
+  # Script crashes if error trapping is on
+  #
+set +e
+  declare -f  method_cmds
+set -e
+
+  echo "...Creating Makefile... ${BOLD}START${OFF}"
+
+  cd $JHALFSDIR/${PROGNAME}-commands
+  # Start with a clean files
+  >$MKFILE
+  >$MKFILE.tmp
+
+  method_cmds=${METHOD}_Makefiles
+
+  host_prep_Makefiles        # mk_SETUP      (SETUP)  $host_prep
+  cross_tools_Makefiles      # mk_CROSS      (LUSER)  $cross_tools
+  temptools_Makefiles        # mk_TEMP       (LUSER)  $temptools
+  $method_cmds               # mk_SYSTOOLS   (CHROOT) $chroottools/$boottools
+  if [[ ! $TEST = "0" ]]; then
+    testsuite_tools_Makefiles    # mk_SYSTOOLS   (CHROOT) $testsuitetools
+  fi
+  final_system_Makefiles         # mk_FINAL      (CHROOT) $basicsystem
+    # Add the iterations targets, if needed
+  [[ "$COMPARE" = "y" ]] && wrt_compare_targets
+  bootscripts_Makefiles          # mk_BOOTSCRIPT (CHROOT) $bootscripttools
+  bootable_Makefiles             # mk_BOOTABLE   (CHROOT) $bootabletools
+
+  # Add the CUSTOM_TOOLS targets, if needed
+  [[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
+  # Add the BLFS_TOOL targets, if needed
+  [[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
+
+  # Add a header, some variables and include the function file
+  # to the top of the real Makefile.
+  wrt_Makefile_header
+
+  # Add chroot commands
+  if [ "$METHOD" = "chroot" ] ; then
+    CHROOT_LOC="`whereis -b chroot | cut -d " " -f2`"
+    chroot=`cat chroot/*chroot* | \
+            sed  -e "s@chroot@$CHROOT_LOC@" \
+                 -e '/#!\/bin\/bash/d' \
+                 -e '/^export/d' \
+                 -e '/^logout/d' \
+                 -e 's@ \\\@ @g' | \
+            tr -d '\n' |  \
+            sed -e 's/  */ /g' \
+                -e 's|\\$|&&|g' \
+                -e 's|exit||g' \
+                -e 's|$| -c|' \
+                -e 's|"$${CLFS}"|$(MOUNT_PT)|'\
+                -e 's|set -e||' \
+                -e 's|set +h||'`
+    echo -e "CHROOT1= $chroot\n" >> $MKFILE
+  fi
+
+################## CHROOT ####################
+
+if [[ "${METHOD}" = "chroot" ]]; then
+(
+cat << EOF
+
+all: ck_UID mk_SETUP mk_CROSS mk_SUDO mk_SYSTOOLS create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL
+	@sudo make do-housekeeping
+	@echo "$VERSION - jhalfs build" > clfs-release && \\
+	sudo mv clfs-release \$(MOUNT_PT)/etc
+	@\$(call echo_finished,$VERSION)
+
+ck_UID:
+	@if [ \`id -u\` = "0" ]; then \\
+	  echo "+--------------------------------------------------+"; \\
+	  echo "|You cannot run this makefile from the root account|"; \\
+	  echo "+--------------------------------------------------+"; \\
+	  exit 1; \\
+	fi
+
+#---------------AS ROOT
+mk_SETUP:
+	@\$(call echo_SU_request)
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
+	@touch \$@
+
+#---------------AS LUSER
+mk_CROSS: mk_SETUP
+	@\$(call echo_PHASE,Cross and Temporary Tools)
+	@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) AS_LUSER" )
+	@sudo make restore-luser-env
+	@touch \$@
+
+mk_SUDO: mk_CROSS
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SUDO
+	@touch \$@
+
+#---------------CHROOT JAIL
+mk_SYSTOOLS: mk_SUDO
+	@\$(call echo_CHROOT_request)
+	@\$(call echo_PHASE, CHROOT JAIL )
+	@( sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) PREP_CHROOT_JAIL")
+	@( sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CHROOT_JAIL")
+	@touch \$@
+
+mk_CUSTOM_TOOLS: create-sbu_du-report
+	@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
+	  sudo mkdir -p ${BUILDDIR}${TRACKING_DIR}; \\
+	  (sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
+	fi;
+	@touch \$@
+
+mk_BLFS_TOOL: mk_CUSTOM_TOOLS
+	@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building BLFS_TOOL); \\
+	  sudo mkdir -p $BUILDDIR$TRACKING_DIR; \\
+	  sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"; \\
+	fi;
+	@touch \$@
+
+SETUP:            $host_prep
+AS_LUSER:         $cross_tools $temptools
+SUDO:	          $orphan_scripts
+PREP_CHROOT_JAIL:  SHELL=/tools/bin/bash
+PREP_CHROOT_JAIL: ${chroottools}
+CHROOT_JAIL:       SHELL=/tools/bin/bash
+CHROOT_JAIL:      $testsuitetools $basicsystem  $bootscripttools  $bootabletools
+CUSTOM_TOOLS:     $custom_list
+BLFS_TOOL:        $blfs_tool
+
+
+create-sbu_du-report:  mk_SYSTOOLS
+	@\$(call echo_message, Building)
+	@if [ "\$(ADD_REPORT)" = "y" ]; then \\
+	  ./create-sbu_du-report.sh logs $VERSION; \\
+	  \$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
+	fi;
+	@touch  \$@
+
+do-housekeeping:
+	@-umount \$(MOUNT_PT)/dev/pts
+	@-umount \$(MOUNT_PT)/dev/shm
+	@-umount \$(MOUNT_PT)/dev
+	@-umount \$(MOUNT_PT)/sys
+	@-umount \$(MOUNT_PT)/proc
+	@-rm /tools /cross-tools
+	@-if [ ! -f luser-exist ]; then \\
+		userdel \$(LUSER); \\
+		rm -rf \$(LUSER_HOME); \\
+	fi;
+
+EOF
+) >> $MKFILE
+
+fi
+
+################### BOOT #####################
+
+if [[ "${METHOD}" = "boot" ]]; then
+(
+cat << EOF
+
+all:	ck_UID mk_SETUP mk_CROSS mk_SUDO
+	@sudo make restore-luser-env
+	@sudo make do-housekeeping
+	@\$(call echo_boot_finished,$VERSION)
+
+makesys: mk_FINAL mk_CUSTOM_TOOLS mk_BLFS_TOOL
+	@echo "$VERSION - jhalfs build" > /etc/clfs-release
+	@\$(call echo_finished,$VERSION)
+
+
+ck_UID:
+	@if [ \`id -u\` = "0" ]; then \\
+	  echo "+--------------------------------------------------+"; \\
+	  echo "|You cannot run this makefile from the root account|"; \\
+	  echo "|However, if this is the boot environment          |"; \\
+	  echo "| the command you are looking for is               |"; \\
+	  echo "|   make makesys                                   |"; \\
+	  echo "| to finish off the build                          |"; \\
+	  echo "+--------------------------------------------------+"; \\
+	  exit 1; \\
+	fi
+
+#---------------AS ROOT
+
+mk_SETUP:
+	@\$(call echo_SU_request)
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
+	@touch \$@
+
+#---------------AS LUSER
+
+mk_CROSS: mk_SETUP
+	@\$(call echo_PHASE,Cross Tool)
+	@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) AS_LUSER" )
+	@touch \$@
+
+mk_SUDO: mk_CROSS
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SUDO
+	@touch \$@
+
+#---------------AS ROOT
+
+mk_FINAL:
+	@\$(call echo_PHASE,Final System)
+	@( source /root/.bash_profile && make BREAKPOINT=\$(BREAKPOINT) AS_ROOT )
+	@touch \$@
+
+mk_CUSTOM_TOOLS: mk_FINAL
+	@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
+	  mkdir -p ${TRACKING_DIR}; \\
+	  ( source /root/.bash_profile && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS ); \\
+	fi;
+	@touch \$@
+
+mk_BLFS_TOOL: mk_CUSTOM_TOOLS
+	@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building BLFS_TOOL); \\
+	  mkdir -p $TRACKING_DIR; \\
+	  ( source /root/.bash_profile && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL ); \\
+	fi
+	@touch \$@
+
+SETUP:        $host_prep
+AS_LUSER:     $cross_tools $temptools ${boottools}
+SUDO:	      $orphan_scripts
+AS_ROOT:      SHELL=/tools/bin/bash
+AS_ROOT:      $testsuitetools $basicsystem $bootscripttools $bootabletools
+CUSTOM_TOOLS: $custom_list
+BLFS_TOOL:    $blfs_tool
+
+do-housekeeping:
+	@-rm /tools /cross-tools
+	@-if [ ! -f luser-exist ]; then \\
+		userdel \$(LUSER); \\
+		rm -rf \$(LUSER_HOME); \\
+	fi;
+
+EOF
+) >> $MKFILE
+fi
+
+(
+ cat << EOF
+
+restore-luser-env:
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
+	fi;
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
+	touch \$@ && \\
+	echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
+	echo --------------------------------------------------------------------------------\$(WHITE)
+
+########################################################
+
+
+EOF
+) >> $MKFILE
+
+  # Bring over the items from the Makefile.tmp
+  cat $MKFILE.tmp >> $MKFILE
+  rm $MKFILE.tmp
+
+  echo "Creating Makefile... ${BOLD}DONE${OFF}"
+}
diff --git a/2.3/CLFS2/clfs2.xsl b/2.3/CLFS2/clfs2.xsl
new file mode 100644
index 0000000..76fa0f0
--- /dev/null
+++ b/2.3/CLFS2/clfs2.xsl
@@ -0,0 +1,153 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
+  %general-entities;
+]>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exsl="http://exslt.org/common"
+    extension-element-prefixes="exsl"
+    version="1.0">
+
+<!-- XSLT stylesheet to create shell scripts from CLFS2 books. -->
+
+  <!-- Install vim-lang package? -->
+  <xsl:param name="vim-lang" select="y"/>
+
+  <!-- Time zone -->
+  <xsl:param name="timezone" select="GMT"/>
+
+  <!-- Page size -->
+  <xsl:param name="page" select="letter"/>
+
+  <!-- Locale settings -->
+  <xsl:param name="lang" select="C"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//sect1"/>
+  </xsl:template>
+
+  <xsl:template match="sect1">
+    <xsl:choose>
+      <xsl:when test="../@id='chapter-partitioning' or
+                      ../@id='chapter-getting-materials' or
+                      ../@id='chapter-final-preps'"/>
+      <xsl:otherwise>
+        <xsl:if test="count(descendant::screen/userinput) &gt; 0 and
+                      count(descendant::screen/userinput) &gt;
+                      count(descendant::screen[@role='nodump'])">
+            <!-- The dirs names -->
+          <xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
+          <xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
+          <xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
+          <xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
+            <!-- The file names -->
+          <xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
+          <xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
+          <xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
+            <!-- The build order -->
+          <xsl:variable name="position" select="position()"/>
+          <xsl:variable name="order">
+            <xsl:choose>
+              <xsl:when test="string-length($position) = 1">
+                <xsl:text>00</xsl:text>
+                <xsl:value-of select="$position"/>
+              </xsl:when>
+              <xsl:when test="string-length($position) = 2">
+                <xsl:text>0</xsl:text>
+                <xsl:value-of select="$position"/>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:value-of select="$position"/>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:variable>
+            <!-- Creating dirs and files -->
+          <exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
+            <xsl:text>#!/bin/bash&#xA;set +h&#xA;</xsl:text>
+            <xsl:if test="not(@id='ch-system-stripping')">
+              <xsl:text>set -e&#xA;</xsl:text>
+            </xsl:if>
+            <xsl:text>&#xA;</xsl:text>
+            <xsl:if test="sect2[@role='installation']">
+              <xsl:text>cd $PKGDIR&#xA;</xsl:text>
+              <xsl:if test="@id='ch-system-vim' and $vim-lang = 'y'">
+                <xsl:text>tar -xvf ../vim-&vim-version;-lang.* --strip-components=1&#xA;</xsl:text>
+              </xsl:if>
+            </xsl:if>
+            <xsl:apply-templates select=".//para/userinput | .//screen"/>
+            <xsl:text>exit</xsl:text>
+          </exsl:document>
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="screen">
+    <xsl:if test="child::* = userinput and not(@role = 'nodump')">
+      <xsl:apply-templates select="userinput" mode="screen"/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="para/userinput"/>
+
+  <xsl:template match="userinput" mode="screen">
+    <xsl:choose>
+      <!-- Estandarized package formats -->
+      <xsl:when test="contains(string(),'tar.gz')">
+        <xsl:value-of select="substring-before(string(),'tar.gz')"/>
+        <xsl:text>tar.*</xsl:text>
+        <xsl:value-of select="substring-after(string(),'tar.gz')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Setting $LANG for /etc/profile -->
+      <xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
+                contains(string(),'export LANG=')">
+        <xsl:value-of select="substring-before(string(),'export LANG=')"/>
+        <xsl:text>export LANG=</xsl:text>
+        <xsl:value-of select="$lang"/>
+        <xsl:value-of select="substring-after(string(),'charmap]')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Compile the keymap into the kernel has been disabled -->
+      <xsl:when test="contains(string(),'defkeymap')"/>
+      <!-- Copying the kernel config file -->
+      <xsl:when test="string() = 'make mrproper'">
+        <xsl:text>make mrproper&#xA;</xsl:text>
+        <xsl:text>cp -v ../kernel-config .config&#xA;</xsl:text>
+      </xsl:when>
+      <!-- No interactive commands are needed if the .config file is the proper one -->
+      <xsl:when test="contains(string(),'menuconfig')"/>
+      <!-- Don't stop on strip run -->
+      <xsl:when test="contains(string(),'strip ')">
+        <xsl:apply-templates/>
+        <xsl:text> || true&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The rest of commands -->
+      <xsl:otherwise>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="replaceable">
+    <xsl:choose>
+      <xsl:when test="ancestor::sect1[@id='ch-cross-tools-glibc']">
+        <xsl:value-of select="$timezone"/>
+      </xsl:when>
+      <xsl:when test="ancestor::sect1[@id='ch-cross-tools-groff'] or
+                      ancestor::sect1[@id='ch-system-groff']">
+        <xsl:value-of select="$page"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>**EDITME</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>EDITME**</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/CLFS2/master.sh b/2.3/CLFS2/master.sh
new file mode 100644
index 0000000..f3d97fb
--- /dev/null
+++ b/2.3/CLFS2/master.sh
@@ -0,0 +1,536 @@
+#!/bin/bash
+# $Id$
+
+###################################
+###          FUNCTIONS          ###
+###################################
+
+
+#----------------------------#
+host_prep_Makefiles() {      # Initialization of the system
+#----------------------------#
+  local   CLFS_HOST
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}host prep files ( SETUP ) ${R_arrow}"
+
+  # defined here, only for ease of reading
+  CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
+(
+cat << EOF
+
+025-addinguser:
+	@\$(call echo_message, Building)
+	@if [ ! -d \$(LUSER_HOME) ]; then \\
+		groupadd \$(LGROUP); \\
+		useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
+	else \\
+		touch luser-exist; \\
+	fi;
+	@\$(call housekeeping)
+
+026-settingenvironment:  025-addinguser
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile  -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
+	fi;
+	@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
+	echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "CLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "PATH=\$(MOUNT_PT)/cross-tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "unset CFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "unset CXXFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_HOST=\"${CLFS_HOST}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_TARGET=\"${TARGET}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
+	touch envars && \\
+	chown \$(LUSER):\$(LGROUP) envars
+	@\$(call housekeeping)
+
+027-create-directories: 026-settingenvironment
+	@\$(call echo_message, Building)
+
+	@mkdir -p \$(MOUNT_PT)/{bin,boot,dev,{etc/,}opt,home,lib,mnt}
+	@mkdir -p \$(MOUNT_PT)/{proc,media/{floppy,cdrom},sbin,srv,sys}
+	@mkdir -p \$(MOUNT_PT)/var/{lock,log,mail,run,spool}
+	@mkdir -p \$(MOUNT_PT)/var/{opt,cache,lib/{misc,locate},local}
+	@install -d -m 0750 \$(MOUNT_PT)/root
+	@install -d -m 1777 \$(MOUNT_PT){/var,}/tmp
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}{bin,include,lib,sbin,src}
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{doc,info,locale,man}
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{misc,terminfo,zoneinfo}
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
+	@for dir in \$(MOUNT_PT)/usr{,/local}; do \\
+	  ln -s share/{man,doc,info} \$\$dir ; \\
+	done
+	@\$(call housekeeping)
+
+028-creating-sysfile: 027-create-directories
+	@\$(call echo_message, Building)
+
+	@touch \$(MOUNT_PT)/etc/mtab
+	@echo "root::0:0:root:/root:/bin/bash" >> \$(MOUNT_PT)/etc/passwd
+	@echo "root:x:0:" >> \$(MOUNT_PT)/etc/group
+	@echo "bin:x:1:"  >> \$(MOUNT_PT)/etc/group
+	@echo "sys:x:2:"  >> \$(MOUNT_PT)/etc/group
+	@echo "kmem:x:3"  >> \$(MOUNT_PT)/etc/group
+	@echo "tty:x:4:"  >> \$(MOUNT_PT)/etc/group
+	@echo "tape:x:5:"   >> \$(MOUNT_PT)/etc/group
+	@echo "daemon:x:6:" >> \$(MOUNT_PT)/etc/group
+	@echo "floppy:x:7:" >> \$(MOUNT_PT)/etc/group
+	@echo "disk:x:8:"   >> \$(MOUNT_PT)/etc/group
+	@echo "lp:x:9:"     >> \$(MOUNT_PT)/etc/group
+	@echo "dialout:x:10:" >> \$(MOUNT_PT)/etc/group
+	@echo "audio:x:11:"   >> \$(MOUNT_PT)/etc/group
+	@echo "video:x:12:"   >> \$(MOUNT_PT)/etc/group
+	@echo "utmp:x:13:"    >> \$(MOUNT_PT)/etc/group
+	@echo "usb:x:14:"     >> \$(MOUNT_PT)/etc/group
+	@echo "cdrom:x:15:"   >> \$(MOUNT_PT)/etc/group
+
+	@touch \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/{btmp,lastlog,wtmp}
+	@chmod 664 \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/lastlog
+	@chown -R \$(LUSER) \$(MOUNT_PT) && \\
+	chmod -R a+w \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
+	chmod -R a+w \$(SRCSDIR)
+	@\$(call housekeeping)
+
+EOF
+) >> $MKFILE.tmp
+
+  host_prep=" 025-addinguser 026-settingenvironment 027-create-directories 028-creating-sysfile"
+}
+
+
+#-----------------------------#
+cross_tools_Makefiles() {     #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}cross tools     ( LUSER ) ${R_arrow}"
+
+  for file in cross-tools/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+    #
+    # Skip this script...
+    case $this_script in
+      *cflags* | *variables* )  # work done in host_prep_Makefiles
+              continue ;;
+      *) ;;
+    esac
+
+    #
+    # Set the dependency for the first target.
+    if [ -z $PREV ] ; then PREV=028-creating-sysfile ; fi
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    cross_tools="$cross_tools $this_script"
+
+    # Grab the name of the target (minus the -headers or -cross in the case of gcc
+    # and binutils in chapter 5)
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
+                                  -e 's@-static@@' \
+                                  -e 's@-final@@' \
+				  -e 's@-64@@' \
+                                  -e 's@-n32@@'`
+    case $name in
+      glibc-headers) name="glibc" ;;
+    esac
+    pkg_tarball=$(get_package_tarball_name $name)
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+       LUSER_wrt_unpack "$pkg_tarball"
+       # If using optimizations, write the instructions
+       [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done # for file in ....
+}
+
+
+
+#-----------------------------#
+final_system_Makefiles() {    #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}final system    ( LUSER ) ${R_arrow}"
+
+  for file in final-system/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Test if the stripping phase must be skipped.
+    # Skip alsp temp-perl for iterative runs
+    case $this_script in
+      *stripping*) [[ "$STRIP" = "n" ]] && continue ;;
+    esac
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
+                                  -e 's@temp-@@' \
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@'`
+
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package.
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    # Append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    basicsystem="$basicsystem ${this_script}"
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      # Touch timestamp file if installed files logs will be created.
+      # But only for the firt build when running iterative builds.
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+      LUSER_wrt_unpack "$pkg_tarball"
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+  done  # for file in final-system/* ...
+}
+
+
+
+#-----------------------------#
+bootscripts_Makefiles() {     #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}bootscripts     ( LUSER ) ${R_arrow}"
+
+  for file in bootscripts/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    case $this_script in
+      *udev)     continue ;; # This is not a script but a commentary, we want udev-rules
+      *console*) continue ;; # Use the files that came with the bootscripts
+      *network*) continue ;; # Manually create these files
+      *)  ;;
+    esac
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    bootscripttools="$bootscripttools $this_script"
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'\
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@'`
+    case $name in
+      *bootscripts*) name=bootscripts-cross-lfs ;;
+      *udev-rules)   name=udev-cross-lfs ;;
+    esac
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_wrt_unpack "$pkg_tarball"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done  # for file in bootscripts/* ...
+
+}
+
+
+#-----------------------------#
+bootable_Makefiles() {        #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}make bootable   ( LUSER ) ${R_arrow}"
+
+  for file in bootable/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # A little housekeeping on the scripts
+    case $this_script in
+      *grub | *aboot | *colo | *silo | *arcload | *lilo | *reboot* )  continue ;;
+      *fstab)  [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
+      *kernel) # if there is no kernel config file do not build the kernel
+               [[ -z $CONFIG ]] && continue
+                 # Copy the config file to /sources with a standardized name
+               cp $CONFIG $BUILDDIR/sources/kernel-config
+        ;;
+    esac
+    #
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    # NOTE: new makfile format forces the last script, *chowning, into a separate
+    #  phase.
+    case ${this_script} in
+      *chowning) chowning=" ${this_script}"   ;;
+              *) bootable="$bootable $this_script"  ;;
+    esac
+    #
+    # Grab the name of the target, strip id number and misc words.
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-build@@' `
+    case $this_script in
+      *kernel*) name=linux
+       ;;
+    esac
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_wrt_unpack "$pkg_tarball"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+    fi
+    #
+    # Select a script execution method
+    case $this_script in
+      *fstab*)  if [[ -n "$FSTAB" ]]; then
+                  LUSER_wrt_CopyFstab
+                else
+                  LUSER_wrt_RunAsUser "${file}"
+                fi
+          ;;
+      *chowning)  wrt_RunAsRoot "${file}"
+          ;;
+              *)  LUSER_wrt_RunAsUser "${file}"
+          ;;
+    esac
+    #
+    # Housekeeping...remove any build directory(ies) except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done
+
+}
+
+
+#-----------------------------#
+build_Makefile() {            # Construct a Makefile from the book scripts
+#-----------------------------#
+  echo "Creating Makefile... ${BOLD}START${OFF}"
+
+  cd $JHALFSDIR/${PROGNAME}-commands
+  # Start with a clean Makefile.tmp file
+  >$MKFILE.tmp
+
+  host_prep_Makefiles
+  cross_tools_Makefiles            # $cross_tools
+  final_system_Makefiles           # $basicsystem
+  bootscripts_Makefiles            # $bootscripttools
+  bootable_Makefiles               # $bootable
+  # Add the CUSTOM_TOOLS targets, if needed
+  [[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
+  # Add the BLFS_TOOL targets, if needed.
+  [[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
+
+  # Add a header, some variables and include the function file
+  # to the top of the real Makefile.
+  wrt_Makefile_header
+
+  # Drop in the main target 'all:' and the chapter targets with each sub-target
+  # as a dependency.
+(
+cat << EOF
+
+all:	ck_UID mk_SETUP mk_LUSER create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL mk_ROOT
+	@sudo make restore-luser-env
+	@sudo make do-housekeeping
+	@\$(call echo_finished,$VERSION)
+
+ck_UID:
+	@if [ \`id -u\` = "0" ]; then \\
+	  echo "--------------------------------------------------"; \\
+	  echo "You cannot run this makefile from the root account"; \\
+	  echo "--------------------------------------------------"; \\
+	  exit 1; \\
+	fi
+
+mk_SETUP:
+	@\$(call echo_SU_request)
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
+	@touch \$@
+
+mk_LUSER: mk_SETUP
+	@\$(call echo_SULUSER_request)
+	@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
+	@touch \$@
+
+mk_CUSTOM_TOOLS: create-sbu_du-report
+	@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
+	  (sudo \$(SU_LUSER) "mkdir -p $BUILDDIR$TRACKING_DIR"); \\
+	  (sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
+	fi;
+	@touch \$@
+
+mk_BLFS_TOOL: mk_CUSTOM_TOOLS
+	@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building BLFS_TOOL); \\
+	  (sudo \$(SU_LUSER) "mkdir -p $BUILDDIR$TRACKING_DIR"); \\
+	  (sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"); \\
+	fi;
+	@touch \$@
+
+mk_ROOT: create-sbu_du-report
+	@\$(call echo_SU_request)
+	@echo "$VERSION-sysroot - jhalfs build" > clfs-release && \\
+	sudo mv clfs-release \$(MOUNT_PT)/etc
+	@sudo make BREAKPOINT=\$(BREAKPOINT) ROOT
+	@touch \$@
+
+SETUP:        $host_prep
+LUSER:        $cross_tools $basicsystem $bootscripttools $bootable
+CUSTOM_TOOLS: $custom_list
+BLFS_TOOL:    $blfs_tool
+ROOT:         $chowning
+
+
+create-sbu_du-report: mk_LUSER
+	@\$(call echo_message, Building)
+	@if [ "\$(ADD_REPORT)" = "y" ]; then \\
+	  ./create-sbu_du-report.sh logs $VERSION; \\
+	  \$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
+	fi;
+	@touch  \$@
+
+restore-luser-env:
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
+	fi;
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
+	touch \$@ && \\
+	echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
+	echo --------------------------------------------------------------------------------\$(WHITE)
+
+do-housekeeping:
+	@-if [ ! -f luser-exist ]; then \\
+		userdel \$(LUSER); \\
+		rm -rf \$(LUSER_HOME); \\
+	fi;
+
+EOF
+) >> $MKFILE
+
+  # Bring over the items from the Makefile.tmp
+  cat $MKFILE.tmp >> $MKFILE
+  rm $MKFILE.tmp
+  echo "Creating Makefile... ${BOLD}DONE${OFF}"
+
+}
diff --git a/2.3/CLFS3/clfs3.xsl b/2.3/CLFS3/clfs3.xsl
new file mode 100644
index 0000000..e0ec0f9
--- /dev/null
+++ b/2.3/CLFS3/clfs3.xsl
@@ -0,0 +1,154 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
+  %general-entities;
+]>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exsl="http://exslt.org/common"
+    extension-element-prefixes="exsl"
+    version="1.0">
+
+<!-- XSLT stylesheet to create shell scripts from CLFS2 books. -->
+
+  <!-- Endian level -->
+  <xsl:param name="endian" select="xbig"/>
+
+  <!-- Time zone -->
+  <xsl:param name="timezone" select="GMT"/>
+
+  <!-- Page size -->
+  <xsl:param name="page" select="letter"/>
+
+  <!-- Locale settings -->
+  <xsl:param name="lang" select="C"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//sect1"/>
+  </xsl:template>
+
+  <xsl:template match="sect1">
+    <xsl:choose>
+      <xsl:when test="../@id='chapter-partitioning' or
+                      ../@id='chapter-getting-materials' or
+                      ../@id='chapter-final-preps'"/>
+      <xsl:otherwise>
+        <xsl:if test="count(descendant::screen/userinput) &gt; 0 and
+                      count(descendant::screen/userinput) &gt;
+                      count(descendant::screen[@role='nodump'])">
+            <!-- The dirs names -->
+          <xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
+          <xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
+          <xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
+          <xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
+            <!-- The file names -->
+          <xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
+          <xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
+          <xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
+            <!-- The build order -->
+          <xsl:variable name="position" select="position()"/>
+          <xsl:variable name="order">
+            <xsl:choose>
+              <xsl:when test="string-length($position) = 1">
+                <xsl:text>00</xsl:text>
+                <xsl:value-of select="$position"/>
+              </xsl:when>
+              <xsl:when test="string-length($position) = 2">
+                <xsl:text>0</xsl:text>
+                <xsl:value-of select="$position"/>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:value-of select="$position"/>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:variable>
+            <!-- Creating dirs and files -->
+          <exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
+            <xsl:text>#!/bin/bash&#xA;set +h&#xA;set -e&#xA;&#xA;</xsl:text>
+            <!-- Set envars needed by uClibc -->
+            <xsl:if test="@id='ch-cross-tools-uclibc'">
+              <xsl:copy-of select="//sect1[@id='ch-cross-tools-toolchain']/screen"/>
+              <xsl:text>&#xA;&#xA;</xsl:text>
+            </xsl:if>
+            <xsl:if test="sect2[@role='installation']">
+              <xsl:text>cd $PKGDIR&#xA;</xsl:text>
+            </xsl:if>
+            <xsl:apply-templates select=".//para/userinput | .//screen"/>
+            <xsl:text>exit</xsl:text>
+          </exsl:document>
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="screen">
+    <xsl:if test="child::* = userinput and not(@role = 'nodump')">
+      <xsl:apply-templates select="userinput" mode="screen"/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="para/userinput"/>
+
+  <xsl:template match="userinput" mode="screen">
+    <xsl:choose>
+      <!-- Estandarized package formats -->
+      <xsl:when test="contains(string(),'tar.gz')">
+        <xsl:value-of select="substring-before(string(),'tar.gz')"/>
+        <xsl:text>tar.*</xsl:text>
+        <xsl:value-of select="substring-after(string(),'tar.gz')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Select Endian level for uClibc -->
+      <xsl:when test="$endian='xbig' and contains(string(),'LITTLE_ENDIAN')"/>
+      <xsl:when test="$endian='xlittle' and contains(string(),'BIG_ENDIAN')"/>
+      <!-- Setting $LANG for /etc/profile -->
+      <xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
+                contains(string(),'export LANG=')">
+        <xsl:value-of select="substring-before(string(),'export LANG=')"/>
+        <xsl:text>export LANG=</xsl:text>
+        <xsl:value-of select="$lang"/>
+        <xsl:value-of select="substring-after(string(),'charmap]')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Compile the keymap into the kernel has been disabled -->
+      <xsl:when test="contains(string(),'defkeymap')"/>
+      <!-- Copying the kernel config file -->
+      <xsl:when test="string() = 'make mrproper'">
+        <xsl:text>make mrproper&#xA;</xsl:text>
+        <xsl:text>cp -v ../kernel-config .config&#xA;</xsl:text>
+      </xsl:when>
+      <!-- No interactive commands are needed if the .config file is the proper one -->
+      <xsl:when test="contains(string(),'menuconfig')"/>
+      <!-- Don't stop on strip run -->
+      <xsl:when test="contains(string(),'strip ')">
+        <xsl:apply-templates/>
+        <xsl:text> || true&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The rest of commands -->
+      <xsl:otherwise>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="replaceable">
+    <xsl:choose>
+      <xsl:when test="ancestor::sect1[@id='ch-cross-tools-glibc']">
+        <xsl:value-of select="$timezone"/>
+      </xsl:when>
+      <xsl:when test="ancestor::sect1[@id='ch-cross-tools-groff'] or
+                      ancestor::sect1[@id='ch-system-groff']">
+        <xsl:value-of select="$page"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>**EDITME</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>EDITME**</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/CLFS3/master.sh b/2.3/CLFS3/master.sh
new file mode 100644
index 0000000..9f500dc
--- /dev/null
+++ b/2.3/CLFS3/master.sh
@@ -0,0 +1,586 @@
+#!/bin/bash
+# $Id$
+
+###################################
+###          FUNCTIONS          ###
+###################################
+
+
+#----------------------------#
+host_prep_Makefiles() {      # Initialization of the system
+#----------------------------#
+  local   CLFS_HOST
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}host prep files ( SETUP ) ${R_arrow}"
+
+  # defined here, only for ease of reading
+  CLFS_HOST="$(echo $MACHTYPE | sed "s/$(echo $MACHTYPE | cut -d- -f2)/cross/")"
+(
+cat << EOF
+
+025-addinguser:
+	@\$(call echo_message, Building)
+	@if [ ! -d \$(LUSER_HOME) ]; then \\
+		groupadd \$(LGROUP); \\
+		useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
+	else \\
+		touch luser-exist; \\
+	fi;
+	@\$(call housekeeping)
+
+026-settingenvironment:  025-addinguser
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile  -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
+	fi;
+	@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
+	echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "CLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "PATH=\$(MOUNT_PT)/cross-tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "unset CFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "unset CXXFLAGS" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_HOST=\"${CLFS_HOST}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_TARGET=\"${TARGET}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export CLFS_MIPS_LEVEL=\"${MIPS_LEVEL}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export BUILD=\"${ABI}\"" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
+	touch envars && \\
+	chown \$(LUSER):\$(LGROUP) envars
+	@\$(call housekeeping)
+
+027-create-directories: 026-settingenvironment
+	@\$(call echo_message, Building)
+
+	@mkdir -p \$(MOUNT_PT)/{bin,boot,dev,{etc/,}opt,home,lib,mnt}
+	@mkdir -p \$(MOUNT_PT)/{proc,media/{floppy,cdrom},sbin,srv,sys}
+	@mkdir -p \$(MOUNT_PT)/var/{lock,log,mail,run,spool}
+	@mkdir -p \$(MOUNT_PT)/var/{opt,cache,lib/{misc,locate},local}
+	@install -d -m 0750 \$(MOUNT_PT)/root
+	@install -d -m 1777 \$(MOUNT_PT){/var,}/tmp
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}{bin,include,lib,sbin,src}
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{doc,info,locale,man}
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/{misc,terminfo,zoneinfo}
+	@mkdir -p \$(MOUNT_PT)/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8}
+	@for dir in \$(MOUNT_PT)/usr{,/local}; do \\
+	  ln -s share/{man,doc,info} \$\$dir ; \\
+	done
+	@\$(call housekeeping)
+
+028-creating-sysfile: 027-create-directories
+	@\$(call echo_message, Building)
+
+	@touch \$(MOUNT_PT)/etc/mtab
+	@echo "root::0:0:root:/root:/bin/ash" >> \$(MOUNT_PT)/etc/passwd
+	@echo "root:x:0:" >> \$(MOUNT_PT)/etc/group
+	@echo "bin:x:1:"  >> \$(MOUNT_PT)/etc/group
+	@echo "sys:x:2:"  >> \$(MOUNT_PT)/etc/group
+	@echo "kmem:x:3"  >> \$(MOUNT_PT)/etc/group
+	@echo "tty:x:4:"  >> \$(MOUNT_PT)/etc/group
+	@echo "tape:x:5:"   >> \$(MOUNT_PT)/etc/group
+	@echo "daemon:x:6:" >> \$(MOUNT_PT)/etc/group
+	@echo "floppy:x:7:" >> \$(MOUNT_PT)/etc/group
+	@echo "disk:x:8:"   >> \$(MOUNT_PT)/etc/group
+	@echo "lp:x:9:"     >> \$(MOUNT_PT)/etc/group
+	@echo "dialout:x:10:" >> \$(MOUNT_PT)/etc/group
+	@echo "audio:x:11:"   >> \$(MOUNT_PT)/etc/group
+	@echo "video:x:12:"   >> \$(MOUNT_PT)/etc/group
+	@echo "utmp:x:13:"    >> \$(MOUNT_PT)/etc/group
+	@echo "usb:x:14:"     >> \$(MOUNT_PT)/etc/group
+	@echo "cdrom:x:15:"   >> \$(MOUNT_PT)/etc/group
+
+	@touch \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/{btmp,lastlog,wtmp}
+	@chmod 664 \$(MOUNT_PT)/var/run/utmp \$(MOUNT_PT)/var/log/lastlog
+	@chown -R \$(LUSER) \$(MOUNT_PT) && \\
+	chmod -R a+w \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
+	chmod -R a+w \$(SRCSDIR)
+	@\$(call housekeeping)
+
+EOF
+) >> $MKFILE.tmp
+
+  host_prep=" 025-addinguser 026-settingenvironment 027-create-directories 028-creating-sysfile"
+}
+
+#-----------------------------#
+systemprep_Makefiles() {      #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}system prep tools     ( LUSER ) ${R_arrow}"
+
+  for file in systemprep/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Set the dependency for the first target.
+    if [ -z $PREV ] ; then PREV=028-creating-sysfile ; fi
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile)
+    cross_tools="$cross_tools $this_script"
+
+    # Grab the name of the target (minus the -headers or -cross in the case of gcc
+    # and binutils in chapter 5)
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'`
+
+    pkg_tarball=$(get_package_tarball_name $name)
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+       LUSER_wrt_unpack "$pkg_tarball"
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    [[ "$pkg_tarball" != "" ]] && LUSER_RemoveBuildDirs "${name}"
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done # for file in ....
+}
+
+
+#-----------------------------#
+cross_tools_Makefiles() {     #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}cross tools     ( LUSER ) ${R_arrow}"
+
+  for file in cross-tools/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+    #
+    # Skip this script...
+    # NOTE.. the book indicated you only needed to install groff or file if the host
+    #   had older versions. The packages would be installed in the target directory
+    #   and not the host.
+    case $this_script in
+      *cflags* | *variables* | *abi | *toolchain*)  # work done in host_prep_Makefiles
+              continue ;;
+      *) ;;
+    esac
+
+    #
+    # Set the dependency for the first target.
+    if [ -z $PREV ] ; then PREV=028-creating-sysfile ; fi
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile)
+    cross_tools="$cross_tools $this_script"
+
+    # Grab the name of the target (minus the -headers or -cross in the case of gcc
+    # and binutils in chapter 5)
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
+                                  -e 's@-static@@' \
+                                  -e 's@-final@@' \
+				  -e 's@-64@@' \
+                                  -e 's@-n32@@'`
+    case $name in
+      uclibc*) name="uClibc" ;;
+    esac
+    pkg_tarball=$(get_package_tarball_name $name)
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+       LUSER_wrt_unpack "$pkg_tarball"
+      # Touch timestamp file if installed files logs will be created.
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+       # If using optimizations, write the instructions
+       [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done # for file in ....
+}
+
+
+
+#-----------------------------#
+final_system_Makefiles() {    #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}final system    ( LUSER ) ${R_arrow}"
+
+  for file in final-system/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' \
+                                  -e 's@temp-@@' \
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@'`
+
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package.
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    # Append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    basicsystem="$basicsystem ${this_script}"
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      # Touch timestamp file if installed files logs will be created.
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+      LUSER_wrt_unpack "$pkg_tarball"
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+  done  # for file in final-system/* ...
+}
+
+
+
+#-----------------------------#
+bootscripts_Makefiles() {     #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}bootscripts     ( LUSER ) ${R_arrow}"
+
+  for file in bootscripts/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    case $this_script in
+      *console*) continue ;; # Use the files that came with the bootscripts
+      *network*) continue ;; # Manually create these files
+      *)  ;;
+    esac
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    bootscripttools="$bootscripttools $this_script"
+
+    # Grab the name of the target, strip id number, XXX-script
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@'\
+                                  -e 's@-64bit@@' \
+                                  -e 's@-64@@' \
+                                  -e 's@64@@' \
+                                  -e 's@n32@@'`
+    case $name in
+      *bootscripts*) name=clfs-embedded-bootscripts ;;
+    esac
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_wrt_unpack "$pkg_tarball"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+    fi
+    #
+    LUSER_wrt_RunAsUser "${file}"
+    #
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done  # for file in bootscripts/* ...
+
+}
+
+
+#-----------------------------#
+bootable_Makefiles() {        #
+#-----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}make bootable   ( LUSER ) ${R_arrow}"
+
+  for file in bootable/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # A little housekeeping on the scripts
+    case $this_script in
+      *grub | *aboot | *colo | *silo | *arcload | *lilo | *reboot* )  continue ;;
+      *fstab)  [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
+      *kernel) # if there is no kernel config file do not build the kernel
+               [[ -z $CONFIG ]] && continue
+                 # Copy the config file to /sources with a standardized name
+               cp $CONFIG $BUILDDIR/sources/kernel-config
+        ;;
+    esac
+    #
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    # NOTE: new makfile format forces the last script, *chowning, into a separate
+    #  phase.
+    case ${this_script} in
+      *chowning) chowning=${this_script}   ;;
+              *) bootable="$bootable $this_script"  ;;
+    esac
+    #
+    # Grab the name of the target, strip id number and misc words.
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-build@@' `
+    case $this_script in
+      *kernel*) name=linux
+       ;;
+    esac
+
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+    #
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_wrt_unpack "$pkg_tarball"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_TouchTimestamp
+      fi
+    fi
+    #
+    # Select a script execution method
+    case $this_script in
+      *fstab*)  if [[ -n "$FSTAB" ]]; then
+                  LUSER_wrt_CopyFstab
+                else
+                  LUSER_wrt_RunAsUser "${file}"
+                fi
+          ;;
+      *chowning)  wrt_RunAsRoot "${file}"
+          ;;
+              *)  LUSER_wrt_RunAsUser "${file}"
+          ;;
+    esac
+    #
+    # Housekeeping...remove any build directory(ies) except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "${name}"
+      if [ "${INSTALL_LOG}" = "y" ] ; then
+        LUSER_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+    #
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+
+  done
+
+}
+
+
+#-----------------------------#
+build_Makefile() {            # Construct a Makefile from the book scripts
+#-----------------------------#
+  echo "Creating Makefile... ${BOLD}START${OFF}"
+
+  cd $JHALFSDIR/${PROGNAME}-commands
+  # Start with a clean Makefile.tmp file
+  >$MKFILE.tmp
+
+  host_prep_Makefiles
+  [[ "${PLATFORM% -*}" = "WRT" ]] && systemprep_Makefiles # $cross_tools
+  cross_tools_Makefiles            # $cross_tools
+  final_system_Makefiles           # $basicsystem
+  bootscripts_Makefiles            # $bootscripttools
+  bootable_Makefiles               # $bootable
+  # Add the CUSTOM_TOOLS targets, if needed
+  [[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
+
+  # Add a header, some variables and include the function file
+  # to the top of the real Makefile.
+  wrt_Makefile_header
+
+  # Drop in the main target 'all:' and the chapter targets with each sub-target
+  # as a dependency.
+(
+cat << EOF
+
+all:	ck_UID mk_SETUP mk_LUSER create-sbu_du-report mk_CUSTOM_TOOLS mk_ROOT
+	@sudo make restore-luser-env
+	@sudo make do-housekeeping
+	@\$(call echo_finished,$VERSION)
+
+ck_UID:
+	@if [ \`id -u\` = "0" ]; then \\
+	  echo "--------------------------------------------------"; \\
+	  echo "You cannot run this makefile from the root account"; \\
+	  echo "--------------------------------------------------"; \\
+	  exit 1; \\
+	fi
+
+mk_SETUP:
+	@\$(call echo_SU_request)
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
+	@touch \$@
+
+mk_LUSER: mk_SETUP
+	@\$(call echo_SULUSER_request)
+	@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
+	@touch \$@
+
+mk_CUSTOM_TOOLS: create-sbu_du-report
+	@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
+	  (sudo \$(SU_LUSER) "mkdir -p $BUILDDIR$TRACKING_DIR"); \\
+	  (sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
+	fi;
+	@touch \$@
+
+mk_ROOT:
+	@\$(call echo_SU_request)
+	@echo "$VERSION-embedded - jhalfs build" > clfs-release && \\
+	sudo mv clfs-release \$(MOUNT_PT)/etc
+	@sudo make BREAKPOINT=\$(BREAKPOINT) ROOT
+	@touch \$@
+
+
+SETUP:        $host_prep
+LUSER:	      $cross_tools $basicsystem $bootscripttools $bootable
+CUSTOM_TOOLS: $custom_list
+ROOT:	      $chowning
+
+
+create-sbu_du-report:  mk_LUSER
+	@\$(call echo_message, Building)
+	@if [ "\$(ADD_REPORT)" = "y" ]; then \\
+	  ./create-sbu_du-report.sh logs $VERSION; \\
+	  \$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
+	fi;
+	@touch  \$@
+
+restore-luser-env:
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
+	fi;
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
+	touch \$@ && \\
+	echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
+	echo --------------------------------------------------------------------------------\$(WHITE)
+
+do-housekeeping:
+	@-if [ ! -f luser-exist ]; then \\
+		userdel \$(LUSER); \\
+		rm -rf \$(LUSER_HOME); \\
+	fi;
+
+EOF
+) >> $MKFILE
+
+  # Bring over the items from the Makefile.tmp
+  cat $MKFILE.tmp >> $MKFILE
+  rm $MKFILE.tmp
+  echo "Creating Makefile... ${BOLD}DONE${OFF}"
+
+}
+
diff --git a/2.3/Config.in b/2.3/Config.in
new file mode 100644
index 0000000..01eac91
--- /dev/null
+++ b/2.3/Config.in
@@ -0,0 +1,1108 @@
+menu "--- BOOK Settings"
+
+	#--- BOOK/script
+	choice
+		prompt "Use BOOK"
+		default BOOK_LFS
+		help
+			#-- Select the BOOK/Build style you wish to configure.
+
+		config	BOOK_LFS
+			bool "Linux From Scratch"
+
+		config	BOOK_CLFS
+			bool "Cross-Compiled Linux From Scratch"
+
+		config	BOOK_CLFS2
+			bool "Cross-Compiled Linux From Scratch (Sysroot method)"
+
+		config	BOOK_CLFS3
+			bool "Cross-Compiled Linux From Scratch (Embedded Systems)"
+
+		config	BOOK_HLFS
+			bool "Hardened Linux From Scratch"
+
+		config	BOOK_BLFS
+			bool "Beyond Linux From Scratch"
+	endchoice
+
+	config	PROGNAME
+		string
+		default	"lfs"		if BOOK_LFS
+		default	"clfs"		if BOOK_CLFS
+		default	"clfs2"		if BOOK_CLFS2
+		default	"clfs3"		if BOOK_CLFS3
+		default	"hlfs"		if BOOK_HLFS
+		default	"blfs"		if BOOK_BLFS
+
+	config	RUN_ME
+		string
+		default	"./jhalfs run"	if !BOOK_BLFS
+		default	"./blfs-tool"	if BOOK_BLFS
+	#--- End BOOK/script
+
+	#--- Book version
+	choice
+		prompt	"Release"
+		default	relSVN
+		config	relSVN
+			bool	"SVN"
+			help
+				#-- Current development version as in trunk
+
+		config	WORKING_COPY
+			bool	"Working Copy"
+			depends on !BOOK_BLFS
+			help
+				#-- A local working copy
+
+		config	BRANCH
+			bool	"Branch or stable book" if !BOOK_CLFS2 && !BOOK_CLFS3
+			help
+				#-- A supported SVN branch or stable released book
+	endchoice
+
+	config	BRANCH_ID
+		string	"Book Version (mandatory)"
+		default	"**EDIT ME**"
+		depends	BRANCH
+		help
+			#-- A list of valid branches and stable books ID's is available here.
+			#   http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks
+
+	config	BOOK
+		string	"Loc of working copy (mandatory)"
+		default	"**EDIT ME**"
+		depends	WORKING_COPY
+		help
+			#-- The full path to a local copy of the book XML sources
+			#
+	#--- End BOOK version
+
+	#--- CLFS specific params
+	choice
+		prompt	"Target architecture"
+		default	ARCH_X86
+		depends	BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3
+		help
+			#-- Choose the target system base architecture
+
+		config	ARCH_X86
+			bool	"x86"
+
+		config	ARCH_MIPS
+			bool	"mips"	if !BOOK_CLFS2
+
+		config	ARCH_PPC
+			bool	"ppc"	if BOOK_CLFS
+
+		config	ARCH_SPARC
+			bool	"sparc"	if BOOK_CLFS
+
+		config	ARCH_ALPHA
+			bool	"alpha"	if !BOOK_CLFS3
+
+		config	ARCH_ARM
+			bool	"arm"	if !BOOK_CLFS
+
+		config	ARCH_HPPA
+			bool	"hppa"	if BOOK_CLFS2
+	endchoice
+
+	choice
+		prompt	"Hardware Platform"
+		depends	BOOK_CLFS3 && ARCH_MIPS
+		default	PLATFORM_GENERIC
+		help
+			# Chose a destination platform
+			# Platform specific files will be included
+
+		config	PLATFORM_GENERIC
+			bool	"Generic platform"
+
+		config	PLATFORM_WRT
+			bool	"WRT - MIPS based wireless router" if ARCH_MIPS
+	endchoice
+
+	choice
+		prompt	"Library"
+		depends	(BOOK_CLFS && !ARCH_ALPHA) || (BOOK_CLFS3 && ARCH_MIPS)
+		default	DATA_32
+		help
+			#-- Choose the target system libraries type
+
+		config	DATA_32
+			bool	"32-bit"
+
+		config	DATA_64
+			bool	"64-bit"	if !ARCH_PPC
+
+		config	DATA_MULTI
+			bool	"multilib"	if !(BOOK_CLFS3 && ARCH_MIPS )
+	endchoice
+
+	choice
+		prompt	"Processor type"
+		depends	(BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3) && ((ARCH_X86 && !(DATA_64 || DATA_MULTI)) || ARCH_MIPS || ARCH_HPPA || ARCH_ALPHA || (ARCH_SPARC && (DATA_64 || DATA_MULTI)) || (ARCH_ARM && BOOK_CLFS3))
+		help
+			#-- Choose the target system processor
+
+		config	PROC_i486
+			bool	"486 Compatibles"					if ARCH_X86
+
+		config	PROC_i586
+			bool	"Pentium, K6, 586 Compatibles"				if ARCH_X86
+
+		config	PROC_i686
+			bool	"Pentium II, Pentium III, Pentium 4, Athlon, Duron"	if ARCH_X86
+
+		config	PROC_mipsel
+			bool	"MIPS Little Endian"					if ARCH_MIPS
+
+		config	PROC_mips
+			bool	"MIPS Big Endian"					if ARCH_MIPS
+
+		config	PROC_unknown
+			bool	"Unknown"						if ARCH_HPPA || ARCH_ALPHA
+
+		config	PROC_hppa1
+			bool	"PA 7000 Series"					if ARCH_HPPA
+
+		config	PROC_hppa2
+			bool	"PA 8000 Series"					if ARCH_HPPA
+
+		config	PROC_EV5
+			bool	"EV5 Series"						if ARCH_ALPHA
+
+		config	PROC_EV56
+			bool	"EV56 Series"						if ARCH_ALPHA
+
+		config	PROC_PCA56
+			bool	"PCA56 Series"						if ARCH_ALPHA
+
+		config	PROC_PCA57
+			bool	"PCA57 Series"						if ARCH_ALPHA
+
+		config	PROC_EV6
+			bool	"EV6 Series"						if ARCH_ALPHA
+
+		config	PROC_EV67
+			bool	"EV67 Series"						if ARCH_ALPHA
+
+		config	PROC_EV68
+			bool	"EV68 Series"						if ARCH_ALPHA
+
+		config	PROC_ARM
+			bool	"Generic arm, little endian"				if ARCH_ARM
+
+		config	PROC_ARM5L
+			bool	"Generic arm, version 5, little endian"			if ARCH_ARM
+
+		config	PROC_ARM5B
+			bool	"Generic arm, version 5, big endian"			if ARCH_ARM
+
+		config	PROC_ULTRA1
+			bool	"UtraSparc"						if ARCH_SPARC && (DATA_64 || DATA_MULTI)
+
+		config	PROC_ULTRA2
+			bool	"UtraSparc2"						if ARCH_SPARC && (DATA_64 || DATA_MULTI)
+
+		config	PROC_ULTRA3
+			bool	"UtraSparc3"						if ARCH_SPARC && (DATA_64 || DATA_MULTI)
+	endchoice
+
+	choice
+		prompt	"MIPS 64 ABI"
+		depends	BOOK_CLFS3 && ARCH_MIPS && DATA_64
+		default	ABI_64
+		help
+			#-- Choose the target system ABI to use
+
+		config	ABI_32
+			bool	"o32"
+
+		config	ABI_N32
+			bool	"n32"
+
+		config	ABI_64
+			bool	"n64"
+	endchoice
+
+	config TARGET
+		string
+		default "i486-pc-linux-gnu"		if !BOOK_CLFS3 && PROC_i486
+		default "i586-pc-linux-gnu"		if !BOOK_CLFS3 && PROC_i586
+		default "i686-pc-linux-gnu"		if !BOOK_CLFS3 && PROC_i686
+
+		default "i486-pc-linux-uclibc"		if  BOOK_CLFS3 && PROC_i486
+		default "i586-pc-linux-uclibc"		if  BOOK_CLFS3 && PROC_i586
+		default "i686-pc-linux-uclibc"		if  BOOK_CLFS3 && PROC_i686
+
+		default	"x86_64-unknown-linux-gnu"	if  ARCH_X86   && (DATA_64 || DATA_MULTI)
+
+		default "mipsel-unknown-linux-gnu"	if !BOOK_CLFS3 && PROC_mipsel && DATA_32
+		default "mips-unknown-linux-gnu"	if !BOOK_CLFS3 && PROC_mips   && DATA_32
+		default	"mips64el-unknown-linux-gnu"	if !BOOK_CLFS3 && PROC_mipsel && (DATA_64 || DATA_MULTI)
+		default	"mips64-unknown-linux-gnu"	if !BOOK_CLFS3 && PROC_mips   && (DATA_64 || DATA_MULTI)
+
+		default "mipsel-unknown-linux-uclibc"	if  BOOK_CLFS3 && PROC_mipsel && DATA_32
+		default "mips-unknown-linux-uclibc"	if  BOOK_CLFS3 && PROC_mips   && DATA_32
+		default "mips64el-unknown-linux-uclibc"	if  BOOK_CLFS3 && PROC_mipsel && DATA_64
+		default "mips64-unknown-linux-uclibc"	if  BOOK_CLFS3 && PROC_mips   && DATA_64
+
+		default	"powerpc-unknown-linux-gnu"	if  ARCH_PPC   && DATA_32
+		default "powerpc64-unknown-linux-gnu"	if  ARCH_PPC   && DATA_MULTI
+
+		default "sparc-unknown-linux-gnu"	if  ARCH_SPARC && DATA_32
+		default "sparc64-unknown-linux-gnu"	if  ARCH_SPARC && (DATA_64 || DATA_MULTI)
+
+		default	"hppa-unknown-linux-gnu"	if  PROC_unknown && ARCH_HPPA
+		default	"hppa1.1-unknown-linux-gnu"	if  PROC_hppa1
+		default	"hppa2.0-unknown-linux-gnu"	if  PROC_hppa2
+
+		default	"arm-unknown-linux-gnu"		if  ARCH_ARM && BOOK_CLFS2
+
+		default "arm-unknown-linux-uclibc"	if  PROC_ARM
+		default "armv5l-unknown-linux-uclibc"	if  PROC_ARM5L
+		default "armv5b-unknown-linux-uclibc"	if  PROC_ARM5B
+
+		default "alpha-unknown-linux-gnu"	if  PROC_unknown && ARCH_ALPHA
+		default "alphaev5-unknown-linux-gnu"	if  PROC_EV5
+		default "alphaev56-unknown-linux-gnu"	if  PROC_EV56
+		default "alphapca56-unknown-linux-gnu"	if  PROC_PCA56
+		default "alphapca57-unknown-linux-gnu"	if  PROC_PCA57
+		default "alphaev6-unknown-linux-gnu"	if  PROC_EV6
+		default "alphaev67-unknown-linux-gnu"	if  PROC_EV67
+		default "alphaev68-unknown-linux-gnu"	if  PROC_EV68
+
+	config TARGET32
+		string
+		depends	DATA_MULTI
+		default "i686-pc-linux-gnu"		if ARCH_X86
+		default "mipsel-unknown-linux-gnu"	if PROC_mipsel
+		default "mips-unknown-linux-gnu"	if PROC_mips
+		default "sparc-unknown-linux-gnu"	if ARCH_SPARC
+		default "powerpc-unknown-linux-gnu"	if ARCH_PPC
+
+	config  PLATFORM
+		string
+		default "GENERIC"			if (!BOOK_CLFS3) || PLATFORM_GENERIC
+		default	"WRT - Wireless Router"		if PLATFORM_WRT
+
+	config  SPARC64_PROC
+		string
+		default "none"				if !(ARCH_SPARC && (DATA_64 || DATA_MULTI))
+		default	"1"				if PROC_ULTRA1
+		default	"2"				if PROC_ULTRA2
+		default	"3"				if PROC_ULTRA3
+
+	config	ARCH
+		string
+		default	"x86"		if ARCH_X86   && (DATA_32 || BOOK_CLFS2 || BOOK_CLFS3)
+		default	"x86_64"	if ARCH_X86   && DATA_MULTI
+		default	"x86_64-64"	if ARCH_X86   && DATA_64
+
+		default	"wrt"		if PLATFORM_WRT && BOOK_CLFS3
+
+		default	"mips"		if ARCH_MIPS  && (DATA_32 || BOOK_CLFS3)
+		default	"mips64"	if ARCH_MIPS  && DATA_MULTI
+		default	"mips64-64"	if ARCH_MIPS  && DATA_64 && BOOK_CLFS
+
+
+		default	"ppc"		if ARCH_PPC   && DATA_32
+		default	"ppc64"		if ARCH_PPC   && DATA_MULTI
+
+		default	"sparc"		if ARCH_SPARC && DATA_32
+		default	"sparc64"	if ARCH_SPARC && DATA_MULTI
+		default	"sparc64-64"	if ARCH_SPARC && DATA_64
+
+		default	"alpha"		if ARCH_ALPHA
+		default	"arm"		if ARCH_ARM
+		default	"hppa"		if ARCH_HPPA
+
+	config  MIPS_LEVEL
+		string
+		depends BOOK_CLFS3 && ARCH_MIPS
+		default	"1"		if DATA_32
+		default "3"		if DATA_64
+
+	config	ABI
+		string
+		depends BOOK_CLFS3
+		default "-m32"		if ARCH_X86 || ARCH_ARM
+#		default "-m64"		if NO USED YET IN THE BOOK
+		default "-mabi=32"	if ABI_32 || (ARCH_MIPS && DATA_32)
+		default "-mabi=n32"	if ABI_N32
+		default "-mabi=64"	if ABI_64
+
+	config	ENDIAN
+		string
+		depends BOOK_CLFS3 && (ARCH_MIPS || ARCH_ARM)
+		default "little"	if PROC_mipsel || PROC_ARM || PROC_ARM5L
+		default "big"		if PROC_mips || PROC_ARM5B
+
+	choice
+		prompt	"Build method"
+		depends	BOOK_CLFS
+		help
+			#-- What build method should be used: a chroot jail or minimal boot system
+			#   Review the Cross-LFS book chap6 "TO BOOT OR CHROOT" for a full explanation.
+
+		config	BUILD_CHROOT
+			bool	"chroot"
+
+		config	BUILD_BOOT
+			bool	"boot"
+	endchoice
+
+	config	METHOD
+		string
+		default	"chroot"	if BUILD_CHROOT
+		default	"boot"		if BUILD_BOOT
+
+	config	BOOT_CONFIG
+		string	"BOOT kernel config file (mandatory)"
+		default "***EDIT ME***"
+		depends on BUILD_BOOT
+		help
+			#-- If METHOD=boot, location of boot-kernel config file
+			#   The config file will be copied to ${BUILD_DIR}/sources
+			#   and renamed 'bootkernel-config'
+			#
+			# NOTE: this setting is required
+	#--- End CLFS specific params
+
+	#--- HLFS specific params
+	config	GRSECURITY_HOST
+		bool	"Building on grsecurity enabled host?"
+		default	n
+		depends on BOOK_HLFS
+		help
+			#-- If your build system has grsecurity patches applied
+			#   you MUST enable this switch.
+
+	choice
+		prompt "Library"
+		depends on BOOK_HLFS
+		help
+			#-- Which library model to use: uClibc/glibc
+
+		config	LIB_GLIBC
+			bool "glibc"
+
+		config	LIB_UCLIBC
+			bool "uClibc"
+	endchoice
+
+	config	MODEL
+		depends on BOOK_HLFS
+		string
+		default	"glibc"		if LIB_GLIBC
+		default "uclibc"	if LIB_UCLIBC
+
+	choice
+		prompt "Kernel series"
+		depends on BOOK_HLFS
+		help
+			#-- Which kernel series to use: 2.6/2.4
+
+		config	KERNEL_26
+			bool "2.6 kernel series"
+
+		config	KERNEL_24
+			bool "2.4 kernel series"
+	endchoice
+
+	config	KERNEL
+		depends on BOOK_HLFS
+		string
+		default	"2.6"		if KERNEL_26
+		default	"2.4"		if KERNEL_24
+
+#         menu	"HLFS Additional Features"
+# 		depends on BOOK_HLFS
+#
+# 		config	SET_SSP
+# 		bool	"Stack-smashing protector"
+# 		default	y
+#
+# 		config	SET_ASLR
+# 		bool	"Address-space layout randomization"
+# 		default	y
+#
+# 		config	SET_PAX
+# 		bool	"PaX-aware ELF executables and kernel"
+# 		default	y
+#
+# 		config	SET_HARDENED_TMP
+# 		bool	"Hardened temporary files creation"
+# 		default	y
+#
+# 		config	SET_WARNINGS
+# 		bool	"Additional warnings"
+# 		default	y
+#
+# 		config	SET_MISC
+# 		bool	"Miscellaneous features"
+# 		default	y
+#
+# 		config	SET_BLOWFISH
+# 		bool	"Blowfish passwords"
+# 		default	y
+# 	endmenu
+
+	config	SSP
+#		depends on SET_SSP
+		string
+		default ",ssp,"
+
+	config	ASLR
+#		depends on SET_ASLR
+		string
+		default ",aslr,"
+
+	config	PAX
+#		depends on SET_PAX
+		string
+		default ",pax,"
+
+	config	HARDENED_TMP
+#		depends on SET_HARDENED_TMP
+		string
+		default ",hardened_tmp,"
+
+	config	WARNINGS
+#		depends on SET_WARNINGS
+		string
+		default ",warnings,"
+
+	config	MISC
+#		depends on SET_MISC
+		string
+		default ",misc,"
+
+	config	BLOWFISH
+#		depends on SET_BLOWFISH
+		string
+		default ",blowfish,"
+	#--- End HLFS specific params
+
+	#--- Custom Tools support
+	config CUSTOM_TOOLS
+		bool	"Add custom tools support"
+		default	n
+		depends on !BOOK_BLFS
+		help
+			#--- Activating this option additional packages you create
+			#    will be installed after finished the xLFS system build.
+			#
+	#--- End Custom Tools support
+
+	#--- blfs-tool Support
+	config BLFS_TOOL
+		bool	"Add blfs-tool support"
+		default	n
+		depends on !BOOK_BLFS && !BOOK_CLFS3
+		help
+			#--- Activating this option will install additional
+			#    packages needed to use blfs-tool when booting
+			#    the new system.
+			#
+			#    The blfs-tool files will be installed under
+			#    $BUILD_DIR/blfs_root.
+
+			#    After booting the new xLFS system you should to
+			#    create an user account and move the /blfs-root
+			#    directory to the user's home, making he the
+			#    directory and files owner, before start
+			#    using blfs-tool.
+			#
+			#    Also, be sure to bring to that user read and write
+			#    privileges over the $TRACKING_DIR directory and
+			#    the files that it contains.
+			#
+			#    And don't forget to configure sudo properly.
+
+	choice
+		prompt	"BLFS Release"
+		default	BLFS_SVN
+		depends on BLFS_TOOL
+		config	BLFS_SVN
+			bool	"BLFS SVN"
+			help
+				#-- Current development version as in trunk
+
+		config	BLFS_BRANCH
+			bool	"BLFS Branch or stable book"
+			help
+				#-- A supported SVN branch or stable released book
+	endchoice
+
+	config	BLFS_BRANCH_ID
+		string	"BLFS Book Version (mandatory)"
+		default	"**EDIT ME**"
+		depends on BLFS_BRANCH
+		help
+			#-- A list of valid branches and stable books ID's is available here.
+			#   http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks
+
+	menu "blfs-tool dependencies"
+		depends on BLFS_TOOL
+
+		config	DEP_LIBXML
+		bool	"libxml2 (required)"
+		default	y
+
+		config	DEP_LIBXSLT
+		bool	"libxslt (required)"
+		default	y
+
+		config	DEP_TIDY
+		bool	"tidy (required)"
+		default	y
+
+		config	DEP_DBXML
+		bool	"DocBook XML DTD (required)"
+		default	y
+
+		config	DEP_UNZIP
+		bool	"UnZip (required to install DocBook XML DTD)"
+		default	y
+		depends on DEP_DBXML
+
+		#config	DEP_DBXSL
+		#bool	"DocBook XSL (required)"
+		#default	y
+
+		config	DEP_LINKS
+		bool	"links (required)"
+		default	y
+
+		config	DEP_SUDO
+		bool	"sudo (recommended)"
+		default	y
+
+		config	DEP_WGET
+		bool	"wget (recommended)"
+		default	y
+
+		config	DEP_GPM
+		bool	"GPM (optional, see help)"
+		default	y
+		help
+			#-- You MUST to install manually the gpm bootscript
+			#   and create its configuration file.
+			#
+			#   An alternative is to unselect this option and
+			#   install gpm, its configuration file, and its
+			#   bootscript using the custom tools support.
+
+		config	DEP_SVN
+		bool	"SVN client (optional, see help)"
+		default	n
+		help
+			#-- Subversion-1.3.1 will be installed. This version is
+			#   old but does not rely on additional packages to be
+			#   built.
+			#
+			#   If you are happy with this old version and don't
+			#   need extra features, select this option.
+	endmenu
+	#--- End blfs-tool Support
+
+	#--- BLFS specific params
+	config	BLFS_ROOT
+		string "Directory root"
+		default "$HOME/blfs_root" if BOOK_BLFS
+		default "/blfs_root" if BLFS_TOOL
+		depends on BOOK_BLFS || BLFS_TOOL
+		help
+			#-- Full path to the directory where all required
+			#   files and scripts will be stored.
+
+	config	BLFS_XML
+		string "BLFS sources directory"
+		default "blfs-xml"
+		depends on BOOK_BLFS || BLFS_TOOL
+		help
+			#-- The directory name under $BLFS_ROOT where BLFS book
+			#   sources will be checkout.
+
+	config	TRACKING_DIR
+		string "Installed packages database directory"
+		default "/var/lib/jhalfs/BLFS"
+		depends on BOOK_BLFS || BLFS_TOOL || CUSTOM_TOOLS
+		help
+			#-- Full path to the directory where the installed
+			#   packages database will be created.
+			#
+			#   If you are installing blfs-tool on a running xLFS system
+                        #   you MUST to create manually this directory.
+                        #
+                        #   If you are installing blfs-tool as part of a xLFS build
+                        #   and/or using the customized scripts feature, you will
+                        #   need to fix that directory permissions after booting
+                        #   the new system.
+			#
+			#   Note that the user that will build the packages must
+			#   have read and write privileges on that directory.
+	#--- End BLFS specific params
+
+#--- End BOOK Settings
+endmenu
+
+menu "--- General Settings"
+	depends on !BOOK_BLFS
+
+	#--- Set User Account
+	config	CONFIG_USER
+		bool	"Change the default user/group and homedir for this build"
+		default	n
+		help	#-- Unprivileged user and group name
+			#   If you do not have the priv to create/delete
+			#   users and groups you can specifiy your own
+			#   user id for the build
+			#
+			# default values for each book
+			# LFS    lfs
+			# CLFS*  clfs
+			# HLFS   hlfs
+			#
+			# Also, if your host place users home dirs into a
+			# directory other than /home you can specify it here.
+
+	config	DEF_USER
+		string
+		default	"lfs"	if BOOK_LFS
+		default	"clfs"	if BOOK_CLFS || BOOK_CLFS2 || BOOK_CLFS3
+		default "hlfs"	if BOOK_HLFS
+
+	config	SET_USER
+		string	"User account"
+		depends	CONFIG_USER
+		default	DEF_USER
+
+	config	CONFIG_GROUP
+		bool	"Set Group?"
+		default	n
+		depends	CONFIG_USER
+
+	config	SET_GROUP
+		string	"GROUP account"
+		depends	CONFIG_GROUP
+		default	DEF_USER
+
+	config	CONFIG_HOME
+		bool	"Set home dir?"
+		default	n
+		depends	CONFIG_USER
+
+	config	SET_HOME
+		string	"Path to the directory where user home dir will be created"
+		depends	CONFIG_HOME
+		default	"/home"
+
+	config	LUSER
+		string
+		default	DEF_USER	if !CONFIG_USER
+		default	SET_USER	if  CONFIG_USER
+
+	config	LGROUP
+		string
+		default	LUSER		if !CONFIG_GROUP
+		default	SET_GROUP	if  CONFIG_GROUP
+
+	config	LHOME
+		string
+		default	"/home"		if !CONFIG_HOME
+		default	SET_HOME	if  CONFIG_HOME
+	#--- End Set User Account
+
+	config BUILDDIR
+		string "Build Directory"
+		default "/mnt/build_dir"
+		help
+			#-- The directory where the created system will be located.
+
+	config	GETPKG
+		bool "Retrieve source files"
+		default n
+		help
+			#-- Download all packages and patches required by the book selected
+			#   NOTE: Looks for files in the local archive defined by SRC_ARCHIVE
+			#   first and if necessary retrieve them from the 'net.
+			#   Files will be transfered to $BUILDDIR/sources.
+
+	config SRC_ARCHIVE
+		string "Package Archive Directory"
+		default "$SRC_ARCHIVE"
+		depends GETPKG
+		help
+			#-- A local archive for packages/file (not $BUILDDIR/sources)
+			#   Used only if GETPKG = 1
+			#   Any missing file will be downloaded and archived here,
+			#   if the user has the right priviledges.
+
+	config SERVER
+		string "FTP mirror"
+		default "ftp://ftp.lfs-matrix.net"
+		depends GETPKG
+		help
+			#-- FTP mirror to download packages and patches if not found
+			#   in $SRC_ARCHIVE
+			#   As a last resort, the files will dowloaded from upstream,
+                        #   if possible.
+
+	config	GETKERNEL
+		bool	"Always retrieve kernel package (see help)"
+		default	y if BOOK_LFS || BOOK_HLFS
+		depends GETPKG
+		help
+			#-- Get the kernel package and patches even if no kernel
+			#   configuration file has been supplied.
+
+			# NOTE:
+			#   The kernel package must be available when building
+			#   the SVN version of LFS or HLFS to can install the
+			#   headers files.
+			#
+			#   If building LFS-6.2 this setting can be disabled.
+
+	config	RUNMAKE
+		bool	"Run the makefile"
+		default n
+		help
+			#-- Automatically run the makefile once it has been created
+
+	config	CLEAN
+		bool	"Rebuild files"
+		default	n
+		help
+			#-- Clean the build directory before performing any other task.
+			#   The directory is cleaned only if it was populated by a
+			#   previous JHALFS run.
+			#
+
+#--- End General Settings
+endmenu
+
+menu "--- Build Settings"
+	depends on !BOOK_BLFS
+
+	#--- Test Suites
+	config	CONFIG_TESTS
+		bool	"Run testsuites"
+		depends	!BOOK_CLFS2 && !BOOK_CLFS3
+		default	y
+		help
+			#-- Run test suites
+			#
+			#  You will can to select between:
+			#
+			#  - Only final system Glibc, GCC and Binutils testsuites
+			#  - All final system testsuites
+			#  - Both temporary tools and final system testsuites
+			#
+			#  HLFS and CLFS has no testsuites available in the
+			#  temporary tools phase
+
+			#  You will be promt also about the "flavour" of the
+			#  testsuites run:
+			#
+			#  - Don't stop on test suite failures
+			#  - Abort the build at the first test suite failure
+			#
+
+	choice
+		prompt	"Tests level"
+		depends	 CONFIG_TESTS
+		default	TEST_1
+
+		config	TST_1
+			bool	"Only final system Glibc, GCC and Binutils testsuites"
+
+		config	TST_2
+			bool	"All final system testsuites"
+
+		config	TST_3
+			bool	"Both temporary tools and final system testsuites" if !BOOK_HLFS && !BOOK_CLFS
+	endchoice
+
+	config	TEST
+		int
+		default	"0"	if !CONFIG_TESTS
+		default	"1"	if TST_1
+		default	"2"	if TST_2
+		default	"3"	if TST_3
+
+	choice
+		prompt	"Flavour"
+		depends	CONFIG_TESTS
+
+		config	NO_BOMB
+			bool	"Don't stop on test suite failures"
+
+		config	BOMB
+			bool	"Abort the build at the first test suite failure"
+	endchoice
+
+	config	BOMB_TEST
+		bool
+		default	n if NO_BOMB
+		default	y if BOMB
+
+	#--- End Test Suites
+
+	#--- Installed files logs
+	config	INSTALL_LOG
+		bool	"Create installed files logs"
+		default	n
+		help
+			#-- Select this if you want to create logs of the files
+			#   installed by each package on the final system.
+
+	#--- End Installed files logs
+
+	#--- FSTAB
+	config	HAVE_FSTAB
+		bool	"Use a custom fstab file"
+		default	n
+		help
+			#-- Select this if you have ready a proper fstab file
+
+	config	FSTAB
+		string	"Fstab file (optional)"
+		default	"***EDIT ME***"
+		depends on HAVE_FSTAB
+		help
+			#-- The location of fstab file (if empty, a template is created)
+	#--- End FSTAB
+
+	#--- Kernel
+	config	CONFIG_BUILD_KERNEL
+		bool	"Build the kernel"
+		default	n
+		help
+			#-- Select this option if you wish to build the kernel.
+			#
+			#   You will be prompted for the full path to the .config
+			#   file. It will be copied to the 'sources' directory and
+			#   rename kernel-config
+
+	config	CONFIG
+		string	"Kernel config file"
+		default	"***EDIT ME***"
+		depends on CONFIG_BUILD_KERNEL
+		help
+			#-- Fully qualified path to a kernel config file
+			#   The config file will be copied to ${BUILD_DIR}/sources
+			#   and renamed 'kernel-config'
+	#--- End Kernel
+
+	config	STRIP
+		bool "Strip Installed Binaries/Libraries"
+		default y
+		depends on !BOOK_CLFS3
+
+	config	VIMLANG
+		bool "Install vim-lang package"
+		default y
+		depends on !BOOK_HLFS && !BOOK_CLFS3
+		help
+			#-- Install the optional vim-lang package
+
+	config	TIMEZONE
+		string "TimeZone"
+		default "GMT"
+		help
+			#-- The timezone as output by tzselect
+			#   This will be copied to /etc/localtime
+
+	config	LANG
+		string "Language"
+		default "$LANG"
+		help
+			#-- Language information in /etc/profile  See <locale -a> for values
+
+	#--- Groff page
+	choice
+		prompt	"Groff page size"
+		default	PAGE_LETTER
+		help
+			#-- Page definition for groff: letter or A4
+
+		config	PAGE_LETTER
+			bool	"letter"
+
+		config	PAGE_A4
+			bool	"A4"
+	endchoice
+
+	config	PAGE
+		string
+		default	"letter"	if PAGE_LETTER
+		default	"A4"		if PAGE_A4
+	#--- End Groff page
+
+#--- End Build Settings
+endmenu
+
+menu "--- Advanced Features"
+	depends on !BOOK_BLFS
+
+	config	REPORT
+		bool "Create SBU and disk usage report"
+		default y
+
+	#--- ICA/farce
+	config	COMPARE
+		bool "Run comparison analysis on final stage"
+		depends	!BOOK_CLFS2 && !BOOK_CLFS3
+		default n
+		help
+			#-- Should some iterative comparison analysis by made?
+			#
+			#   Unless you are familiar with ICA and/or FARCE do not
+			#   select this option
+			#
+			#  ICA and FARCE are analysis tools for comparing one
+			#  build to the next. Builds mays differ from one iteration
+			#  to another due to the build order and these tools try
+			#  to ferret out those differences by examining the stored
+			#  build logs and binary files.
+			#
+			#  The scripts are well commented and can be found in ./extras/*
+			#
+
+	config	ITERATIONS
+		int	"Number of test runs (2,3,4,5)"	if COMPARE
+		depends on COMPARE
+		range	2 5
+		default	3
+
+	config	RUN_ICA
+		bool	"ICA testing"
+		depends on COMPARE
+		default y
+		help
+			#-- Run ICA testing
+
+	config	RUN_FARCE
+		bool	"farce testing"
+		depends on COMPARE
+		default n
+		help
+			#-- Run farce testing
+	#--- End ICA/farce
+
+	#--- Optimizations
+if !BOOK_CLFS2 && !BOOK_CLFS3
+	config	CONFIG_OPTIMIZE
+		bool	"Use optimization (see help)"
+		default	n
+		help
+			#-- Actual optimzation flags MUST be defined in ./optimize/*
+			#   files before activate this option.
+			#
+			# WARNING: The use of build optimizations may be dangerous.
+			#   You should know what you are doing and be sure that the
+			#   optimization settings listed below are what you want.
+			#   It there are build issues or the system doesn't work as
+			#   expected, please rebuild without optimizations before
+			#   asking for support.
+
+	choice
+		prompt "Optimization level "
+		default OPT_1
+		depends	CONFIG_OPTIMIZE
+		help
+			#-- Optimization values are set in optimize/* files
+
+		config	OPT_1
+			bool	"Final system only"
+
+		config	OPT_2
+			bool	"Both temp tools and final system"
+	endchoice
+
+	config	OPTIMIZE
+		int
+		default	"0"	if !CONFIG_OPTIMIZE
+		default	"1"	if OPT_1
+		default	"2"	if OPT_2
+endif
+	#--- End Optimizations
+
+	#-- Internal Settings
+	menu "--- Internal Settings (WARNING: for jhalfs developers only)"
+
+		config	SCRIPT_ROOT
+			string	"Scripts root"
+			default "jhalfs"
+
+		config	JHALFSDIR
+			string "jhalfs directory"
+			default "$BUILDDIR/$SCRIPT_ROOT"
+
+		config	LOGDIRBASE
+			string "Build logs directory basename"
+			default "logs"
+
+		config	LOGDIR
+			string "Build logs directory"
+			default "$JHALFSDIR/$LOGDIRBASE"
+
+		config	TESTLOGDIRBASE
+			string "Test suites logs directory basename"
+			default "test-logs"
+
+		config	TESTLOGDIR
+			string "Test suites logs directory"
+			default "$JHALFSDIR/$TESTLOGDIRBASE"
+
+		config	FILELOGDIRBASE
+			string "Installed files logs directory basename"
+			default "installed-files"
+
+		config	FILELOGDIR
+			string "Installed files logs directory"
+			default "$JHALFSDIR/$FILELOGDIRBASE"
+
+		config	ICALOGDIR
+			string "ICA logs directory"
+			default "$LOGDIR/ICA"
+
+		config	FARCELOGDIR
+			string "farce logs directory"
+			default "$LOGDIR/farce"
+
+		config	MKFILE
+			string "Makefile"
+			default "$JHALFSDIR/Makefile"
+
+		config	XSL
+			string "XSL stylesheet"
+			default "$PROGNAME.xsl"
+
+		config	PKG_LST
+			string "Package contents list"
+			default "unpacked"
+
+	#--- End Internal Settings
+	endmenu
+
+#--- End Advanced Features
+endmenu
+
+config REBUILD_MAKEFILE
+	bool "Rebuild the Makefile (see help)"
+	default n
+	depends on !BOOK_BLFS
+	help
+		#-- Rebuild the Makefile
+		#
+		#   This option alow to rebuild the Makefile after
+		#   customizing the base system build scripts.
+		#
+		#   See README.CUSTOM for more info about this feature.
+
diff --git a/2.3/HLFS/hlfs.xsl b/2.3/HLFS/hlfs.xsl
new file mode 100644
index 0000000..e8d0fb4
--- /dev/null
+++ b/2.3/HLFS/hlfs.xsl
@@ -0,0 +1,326 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
+  %general-entities;
+]>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exsl="http://exslt.org/common"
+    extension-element-prefixes="exsl"
+    version="1.0">
+
+<!-- XSLT stylesheet to create shell scripts from HLFS books. -->
+
+  <!-- What libc implentation must be used? -->
+  <xsl:param name="model" select="glibc"/>
+
+  <!-- What kernel serie must be used? -->
+  <xsl:param name="kernel" select="2.6"/>
+
+  <!-- Is the host kernel using grsecurity? -->
+  <xsl:param name="grsecurity_host" select="n"/>
+
+  <!-- Run test suites?
+       0 = none
+       1 = only chapter06 Glibc, GCC and Binutils testsuites
+       2 = all chapter06 testsuites
+       3 = alias to 2
+  -->
+  <xsl:param name="testsuite" select="1"/>
+
+  <!-- Bomb on test suites failures?
+       n = no, I want to build the full system and review the logs
+       y = yes, bomb at the first test suite failure to can review the build dir
+  -->
+  <xsl:param name="bomb-testsuite" select="n"/>
+
+  <!-- Additional features -->
+  <xsl:param name="features">,ssp,aslr,pax,hardened_tmp,warnings,misc,blowfish,</xsl:param>
+
+  <!-- Time zone -->
+  <xsl:param name="timezone" select="GMT"/>
+
+  <!-- Page size -->
+  <xsl:param name="page" select="letter"/>
+
+  <!-- Locale settings -->
+  <xsl:param name="lang" select="C"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//sect1"/>
+  </xsl:template>
+
+  <xsl:template match="sect1">
+    <xsl:if test="(../@id='chapter-temporary-tools' or
+                  ../@id='chapter-building-system' or
+                  ../@id='chapter-bootable') and
+                  (count(descendant::screen/userinput) &gt; 0 and
+                  count(descendant::screen/userinput) &gt;
+                  count(descendant::screen[@role='nodump'])) and
+                  ((@condition=$model or not(@condition)) and
+                  (@vendor=$kernel or not(@vendor)))">
+        <!-- The dirs names -->
+      <xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
+      <xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
+      <xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
+      <xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
+        <!-- The file names -->
+      <xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
+      <xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
+      <xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
+        <!-- The build order -->
+      <xsl:variable name="position" select="position()"/>
+      <xsl:variable name="order">
+        <xsl:choose>
+          <xsl:when test="string-length($position) = 1">
+            <xsl:text>00</xsl:text>
+            <xsl:value-of select="$position"/>
+          </xsl:when>
+          <xsl:when test="string-length($position) = 2">
+            <xsl:text>0</xsl:text>
+            <xsl:value-of select="$position"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="$position"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+        <!-- Creating dirs and files -->
+      <exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
+        <xsl:choose>
+          <xsl:when test="@id='ch-system-creatingdirs' or
+                    @id='ch-system-createfiles' or
+                    @id='ch-system-changingowner' or
+                    @id='ch-system-strippingagain'">
+            <xsl:text>#!/tools/bin/bash&#xA;set +h&#xA;</xsl:text>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:text>#!/bin/bash&#xA;set +h&#xA;</xsl:text>
+          </xsl:otherwise>
+        </xsl:choose>
+        <xsl:if test="not(@id='ch-tools-stripping') and
+                      not(@id='ch-system-strippingagain')">
+          <xsl:text>set -e&#xA;</xsl:text>
+        </xsl:if>
+        <xsl:text>&#xA;</xsl:text>
+        <xsl:if test="(sect2[@role='installation'])">
+          <xsl:text>cd $PKGDIR&#xA;</xsl:text>
+          <xsl:if test="@id='ch-system-uclibc'">
+             <xsl:text>pushd ../; tar -xvf gettext-&gettext-version;.*; popd; &#xA;</xsl:text>
+          </xsl:if>
+          <!-- SVN toolchain format, from inside ./sources dir unpack binutils and gcc -->
+	  <xsl:if test="@id='ch-tools-embryo-toolchain' or
+                        @id='ch-tools-cocoon-toolchain' or
+                        @id='ch-system-butterfly-toolchain'">
+             <xsl:text>tar -xvf gcc-core-&gcc-version;.*; &#xA;</xsl:text>
+             <xsl:text>tar -xvf binutils-&binutils-version;.*; &#xA;</xsl:text>
+          </xsl:if>
+	  <xsl:if test="@id='ch-tools-cocoon-toolchain' or
+                        @id='ch-system-butterfly-toolchain'">
+             <xsl:text>tar -xvf gcc-g++-&gcc-version;.*; &#xA;</xsl:text>
+          </xsl:if>
+          <!-- ONLY butterfly has a testsuite -->
+          <xsl:if test="@id='ch-system-butterfly-toolchain' and $testsuite != '0'">
+            <xsl:text>tar -xvf gcc-testsuite-&gcc-version;.*; &#xA;</xsl:text>
+          </xsl:if>
+          <!-- END SVN toolchain format -->
+        </xsl:if>
+        <xsl:apply-templates select=".//para/userinput | .//screen"/>
+        <xsl:text>exit</xsl:text>
+      </exsl:document>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="screen">
+    <xsl:if test="(@condition=$model or not(@condition)) and
+                  (@vendor=$kernel or not(@vendor)) and
+                  child::* = userinput and (not(@role) or
+                  (@role and contains($features,concat(',',@role,','))))">
+      <xsl:apply-templates select="userinput" mode="screen"/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="para/userinput">
+    <xsl:if test="(contains(string(),'test') or
+                  contains(string(),'check')) and
+                  ($testsuite = '2' or $testsuite = '3')">
+      <xsl:choose>
+        <xsl:when test="$bomb-testsuite = 'n'">
+          <xsl:value-of select="substring-before(string(),'make')"/>
+          <xsl:text>make -k</xsl:text>
+          <xsl:value-of select="substring-after(string(),'make')"/>
+          <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates/>
+          <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+          <xsl:if test="contains(string(),' -k ')">
+            <xsl:text> || true</xsl:text>
+          </xsl:if>
+          <xsl:text>&#xA;</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="userinput" mode="screen">
+    <xsl:choose>
+      <!-- grsecurity kernel in the host? -->
+      <xsl:when test="ancestor::sect1[@id='ch-system-kernfs'] and
+                contains(string(),'sysctl')
+                and $grsecurity_host ='n'"/>
+      <!-- Setting $LANG for /etc/profile -->
+      <xsl:when test="ancestor::sect1[@id='bootable-profile'] and
+                contains(string(),'export LANG=')">
+        <xsl:value-of select="substring-before(string(),'export LANG=')"/>
+        <xsl:text>export LANG=</xsl:text>
+        <xsl:value-of select="$lang"/>
+        <xsl:value-of select="substring-after(string(),'CC]')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Copying the kernel config file -->
+      <xsl:when test="string() = 'make mrproper'">
+        <xsl:text>make mrproper&#xA;</xsl:text>
+        <xsl:text>cp -v /sources/kernel-config .config&#xA;</xsl:text>
+      </xsl:when>
+      <!-- No interactive commands are needed if the .config file is the proper one -->
+      <xsl:when test="string() = 'make menuconfig'"/>
+      <!-- For uClibc we need to set CONFIG_SITE -->
+      <xsl:when test="contains(string(),'CONFIG_SITE')">
+        <xsl:value-of select="substring-before(string(),'export')"/>
+        <xsl:text>echo "export</xsl:text>
+        <xsl:value-of select="substring-after(string(),'export')"/>
+        <xsl:text>" &gt;&gt; ~/.bashrc&#xA;</xsl:text>
+      </xsl:when>
+      <!-- For uClibc we need to cd to the Gettext package -->
+      <xsl:when test="contains(string(),'cd gettext-runtime/')">
+        <xsl:text>cd ../gettext-*/gettext-runtime</xsl:text>
+        <xsl:value-of select="substring-after(string(),'gettext-runtime')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The Coreutils and Module-Init-Tools test suites are optional -->
+      <xsl:when test="(ancestor::sect1[@id='ch-system-coreutils'] or
+                ancestor::sect1[@id='ch-system-module-init-tools']) and
+                (contains(string(),'check') or
+                contains(string(),'distclean') or
+                contains(string(),'dummy'))">
+        <xsl:choose>
+          <xsl:when test="$testsuite = '0' or $testsuite = '1'"/>
+          <xsl:otherwise>
+            <xsl:if test="not(contains(string(),'check'))">
+              <xsl:apply-templates/>
+              <xsl:text>&#xA;</xsl:text>
+            </xsl:if>
+            <xsl:if test="contains(string(),'check')">
+              <xsl:choose>
+                <xsl:when test="$bomb-testsuite = 'n'">
+                  <xsl:value-of select="substring-before(string(),'check')"/>
+                  <xsl:text>-k check</xsl:text>
+                  <xsl:value-of select="substring-after(string(),'check')"/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:apply-templates/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                  <xsl:if test="contains(string(),' -k ')">
+                    <xsl:text> || true</xsl:text>
+                  </xsl:if>
+                  <xsl:text>&#xA;</xsl:text>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:if>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Fixing butterfly toolchain test suite run -->
+      <xsl:when test="ancestor::sect1[@id='ch-system-butterfly-toolchain']
+                      and string() = 'make -k check'">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:choose>
+              <xsl:when test="$bomb-testsuite = 'n'">
+                <xsl:text>make -k check &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:apply-templates/>
+                <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                <xsl:if test="contains(string(),' -k ')">
+                  <xsl:text> || true</xsl:text>
+                </xsl:if>
+                <xsl:text>&#xA;</xsl:text>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Fixing Glbc test suite  -->
+      <xsl:when test="contains(string(),'rm -v configparms') and
+                      contains(string(),'-fno-stack-protector')">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:apply-templates/>
+            <xsl:text>&#xA;</xsl:text>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test="contains(string(),'glibc-check-log')">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:value-of select="substring-before(string(),'2&gt;&amp;1')"/>
+            <xsl:text>&gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Fixing Cocoon sanity checks  -->
+      <xsl:when test="contains(string(),'./strcat-overflow')">
+        <xsl:text>set +e&#xA;</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;set -e&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Fixing Butterfly sanity checks  -->
+      <xsl:when test="contains(string(),'./fortify-test')
+                      or contains(string(),'./ssp-test')">
+        <xsl:text>! </xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Don't stop on strip run -->
+      <xsl:when test="contains(string(),'strip ')">
+        <xsl:apply-templates/>
+        <xsl:text> || true&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The rest of commands -->
+      <xsl:otherwise>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="literal">
+    <xsl:if test="(@condition=$model or not(@condition)) and
+                  (@vendor=$kernel or not(@vendor))">
+      <xsl:apply-templates/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="replaceable">
+    <xsl:choose>
+      <xsl:when test="ancestor::sect1[@id='ch-system-glibc'] or
+                      ancestor::sect1[@id='ch-system-uclibc']">
+        <xsl:value-of select="$timezone"/>
+      </xsl:when>
+      <xsl:when test="ancestor::sect1[@id='ch-system-groff']">
+        <xsl:value-of select="$page"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>**EDITME</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>EDITME**</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/HLFS/master.sh b/2.3/HLFS/master.sh
new file mode 100644
index 0000000..5d12ec4
--- /dev/null
+++ b/2.3/HLFS/master.sh
@@ -0,0 +1,659 @@
+#!/bin/bash
+set -e  # Enable error trapping
+
+# $Id$
+
+###################################
+###          FUNCTIONS          ###
+###################################
+
+
+#----------------------------#
+process_toolchain() {        # embryo,cocoon and butterfly need special handling
+#----------------------------#
+  local toolchain=$1
+  local this_file=$2
+  local tc_phase
+  local binutil_tarball
+  local gcc_core_tarball
+  local TC_MountPT
+  local remove_existing
+
+  tc_phase=`echo $toolchain | sed -e 's@[0-9]\{3\}-@@' -e 's@-toolchain@@' -e 's,'$N',,'`
+  case $tc_phase in
+    embryo | \
+    cocoon)    # Vars for LUSER phase
+       remove_existing="remove_existing_dirs"
+            TC_MountPT="\$(MOUNT_PT)\$(SRC)"
+       ;;
+    butterfly) # Vars for CHROOT phase
+       remove_existing="remove_existing_dirs2"
+            TC_MountPT="\$(SRC)"
+       ;;
+  esac
+
+  #
+  # Safe method to remove existing toolchain dirs
+  binutil_tarball=$(get_package_tarball_name "binutils")
+  gcc_core_tarball=$(get_package_tarball_name "gcc-core")
+(
+cat << EOF
+	@\$(call ${remove_existing},$binutil_tarball)
+	@\$(call ${remove_existing},$gcc_core_tarball)
+EOF
+) >> $MKFILE.tmp
+
+  #
+  # Manually remove the toolchain directories..
+(
+cat << EOF
+	@rm -rf ${TC_MountPT}/${tc_phase}-toolchain && \\
+	rm  -rf ${TC_MountPT}/${tc_phase}-build
+EOF
+) >> $MKFILE.tmp
+
+
+(
+cat << EOF
+	@echo "export PKGDIR=${TC_MountPT}" > envars
+EOF
+) >> $MKFILE.tmp
+
+  case ${tc_phase} in
+    butterfly)
+        [[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${toolchain}"
+        CHROOT_wrt_RunAsRoot "$this_file"
+      ;;
+    *)  LUSER_wrt_RunAsUser  "$this_file"
+      ;;
+  esac
+  #
+(
+cat << EOF
+	@\$(call ${remove_existing},$binutil_tarball)
+	@\$(call ${remove_existing},$gcc_core_tarball)
+EOF
+) >> $MKFILE.tmp
+
+  #
+  # Manually remove the toolchain directories..
+(
+cat << EOF
+	@rm -rf ${TC_MountPT}/${tc_phase}-toolchain && \\
+	rm  -rf ${TC_MountPT}/${tc_phase}-build
+EOF
+) >> $MKFILE.tmp
+
+}
+
+
+#----------------------------#
+chapter3_Makefiles() {       # Initialization of the system
+#----------------------------#
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter3     ( SETUP ) ${R_arrow}"
+
+  # If $LUSER_HOME is already present in the host, we asume that the
+  # hlfs user and group are also presents in the host, and a backup
+  # of their bash init files is made.
+(
+cat << EOF
+020-creatingtoolsdir:
+	@\$(call echo_message, Building)
+	@mkdir \$(MOUNT_PT)/tools && \\
+	rm -f /tools && \\
+	ln -s \$(MOUNT_PT)/tools /
+	@\$(call housekeeping)
+
+021-addinguser:  020-creatingtoolsdir
+	@\$(call echo_message, Building)
+	@if [ ! -d \$(LUSER_HOME) ]; then \\
+		groupadd \$(LGROUP); \\
+		useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
+	else \\
+		touch luser-exist; \\
+	fi;
+	@chown \$(LUSER) \$(MOUNT_PT)/tools && \\
+	chmod -R a+wt \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
+	chmod a+wt \$(SRCSDIR)
+	@\$(call housekeeping)
+
+022-settingenvironment:  021-addinguser
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile  -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
+	fi;
+	@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
+	echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "HLFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "PATH=/tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export HLFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc && \\
+	chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
+	chmod -R a+wt \$(MOUNT_PT) && \\
+	touch envars && \\
+	chown \$(LUSER) envars
+	@\$(call housekeeping)
+EOF
+) >> $MKFILE.tmp
+  chapter3=" 020-creatingtoolsdir 021-addinguser 022-settingenvironment"
+}
+
+#----------------------------#
+chapter5_Makefiles() {       # Bootstrap or temptools phase
+#----------------------------#
+  local file
+  local this_script
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter5     ( LUSER ) ${R_arrow}"
+
+  for file in chapter05/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Skip this script depending on jhalfs.conf flags set.
+    case $this_script in
+      # If no testsuites will be run, then TCL, Expect and DejaGNU aren't needed
+      *tcl* )     [[ "$TEST" = "0" ]] && continue; ;;
+      *expect* )  [[ "$TEST" = "0" ]] && continue; ;;
+      *dejagnu* ) [[ "$TEST" = "0" ]] && continue; ;;
+        # Test if the stripping phase must be skipped
+      *stripping* ) [[ "$STRIP" = "n" ]] && continue ;;
+      *) ;;
+    esac
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    chapter5="$chapter5 $this_script"
+
+    # Grab the name of the target
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's@-pass[0-9]\{1\}@@'`
+
+    # Adjust 'name'
+    case $name in
+      uclibc)     name="uClibc"  ;;
+    esac
+
+    # Set the dependency for the first target.
+    if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+
+    # This is a very special script and requires manual processing
+    # NO Optimization allowed
+    if [[ ${name} = "embryo-toolchain" ]] || \
+       [[ ${name} = "cocoon-toolchain" ]]; then
+       LUSER_wrt_target "$this_script" "$PREV"
+         process_toolchain "${this_script}" "${file}"
+       wrt_touch
+       PREV=$this_script
+       continue
+    fi
+    #
+    LUSER_wrt_target "$this_script" "$PREV"
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package. Fix GCC tarball name for 2.4-branch.
+    case $name in
+      gcc ) pkg_tarball=$(get_package_tarball_name gcc-core) ;;
+        * ) pkg_tarball=$(get_package_tarball_name $name) ;;
+    esac
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      # Insert instructions for unpacking the package and to set the PKGDIR variable.
+      LUSER_wrt_unpack "$pkg_tarball"
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+    # Insert date and disk usage at the top of the log file, the script run
+    # and date and disk usage again at the bottom of the log file.
+    LUSER_wrt_RunAsUser "${file}"
+
+    # Remove the build directory(ies) except if the package build fails
+    # (so we can review config.cache, config.log, etc.)
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "$name"
+    fi
+
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+  done  # end for file in chapter05/*
+}
+
+
+#----------------------------#
+chapter6_Makefiles() {       # sysroot or chroot build phase
+#----------------------------#
+  local file
+  local this_script
+  # Set envars and scripts for iteration targets
+  if [[ -z "$1" ]] ; then
+    local N=""
+  else
+    local N=-build_$1
+    local chapter6=""
+    mkdir chapter06$N
+    cp chapter06/* chapter06$N
+    for script in chapter06$N/* ; do
+      # Overwrite existing symlinks, files, and dirs
+      sed -e 's/ln -s /ln -sf /g' \
+          -e 's/^mv /&-f /g' \
+          -e 's/mkdir -v/&p/g' -i ${script}
+      # Rename the scripts
+      mv ${script} ${script}$N
+    done
+    # Remove Bzip2 binaries before make install
+    sed -e 's@make install@rm -vf /usr/bin/bz*\n&@' -i chapter06$N/*-bzip2$N
+    # Fix how Module-Init-Tools do the install target
+    sed -e 's@make install@make INSTALL=install install@' -i chapter06$N/*-module-init-tools$N
+    # Don't readd already existing groups
+    sed -e '/groupadd/d' -i chapter06$N/*-udev$N
+  fi
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter6$N     ( CHROOT ) ${R_arrow}"
+
+  for file in chapter06$N/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Skip this script depending on jhalfs.conf flags set.
+    case $this_script in
+        # We'll run the chroot commands differently than the others, so skip them in the
+        # dependencies and target creation.
+      *chroot* )  continue ;;
+        # Test if the stripping phase must be skipped
+      *-stripping* )  [[ "$STRIP" = "n" ]] && continue ;;
+        # Skip linux-headers in iterative builds
+      *linux-headers*) [[ -n "$N" ]] && continue ;;
+    esac
+
+    # Grab the name of the target
+    name=`echo $this_script | sed -e 's@[0-9]\{3\}-@@' -e 's,'$N',,'`
+
+    case $name in
+      uclibc)  name="uClibc"   ;;
+    esac
+
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package. Fix GCC tarball name for 2.4-branch.
+    case $name in
+      gcc ) pkg_tarball=$(get_package_tarball_name gcc-core) ;;
+        * ) pkg_tarball=$(get_package_tarball_name $name) ;;
+    esac
+
+    if [[ "$pkg_tarball" = "" ]] && [[ -n "$N" ]] ; then
+      case "${this_script}" in
+        *stripping*) ;;
+        *)  continue ;;
+      esac
+    fi
+
+    # Append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    case "${this_script}" in
+      *kernfs* ) runasroot=" ${this_script}" ;;
+             * ) chapter6="$chapter6 ${this_script}" ;;
+    esac
+
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    if [[ ${name} = "butterfly-toolchain" ]]; then
+      CHROOT_wrt_target "${this_script}" "$PREV"
+      # Touch timestamp file if installed files logs will be created.
+      # But only for the firt build when running iterative builds.
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_TouchTimestamp
+      fi
+      process_toolchain "${this_script}" "${file}"
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+      wrt_touch
+      PREV=$this_script
+      continue
+    fi
+    # kernfs is run in SUDO target
+    case "${this_script}" in
+      *kernfs* )  LUSER_wrt_target  "${this_script}" "$PREV" ;;
+             * )  CHROOT_wrt_target "${this_script}" "$PREV" ;;
+    esac
+
+    # If $pkg_tarball isn't empty, we've got a package...
+    # Insert instructions for unpacking the package and changing directories
+    if [ "$pkg_tarball" != "" ] ; then
+      # Touch timestamp file if installed files logs will be created.
+      # But only for the firt build when running iterative builds.
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_TouchTimestamp
+      fi
+      CHROOT_Unpack "$pkg_tarball"
+      # If the testsuites must be run, initialize the log file
+      # butterfly-toolchain tests are enabled in 'process_tookchain' function
+      # 2.4-branch toolchain is ernabled here.
+      case $name in
+        glibc | gcc | binutils)
+            [[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${this_script}" ;;
+        * ) [[ "$TEST" > "1" ]]  && CHROOT_wrt_test_log "${this_script}" ;;
+      esac
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+
+    # In kernfs we need to set HLFS and not to use chroot.
+    case "${this_script}" in
+      *kernfs* ) wrt_RunAsRoot "${file}" ;;
+             * ) CHROOT_wrt_RunAsRoot "${file}" ;;
+    esac
+    #
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      CHROOT_wrt_RemoveBuildDirs "$name"
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+    fi
+    #
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+    # Set system_build envar for iteration targets
+    system_build=$chapter6
+  done # end for file in chapter06/*
+
+}
+
+#----------------------------#
+chapter7_Makefiles() {       # Create a bootable system.. kernel, bootscripts..etc
+#----------------------------#
+  local file
+  local this_script
+
+  echo  "${tab_}${GREEN}Processing... ${L_arrow}Chapter7     ( BOOT ) ${R_arrow}"
+  for file in chapter07/*; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    case $this_script in
+      *grub)     continue  ;; # Grub must be configured manually.
+      *console)  continue  ;; # Use the file generated by lfs-bootscripts
+      *fstab)    [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab
+        ;;
+      *kernel)   # If no .config file is supplied, the kernel build is skipped
+                 [[ -z $CONFIG ]] && continue
+                 cp $CONFIG $BUILDDIR/sources/kernel-config
+        ;;
+    esac
+
+    # First append then name of the script file to a list (this will become
+    # the names of the targets in the Makefile
+    chapter7="$chapter7 $this_script"
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "$this_script" "$PREV"
+
+    case "${this_script}" in
+      *bootscripts*)
+        if [ "${INSTALL_LOG}" = "y" ] ; then
+          CHROOT_wrt_TouchTimestamp
+        fi
+        CHROOT_Unpack $(get_package_tarball_name "lfs-bootscripts")
+        blfs_bootscripts=$(get_package_tarball_name "blfs-bootscripts" | sed -e 's/.tar.*//' )
+        echo -e "\t@echo \"\$(MOUNT_PT)\$(SRC)/$blfs_bootscripts\" >> sources-dir" >> $MKFILE.tmp
+        ;;
+      *kernel)
+        name="linux"
+        pkg_tarball=$(get_package_tarball_name $name)
+        if [ "${INSTALL_LOG}" = "y" ] ; then
+          CHROOT_wrt_TouchTimestamp
+        fi
+        CHROOT_Unpack "$pkg_tarball"
+        ;;
+    esac
+
+    case "${this_script}" in
+      *fstab*) # Check if we have a real /etc/fstab file
+        if [[ -n "$FSTAB" ]] ; then
+           CHROOT_wrt_CopyFstab
+        else
+           CHROOT_wrt_RunAsRoot "$file"
+        fi
+        ;;
+      *)  # All other scripts
+        CHROOT_wrt_RunAsRoot "${file}"
+        ;;
+    esac
+
+    # Remove the build directory except if the package build fails.
+    case "${this_script}" in
+      *bootscripts*)
+(
+cat << EOF
+	@ROOT=\`head -n1 \$(SRC)/\$(PKG_LST) | sed 's@^./@@;s@/.*@@'\` && \\
+	rm -r \$(SRC)/\$\$ROOT
+	@rm -rf \`cat sources-dir\` && \\
+	rm sources-dir
+EOF
+) >> $MKFILE.tmp
+          if [ "${INSTALL_LOG}" = "y" ] ; then
+            CHROOT_wrt_LogNewFiles "$name"
+          fi
+       ;;
+      *kernel)       CHROOT_wrt_RemoveBuildDirs "dummy"
+                     if [ "${INSTALL_LOG}" = "y" ] ; then
+                       CHROOT_wrt_LogNewFiles "$name"
+                     fi ;;
+    esac
+
+    # Include a touch of the target name so make can check if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=$this_script
+  done  # for file in chapter07/*
+}
+
+
+#----------------------------#
+build_Makefile() {           # Construct a Makefile from the book scripts
+#----------------------------#
+  echo "Creating Makefile... ${BOLD}START${OFF}"
+
+  cd $JHALFSDIR/${PROGNAME}-commands
+  # Start with a clean Makefile.tmp file
+  >$MKFILE.tmp
+
+  chapter3_Makefiles
+  chapter5_Makefiles
+  chapter6_Makefiles
+  # Add the iterations targets, if needed
+  [[ "$COMPARE" = "y" ]] && wrt_compare_targets
+  chapter7_Makefiles
+  # Add the CUSTOM_TOOLS targets, if needed
+  [[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
+  # Add the BLFS_TOOL targets, if needed
+  [[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
+
+  # Add a header, some variables and include the function file
+  # to the top of the real Makefile.
+  wrt_Makefile_header
+
+  # Add chroot commands
+  CHROOT_LOC="`whereis -b chroot | cut -d " " -f2`"
+  i=1
+  for file in chapter06/*chroot* ; do
+    chroot=`cat $file | \
+            sed -e "s@chroot@$CHROOT_LOC@" \
+                -e '/#!\/bin\/bash/d' \
+                -e '/^export/d' \
+                -e '/^logout/d' \
+                -e 's@ \\\@ @g' | \
+            tr -d '\n' |  \
+            sed -e 's/  */ /g' \
+                -e 's|\\$|&&|g' \
+                -e 's|exit||g' \
+                -e 's|$| -c|' \
+                -e 's|"$$HLFS"|$(MOUNT_PT)|'\
+                -e 's|set -e||' \
+                -e 's|set +h||'`
+    echo -e "CHROOT$i= $chroot\n" >> $MKFILE
+    i=`expr $i + 1`
+  done
+
+  # Drop in the main target 'all:' and the chapter targets with each sub-target
+  # as a dependency.
+(
+  cat << EOF
+
+all:	ck_UID mk_SETUP mk_LUSER mk_SUDO mk_CHROOT mk_BOOT create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL
+	@sudo make do-housekeeping
+	@echo "$VERSION - jhalfs build" > hlfs-release && \\
+	sudo install -m444 hlfs-release \$(MOUNT_PT)/etc/hlfs-release
+	@\$(call echo_finished,$VERSION)
+
+ck_UID:
+	@if [ \`id -u\` = "0" ]; then \\
+	  echo "--------------------------------------------------"; \\
+	  echo "You cannot run this makefile from the root account"; \\
+	  echo "--------------------------------------------------"; \\
+	  exit 1; \\
+	fi
+
+mk_SETUP:
+	@\$(call echo_SU_request)
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
+	@touch \$@
+
+mk_LUSER: mk_SETUP
+	@\$(call echo_SULUSER_request)
+	@(sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
+	@sudo make restore-luser-env
+	@touch \$@
+
+mk_SUDO: mk_LUSER
+	@sudo make SUDO
+	@touch \$@
+
+mk_CHROOT: mk_SUDO
+	@if [ ! -e \$(MOUNT_PT)/dev ]; then \\
+	  mkdir \$(MOUNT_PT)/dev && \\
+	  sudo mknod -m 666 \$(MOUNT_PT)/dev/null c 1 3 && \\
+	  sudo mknod -m 600 \$(MOUNT_PT)/dev/console c 5 1 && \\
+	  sudo chown -R 0:0 \$(MOUNT_PT)/dev; \\
+	fi;
+	@\$(call echo_CHROOT_request)
+	@( sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CHROOT")
+	@touch \$@
+
+mk_BOOT: mk_CHROOT
+	@\$(call echo_CHROOT_request)
+	@( sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BOOT")
+	@touch \$@
+
+mk_CUSTOM_TOOLS: create-sbu_du-report
+	@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
+	  sudo mkdir -p ${BUILDDIR}${TRACKING_DIR}; \\
+	  (sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
+	fi;
+	@touch \$@
+
+mk_BLFS_TOOL: mk_CUSTOM_TOOLS
+	@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building BLFS_TOOL); \\
+	  sudo mkdir -p $BUILDDIR$TRACKING_DIR; \\
+	  (sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"); \\
+	fi;
+	@touch \$@
+
+
+SETUP:        $chapter3
+LUSER:        $chapter5
+SUDO:         $runasroot
+CHROOT:       SHELL=/tools/bin/bash
+CHROOT:       $chapter6
+BOOT:         $chapter7
+CUSTOM_TOOLS: $custom_list
+BLFS_TOOL:    $blfs_tool
+
+
+create-sbu_du-report:  mk_BOOT
+	@\$(call echo_message, Building)
+	@if [ "\$(ADD_REPORT)" = "y" ]; then \\
+	  ./create-sbu_du-report.sh logs $VERSION; \\
+	  \$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
+	fi;
+	@touch  \$@
+
+restore-luser-env:
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
+	fi;
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash* && \\
+	touch \$@ && \\
+	echo " "\$(BOLD)Target \$(BLUE)\$@ \$(BOLD)OK && \\
+	echo --------------------------------------------------------------------------------\$(WHITE)
+
+do-housekeeping:
+	@-umount \$(MOUNT_PT)/dev/pts
+	@-umount \$(MOUNT_PT)/dev/shm
+	@-umount \$(MOUNT_PT)/dev
+	@-umount \$(MOUNT_PT)/sys
+	@-umount \$(MOUNT_PT)/proc
+	@-rm /tools
+	@-if [ ! -f luser-exist ]; then \\
+		userdel \$(LUSER); \\
+		rm -rf \$(LUSER_HOME); \\
+	fi;
+
+
+
+EOF
+) >> $MKFILE
+
+  # Bring over the items from the Makefile.tmp
+  cat $MKFILE.tmp >> $MKFILE
+  rm $MKFILE.tmp
+  echo "Creating Makefile... ${BOLD}DONE${OFF}"
+
+}
diff --git a/2.3/LFS/lfs.xsl b/2.3/LFS/lfs.xsl
new file mode 100644
index 0000000..bebb86d
--- /dev/null
+++ b/2.3/LFS/lfs.xsl
@@ -0,0 +1,306 @@
+<?xml version="1.0"?>
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY % general-entities SYSTEM "FAKEDIR/general.ent">
+  %general-entities;
+]>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:exsl="http://exslt.org/common"
+    extension-element-prefixes="exsl"
+    version="1.0">
+
+<!-- XSLT stylesheet to create shell scripts from LFS books. -->
+
+  <!-- Run test suites?
+       0 = none
+       1 = only chapter06 Glibc, GCC and Binutils testsuites
+       2 = all chapter06 testsuites
+       3 = all chapter05 and chapter06 testsuites
+  -->
+  <xsl:param name="testsuite" select="1"/>
+
+  <!-- Bomb on test suites failures?
+       n = no, I want to build the full system and review the logs
+       y = yes, bomb at the first test suite failure to can review the build dir
+  -->
+  <xsl:param name="bomb-testsuite" select="n"/>
+
+  <!-- Install vim-lang package? -->
+  <xsl:param name="vim-lang" select="y"/>
+
+  <!-- Time zone -->
+  <xsl:param name="timezone" select="GMT"/>
+
+  <!-- Page size -->
+  <xsl:param name="page" select="letter"/>
+
+  <!-- Locale settings -->
+  <xsl:param name="lang" select="C"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//sect1"/>
+  </xsl:template>
+
+  <xsl:template match="sect1">
+    <xsl:if test="(../@id='chapter-temporary-tools' or
+                  ../@id='chapter-building-system' or
+                  ../@id='chapter-bootscripts' or
+                  ../@id='chapter-bootable') and
+                  count(descendant::screen/userinput) &gt; 0 and
+                  count(descendant::screen/userinput) &gt;
+                  count(descendant::screen[@role='nodump'])">
+        <!-- The dirs names -->
+      <xsl:variable name="pi-dir" select="../processing-instruction('dbhtml')"/>
+      <xsl:variable name="pi-dir-value" select="substring-after($pi-dir,'dir=')"/>
+      <xsl:variable name="quote-dir" select="substring($pi-dir-value,1,1)"/>
+      <xsl:variable name="dirname" select="substring-before(substring($pi-dir-value,2),$quote-dir)"/>
+        <!-- The file names -->
+      <xsl:variable name="pi-file" select="processing-instruction('dbhtml')"/>
+      <xsl:variable name="pi-file-value" select="substring-after($pi-file,'filename=')"/>
+      <xsl:variable name="filename" select="substring-before(substring($pi-file-value,2),'.html')"/>
+        <!-- The build order -->
+      <xsl:variable name="position" select="position()"/>
+      <xsl:variable name="order">
+        <xsl:choose>
+          <xsl:when test="string-length($position) = 1">
+            <xsl:text>00</xsl:text>
+            <xsl:value-of select="$position"/>
+          </xsl:when>
+          <xsl:when test="string-length($position) = 2">
+            <xsl:text>0</xsl:text>
+            <xsl:value-of select="$position"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="$position"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:variable>
+        <!-- Creating dirs and files -->
+      <exsl:document href="{$dirname}/{$order}-{$filename}" method="text">
+        <xsl:choose>
+          <xsl:when test="@id='ch-system-creatingdirs' or
+                    @id='ch-system-createfiles' or
+                    @id='ch-system-strippingagain'">
+            <xsl:text>#!/tools/bin/bash&#xA;set +h&#xA;</xsl:text>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:text>#!/bin/bash&#xA;set +h&#xA;</xsl:text>
+          </xsl:otherwise>
+        </xsl:choose>
+        <xsl:if test="not(@id='ch-tools-stripping') and
+                      not(@id='ch-system-strippingagain')">
+          <xsl:text>set -e&#xA;</xsl:text>
+        </xsl:if>
+        <xsl:text>&#xA;</xsl:text>
+        <xsl:if test="sect2[@role='installation']">
+          <xsl:text>cd $PKGDIR&#xA;</xsl:text>
+          <xsl:if test="@id='ch-system-vim' and $vim-lang = 'y'">
+            <xsl:text>tar -xvf ../vim-&vim-version;-lang.* --strip-components=1&#xA;</xsl:text>
+          </xsl:if>
+        </xsl:if>
+        <xsl:apply-templates select=".//para/userinput | .//screen"/>
+        <xsl:if test="$testsuite='3' and @id='ch-tools-glibc'">
+          <xsl:copy-of select="//sect1[@id='ch-system-glibc']/sect2[2]/screen[@role='nodump']"/>
+          <xsl:text>&#xA;</xsl:text>
+        </xsl:if>
+        <xsl:text>exit</xsl:text>
+      </exsl:document>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="screen">
+    <xsl:if test="child::* = userinput and not(@role = 'nodump')">
+      <xsl:apply-templates select="userinput" mode="screen"/>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="para/userinput">
+    <xsl:if test="(contains(string(),'test') or
+            contains(string(),'check')) and
+            (($testsuite = '2' and
+            ancestor::chapter[@id='chapter-building-system']) or
+            $testsuite = '3')">
+      <xsl:choose>
+        <xsl:when test="$bomb-testsuite = 'n'">
+          <xsl:value-of select="substring-before(string(),'make')"/>
+          <xsl:text>make -k</xsl:text>
+          <xsl:value-of select="substring-after(string(),'make')"/>
+          <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:apply-templates/>
+          <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+          <xsl:if test="contains(string(),' -k ')">
+            <xsl:text> || true</xsl:text>
+          </xsl:if>
+          <xsl:text>&#xA;</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template match="userinput" mode="screen">
+    <xsl:choose>
+      <!-- Estandarized package formats -->
+      <xsl:when test="contains(string(),'tar.gz')">
+        <xsl:value-of select="substring-before(string(),'tar.gz')"/>
+        <xsl:text>tar.*</xsl:text>
+        <xsl:value-of select="substring-after(string(),'tar.gz')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Avoiding a race condition in a patch -->
+      <xsl:when test="contains(string(),'debian_fixes')">
+        <xsl:value-of select="substring-before(string(),'patch')"/>
+        <xsl:text>patch -Z</xsl:text>
+        <xsl:value-of select="substring-after(string(),'patch')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Fix Udev reinstallation after a build failure -->
+      <xsl:when test="contains(string(),'firmware,udev')">
+        <xsl:text>if [[ ! -d /lib/udev/devices ]] ; then&#xA;</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;fi&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Setting $LANG for /etc/profile -->
+      <xsl:when test="ancestor::sect1[@id='ch-scripts-profile'] and
+                contains(string(),'export LANG=')">
+        <xsl:value-of select="substring-before(string(),'export LANG=')"/>
+        <xsl:text>export LANG=</xsl:text>
+        <xsl:value-of select="$lang"/>
+        <xsl:value-of select="substring-after(string(),'modifiers>')"/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:when>
+      <!-- Copying the kernel config file -->
+      <xsl:when test="string() = 'make mrproper'">
+        <xsl:text>make mrproper&#xA;</xsl:text>
+        <xsl:text>cp -v ../kernel-config .config&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The Bash, Coreutils, and Module-Init-Tools test suites are optional -->
+      <xsl:when test="(ancestor::sect1[@id='ch-system-coreutils'] or
+                       ancestor::sect1[@id='ch-system-bash'] or
+                       ancestor::sect1[@id='ch-system-module-init-tools']) and
+                      (contains(string(),'check') or contains(string(),'nobody')
+                       or contains(string(),'dummy'))">
+        <xsl:choose>
+          <xsl:when test="$testsuite = '0' or $testsuite = '1'"/>
+          <xsl:otherwise>
+            <xsl:if test="not(contains(string(),'check')) and
+                          not(contains(string(),'tests'))">
+              <xsl:apply-templates/>
+              <xsl:text>&#xA;</xsl:text>
+            </xsl:if>
+            <!-- Coreutils and Module-Init-Tools -->
+            <xsl:if test="contains(string(),'check')">
+              <xsl:choose>
+                <xsl:when test="$bomb-testsuite = 'n'">
+                  <xsl:value-of select="substring-before(string(),'check')"/>
+                  <xsl:text>-k check</xsl:text>
+                  <xsl:value-of select="substring-after(string(),'check')"/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:apply-templates/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                  <xsl:if test="contains(string(),' -k ')">
+                    <xsl:text> || true</xsl:text>
+                  </xsl:if>
+                  <xsl:text>&#xA;</xsl:text>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:if>
+            <!-- Bash -->
+            <xsl:if test="contains(string(),'tests')">
+              <xsl:choose>
+                <xsl:when test="$bomb-testsuite = 'n'">
+                  <xsl:value-of select="substring-before(string(),'tests')"/>
+                  <xsl:text>-k tests</xsl:text>
+                  <xsl:value-of select="substring-after(string(),'tests')"/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+                  <xsl:apply-templates/>
+                  <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                  <xsl:if test="contains(string(),' -k ')">
+                    <xsl:text> || true</xsl:text>
+                  </xsl:if>
+                  <xsl:text>&#xA;</xsl:text>
+                </xsl:otherwise>
+              </xsl:choose>
+            </xsl:if>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Fixing toolchain test suites run -->
+      <xsl:when test="string() = 'make check' or
+                string() = 'make -k check'">
+        <xsl:choose>
+          <xsl:when test="(($testsuite = '1' or $testsuite = '2') and
+                    ancestor::chapter[@id='chapter-building-system']) or
+                    $testsuite = '3'">
+            <xsl:choose>
+              <xsl:when test="$bomb-testsuite = 'n'">
+                <xsl:text>make -k check &gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+              </xsl:when>
+              <xsl:otherwise>
+                <xsl:apply-templates/>
+                <xsl:text> &gt;&gt; $TEST_LOG 2&gt;&amp;1</xsl:text>
+                <xsl:if test="contains(string(),' -k ')">
+                  <xsl:text> || true</xsl:text>
+                </xsl:if>
+                <xsl:text>&#xA;</xsl:text>
+              </xsl:otherwise>
+            </xsl:choose>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test="contains(string(),'glibc-check-log')">
+        <xsl:choose>
+          <xsl:when test="$testsuite != '0'">
+            <xsl:value-of select="substring-before(string(),'2&gt;&amp;1')"/>
+            <xsl:text>&gt;&gt; $TEST_LOG 2&gt;&amp;1 || true&#xA;</xsl:text>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <xsl:when test="contains(string(),'test_summary') or
+                contains(string(),'expect -c')">
+        <xsl:choose>
+          <xsl:when test="(($testsuite = '1' or $testsuite = '2') and
+                    ancestor::chapter[@id='chapter-building-system']) or
+                    $testsuite = '3'">
+            <xsl:apply-templates/>
+            <xsl:text> &gt;&gt; $TEST_LOG&#xA;</xsl:text>
+          </xsl:when>
+        </xsl:choose>
+      </xsl:when>
+      <!-- Don't stop on strip run -->
+      <xsl:when test="contains(string(),'strip ')">
+        <xsl:apply-templates/>
+        <xsl:text> || true&#xA;</xsl:text>
+      </xsl:when>
+      <!-- The rest of commands -->
+      <xsl:otherwise>
+        <xsl:apply-templates/>
+        <xsl:text>&#xA;</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template match="replaceable">
+    <xsl:choose>
+      <xsl:when test="ancestor::sect1[@id='ch-system-glibc']">
+        <xsl:value-of select="$timezone"/>
+      </xsl:when>
+      <xsl:when test="ancestor::sect1[@id='ch-system-groff']">
+        <xsl:value-of select="$page"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>**EDITME</xsl:text>
+        <xsl:apply-templates/>
+        <xsl:text>EDITME**</xsl:text>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/LFS/master.sh b/2.3/LFS/master.sh
new file mode 100644
index 0000000..f3d28ad
--- /dev/null
+++ b/2.3/LFS/master.sh
@@ -0,0 +1,531 @@
+#!/bin/bash
+
+# $Id$
+
+###################################
+###	    FUNCTIONS		###
+###################################
+
+
+#############################################################
+
+
+#----------------------------#
+chapter4_Makefiles() {       #
+#----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter4     ( SETUP ) ${R_arrow}"
+
+# If $LUSER_HOME is already present in the host, we asume that the
+# lfs user and group are also presents in the host, and a backup
+# of their bash init files is made.
+(
+    cat << EOF
+020-creatingtoolsdir:
+	@\$(call echo_message, Building)
+	@mkdir \$(MOUNT_PT)/tools && \\
+	rm -f /tools && \\
+	ln -s \$(MOUNT_PT)/tools /
+	@\$(call housekeeping)
+
+021-addinguser:  020-creatingtoolsdir
+	@\$(call echo_message, Building)
+	@if [ ! -d \$(LUSER_HOME) ]; then \\
+		groupadd \$(LGROUP); \\
+		useradd -s /bin/bash -g \$(LGROUP) -m -k /dev/null \$(LUSER); \\
+	else \\
+		touch luser-exist; \\
+	fi;
+	@chown \$(LUSER) \$(MOUNT_PT)/tools && \\
+	chmod -R a+wt \$(MOUNT_PT)/\$(SCRIPT_ROOT) && \\
+	chmod a+wt \$(SRCSDIR)
+	@\$(call housekeeping)
+
+022-settingenvironment:  021-addinguser
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc -a ! -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bashrc \$(LUSER_HOME)/.bashrc.XXX; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile  -a ! -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile \$(LUSER_HOME)/.bash_profile.XXX; \\
+	fi;
+	@echo "set +h" > \$(LUSER_HOME)/.bashrc && \\
+	echo "umask 022" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "LFS=\$(MOUNT_PT)" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "LC_ALL=POSIX" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "PATH=/tools/bin:/bin:/usr/bin" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "export LFS LC_ALL PATH" >> \$(LUSER_HOME)/.bashrc && \\
+	echo "source $JHALFSDIR/envars" >> \$(LUSER_HOME)/.bashrc && \\
+	chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bashrc && \\
+	touch envars && \\
+	chown \$(LUSER) envars
+	@\$(call housekeeping)
+EOF
+) > $MKFILE.tmp
+
+  chapter4=" 020-creatingtoolsdir 021-addinguser 022-settingenvironment"
+}
+
+
+
+#----------------------------#
+chapter5_Makefiles() {
+#----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter5     ( LUSER ) ${R_arrow}"
+
+  for file in chapter05/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # If no testsuites will be run, then TCL, Expect and DejaGNU aren't needed
+    # Fix also locales creation when running chapter05 testsuites (ugly)
+    case "${this_script}" in
+      *tcl)       [[ "${TEST}" = "0" ]] && continue ;;
+      *expect)    [[ "${TEST}" = "0" ]] && continue ;;
+      *dejagnu)   [[ "${TEST}" = "0" ]] && continue ;;
+      *stripping) [[ "${STRIP}" = "n" ]] && continue ;;
+      *glibc)     [[ "${TEST}" = "3" ]] && \
+                  sed -i 's@/usr/lib/locale@/tools/lib/locale@' $file ;;
+    esac
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    # DO NOT append the changingowner script, it need be run as root.
+    # A hack is necessary: create script in chap5 BUT run as a dependency for
+    # SUDO target
+    case "${this_script}" in
+      *changingowner) runasroot="$runasroot ${this_script}" ;;
+                   *) chapter5="$chapter5 ${this_script}" ;;
+    esac
+
+    # Grab the name of the target (minus the -pass1 or -pass2 in the case of gcc
+    # and binutils in chapter 5)
+    name=`echo ${this_script} | sed -e 's@[0-9]\{3\}-@@' -e 's@-pass[0-9]\{1\}@@'`
+
+    # Set the dependency for the first target.
+    if [ -z $PREV ] ; then PREV=022-settingenvironment ; fi
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    LUSER_wrt_target "${this_script}" "$PREV"
+
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    # If $pkg_tarball isn't empty, we've got a package...
+    if [ "$pkg_tarball" != "" ] ; then
+      # Insert instructions for unpacking the package and to set the PKGDIR variable.
+      LUSER_wrt_unpack "$pkg_tarball"
+      # If the testsuites must be run, initialize the log file
+      [[ "$TEST" = "3" ]] && LUSER_wrt_test_log "${this_script}"
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" = "2" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+
+    # Insert date and disk usage at the top of the log file, the script run
+    # and date and disk usage again at the bottom of the log file.
+    # The changingowner script must be run as root.
+    case "${this_script}" in
+      *changingowner)  wrt_RunAsRoot "$file" ;;
+      *)               LUSER_wrt_RunAsUser "$file" ;;
+    esac
+
+    # Remove the build directory(ies) except if the package build fails
+    # (so we can review config.cache, config.log, etc.)
+    if [ "$pkg_tarball" != "" ] ; then
+      LUSER_RemoveBuildDirs "$name"
+    fi
+
+    # Include a touch of the target name so make can check
+    # if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+  done  # end for file in chapter05/*
+}
+
+
+#----------------------------#
+chapter6_Makefiles() {
+#----------------------------#
+
+  # Set envars and scripts for iteration targets
+  if [[ -z "$1" ]] ; then
+    local N=""
+  else
+    local N=-build_$1
+    local chapter6=""
+    mkdir chapter06$N
+    cp chapter06/* chapter06$N
+    for script in chapter06$N/* ; do
+      # Overwrite existing symlinks, files, and dirs
+      sed -e 's/ln -sv/&f/g' \
+          -e 's/mv -v/&f/g' \
+          -e 's/mkdir -v/&p/g' -i ${script}
+      # Rename the scripts
+      mv ${script} ${script}$N
+    done
+    # Remove Bzip2 binaries before make install (LFS-6.2 compatibility)
+    sed -e 's@make install@rm -vf /usr/bin/bz*\n&@' -i chapter06$N/*-bzip2$N
+  fi
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter6$N     ( CHROOT ) ${R_arrow}"
+
+  for file in chapter06$N/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # We'll run the chroot commands differently than the others, so skip them in the
+    # dependencies and target creation.
+    # Skip also linux-headers in iterative builds.
+    case "${this_script}" in
+      *chroot)      continue ;;
+      *stripping*) [[ "${STRIP}" = "n" ]] && continue ;;
+      *linux-headers*) [[ -n "$N" ]] && continue ;;
+    esac
+
+    # Grab the name of the target.
+    name=`echo ${this_script} | sed -e 's@[0-9]\{3\}-@@' -e 's,'$N',,'`
+
+    # Find the version of the command files, if it corresponds with the building of
+    # a specific package. We need this here to can skip scripts not needed for
+    # iterations rebuilds
+    pkg_tarball=$(get_package_tarball_name $name)
+
+    if [[ "$pkg_tarball" = "" ]] && [[ -n "$N" ]] ; then
+      case "${this_script}" in
+        *stripping*) ;;
+        *)  continue ;;
+      esac
+    fi
+
+    # Append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile)
+    # The kernfs script must be run as part of SUDO target.
+    case "${this_script}" in
+      *kernfs) runasroot="$runasroot ${this_script}" ;;
+            *) chapter6="$chapter6 ${this_script}" ;;
+    esac
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    # In the mount of kernel filesystems we need to set LFS
+    # and not to use chroot.
+    case "${this_script}" in
+      *kernfs)  LUSER_wrt_target  "${this_script}" "$PREV" ;;
+      *)        CHROOT_wrt_target "${this_script}" "$PREV" ;;
+    esac
+
+    # If $pkg_tarball isn't empty, we've got a package...
+    # Insert instructions for unpacking the package and changing directories
+    if [ "$pkg_tarball" != "" ] ; then
+      # Touch timestamp file if installed files logs will be created.
+      # But only for the firt build when running iterative builds.
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_TouchTimestamp
+      fi
+      CHROOT_Unpack "$pkg_tarball"
+      # If the testsuites must be run, initialize the log file
+      case $name in
+        binutils | gcc | glibc )
+          [[ "$TEST" != "0" ]] && CHROOT_wrt_test_log "${this_script}"
+          ;;
+        * )
+          [[ "$TEST" = "2" ]] || [[ "$TEST" = "3" ]] && CHROOT_wrt_test_log "${this_script}"
+          ;;
+      esac
+      # If using optimizations, write the instructions
+      [[ "$OPTIMIZE" != "0" ]] &&  wrt_optimize "$name" && wrt_makeflags "$name"
+    fi
+
+    # In the mount of kernel filesystems we need to set LFS
+    # and not to use chroot.
+    case "${this_script}" in
+      *kernfs)  wrt_RunAsRoot  "$file" ;;
+      *)        CHROOT_wrt_RunAsRoot "$file" ;;
+    esac
+
+    # Write installed files log and remove the build directory(ies)
+    # except if the package build fails.
+    if [ "$pkg_tarball" != "" ] ; then
+      CHROOT_wrt_RemoveBuildDirs "$name"
+      if [ "${INSTALL_LOG}" = "y" ] && [ "x${N}" = "x" ] ; then
+        CHROOT_wrt_LogNewFiles "$name"
+      fi
+    fi
+
+    # Include a touch of the target name so make can check
+    # if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+    # Set system_build envar for iteration targets
+    system_build=$chapter6
+  done # end for file in chapter06/*
+}
+
+#----------------------------#
+chapter78_Makefiles() {
+#----------------------------#
+  echo "${tab_}${GREEN}Processing... ${L_arrow}Chapter7/8   ( BOOT ) ${R_arrow}"
+
+  for file in chapter0{7,8}/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Grub must be configured manually.
+    # Handle fstab creation.
+    # If no .config file is supplied, the kernel build is skipped
+    case ${this_script} in
+      *grub)    continue ;;
+      *fstab)   [[ ! -z ${FSTAB} ]] && cp ${FSTAB} $BUILDDIR/sources/fstab ;;
+      *kernel)  [[ -z ${CONFIG} ]] && continue
+                cp ${CONFIG} $BUILDDIR/sources/kernel-config  ;;
+    esac
+
+    # First append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile
+    chapter78="$chapter78 ${this_script}"
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    CHROOT_wrt_target "${this_script}" "$PREV"
+
+    # Find the bootscripts and kernel package names
+    case "${this_script}" in
+      *bootscripts)
+            name="lfs-bootscripts"
+            pkg_tarball=$(get_package_tarball_name $name)
+            if [ "${INSTALL_LOG}" = "y" ] ; then
+              CHROOT_wrt_TouchTimestamp
+            fi
+            CHROOT_Unpack "$pkg_tarball"
+        ;;
+      *kernel)
+            name="linux"
+            pkg_tarball=$(get_package_tarball_name $name)
+            if [ "${INSTALL_LOG}" = "y" ] ; then
+              CHROOT_wrt_TouchTimestamp
+            fi
+            CHROOT_Unpack "$pkg_tarball"
+       ;;
+    esac
+
+      # Check if we have a real /etc/fstab file
+    case "${this_script}" in
+      *fstab) if [[ -n $FSTAB ]]; then
+                CHROOT_wrt_CopyFstab
+              else
+                CHROOT_wrt_RunAsRoot "$file"
+              fi
+        ;;
+      *)        CHROOT_wrt_RunAsRoot "$file"
+        ;;
+    esac
+
+    case "${this_script}" in
+      *bootscripts)  CHROOT_wrt_RemoveBuildDirs "dummy"
+                     if [ "${INSTALL_LOG}" = "y" ] ; then
+                       CHROOT_wrt_LogNewFiles "$name"
+                     fi ;;
+      *kernel)       CHROOT_wrt_RemoveBuildDirs "dummy"
+                     if [ "${INSTALL_LOG}" = "y" ] ; then
+                       CHROOT_wrt_LogNewFiles "$name"
+                     fi ;;
+    esac
+
+    # Include a touch of the target name so make can check
+    # if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+  done  # for file in chapter0{7,8}/*
+
+}
+
+
+
+#----------------------------#
+build_Makefile() {           #
+#----------------------------#
+
+  echo "Creating Makefile... ${BOLD}START${OFF}"
+
+  cd $JHALFSDIR/${PROGNAME}-commands
+
+  # Start with a clean Makefile.tmp file
+  >$MKFILE
+
+  chapter4_Makefiles
+  chapter5_Makefiles
+  chapter6_Makefiles
+  # Add the iterations targets, if needed
+  [[ "$COMPARE" = "y" ]] && wrt_compare_targets
+  chapter78_Makefiles
+  # Add the CUSTOM_TOOLS targets, if needed
+  [[ "$CUSTOM_TOOLS" = "y" ]] && wrt_CustomTools_target
+  # Add the BLFS_TOOL targets, if needed
+  [[ "$BLFS_TOOL" = "y" ]] && wrt_blfs_tool_targets
+
+  # Add a header, some variables and include the function file
+  # to the top of the real Makefile.
+  wrt_Makefile_header
+
+  # Add chroot commands
+  CHROOT_LOC="`whereis -b chroot | cut -d " " -f2`"
+  i=1
+  for file in chapter06/*chroot* ; do
+    chroot=`cat $file | \
+            sed -e "s@chroot@$CHROOT_LOC@" \
+                -e '/#!\/bin\/bash/d' \
+                -e 's@ \\\@ @g' | \
+            tr -d '\n' | \
+            sed -e 's/  */ /g' \
+                -e 's|\\$|&&|g' \
+                -e 's|exit||g' \
+                -e 's|$| -c|' \
+                -e 's|"$$LFS"|$(MOUNT_PT)|' \
+                -e 's|set -e||' \
+                -e 's|set +h||'`
+    echo -e "CHROOT$i= $chroot\n" >> $MKFILE
+    i=`expr $i + 1`
+  done
+
+  # Drop in the main target 'all:' and the chapter targets with each sub-target
+  # as a dependency.
+(
+    cat << EOF
+
+all:	ck_UID mk_SETUP mk_LUSER mk_SUDO mk_CHROOT mk_BOOT create-sbu_du-report mk_CUSTOM_TOOLS mk_BLFS_TOOL
+	@sudo make do_housekeeping
+	@echo "$VERSION - jhalfs build" > lfs-release && \\
+	sudo mv lfs-release \$(MOUNT_PT)/etc
+	@\$(call echo_finished,$VERSION)
+
+ck_UID:
+	@if [ \`id -u\` = "0" ]; then \\
+	  echo "--------------------------------------------------"; \\
+	  echo "You cannot run this makefile from the root account"; \\
+	  echo "--------------------------------------------------"; \\
+	  exit 1; \\
+	fi
+
+mk_SETUP:
+	@\$(call echo_SU_request)
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SETUP
+	@touch \$@
+
+mk_LUSER: mk_SETUP
+	@\$(call echo_SULUSER_request)
+	@( sudo \$(SU_LUSER) "source .bashrc && cd \$(MOUNT_PT)/\$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) LUSER" )
+	@sudo make restore-luser-env
+	@touch \$@
+
+mk_SUDO: mk_LUSER
+	@sudo make BREAKPOINT=\$(BREAKPOINT) SUDO
+	@touch \$@
+
+mk_CHROOT: mk_SUDO
+	@\$(call echo_CHROOT_request)
+	@( sudo \$(CHROOT1) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CHROOT")
+	@touch \$@
+
+mk_BOOT: mk_CHROOT
+	@\$(call echo_CHROOT_request)
+	@( sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BOOT")
+	@touch \$@
+
+mk_CUSTOM_TOOLS: create-sbu_du-report
+	@if [ "\$(ADD_CUSTOM_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building CUSTOM_TOOLS); \\
+	  sudo mkdir -p ${BUILDDIR}${TRACKING_DIR}; \\
+	  (sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) CUSTOM_TOOLS"); \\
+	fi;
+	@touch \$@
+
+mk_BLFS_TOOL: mk_CUSTOM_TOOLS
+	@if [ "\$(ADD_BLFS_TOOLS)" = "y" ]; then \\
+	  \$(call sh_echo_PHASE,Building BLFS_TOOL); \\
+	  sudo mkdir -p $BUILDDIR$TRACKING_DIR; \\
+	  (sudo \$(CHROOT2) "cd \$(SCRIPT_ROOT) && make BREAKPOINT=\$(BREAKPOINT) BLFS_TOOL"); \\
+	fi;
+	@touch \$@
+
+
+SETUP:        $chapter4
+LUSER:        $chapter5
+SUDO:         $runasroot
+CHROOT:       SHELL=/tools/bin/bash
+CHROOT:       $chapter6
+BOOT:         $chapter78
+CUSTOM_TOOLS: $custom_list
+BLFS_TOOL:    $blfs_tool
+
+
+create-sbu_du-report:  mk_BOOT
+	@\$(call echo_message, Building)
+	@if [ "\$(ADD_REPORT)" = "y" ]; then \\
+	  ./create-sbu_du-report.sh logs $VERSION; \\
+	  \$(call echo_report,$VERSION-SBU_DU-$(date --iso-8601).report); \\
+	fi;
+	@touch  \$@
+
+restore-luser-env:
+	@\$(call echo_message, Building)
+	@if [ -f \$(LUSER_HOME)/.bashrc.XXX ]; then \\
+		mv -f \$(LUSER_HOME)/.bashrc.XXX \$(LUSER_HOME)/.bashrc; \\
+	fi;
+	@if [ -f \$(LUSER_HOME)/.bash_profile.XXX ]; then \\
+		mv \$(LUSER_HOME)/.bash_profile.XXX \$(LUSER_HOME)/.bash_profile; \\
+	fi;
+	@chown \$(LUSER):\$(LGROUP) \$(LUSER_HOME)/.bash*
+	@\$(call housekeeping)
+
+do_housekeeping:
+	@-umount \$(MOUNT_PT)/sys
+	@-umount \$(MOUNT_PT)/proc
+	@-umount \$(MOUNT_PT)/dev/shm
+	@-umount \$(MOUNT_PT)/dev/pts
+	@-umount \$(MOUNT_PT)/dev
+	@-rm /tools
+	@-if [ ! -f luser-exist ]; then \\
+		userdel \$(LUSER); \\
+		rm -rf \$(LUSER_HOME); \\
+	fi;
+
+
+EOF
+) >> $MKFILE
+
+  # Bring over the items from the Makefile.tmp
+  cat $MKFILE.tmp >> $MKFILE
+  rm $MKFILE.tmp
+  echo "Creating Makefile... ${BOLD}DONE${OFF}"
+}
diff --git a/2.3/LICENSE b/2.3/LICENSE
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/2.3/LICENSE
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/2.3/Makefile b/2.3/Makefile
new file mode 100644
index 0000000..d5ae127
--- /dev/null
+++ b/2.3/Makefile
@@ -0,0 +1,35 @@
+# From the Build Scripts Written By: Jim Gifford <lfs@jg555.com>
+# Modified By: Joe Ciccone <jciccone@linuxfromscratch.org
+# Additional changes: George Boudreau <georgeb@linuxfromscratch.org>
+
+TOPDIR=$(shell pwd)
+CONFIG_CONFIG_IN = Config.in
+CONFIG = menu
+
+all: menuconfig
+#	@clear
+	@`grep RUN_ME configuration | sed -e 's@RUN_ME=\"@@' -e 's@\"@@' `
+
+$(CONFIG)/conf:
+	$(MAKE) -C $(CONFIG) conf
+
+$(CONFIG)/mconf:
+	$(MAKE) -C $(CONFIG) ncurses conf mconf
+
+menuconfig: $(CONFIG)/mconf
+	@$(CONFIG)/mconf $(CONFIG_CONFIG_IN)
+
+config: $(CONFIG)/conf
+	@$(CONFIG)/conf $(CONFIG_CONFIG_IN)
+
+# Clean up
+
+clean:
+	rm -f configuration configuration.old error
+	- $(MAKE) -C $(CONFIG) clean
+
+clean-target:
+	rm -f error
+	- $(MAKE) -C $(CONFIG) clean
+
+.PHONY: all menuconfig config clean clean-target
diff --git a/2.3/README b/2.3/README
new file mode 100644
index 0000000..fc8bebf
--- /dev/null
+++ b/2.3/README
@@ -0,0 +1,276 @@
+$Id$
+
+1. INTRODUCTION::
+
+     This collection of scripts, known as jhalfs, strives to create
+  accurate makefiles from the Linux From Scratch book series XML files.
+  This software is an evolution of the original "jhalfs-0.2" code developed
+  by Jeremy Huntwork.
+
+     The usage of this script assumes you have read and are familiar with
+  the book(s) and, therefore, the configuration variables found in menuconfig
+  interface will have meaning to you.
+
+  The list of supported books can be found at
+  http://wiki.linuxfromscratch.org/alfs/wiki/SupportedBooks
+
+  NOTES::
+  *.  The resulting Makefile takes considerable time to run to completion.
+  Lay in a supply of caffeine beverages.
+
+  *.  It is recommended that you temporarily unpack your linux kernel,
+  run <make menuconfig>, configure the kernel as per the book and save
+  the resulting .config file. This suggestion also applies to the
+  configuration of the uClibc package when building a HLFS system using
+  uClibc rather than glibc.
+
+  *.  Read carefully this file and the other README.* files before start
+  using the tool.
+
+2. PREREQUISITES::
+
+     To use this tool you MUST:
+
+     - have experience building {c,h,b}LFS packages
+     - know how to edit and write shell scripts
+     - know how a Makefile works
+     - be able to trace build failures and to find what is causing it
+       (user error, package bug, {c,h,b}LFS command bug, or jhalfs code bug)
+
+     If you do not have the above skills, please don't use this tool.
+
+
+3. INSTALLATION::
+
+     No installation is required. System-wide installation is not allowed.
+
+4. CONFIGURATION::
+
+     We have installed the familiar menu based configuration tool driven by
+     GNU make. see the section RUNNING, for details
+
+5. RUNNING::
+
+     The command <make> will launch a menu based configuration program. You will
+     recognize the layout from building the kernel or uClibc/BusyBox. The
+     underlying menu code was borrowed from BusyBox and slightly modified for
+     our use.
+
+     Help on parameter function is available from the on-line help. Please
+     make use of that feature for additional information not in this file.
+
+     Once you have set the parameters you wish and have saved your work the
+     jhalfs script is launch. The script verify first that the host can run
+     it and build the xLFS system, then validate the configuration and present
+     you with your selections which you may accept or reject.
+
+     If you accepted the displayed settings jhalfs will proceed to create the
+     Makefile, optionally download packages.
+
+     ::NEWS::
+         You must be logged as a normal user with sudo privileges to run
+         the Makefile.
+
+     NOTE::
+         If you run the jhalfs script directly the only function you can select
+         is to display the version number running <./jhalfs -v>
+
+6. BLFS_TOOL SUPPORT::
+
+     For books that support it, there is an option to install blfs-tool and its
+     dependencies on the final system. The pre-made build dependencies
+     scripts has been written based on a LFS build. For CLFS and HLFS
+     builds you may need to adjust that scripts, that are found into the
+     common/blfs-tool-deps directory in the jhalfs sources tree.
+
+     WARNING:: If you add blfs-tool support on a CLFS Sysroot build
+               you MUST to edit the dependencies scripts to fix the
+               installation paths.
+               Be careful when you modify the scripts as you can
+               easily disable the host system.
+
+     After booting the new xLFS system some steps are needed to finish
+     blfs-tool installation:
+
+       - A user account must be created. You must be logged on that user
+         account to use blfs-tool.
+
+       - Move /blfs-root to that user's home and change ownership of the
+         directory and files to the user.
+
+       - Give the user read and write privileges over the $TRACKING_DIR
+         directory and the files that it contains.
+
+       - If you think that you may need the libxml2/libxslt Python modules,
+         remove the libxml2 and libxslt trackin files found in $TRACKING_DIR.
+
+       - Configure sudo, adding the needed privileges for the user.
+
+     We assume that blfs-tool will be used on a running fresh xLFS system.
+     To use it to build BLFS packages from the chroot jail is also possible,
+     but is for you to figure out how to do that.
+
+     To know how to blfs-tool works, see README.BLFS.
+
+7. LAYOUT::
+
+        /BLFS (see README.BLFS)
+
+        /CLFS/master.sh
+             /clfs.xsl
+
+        /CLFS2/master.sh
+              /clfs2.xsl
+
+        /CLFS3/master.sh
+              /clfs3.xsl
+
+        /HLFS/master.sh
+             /hlfs.xsl
+
+        /LFS/master.sh
+            /lfs.xsl
+
+        /common/common_functions
+               /makefile_functions
+               /packages.xsl
+               /urls.xsl
+               /create-sbu_du-report.sh
+               /progress_bar.sh
+               /blfs-tool-deps/9xx-*
+               /libs/func_*
+
+        /custom/template
+               /config/
+               /examples/*
+               /examples_CLFS-E/*
+
+        /extras/do_copy_files
+               /do_ica_prep
+               /do_ica_work
+               /farce
+               /filelist
+
+        /optimize/opt_config
+                 /opt_override
+                 /optimize_functions
+                 /opt_config.d/noOpt
+                              /noSymbols
+                              /O3pipe
+                              /O3pipe_march
+                              /defOpt_fPIC
+
+        /menu/*
+
+        README
+        README.BLFS
+        README.CLFS
+        README.HLFS
+        README.CUSTOM
+        TODO
+        LICENSE
+
+        Config.in
+        Makefile
+        jhalfs
+        blfs-tool
+
+8. FAQ::
+    Q. "This 'help' file is very sparse"
+    A. Yes, it is. This tool, jhalfs, is for those who understand the LFS books
+       and wish to automate the build. 99% of any problems that arise can be
+       solved by reading the book(s).
+
+    Q. "It doesn't work!"
+    A. Yes it does, try >> make
+       Remember you must have 'sudo' privileges.
+
+    Q. "It still doesn't work"
+    A. jhalfs was designed to work against the development versions of the LFS
+       series of books. Consequently changes in a book(s) sometimes breaks older
+       versions of jhalfs. Before you start pulling out your hair download the
+       latest version of jhalfs to see if that solves your problem.
+
+    Q. "How do I specify the build location?"
+    A. The original LFS document worked against the well known location /mnt/lfs.
+       This script automates the build of all of the LFS series of books and uses
+       a generic location $BUILDDIR with a default value of /mnt/build_dir.
+       You may change this value to suit your needs.
+
+       The layout below $BUILDDIR is as follows.
+       $BUILDDIR/
+            jhalfs      (Makefile, cmd scripts, logs, etc..)
+            sources     (where packages reside)
+            tools       (temporary bootstrap system)
+            cross-tools (temporary CLFS only)
+                ...
+            FHS dir structure
+                ...
+            blfs_root   (files to use blfs-tool if selected to install it)
+
+    Q. "What is the function of the SRC_ARCHIVE variable?"
+    A. When jhalfs runs and packages download was selected, it creates a local
+       copy of the necessary packages in BUILDDIR/sources by downloading the
+       files. If the variable SRC_ARCHIVE is defined the software will first
+       look in this location for the file and, if found, will copy it to
+       BUILDDIR/sources.
+       If the files are not found in SRC_ARCHIVE _and_ you have write priv to
+       the directory any downloaded files will be mirrored there.
+
+    Q. "How do I set the SRC_ARCHIVE location?"
+    A. The best way to set the value of SRC_ARCHIVE is
+
+       export SRC_ARCHIVE=/wherever/you/store/downloaded/packages
+
+       or you can set the full path in the proper menu entry.
+
+    Q. "Why have 2 copies of the files?"
+    A. The package files must be visible during the chroot phase and this is a
+       simple and reliable method of doing so. This method also handles the CLFS
+       boot build method where the final build may be done on a separate machine.
+
+    Q. "What is the function of "User account" and "Group account" menu settings?"
+    A. If you are running jhalfs from a low or non-privileged account you may not
+       have the priv to create/delete the user needed to build temporary tools.
+       These settings allow you to use your own user and group name to do that
+       build steps.
+
+       These variables are adjustable also when invoking make:
+
+         $BUILDDIR make LUSER=myaccount LGROUP=mygroup
+
+       The only changes to your account will be the creation of a NEW .bashrc
+       after saving your original to .bashrc.XXX
+
+    Q. "When I try to build CLFS the Makefile fails at the mid-point"
+    A. There could be numerous reasons for the failure but the most likely reason
+       is you are doing a cross-build using the 'chroot' method and the target is
+       not compatible with the host.  If you choose to build using the chroot
+       method a test is performed at the end of the temptools phase. If the test
+       succeeds the build continues inside a chroot jail. However if the test fails
+       it means the host and target are not compatible an you should use the
+       'boot' method to create your target code.
+       As an extreme example: You can build a sparc target on a x86 platform but
+       only the temptools phase. You must select the 'boot' method and not the
+       'chroot.' You must transfer the toolchain to a sparc platform, reboot the
+       sparc box and continue the build.
+       Of all the LFS series of books Cross-LFS requires the greatest
+       understanding of host/target hardware combination. Please read the book
+       carefully and don't skip the easy parts (there are none..)
+
+    Q. "How could I stop the build at a predefined chosen point?"
+    A. Launch the Makefile manually passing the last numbered target to be build
+       as the break point. For example:
+
+          make BREAKPOINT=84-bash
+
+       The build can be stopped also at the end of a top-level build phase by
+       calling directly the appropriate mk_* target. For example:
+
+          make mk_LUSER
+
+       See the Makefile to know the proper target names for that book build.
+
+Authors:
+  George Boudreau
+  Manuel Canales Esparcia
diff --git a/2.3/README.BLFS b/2.3/README.BLFS
new file mode 100644
index 0000000..430f9ae
--- /dev/null
+++ b/2.3/README.BLFS
@@ -0,0 +1,233 @@
+$Id$
+
+1. INTRODUCTION::
+
+     If you want to add blfs-tool support into a xLFS base system build,
+  read the "BLFS_TOOL SUPPORT" section found in the README and be sure
+  to follow the after-booting installation intructions.
+
+     To automate package builds from the BLFS book instructions is a huge
+  task. Some of the issues are: the BLFS book isn't linear; some package
+  pages use a custom layout; there are circular dependencies; several
+  packages can be installed on a non-default prefix; build commands can
+  change based on what dependencies will be used, etc.
+
+     That being said, the goal of the blfs-tool is to help you solve package
+  dependencies, create build scripts and a Makefile. Few of the auto-generated
+  build scripts and Makefile will work "as is", thus, as a general rule,
+  you will need to review and edit the scripts while reading the book.
+
+
+2. PREREQUISITES::
+
+     To use this tool you MUST:
+
+     - have experience building BLFS packages
+     - know how to edit and write shell scripts
+     - know how a Makefile works
+     - be able to trace build failures and to find what is causing it
+       (user error, package bug, BLFS command bug, or jhalfs code bug)
+
+     If you do not have the above skills, please don't use this tool.
+
+
+3. USAGE::
+
+     Due the complexity of the BLFS book, the scripts and Makefile generation
+  is done in several steps:
+
+  3.1  INSTALLED PACKAGES TRACKING SYSTEM
+
+       This tool includes a very simple tracking system to log which packages
+    have been installed using the tool. It is used to skip installed packages
+    from target selection menu and to test if an installed package has been
+    updated in the BLFS book. Do not rely on this feature as a package
+    management tool.
+
+       The directory where tracking files will be stored needs to be created
+    before installing blfs-tool. You can place this directory anywhere, taking
+    care that the user must have read and write privileges on that directory
+    and on all files it contains.
+
+       To use the default path set in the installation menu, run as root:
+
+    install -d -m1777 /var/lib/jhalfs/BLFS
+
+  3.2  BLFS_TOOL INSTALLATION::
+
+       Run "make" to launch the jhalfs menuconfig interface. Select the BLFS
+    book and version. Then set the installation directory (default
+    $HOME/blfs_root), the BLFS sources directory (default blfs-xml), and
+    the installed packages tracking directory (default /var/lib/jhalfs/BLFS).
+
+       All required files will be placed in the installation directory and
+    BLFS XML sources will be installed in the named sub-directory.
+
+       Installed files:
+
+    blfs-xml/*         SVN tree of the selected BLFS book version
+    lib/*              functions libraries, xsl stylesheets, and auto-generated
+                       meta-packages dependencies tree files
+    menu/*             lxdialog and menuconfig source code
+    README.BLFS        this file
+    TODO               developers notes
+    update_book.sh     update the XML book sources and regenerates packages
+                       database and meta-packages dependencies tree
+    gen_config.sh      regenerates Config.in
+    gen_pkg_book.sh    resolves dependencies and generates linear BLFS books
+                       and build scripts
+    gen-makefile.sh    generates the target Makefile
+    progress_bar.sh    the target Makefile progress bar
+    Makefile           run gen_config.sh to update Config.in,
+                       then launch the menuconfig interface, and lastly run
+                       gen_pkg_book.sh based on configuration settings
+    Config.in          menuconfig interface input file
+    packages           auto-generated packages database
+    envars.conf        envars needed when running the target build scripts
+
+       From now on, all the work must be done from inside the installation
+    root directory.
+
+       When finished the installation, the configuration and target selection
+    menu is launch.
+
+  3.3  UPDATING BOOK SOURCES::
+
+       If you are using the development book version and you want to update
+    installed packages to the latest version found in that book, you need to
+    update the XML sources and packages database.
+
+       To do that run "./update_book.sh"
+
+       On the next configuration run, packages already installed but listed
+    with a new version in the book will be available for target selection
+    and used to solve dependencies.
+
+  3.4  CONFIGURING AND PARSING THE BOOK::
+
+       The next step is to create a book and build scripts in dependency
+    build order for a target package. A target can be a package or a
+    meta-package.
+
+    WARNING:
+           Only one target (meta-package or individual package) must be
+           selected on each configuration run.
+	   There is no way to solve dependencies properly when more
+           than one target are selected.
+
+       Run <make> to launch the configuration interface. The main menu contains
+    three blocks: meta-package selection, individual package selection, and
+    build options.
+
+       When a meta-package is selected, it is possible to unselect unwanted
+    components. The unselected components will be skipped if no other components
+    depends on them.
+
+       In the build options section, the dependencies level and default packages
+    used to solve alternatives are set. You can also select whether the build will
+    be made as a normal user or as root. That settings are saved to be reused in
+    future configuration runs.
+
+       If, for example, your target selection is Xsoft-->Graphweb-->galeon, a
+    directory named "galeon" will be created. Inside that directory you will
+    find a directory named "HTML" that contains a galeon-based HTML book with
+    its dependencies in build order, and a "scripts" directory with build
+    scripts for that packages.
+
+       There are also two other directories ("dependencies" and "xincludes")
+    that contain files generated while resolving dependencies trees.
+
+  3.5  EDITING BUILD SCRIPTS
+
+       Now it is time to review the generated book and scripts, making any changes
+    to the scripts necessary to fix generation bugs or to suit your needs.
+
+       Scripts for additional packages (i.e., for non-BLFS packages) can be
+    easily inserted. For example, if you want to install the external dependency
+    "bar" before "foo" package and the "foo" script is named "064-z-foo", you
+    need to create a "064-y-bar" build script.
+
+      Remember, the package tracking system isn't a package management tool
+    and knows nothing about packages not in the BLFS book.
+
+      Also, review and edit envars.conf. This file is used to set global envars
+    needed by the build scripts.
+
+  3.6  CREATING THE MAKEFILE
+
+       When the build scripts are ready to be run, the Makefile can be
+    created. Be sure that you cd into the "package" directory and run
+    ../gen-makefile.sh
+
+    Review the Makefile, and, if all looks sane, start the build.
+
+4. GENERATED BUILD SCRIPTS ISSUES::
+
+      In this section, known issues with the generated build scripts are
+   discussed. They are due to build procedures and/or BLFS layout particularities
+   that we can't handle. In several cases, editing the build scripts is mandatory.
+   You may also need to insert some build scripts created by you to resolve
+   unhandled dependencies and/or to remove some script installing the affected
+   package by hand.
+
+   4.1  BLFS BOOTSCRIPTS
+
+        For now, bootscripts installation will fail. You will need to edit
+     the scripts for packages that install bootscripts and fix their
+     installation command. That could be fixed in the future.
+
+   4.2  PACKAGE CONFIGURATION
+
+        For those packages that have a "Configuration" section, you should
+     edit the build script to fit the needs of your system.
+
+   4.4  PDL, Perl modules, and Glib-Bindings.
+
+        The generated scripts for these packages are broken and can not
+     be fixed. You must replace them with your own scripts or install the
+     packages by hand.
+
+   4.4  GCC, JDK, Sane, and KDE-multimedia
+
+        On the pages for these packages, the BLFS book actually has instructions
+     to install two packages. You must edit the scripts to fix this.
+
+        We will try to fix some of them, but this may not be possible.
+
+   4.5  XORG7
+
+        The generated scripts for Xorg7 pseudo-packages have $SRC_ARCHIVE
+     support for individual packages, but not for patches nor *.wget and *.md5
+     files.
+
+        If you have previously downloaded the patches, you must edit
+     the scripts to use your local packages.
+
+       The *.wget and *.md5 files should be downladed always from inside
+     the scripts to be sure that the most current individual packages are
+     used. Thus don't reuse previouly existing ones.
+
+   4.6  PATCHES
+
+        By default, all required patches will be downloaded from the NET.
+
+        If you have previously downloaded the patches, you must edit the
+     scripts to use your local patches.
+
+        Also, be sure that all scripts have the commands to download/apply the
+     required patches. Due to book layout issues, some patches may be missing.
+
+   4.7  ROOT COMMANDS
+
+        If building as a normal user (the default setting), be sure that all
+     commands that require root privileges are run using sudo. Also make sure
+     necessary root privilege commands are visible in your PATH.
+
+        Due to book layout issues, some sudo commands may be missing.
+
+   4.8  OTHERS
+
+        There may be other issues that we are not aware of. If you find
+     any, please report it to <alfs-discuss@linuxfromscratch.org>.
+
+
diff --git a/2.3/README.CLFS b/2.3/README.CLFS
new file mode 100644
index 0000000..e4251a2
--- /dev/null
+++ b/2.3/README.CLFS
@@ -0,0 +1,44 @@
+# $Id$
+
+       CLFS-1.x NOTES
+
+  None for now.
+
+
+
+       CLFS SYSROOT METHOD NOTES
+
+  .- If you want to install additional custom packages via "Add custom tools
+  support" and/or select "Add blfs-tool support", be sure to review and edit
+  their packages build scripts to follow the sysroot build method or you will
+  end messing your host system. Be very careful with this.
+
+  .- If you install additional packages not using the "Add custom tools support"
+  feature (i,e, you will install it manually after finished the Makefile run)
+  you will need to run manually the "Changing the Ownership Of The CLFS System"
+  phase commands found in the book.
+
+
+
+       CLFS EMBEDDED SYSTEMS NOTES
+
+  .- Mips, WRT and ARM builds are broken due a book bug on the uClibc
+  *ENDIAN* configuration settings.
+
+  .- To install CBLFS packages you must to use the "Add custom tools support"
+  feature. To learn how it works and how to use it, see the section titled
+     "Adding Post-System Build Configuration Files and Extra Packages"
+  found in README.CUSTOM. That is also applicable to bootloaders installation.
+
+  .- If you install additional packages not using the "Add custom tools support"
+  feature (i,e, you will install it manually after finished the Makefile run)
+  you will need to run manually the "Changing the Ownership Of The CLFS System"
+  phase commands found in the book.
+
+  .- If your target is a MIPS wireless router, you must to select "mips" as
+  your target architecture and "WRT - MIPS based wireless route" as your
+  hardware platform.
+
+  .- The backup & clean-up phases aren't run. This is to allow users to
+  review the installed files and do a more in-deeper clean-up before creating
+  the system tarball.
diff --git a/2.3/README.CUSTOM b/2.3/README.CUSTOM
new file mode 100644
index 0000000..171449d
--- /dev/null
+++ b/2.3/README.CUSTOM
@@ -0,0 +1,268 @@
+#
+# $Id$
+#
+	HOW TO ADD CUSTOM SCRIPTS TO THE JHALFS MAKEFILE
+
+
+  Normally JHALFS creates a Makefile containing only those scripts found in
+the {B,C,H}LFS books. An automated construction tool cannot predict the
+needs of every individual and requests are made "Can you add xxxx package".
+Rather than adding numerous package scripts and switches for each request it
+was easier to add a tool for the user(s) to code their own package needs.
+
+  There is two areas that can be customized: how the base system is build
+and what additional configurations and packages requires your hardware to can
+boot and work with. Each one of this areas is handled in a different way.
+
+
+
+
+        BASE SYSTEM CUSTOMIZATION
+
+  There is two ways to alter how the base system will be built:
+
+  - Using a working copy of the book sources and editing the XML files.
+    This is the way used by book editors to test packages upgrades,
+    command changes, build order changes. etc.
+
+    This method requires you know very well the book sources and what
+    files need be edited. It will not be discussed here.
+
+  - Editing the generated build scripts to make any change you would.
+    This is the method discussed below.
+
+
+  EDITING THE BASE SCRIPTS
+
+  First step is to generate the build scripts with book defaults. To do that,
+configure jhalfs activating any option you want included, but do not select
+"Run the Makefile" option.
+
+  Under the ${BUILD_DIR}/${SCRIPT_ROOT}/${PROGNAME}-commands directory
+(using the defaults values to do an LFS build, that directory name is
+/mnt/build_dir/jhalfs/lfs-commands) you will find the default build scripts.
+
+  If all you want is modify, add, or remove some command from a package
+installation, for example to change it ./configure line, just edit the related
+script. If changing or adding a patch, be sure to copy the new patch to the
+${BUILD_DIR}/sources directory. When done, run 'make' from inside the
+${BUILD_DIR}/${SCRIPT_ROOT} directory.
+
+
+  REPLACING OR INSERTING PACKAGES AND CHANGING BUILD ORDER
+
+  To remove a package from the system, just remove its script(s).
+
+  To change the version of some package to build a newest or oldest one than the
+one found in the book, edit ${BUILD_DIR}/${SCRIPT_ROOT}/pkg_tarball_list to
+change it tarball name and place the new tarball in the ${BUILD_DIR}/sources
+directory,
+
+  To replace a package by an equivalent one, rename the replaced package script
+to reflect the new package name (for example, 102-man-db -> 102-man), edit the
+script to made the required commands changes, place the new tarball in the
+${BUILD_DIR}/sources directory, and edit ${BUILD_DIR}/${SCRIPT_ROOT}/pkg_tarball_list
+file to replace the removed package tarball name by the new package tarball name.
+
+  To change the build order, rename the scripts changing the first 3-digits
+string until have it ordered in the way you want.
+
+  To insert a new package, for example to build Cracklib to can build Shadow
+with Cracklib support, first you should decide before what default package it
+need be installed, in this example before 107-shadow. Then create a new script
+containing the needed commands, using an existing one as template, and name it with
+the same 3-digits string used for that mentioned default package, but adding
+another 1-digit string. In our example, the new script to build Cracklib just
+before Shadow will be named 107-1-cracklib. This naming schema allow to insert
+up to 10 scripts before each one of the default scripts. Place the tarball for
+the new package and required patches, if any, if ${BUILD_DIR}/sources and edit
+${BUILD_DIR}/${SCRIPT_ROOT}/pkg_tarball_list to add the tarball name for that
+package.
+
+  When ready, launch again the jhalfs configuration interface. Be sure that
+are selected exactly the same options than when generating the default build
+scripts. Be sure that "Rebuild files" is unselected and select "Run the Makefile"
+if you want. Then select "Rebuild the Makefile". This will create a new Makefile
+based on the changes you made to the build scripts.
+
+
+
+
+       ADDING POST-SYSTEM BUILD CONFIGURATION FILES AND EXTRA PACKAGES
+
+  The installation of BLFS packages is handled via blfs-tool and activated
+when you select the appropriate menu option. See README and README.BLFS for
+more info.
+
+  The feature described below was added so users could install remaining
+configuration files, build the packages necessary to access the Internet
+or to support specific hardware, or to install basic utilities that need
+have available from the beginning, and was not intended to replace the BLFS
+install system.
+
+  :::NOTICE:::
+  The following examples are for use with LFS and are not applicable to any
+of the CLFS-sysroot or CLFS-Embedded books. The directory examples_CLFS-E
+contains code extracted from Beyond CLFS-embedded. Any packages you chose to
+add should honour the DESTDIR=${CLFS} switch or equivalent.
+
+
+  LAYOUT
+  A new directory has been added to JHALFS tree which will contain the
+configuration scripts and a few examples. A switch has been added to the
+configuration file which enables/disables the inclusion of personal scripts.
+
+    custom
+      /config          <-- where to put your scripts.
+      /examples        <-- a few example scripts
+      /examples_CLFS-E <-- example scripts for CLFS-Embedded
+      template         <-- ALL scripts MUST look like this
+
+
+
+  NOTE::: You are responsible for including all dependencies and ensuring they
+          are built in the proper order.
+
+  1. To add a package to the final JHALFS Makefile you must first create a file
+     in the custom/config directory.
+       **All config files MUST follow the naming convention, xxx-PKG, where xxx
+       is the order number and PKG is the name of the package. The file naming
+       format is important as it defines the build order. The example shown
+       below has an order number 950 and log files will list in alphabetical
+       order in the /logs directory after blfs-tools scripts.
+    The simplest method is to copy the template file into the config directory
+    and rename it.
+
+  2. Populate the variables with the necessary values.
+       Variable function is self explanatory except for the inclusion of the
+       build cmds. If the package you want to include is found in the BLFS
+       book then you only need to copy/paste the cmd strings between the xEOFx
+       pairs, otherwise you will need to define the build cmds yourself.
+     NOTE::: This script you just created is not usable directly but contains
+             all the information necessary for jhalfs to create a build script
+	     and an entry in the jhalfs Makefile.
+
+  3. As mentioned previously the build order is dictated by the 3 digit number
+     in the file name. If a package has dependencies it must be numerically
+     larger than the dependency files.
+       i.e. The package mc has glib as a dependency and build order is
+           950-glib
+	   951-mc
+
+  4. A config file for BLFS-bootscripts is already created as 999-blfs_bootscripts.
+     If a package requires a bootscript to be installed add the cmd to this
+     file and NOT in the package script. The gpm script is included as an
+     example of multiple patch files and the need for a blfs bootscript.
+
+
+#--------- GLIB example -----------
+
+  #
+  # Filename syntax xxx-PKG  ie. 950-glibc
+  # Create a file in the custom/config directory
+  # Populate the file using the following script as an example
+  #
+
+PKG="glib"
+PKG_VERSION="1.2.10"
+PKG_FILE="glib-1.2.10.tar.gz"
+URL="http://gd.tuwien.ac.at/graphics/gimp/gtk/v1.2/${PKG_FILE}"
+MD5="6fe30dad87c77b91b632def29dd69ef9"
+
+  # The following code removes previously defined PATCHx variables
+for i in PATCH{1..10}; do
+   unset $i
+done
+  # Patches are named PATCH[1..10]
+  # This information is used to download the patch only
+  # If you do not have the MD5SUM the download will proceed with a warning.
+PATCH1="http://www.linuxfromscratch.org/patches/blfs/svn/glib-1.2.10-gcc34-1.patch 0077a1cce5e8a2231ac5a9b08c6263ba"
+
+
+  # NOTE::
+  #  The convoluted scheme used to write out a temporary file is
+  #  a work-around for embedded single and double quotes.
+
+( cat << "xEOFx"
+
+patch -Np1 -i ../glib-1.2.10-gcc34-1.patch &&
+./configure --prefix=/usr &&
+make
+make install &&
+chmod -v 755 /usr/lib/libgmodule-1.2.so.0.0.10
+
+xEOFx
+) > tmp
+
+
+#--------- GPM example -----------
+
+
+PKG="gpm"
+PKG_VERSION="1.20.1"
+PKG_FILE="gmp-1.20.1.tar.bz2"
+URL="ftp://arcana.linux.it/pub/gpm/gpm-1.20.1.tar.bz2"
+MD5="2c63e827d755527950d9d13fe3d87692"
+for i in PATCH{1..10}; do
+   unset $i
+done
+  # MD5SUM is not absolutely necessary but JHALFS whines and complains
+  # Add the MD5SUM if you can
+PATCH1=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-segfault-1.patch"
+PATCH2=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-silent-1.patch"
+
+
+( cat << "xEOFx"
+
+patch -Np1 -i ../gpm-1.20.1-segfault-1.patch &&
+patch -Np1 -i ../gpm-1.20.1-silent-1.patch &&
+./configure --prefix=/usr --sysconfdir=/etc &&
+LDFLAGS="-lm" make
+
+make install &&
+cp -v conf/gpm-root.conf /etc &&
+ldconfig
+
+# The normal cmd to install the boot script for gpm
+# --- PUT THIS CMD INSIDE 999-blfs_bootscripts
+#make install-gpm
+
+cat > /etc/sysconfig/mouse << "EOF"
+# Begin /etc/sysconfig/mouse
+
+MDEVICE="/dev/psaux"
+PROTOCOL="imps2"
+GPMOPTS=""
+
+# End /etc/sysconfig/mouse
+EOF
+
+xEOFx
+) > tmp
+
+
+#--------- CMDS ONLY example -----------
+  # This is an example of a self contained cmd script
+  # There are no referenced to a package or package dir.
+  # This method is useful for creating user files/profiles/etc
+  # at build time.
+
+
+PKG=""
+PKG_VERSION=""
+PKG_FILE=""
+URL=""
+MD5=""
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1=""
+
+
+( cat << "xEOFx"
+
+echo "JUST A USELESS TRACE"
+
+xEOFx
+) > tmp
+
diff --git a/2.3/README.HLFS b/2.3/README.HLFS
new file mode 100644
index 0000000..e7c2d1a
--- /dev/null
+++ b/2.3/README.HLFS
@@ -0,0 +1,11 @@
+$Id$
+
+
+		::::NOTICE::::
+
+ Hardened Linux From Scratch is a highly volatile project. Extreme design
+ changes can occur and the build could be broken for extended periods of
+ time.
+
+ As of July 26.2007, the Glibc-based systems builds should work.
+ uClibc-based system still fail due book issues.
diff --git a/2.3/TODO b/2.3/TODO
new file mode 100644
index 0000000..e743e3f
--- /dev/null
+++ b/2.3/TODO
@@ -0,0 +1,25 @@
+            jhalfs TODO
+          ---------------
+
+
+MASTER SCRIPT
+-------------
+
+  - Nothing for now.
+
+
+xLFS MODULES
+------------
+
+  - To develop a new "restart" Makefile target code to can resume an stopped build
+  after a host reboot, if possible.
+
+
+BLFS MODULE (See BLFS/TODO)
+-----------
+
+
+OTHERS
+------
+
+  - Bugs haunting and code clean-up.
diff --git a/2.3/blfs-tool b/2.3/blfs-tool
new file mode 100755
index 0000000..7244d14
--- /dev/null
+++ b/2.3/blfs-tool
@@ -0,0 +1,182 @@
+#!/bin/bash
+# $Id$
+
+set -e
+
+# From common/common-functions
+# VT100 colors
+declare -r  BLACK=$'\e[1;30m'
+declare -r  DK_GRAY=$'\e[0;30m'
+
+declare -r  RED=$'\e[31m'
+declare -r  GREEN=$'\e[32m'
+declare -r  YELLOW=$'\e[33m'
+declare -r  BLUE=$'\e[34m'
+declare -r  MAGENTA=$'\e[35m'
+declare -r  CYAN=$'\e[36m'
+declare -r  WHITE=$'\e[37m'
+
+declare -r  OFF=$'\e[0m'
+declare -r  BOLD=$'\e[1m'
+declare -r  REVERSE=$'\e[7m'
+declare -r  HIDDEN=$'\e[8m'
+
+declare -r  tab_=$'\t'
+declare -r  nl_=$'\n'
+
+declare -r   DD_BORDER="${BOLD}==============================================================================${OFF}"
+declare -r   SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
+declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
+
+# bold yellow > <  pair
+declare -r R_arrow=$'\e[1;33m>\e[0m'
+declare -r L_arrow=$'\e[1;33m<\e[0m'
+
+
+#>>>>>>>>>>>>>>>ERROR TRAPPING >>>>>>>>>>>>>>>>>>>>
+#-----------------------#
+simple_error() {        # Basic error trap.... JUST DIE
+#-----------------------#
+  # If +e then disable text output
+  if [[ "$-" =~ e ]]; then
+    echo -e "\n${RED}ERROR:${GREEN} basic error trapped!${OFF}\n" >&2
+  fi
+}
+
+see_ya() {
+    echo -e "\n${L_arrow}${BOLD}jhalfs 2.3${R_arrow} exit${OFF}\n"
+}
+##### Simple error TRAPS
+# ctrl-c   SIGINT
+# ctrl-y
+# ctrl-z   SIGTSTP
+# SIGHUP   1 HANGUP
+# SIGINT   2 INTRERRUPT FROM KEYBOARD Ctrl-C
+# SIGQUIT  3
+# SIGKILL  9 KILL
+# SIGTERM 15 TERMINATION
+# SIGSTOP 17,18,23 STOP THE PROCESS
+#####
+set -e
+trap see_ya 0
+trap simple_error ERR
+trap 'echo -e "\n\n${RED}INTERRUPT${OFF} trapped\n" &&  exit 2'  1 2 3 15 17 18 23
+#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+# envars not sourced from configuration file
+COMMON_DIR="common"
+VERBOSITY=1
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading config params from <configuration>..."
+source configuration
+[[ $? > 0 ]] && echo "file:configuration did not load.." && exit 1
+[[ $VERBOSITY > 0 ]] && echo "OK"
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_check_version.sh>..."
+source $COMMON_DIR/libs/func_check_version.sh
+[[ $? > 0 ]] && echo " function module did not load.." && exit 2
+[[ $VERBOSITY > 0 ]] && echo "OK"
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_validate_configs.sh>..."
+source $COMMON_DIR/libs/func_validate_configs.sh
+[[ $? > 0 ]] && echo " function module did not load.." && exit 2
+[[ $VERBOSITY > 0 ]] && echo "OK"
+[[ $VERBOSITY > 0 ]] && echo "${SD_BORDER}${nl_}"
+
+# Be sure that we have a configuration file
+[[ -z $BOOK_BLFS ]] && echo -e "\nNo BLFS configuration found. Please configure it." && exit 1
+
+# Set default book version
+BRANCH_ID=${BRANCH_ID:=development}
+
+# Set the SVN tree
+case $BRANCH_ID in
+  development )  TREE=trunk/BOOK ;;
+       *EDIT* )  echo " You forgot to set the branch or stable book version."
+                 echo " Please rerun make and fix the configuration."
+                 exit 2 ;;
+     branch-* )  TREE=branches/${BRANCH_ID#branch-} ;;
+            * )  TREE=tags/${BRANCH_ID} ;;
+esac
+
+# Check for minimun dependencies versions
+xsltprocVer=`xsltproc -V | head -n1 `
+  libxmlVer=$(echo $xsltprocVer | cut -d " " -f3)
+ libxsltVer=$(echo $xsltprocVer | cut -d " " -f5)
+    tidyVer=`tidy -V | cut -d " " -f9`
+
+  # Version numbers are packed strings not xx.yy.zz format.
+check_version "2.06.20"  "${libxmlVer:0:1}.${libxmlVer:1:2}.${libxmlVer:3:2}"     "LIBXML2"
+check_version "1.01.14"  "${libxsltVer:0:1}.${libxsltVer:1:2}.${libxsltVer:3:2}"  "LIBXSLT"
+check_version "2004"     "${tidyVer}"                                             "TIDY"
+
+XML_FILE="<?xml version='1.0' encoding='ISO-8859-1'?>
+<?xml-stylesheet type='text/xsl' href='http://docbook.sourceforge.net/release/xsl/1.69.1/xhtml/docbook.xsl'?>
+<!DOCTYPE article PUBLIC '-//OASIS//DTD DocBook XML V4.5//EN'
+  'http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd'>
+<article>
+  <title>Test file</title>
+  <sect1>
+    <title>Some title</title>
+    <para>Some text</para>
+  </sect1>
+</article>"
+
+if `echo $XML_FILE | xmllint -noout -postvalid - 2>/dev/null` ; then
+  check_version "4.5" "4.5" "DocBook XML DTD"
+else
+  echo "Warning: not found a working DocBook XML DTD 4.5 installation"
+  exit 2
+fi
+
+# if `echo $XML_FILE | xsltproc --noout - 2>/dev/null` ; then
+#   check_version "1.69.1" "1.69.1" "DocBook XSL"
+# else
+#   echo "Warning: not found a working DocBook XSL 1.69.1 installation"
+#   exit 2
+# fi
+
+echo "${SD_BORDER}${nl_}"
+
+# For consistency with other books
+validate_config
+echo "${SD_BORDER}${nl_}"
+echo -n "Are you happy with these settings? yes/no (no): "
+read ANSWER
+if [ x$ANSWER != "xyes" ] ; then
+  echo "${nl_}Rerun make to fix the configuration options.${nl_}"
+  exit 1
+fi
+echo "${nl_}${SD_BORDER}${nl_}"
+
+# Install the files
+[[ ! -d $BLFS_ROOT ]] && mkdir -p $BLFS_ROOT
+
+cp -r BLFS/* $BLFS_ROOT
+cp -r menu $BLFS_ROOT
+cp $COMMON_DIR/progress_bar.sh $BLFS_ROOT
+cp README.BLFS $BLFS_ROOT
+
+# Start the work
+cd $BLFS_ROOT
+
+# Clean-up
+rm -rf libs/.svn
+rm -rf menu/.svn
+rm -rf menu/lxdialog/.svn
+
+
+# Set some harcoded envars to their proper values
+sed -i 's,blfs-xml,'$BLFS_XML',' update_book.sh libs/book.xsl
+sed -i 's,tracking-dir,'$TRACKING_DIR',' update_book.sh gen-makefile.sh
+
+# Fetch book sources and create packages and meta-packages dependencies files
+if [[ -d $BLFS_XML ]] ; then
+  ./update_book.sh
+else
+  ./update_book.sh get $BLFS_XML $TREE
+fi
+
+# Run the menuconfig interface
+make -B
+
diff --git a/2.3/common/blfs-tool-deps/901-libxml2 b/2.3/common/blfs-tool-deps/901-libxml2
new file mode 100644
index 0000000..5c48d38
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/901-libxml2
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+./configure --prefix=/usr
+make
+make install
+
+exit
diff --git a/2.3/common/blfs-tool-deps/902-libxslt b/2.3/common/blfs-tool-deps/902-libxslt
new file mode 100644
index 0000000..5c48d38
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/902-libxslt
@@ -0,0 +1,11 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+./configure --prefix=/usr
+make
+make install
+
+exit
diff --git a/2.3/common/blfs-tool-deps/903-tidy b/2.3/common/blfs-tool-deps/903-tidy
new file mode 100644
index 0000000..b3053c1
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/903-tidy
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+./configure --prefix=/usr
+make
+make install
+make -C htmldoc install_apidocs
+
+exit
diff --git a/2.3/common/blfs-tool-deps/904-unzip b/2.3/common/blfs-tool-deps/904-unzip
new file mode 100644
index 0000000..c25e898
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/904-unzip
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+patch -Np1 -i ../unzip-5.52-security_fix-1.patch
+make -f unix/Makefile LOCAL_UNZIP=-D_FILE_OFFSET_BITS=64 linux
+make prefix=/usr install
+
+exit
diff --git a/2.3/common/blfs-tool-deps/905-docbook-xml b/2.3/common/blfs-tool-deps/905-docbook-xml
new file mode 100644
index 0000000..ccd0a86
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/905-docbook-xml
@@ -0,0 +1,108 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+
+cd /sources
+mkdir docbook-xml
+cd docbook-xml
+unzip ../docbook-xml-4.5.zip
+install -v -d -m755 /usr/share/xml/docbook/xml-dtd-4.5
+install -v -d -m755 /etc/xml
+chown -R root:root .
+cp -v -af docbook.cat *.dtd ent/ *.mod \
+    /usr/share/xml/docbook/xml-dtd-4.5
+if [ ! -e /etc/xml/docbook ]; then
+    xmlcatalog --noout --create /etc/xml/docbook
+fi
+xmlcatalog --noout --add "public" \
+    "-//OASIS//DTD DocBook XML V4.5//EN" \
+    "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//DTD DocBook XML CALS Table Model V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/calstblx.dtd" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//DTD XML Exchange Table Model 19990315//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/soextblx.dtd" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//ELEMENTS DocBook XML Information Pool V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/dbpoolx.mod" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/dbhierx.mod" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//ELEMENTS DocBook XML HTML Tables V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/htmltblx.mod" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//ENTITIES DocBook XML Notations V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/dbnotnx.mod" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//ENTITIES DocBook XML Character Entities V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/dbcentx.mod" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "public" \
+    "-//OASIS//ENTITIES DocBook XML Additional General Entities V4.5//EN" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5/dbgenent.mod" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "rewriteSystem" \
+    "http://www.oasis-open.org/docbook/xml/4.5" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5" \
+    /etc/xml/docbook
+xmlcatalog --noout --add "rewriteURI" \
+    "http://www.oasis-open.org/docbook/xml/4.5" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5" \
+    /etc/xml/docbook
+if [ ! -e /etc/xml/catalog ]; then
+    xmlcatalog --noout --create /etc/xml/catalog
+fi
+xmlcatalog --noout --add "delegatePublic" \
+    "-//OASIS//ENTITIES DocBook XML" \
+    "file:///etc/xml/docbook" \
+    /etc/xml/catalog
+xmlcatalog --noout --add "delegatePublic" \
+    "-//OASIS//DTD DocBook XML" \
+    "file:///etc/xml/docbook" \
+    /etc/xml/catalog
+xmlcatalog --noout --add "delegateSystem" \
+    "http://www.oasis-open.org/docbook/" \
+    "file:///etc/xml/docbook" \
+    /etc/xml/catalog
+xmlcatalog --noout --add "delegateURI" \
+    "http://www.oasis-open.org/docbook/" \
+    "file:///etc/xml/docbook" \
+    /etc/xml/catalog
+for DTDVERSION in 4.1.2 4.2 4.3 4.4
+do
+  xmlcatalog --noout --add "public" \
+    "-//OASIS//DTD DocBook XML V$DTDVERSION//EN" \
+    "http://www.oasis-open.org/docbook/xml/$DTDVERSION/docbookx.dtd" \
+    /etc/xml/docbook
+  xmlcatalog --noout --add "rewriteSystem" \
+    "http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5" \
+    /etc/xml/docbook
+  xmlcatalog --noout --add "rewriteURI" \
+    "http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
+    "file:///usr/share/xml/docbook/xml-dtd-4.5" \
+    /etc/xml/docbook
+  xmlcatalog --noout --add "delegateSystem" \
+    "http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
+    "file:///etc/xml/docbook" \
+    /etc/xml/catalog
+  xmlcatalog --noout --add "delegateURI" \
+    "http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
+    "file:///etc/xml/docbook" \
+    /etc/xml/catalog
+done
+cd ..
+rm -rf docbook-xml
+
+exit
diff --git a/2.3/common/blfs-tool-deps/906-docbook-xsl b/2.3/common/blfs-tool-deps/906-docbook-xsl
new file mode 100644
index 0000000..7610d77
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/906-docbook-xsl
@@ -0,0 +1,39 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+install -v -m755 -d /usr/share/xml/docbook/xsl-stylesheets-1.69.1
+cp -v -R VERSION common eclipse extensions fo html \
+         htmlhelp images javahelp lib manpages params \
+         profiling slides template website xhtml \
+    /usr/share/xml/docbook/xsl-stylesheets-1.69.1
+
+if [ ! -d /etc/xml ]; then install -v -m755 -d /etc/xml; fi
+if [ ! -f /etc/xml/catalog ]; then
+    xmlcatalog --noout --create /etc/xml/catalog
+fi
+
+xmlcatalog --noout --add "rewriteSystem" \
+           "http://docbook.sourceforge.net/release/xsl/1.69.1" \
+           "/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
+    /etc/xml/catalog
+
+xmlcatalog --noout --add "rewriteURI" \
+           "http://docbook.sourceforge.net/release/xsl/1.69.1" \
+           "/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
+    /etc/xml/catalog
+
+xmlcatalog --noout --add "rewriteSystem" \
+           "http://docbook.sourceforge.net/release/xsl/current" \
+           "/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
+    /etc/xml/catalog
+
+xmlcatalog --noout --add "rewriteURI" \
+           "http://docbook.sourceforge.net/release/xsl/current" \
+           "/usr/share/xml/docbook/xsl-stylesheets-1.69.1" \
+    /etc/xml/catalog
+
+exit
diff --git a/2.3/common/blfs-tool-deps/907-gpm b/2.3/common/blfs-tool-deps/907-gpm
new file mode 100644
index 0000000..fa2ca01
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/907-gpm
@@ -0,0 +1,16 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+patch -Np1 -i ../gpm-1.20.1-segfault-1.patch
+patch -Np1 -i ../gpm-1.20.1-silent-1.patch
+./configure --prefix=/usr --sysconfdir=/etc
+LDFLAGS="$LDFLAGS -lm" make
+make install
+cp -v conf/gpm-root.conf /etc
+ldconfig
+
+exit
diff --git a/2.3/common/blfs-tool-deps/908-links b/2.3/common/blfs-tool-deps/908-links
new file mode 100644
index 0000000..5e7a8e4
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/908-links
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+./configure --prefix=/usr
+make CFLAGS="-O2 -Wno-sign-compare -Wno-pointer-sign"
+make install
+install -v -d -m755 /usr/share/doc/links-2.1pre23
+install -v -m644 doc/links_cal/* KEYS BRAILLE_HOWTO \
+    /usr/share/doc/links-2.1pre23
+
+exit
diff --git a/2.3/common/blfs-tool-deps/909-sudo b/2.3/common/blfs-tool-deps/909-sudo
new file mode 100644
index 0000000..e906ed3
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/909-sudo
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+patch -Np1 -i ../sudo-1.6.8p12-envvar_fix-1.patch
+./configure --prefix=/usr --libexecdir=/usr/lib \
+    --enable-noargs-shell --with-ignore-dot --with-all-insults \
+    --enable-shell-sets-home
+make
+make install
+
+exit
diff --git a/2.3/common/blfs-tool-deps/910-wget b/2.3/common/blfs-tool-deps/910-wget
new file mode 100644
index 0000000..70e577c
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/910-wget
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+./configure --prefix=/usr --sysconfdir=/etc
+make
+make install
+
+exit
diff --git a/2.3/common/blfs-tool-deps/911-subversion b/2.3/common/blfs-tool-deps/911-subversion
new file mode 100644
index 0000000..48a65dc
--- /dev/null
+++ b/2.3/common/blfs-tool-deps/911-subversion
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+cd $PKGDIR
+
+./configure --prefix=/usr \
+            --without-berkeley-db \
+            --with-installbuilddir=/usr/lib/apr-0
+make
+make install
+rm doc/{Makefile,doxygen.conf}
+find doc -type d -exec chmod 755 {} \;
+find doc -type f -exec chmod 644 {} \;
+install -v -m755 -d /usr/share/doc/subversion-1.3.1
+cp -v -R doc/* /usr/share/doc/subversion-1.3.1
+
+exit
diff --git a/2.3/common/common-functions b/2.3/common/common-functions
new file mode 100644
index 0000000..dc510d4
--- /dev/null
+++ b/2.3/common/common-functions
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+# $Id$
+
+set -e
+
+
+no_empty_builddir() {
+  'clear'
+cat <<- -EOF-
+${DD_BORDER}
+
+${tab_}${tab_}${BOLD}${RED}W A R N I N G${OFF}
+    Looks like the \$BUILDDIR directory contains subdirectories
+    from a previous build.
+
+    Please format the partition mounted on \$BUILDDIR or set
+    a different build directory before running jhalfs.
+${OFF}
+${DD_BORDER}
+-EOF-
+  exit
+}
+
+
+#----------------------------#
+run_make() {                 #
+#----------------------------#
+  # Test if make must be run.
+  if [ "$RUNMAKE" = "y" ] ; then
+    # Test to make sure we're not running the build as root
+    if [ "$UID" = "0" ] ; then
+      echo "You must not be logged in as root to build the system."
+      exit 1
+    fi
+    # Build the system
+    if [ -e $MKFILE ] ; then
+      echo -ne "Building the system...\n"
+      cd $JHALFSDIR && make
+      echo -ne "done\n"
+    fi
+  fi
+}
+
+
+#----------------------------#
+clean_builddir() {           #
+#----------------------------#
+  # Test if the clean must be done.
+  if [ "${CLEAN}" = "y" ]; then
+    # Test to make sure that the build directory was populated by jhalfs
+    if [ ! -d $JHALFSDIR ] || [ ! -d $BUILDDIR/sources ] ; then
+      echo "Looks like $BUILDDIR was not populated by a previous jhalfs run."
+      exit 1
+    # Test that dev filesystems are not mounted in $BUILDDIR
+    elif mount | grep $BUILDDIR/dev > /dev/null ; then
+      echo "Looks like kernel fylesystems are yet mounted on $BUILDDIR."
+      exit 1
+    else
+      # Clean the build directory
+      echo -n "Cleaning $BUILDDIR ..."
+      # First delete proc and sys directories, if exist.
+      # Both should be empty, if not be sure to exit.
+      if [ -d $BUILDDIR/proc ] ; then
+        sudo rmdir $BUILDDIR/proc || exit 1
+      fi
+      if [ -d $BUILDDIR/sys ] ; then
+        sudo rmdir $BUILDDIR/sys || exit 1
+      fi
+      sudo rm -rf $BUILDDIR/{bin,boot,dev,etc,home,lib,media,mnt,opt,root,sbin,srv,tmp,tools,cross-tools,usr,var}
+      echo "done"
+      echo -n "Cleaning $JHALFSDIR ..."
+      sudo rm -rf $JHALFSDIR
+      echo "done"
+      echo -n "Cleaning remainig extracted sources in $BUILDDIR/sources ..."
+      sudo rm -rf `find $BUILDDIR/sources/* -maxdepth 0 -type d`
+      echo "done"
+    fi
+  fi
+}
+
+VERBOSITY2=$VERBOSITY
+
+[[ $VERBOSITY2 > 0 ]] && echo ""
+
+[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_book_parser>..."
+source $COMMON_DIR/libs/func_book_parser
+[[ $? > 0 ]] && echo "file libs/func_book_parser did not load.." && exit 1
+[[ $VERBOSITY2 > 0 ]] && echo "OK"
+
+
+[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_download_pkgs>..."
+source $COMMON_DIR/libs/func_download_pkgs
+[[ $? > 0 ]] && echo "file libs/func_download_pkgs did not load.." && exit 1
+[[ $VERBOSITY2 > 0 ]] && echo "OK"
+
+
+[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_wrt_Makefile>..."
+source $COMMON_DIR/libs/func_wrt_Makefile
+[[ $? > 0 ]] && echo "file libs/func_wrt_Makefile did not load.." && exit 1
+[[ $VERBOSITY2 > 0 ]] && echo "OK"
+
+
+[[ $VERBOSITY2 > 0 ]] && echo -n "Loading <func_blfs_deps>..."
+source $COMMON_DIR/libs/func_blfs_deps
+[[ $? > 0 ]] && echo "file libs/func_blfs_deps did not load.." && exit 1
+[[ $VERBOSITY2 > 0 ]] && echo "OK"
+
+[[ $VERBOSITY2 > 0 ]] && echo -n "    ..."
\ No newline at end of file
diff --git a/2.3/common/create-sbu_du-report.sh b/2.3/common/create-sbu_du-report.sh
new file mode 100755
index 0000000..1e08bf4
--- /dev/null
+++ b/2.3/common/create-sbu_du-report.sh
@@ -0,0 +1,121 @@
+#!/bin/bash
+#$Id$
+
+set -e
+
+LOGSDIR=$1
+VERSION=$2
+
+LINE="================================================================================"
+
+# Make sure that we have a directory as first argument
+[[ ! -d "$LOGSDIR" ]] && \
+  echo -e "\nUSAGE: create-sbu_du-report.sh logs_directory [book_version]\n" && exit
+
+# Make sure that the first argument is a jhalfs logs directory
+[[ ! -f "$LOGSDIR"/000-masterscript.log ]] && \
+  echo -e "\nLooks like $LOGSDIR isn't a jhalfs logs directory.\n" && exit
+
+# If this script is run manually, the book version may be unknown
+[[ -z "$VERSION" ]] && VERSION=unknown
+
+# If there is iteration logs directories, copy the logs inside iteration-1
+# to the top level dir
+[[ -d "$LOGSDIR"/build_1 ]] && \
+  cp $LOGSDIR/build_1/* $LOGSDIR
+
+# Set the report file
+REPORT="$VERSION"-SBU_DU-$(date --iso-8601).report
+
+[ -f $REPORT ] && : >$REPORT
+
+# Dump generation time stamp and book version
+echo -e "\n`date`\n" > "$REPORT"
+echo -e "Book version is:\t$VERSION\n" >> "$REPORT"
+
+# If found, dump jhalfs.config file in a readable format
+if [[ -f jhalfs.config ]] ; then
+  echo -e "\n\tjhalfs configuration settings:\n" >> "$REPORT"
+  cat jhalfs.config | sed -e '/parameters/d;s/.\[[013;]*m//g;s/</\t</;s/^\w\{1,6\}:/&\t/' >> "$REPORT"
+else
+  echo -e "\nNOTE: the jhalfs configuration settings are unknown" >> "$REPORT"
+fi
+
+# Dump CPU and memory info
+echo -e "\n\n\t\tCPU type:\n" >> "$REPORT"
+cat /proc/cpuinfo >> "$REPORT"
+echo -e "\n\t\tMemory info:\n" >> "$REPORT"
+free >> "$REPORT"
+
+# Parse only that logs that have time data
+BUILDLOGS="`grep -l "^Totalseconds:" ${LOGSDIR}/*`"
+
+# Match the first timed log to extract the SBU unit value from it
+BASELOG=`grep -l "^Totalseconds:" $LOGSDIR/* | head -n1`
+echo -e "\nUsing ${BASELOG#*[[:digit:]]-} to obtain the SBU unit value."
+SBU_UNIT=`sed -n 's/^Totalseconds:\s\([[:digit:]]*.[[:digit:]]*\)$/\1/p' $BASELOG`
+echo -e "\nThe SBU unit value is equal to $SBU_UNIT seconds.\n"
+echo -e "\n\n$LINE\n\nThe SBU unit value is equal to $SBU_UNIT seconds.\n" >> "$REPORT"
+
+# Set the first value to 0 for grand totals calculation
+SBU2=0
+INSTALL2=0
+INSTALLMB2=0
+
+# Start the loop
+for log in $BUILDLOGS ; do
+
+# Strip the filename
+  PACKAGE="${log#*[[:digit:]]*-}"
+
+# Start SBU calculation
+# Build time
+  TIME=`sed -n 's/^Totalseconds:\s\([[:digit:]]*.[[:digit:]]*\)$/\1/p' $log`
+  SECS=`perl -e 'print ('$TIME' % '60')';`
+  MINUTES=`perl -e 'printf "%.0f" , (('$TIME' - '$SECS') / '60')';`
+  SBU=`perl -e 'printf "%.3f" , ('$TIME' / '$SBU_UNIT')';`
+
+# Append SBU value to SBU2 for grand total
+  SBU2=`perl -e 'printf "%.3f" , ('$SBU2' + '$SBU')';`
+
+# Start disk usage calculation
+# Disk usage before unpacking the package
+  DU1=`grep "^KB: " $log | head -n1 | cut -f1 | sed -e 's/KB: //'`
+  DU1MB=`perl -e 'printf "%.3f" , ('$DU1' / '1024')';`
+# Disk usage before deleting the source and build dirs
+  DU2=`grep "^KB: " $log | tail -n1 | cut -f1 | sed -e 's/KB: //'`
+  DU2MB=`perl -e 'printf "%.3f" , ('$DU2' / '1024')';`
+# Calculate disk space required to do the build
+  REQUIRED1=`perl -e 'print ('$DU2' - '$DU1')';`
+  REQUIRED2=`perl -e 'printf "%.3f" , ('$DU2MB' - '$DU1MB')';`
+
+# Append installed files disk usage to the previous entry,
+# except for the first parsed log
+  if [ "$log" != "$BASELOG" ] ; then
+    INSTALL=`perl -e 'print ('$DU1' - '$DU1PREV')';`
+    INSTALLMB=`perl -e 'printf "%.3f" , ('$DU1MB' - '$DU1MBPREV')';`
+    echo -e "Installed files disk usage:\t\t\t\t$INSTALL KB or $INSTALLMB MB\n" >> $REPORT
+    # Append install values for grand total
+    INSTALL2=`perl -e 'printf "%.3f" , ('$INSTALL2' + '$INSTALL')';`
+    INSTALLMB2=`perl -e 'printf "%.3f" , ('$INSTALLMB2' + '$INSTALLMB')';`
+  fi
+
+# Set variables to calculate installed files disk usage
+  DU1PREV=$DU1
+  DU1MBPREV=$DU1MB
+
+# Dump time and disk usage values
+  echo -e "$LINE\n\t\t\t\t[$PACKAGE]\n" >> $REPORT
+  echo -e "Build time is:\t\t\t\t\t\t$MINUTES minutes and $SECS seconds" >> $REPORT
+  echo -e "Build time in seconds is:\t\t\t\t$TIME" >> $REPORT
+  echo -e "Approximate SBU time is:\t\t\t\t$SBU" >> $REPORT
+  echo -e "Disk usage before unpacking the package:\t\t$DU1 KB or $DU1MB MB" >> $REPORT
+  echo -e "Disk usage before deleting the source and build dirs:\t$DU2 KB or $DU2MB MB" >> $REPORT
+  echo -e "Required space to build the package:\t\t\t$REQUIRED1 KB or $REQUIRED2 MB" >> $REPORT
+
+done
+
+# Dump grand totals
+echo -e "\n$LINE\n\nTotal time required to build the systen:\t\t$SBU2  SBU" >> $REPORT
+# Total disk usage: including /tools but not /sources.
+echo -e "Total Installed files disk usage:\t\t\t$INSTALL2 KB or $INSTALLMB2 MB" >> $REPORT
diff --git a/2.3/common/libs/func_blfs_deps b/2.3/common/libs/func_blfs_deps
new file mode 100644
index 0000000..22e8d47
--- /dev/null
+++ b/2.3/common/libs/func_blfs_deps
@@ -0,0 +1,198 @@
+#!/bin/bash
+
+# $Id$
+
+#----------------------------# Hardcoded URLs and MD5.
+add_blfs_deps_urls() {       # No easy way to extract it.
+#----------------------------# Some FTP mirrors may not work
+
+  local BLFS_SERVER="${SERVER}/pub/blfs/conglomeration/"
+
+  if [[ "${DEP_LIBXML}" = "y" ]] ; then
+    echo "${LIBXML_URL} ${BLFS_SERVER}libxml2/${LIBXML_PKG} ${LIBXML_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_LIBXSLT}" = "y" ]] ; then
+    echo "${LIBXSLT_URL} ${BLFS_SERVER}libxslt/${LIBXSLT_PKG} ${LIBXSLT_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_TIDY}" = "y" ]] ; then
+    echo "${TIDY_URL} ${BLFS_SERVER}tidy/${TIDY_PKG} ${TIDY_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_UNZIP}" = "y" ]] ; then
+    echo "${UNZIP_URL} ${BLFS_SERVER}unzip/${UNZIP_PKG} ${UNZIP_MD5}" >> urls.lst
+    echo "${UNZIP_PATCH_URL} ${BLFS_SERVER}unzip/${UNZIP_PATCH} ${UNZIP_PATCH_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_DBXML}" = "y" ]] ; then
+    echo "${DBXML_URL} ${BLFS_SERVER}docbook-xml/${DBXML_PKG} ${DBXML_MD5}" >> urls.lst
+  fi
+
+#   if [[ "${DEP_DBXSL}" = "y" ]] ; then
+#     echo "${DBXSL_URL} ${BLFS_SERVER}docbook-xsl/${DBXSL_PKG} ${DBXSL_MD5}" >> urls.lst
+#   fi
+
+  if [[ "${DEP_LINKS}" = "y" ]] ; then
+    echo "${LINKS_URL} ${BLFS_SERVER}links/${LINKS_PKG} ${LINKS_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_SUDO}" = "y" ]] ; then
+    echo "${SUDO_URL} ${BLFS_SERVER}sudo/${SUDO_PKG} ${SUDO_MD5}" >> urls.lst
+    echo "${SUDO_PATCH_URL} ${BLFS_SERVER}sudo/${SUDO_PATCH} ${SUDO_PATCH_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_WGET}" = "y" ]] ; then
+    echo "${WGET_URL} ${BLFS_SERVER}wget/${WGET_PKG} ${WGET_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_SVN}" = "y" ]] ; then
+    echo "${SVN_URL} ${BLFS_SERVER}subversion/${SVN_PKG} ${SVN_MD5}" >> urls.lst
+  fi
+
+  if [[ "${DEP_GPM}" = "y" ]] ; then
+    echo "${GPM_URL} ${BLFS_SERVER}gpm/${GPM_PKG} ${GPM_MD5}" >> urls.lst
+    echo "${GPM_PATCH_1_URL} ${BLFS_SERVER}gpm/${GPM_PATCH_1} ${GPM_PATCH_1_MD5}" >> urls.lst
+    echo "${GPM_PATCH_2_URL} ${BLFS_SERVER}gpm/${GPM_PATCH_2} ${GPM_PATCH_2_MD5}" >> urls.lst
+  fi
+
+}
+
+#----------------------------# Maybe there is a better way to do this, but this
+copy_blfs_deps_scripts() {   # method avoid to place the test on all
+#----------------------------# $PROGNAME/master.sh scripts.
+
+  mkdir -p ${PROGNAME}-commands/blfs-tool-deps
+
+  if [[ "${DEP_LIBXML}" = "y" ]] ; then
+    mv blfs-tool-deps/901-libxml2 ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_LIBXSLT}" = "y" ]] ; then
+    mv blfs-tool-deps/902-libxslt ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_TIDY}" = "y" ]] ; then
+    mv blfs-tool-deps/903-tidy ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_UNZIP}" = "y" ]] ; then
+    mv blfs-tool-deps/904-unzip ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_DBXML}" = "y" ]] ; then
+    mv blfs-tool-deps/905-docbook-xml ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+#   if [[ "${DEP_DBXSL}" = "y" ]] ; then
+#     mv blfs-tool-deps/906-docbook-xsl ${PROGNAME}-commands/blfs-tool-deps
+#   fi
+
+  if [[ "${DEP_LINKS}" = "y" ]] ; then
+    mv blfs-tool-deps/908-links ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_SUDO}" = "y" ]] ; then
+    mv blfs-tool-deps/909-sudo ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_WGET}" = "y" ]] ; then
+    mv blfs-tool-deps/910-wget ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_SVN}" = "y" ]] ; then
+    mv blfs-tool-deps/911-subversion ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  if [[ "${DEP_GPM}" = "y" ]] ; then
+    mv blfs-tool-deps/907-gpm ${PROGNAME}-commands/blfs-tool-deps
+  fi
+
+  rm -rf blfs-tool-deps
+
+}
+
+
+#----------------------------------#
+wrt_blfs_tool_targets() {          #
+#----------------------------------#
+  PREV=""
+
+  echo "${tab_}${GREEN}Processing... ${L_arrow}BLFS_TOOL ${R_arrow}"
+
+  for file in blfs-tool-deps/* ; do
+    # Keep the script file name
+    this_script=`basename $file`
+
+    # Grab the name of the target
+    name=`echo ${this_script} | sed -e 's@[0-9]\{3\}-@@'`
+
+    # Find the package.
+    case $name in
+      tidy )  pkg_tarball=${TIDY_PKG} ;;
+      unzip ) pkg_tarball=${UNZIP_PKG} ;;
+      * )     pkg_tarball=$(get_package_tarball_name $name) ;;
+    esac
+
+    # Append each name of the script files to a list (this will become
+    # the names of the targets in the Makefile)
+    blfs_tool="$blfs_tool ${this_script}"
+
+    #--------------------------------------------------------------------#
+    #         >>>>>>>> START BUILDING A Makefile ENTRY <<<<<<<<          #
+    #--------------------------------------------------------------------#
+    #
+    # Drop in the name of the target on a new line, and the previous target
+    # as a dependency. Also call the echo_message function.
+    if [ "$PROGNAME" = "clfs2" ]; then
+      LUSER_wrt_target "${this_script}" "$PREV"
+    else
+      CHROOT_wrt_target "${this_script}" "$PREV"
+    fi
+
+    # Insert instructions for unpacking the package and changing directories
+    # DocBook-XML is a zip, the build script will handle that.
+    if [ "$PROGNAME" = "clfs2" ]; then
+      [[ ! "$name" = "docbook-xml" ]] && LUSER_wrt_unpack "$pkg_tarball"
+    else
+      [[ ! "$name" = "docbook-xml" ]] && CHROOT_Unpack "$pkg_tarball"
+    fi
+
+    # Run the script.
+    if [ "$PROGNAME" = "clfs2" ]; then
+      LUSER_wrt_RunAsUser "${file}"
+    else
+      CHROOT_wrt_RunAsRoot "$file"
+    fi
+
+    # Remove the build directory(ies) except if the package build fails.
+    if [ "$PROGNAME" = "clfs2" ]; then
+      [[ ! "$name" = "docbook-xml" ]] && LUSER_RemoveBuildDirs "$name"
+    else
+      [[ ! "$name" = "docbook-xml" ]] && CHROOT_wrt_RemoveBuildDirs "$name"
+    fi
+
+    # Touch the tracking file.
+    case $name in
+      tidy )  pkg_ver=html-tidy-cvs_20070326 ;;
+      unzip ) pkg_ver=unzip-5.52 ;;
+      * )     pkg_ver=$(echo $pkg_tarball | sed -e 's/.tar.*//;s/.tgz//;s/.zip//') ;;
+    esac
+    if [ "$PROGNAME" = "clfs2" ]; then
+      echo -e "\t@touch \$(MOUNT_PT)$TRACKING_DIR/$pkg_ver" >>  $MKFILE.tmp
+    else
+      echo -e "\t@touch $TRACKING_DIR/$pkg_ver" >>  $MKFILE.tmp
+    fi
+
+    # Include a touch of the target name so make can check
+    # if it's already been made.
+    wrt_touch
+    #
+    #--------------------------------------------------------------------#
+    #              >>>>>>>> END OF Makefile ENTRY <<<<<<<<               #
+    #--------------------------------------------------------------------#
+
+    # Keep the script file name for Makefile dependencies.
+    PREV=${this_script}
+  done
+}
diff --git a/2.3/common/libs/func_book_parser b/2.3/common/libs/func_book_parser
new file mode 100644
index 0000000..ed6e5ad
--- /dev/null
+++ b/2.3/common/libs/func_book_parser
@@ -0,0 +1,216 @@
+#!/bin/bash
+
+# $Id$
+
+#----------------------------#
+get_book() {                 #
+#----------------------------#
+  cd $JHALFSDIR
+
+  if [ -z $WORKING_COPY ] ; then
+    # Check for Subversion instead of just letting the script hit 'svn' and fail.
+    test `type -p svn` || eval "echo \"This feature requires Subversion.\"
+    exit 1"
+    echo -n "Downloading the $PROGNAME document, $LFSVRS version... "
+
+    case $PROGNAME in
+      lfs) svn_root="LFS" ;;
+      hlfs) svn_root="HLFS" ;;
+      clfs) svn_root="cross-lfs" ;;
+      clfs2) svn_root="cross-lfs" ;;
+      clfs3) svn_root="cross-lfs" ;;
+      *) echo "BOOK not defined in function <get_book>"
+          exit 1 ;;
+    esac
+    # Grab a fresh book if it's missing, otherwise, update it from the
+    # repo. If we've already extracted the commands, move on to getting the
+    # sources.
+    if [ -d ${PROGNAME}-$LFSVRS ] ; then
+      cd ${PROGNAME}-$LFSVRS
+      if LC_ALL=C svn up | grep -q At && \
+         test -d $JHALFSDIR/${PROGNAME}-commands && \
+         test -f $JHALFSDIR/pkg_tarball_list ; then
+        # Set the canonical book version
+        echo -ne "done\n"
+        cd $JHALFSDIR
+        case $PROGNAME in
+          clfs | clfs2 | clfs3 )
+            VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //'  -e 's/<\/.*//') ;;
+          *)
+            VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //'  -e 's/<\/.*//')  ;;
+        esac
+        get_sources
+      else
+        echo -ne "done\n"
+        extract_commands
+      fi
+    else
+      svn co $SVN/${svn_root}/${TREE} ${PROGNAME}-$LFSVRS >>$LOGDIR/$LOG 2>&1
+      echo -ne "done\n"
+      extract_commands
+    fi
+
+  else
+    echo -ne "Using $BOOK as book's sources ...\n"
+    extract_commands
+  fi
+  echo -ne " Document version ${L_arrow}${BOLD}${VERSION}${R_arrow}\n"
+}
+
+#----------------------------#
+extract_commands() {         #
+#----------------------------#
+
+  # Check for libxslt instead of just letting the script hit 'xsltproc' and fail.
+  test `type -p xsltproc` || eval "echo \"This feature requires libxslt.\"
+  exit 1"
+
+  cd $JHALFSDIR
+  case $PROGNAME in
+    clfs | clfs2 | clfs3 )
+      VERSION=$(xmllint --noent $BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //'  -e 's/<\/.*//') ;;
+    *)
+      VERSION=$(xmllint --noent $BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //'  -e 's/<\/.*//')  ;;
+  esac
+
+  # Start clean
+  if [ -d ${PROGNAME}-commands ]; then
+    rm -rf ${PROGNAME}-commands
+    mkdir -v ${PROGNAME}-commands
+  fi
+  echo -n "Extracting commands for"
+
+  # Dump the commands in shell script form from the HLFS book.
+  case ${PROGNAME} in
+    clfs)
+        echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture... "
+        xsltproc --nonet \
+                 --xinclude \
+                 --stringparam method $METHOD \
+                 --stringparam testsuite $TEST \
+                 --stringparam bomb-testsuite $BOMB_TEST \
+                 --stringparam vim-lang $VIMLANG \
+                 --stringparam timezone $TIMEZONE \
+                 --stringparam page $PAGE \
+                 --stringparam lang $LANG \
+                 --stringparam sparc $SPARC64_PROC \
+                 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+
+    clfs2)
+        echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture... "
+        xsltproc --nonet \
+                 --xinclude \
+                 --stringparam vim-lang $VIMLANG \
+                 --stringparam timezone $TIMEZONE \
+                 --stringparam page $PAGE \
+                 --stringparam lang $LANG \
+                 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+
+    clfs3)
+        echo -n " ${L_arrow}${BOLD}$ARCH${R_arrow} target architecture... "
+        xsltproc --nonet \
+                 --xinclude \
+                 --stringparam endian x$ENDIAN \
+                 --stringparam timezone $TIMEZONE \
+                 --stringparam page $PAGE \
+                 --stringparam lang $LANG \
+                 -o ./${PROGNAME}-commands/ $XSL $BOOK/$ARCH-index.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+
+    hlfs)
+        echo -n " ${L_arrow}${BOLD}$MODEL + $KERNEL${R_arrow} HLFS flavour... "
+        xsltproc --nonet \
+                 --xinclude \
+                 --stringparam model $MODEL \
+                 --stringparam kernel $KERNEL \
+                 --stringparam testsuite $TEST \
+                 --stringparam bomb-testsuite $BOMB_TEST \
+                 --stringparam features x$SSP$ASLR$PAX$HARDENED_TMP$WARNINGS$MISC$BLOWFISH \
+                 --stringparam timezone $TIMEZONE \
+                 --stringparam page $PAGE \
+                 --stringparam lang $LANG \
+                 --stringparam grsecurity_host $GRSECURITY_HOST \
+                 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+    lfs)
+        echo -n " ${L_arrow}${BOLD}LFS${R_arrow} build... "
+        xsltproc --nonet \
+                 --xinclude \
+                 --stringparam testsuite $TEST \
+                 --stringparam bomb-testsuite $BOMB_TEST \
+                 --stringparam vim-lang $VIMLANG \
+                 --stringparam timezone $TIMEZONE \
+                 --stringparam page $PAGE \
+                 --stringparam lang $LANG \
+                 -o ./${PROGNAME}-commands/ $XSL $BOOK/index.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+    *)  echo -n " ${L_arrow}${BOLD}${PROGNAME}${R_arrow} book invalid, terminate build... "
+        exit 1 ;;
+  esac
+
+  [[ "${BLFS_TOOL}" = "y" ]] && copy_blfs_deps_scripts
+
+  echo "done"
+
+  # Make the scripts executable.
+  chmod -R +x $JHALFSDIR/${PROGNAME}-commands
+
+  # Create the packages file. We need it for proper Makefile creation
+  create_package_list
+
+  # Done. Moving on...
+  get_sources
+
+}
+
+#----------------------------#
+create_package_list() {      #
+#----------------------------#
+
+  # Create the packages file. We need it for proper Makefile creation
+  rm -f pkg_tarball_list
+  echo -n "Creating <${PROGNAME}> list of tarball names for $BOOK"
+  if [ ! -z $ARCH ] ; then echo -n " $ARCH" ; fi
+  echo -n "... "
+  case ${PROGNAME} in
+    clfs | clfs2 | clfs3 )
+        xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
+                 $BOOK/materials/${ARCH}-chapter.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+    hlfs)
+        xsltproc --nonet --xinclude \
+                 --stringparam model $MODEL \
+                 --stringparam kernel $KERNEL \
+                  -o pkg_tarball_list packages.xsl \
+                 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+    lfs)
+        xsltproc --nonet --xinclude -o pkg_tarball_list packages.xsl \
+                 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
+      ;;
+  esac
+
+  if [[ "${BLFS_TOOL}" = "y" ]] ; then
+(
+cat << EOF
+$LIBXML_PKG
+$LIBXSLT_PKG
+$TIDY_PKG
+$UNZIP_PKG
+$DBXML_PKG
+$DBXSL_PKG
+$LINKS_PKG
+$SUDO_PKG
+$WGET_PKG
+$SVN_PKG
+$GPM_PKG
+EOF
+) >> pkg_tarball_list
+  fi
+
+  echo "done"
+
+}
+
diff --git a/2.3/common/libs/func_check_version.sh b/2.3/common/libs/func_check_version.sh
new file mode 100644
index 0000000..9c4aab5
--- /dev/null
+++ b/2.3/common/libs/func_check_version.sh
@@ -0,0 +1,163 @@
+# $Id$
+
+check_version() {
+: <<inline_doc
+      Tests for a minimum version level. Compares to version numbers and forces an
+        exit if minimum level not met.
+      NOTE: This test will fail on versions containing alpha chars. ie. jpeg 6b
+
+    usage:	check_version "2.6.2" "`uname -r`"         "KERNEL"
+		check_version "3.0"   "$BASH_VERSION"      "BASH"
+		check_version "3.0"   "`gcc -dumpversion`" "GCC"
+
+    input vars: $1=min acceptable version
+    		$2=version to check
+		$3=app name
+    externals:  --
+    modifies:   --
+    returns:    nothing
+    on error:	write text to console and dies
+    on success: write text to console and returns
+inline_doc
+
+  declare -i major minor revision change
+  declare -i ref_major ref_minor ref_revision ref_change
+  declare -r spaceSTR="         "
+
+  ref_version=$1
+  tst_version=$2
+  TXT=$3
+
+  # This saves us the save/restore hassle of the system IFS value
+  local IFS
+
+  write_error_and_die() {
+     echo -e "\n\t\t$TXT version -->${tst_version}<-- is too old.
+		    This script requires ${ref_version} or greater\n"
+   # Ask the user instead of bomb, to make happy that packages which version
+   # ouput don't follow our expectations
+    echo "If you are sure that you have instaled a proper version of ${BOLD}$TXT${OFF}"
+    echo "but jhalfs has failed to detect it, press 'c' and 'ENTER' keys to continue,"
+    echo -n "otherwise press 'ENTER' key to stop jhalfs.  "
+    read ANSWER
+    if [ x$ANSWER != "xc" ] ; then
+      echo "${nl_}Please, install a proper $TXT version.${nl_}"
+      exit 1
+    else
+      minor=$ref_minor
+      revision=$ref_revision
+    fi
+  }
+
+  echo -ne "${TXT}${dotSTR:${#TXT}} ${L_arrow}${BOLD}${tst_version}${OFF}${R_arrow}"
+
+#  echo -ne "$TXT:\t${L_arrow}${BOLD}${tst_version}${OFF}${R_arrow}"
+  IFS=".-(pa"   # Split up w.x.y.z as well as w.x.y-rc  (catch release candidates)
+  set -- $ref_version # set postional parameters to minimum ver values
+  ref_major=$1; ref_minor=$2; ref_revision=$3
+  #
+  set -- $tst_version # Set postional parameters to test version values
+  major=$1; minor=$2; revision=$3
+  #
+  # Compare against minimum acceptable version..
+  (( major > ref_major )) && echo " ${spaceSTR:${#tst_version}}${GREEN}OK${OFF}" && return
+  (( major < ref_major )) && write_error_and_die
+    # major=ref_major
+  (( minor < ref_minor )) && write_error_and_die
+  (( minor > ref_minor )) && echo " ${spaceSTR:${#tst_version}}${GREEN}OK${OFF}" && return
+    # minor=ref_minor
+  (( revision >= ref_revision )) && echo " ${spaceSTR:${#tst_version}}${GREEN}OK${OFF}" && return
+
+  # oops.. write error msg and die
+  write_error_and_die
+}
+#  local -r PARAM_VALS='${config_param}${dotSTR:${#config_param}} ${L_arrow}${BOLD}${!config_param}${OFF}${R_arrow}'
+
+#----------------------------#
+check_prerequisites() {      #
+#----------------------------#
+
+  # LFS/HLFS/CLFS prerequisites
+  check_version "2.6.2"   "`uname -r`"          "KERNEL"
+  check_version "3.0"     "$BASH_VERSION"       "BASH"
+  check_version "3.0.1"   "`gcc -dumpversion`"  "GCC"
+  libcVer="`/lib/libc.so.6 | head -n1`"
+  libcVer="${libcVer##*version }"
+  check_version "2.2.5"   ${libcVer%%,*}        "GLIBC"
+  check_version "2.12"    "$(ld --version  | head -n1 | cut -d" " -f4)"        "BINUTILS"
+  check_version "1.15"    "$(tar --version | head -n1 | cut -d" " -f4)"        "TAR"
+  bzip2Ver="$(bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f8)"
+  check_version "1.0.2"   "${bzip2Ver%%,*}"                                    "BZIP2"
+  check_version "1.875"   "$(bison --version | head -n1 | cut -d" " -f4)"      "BISON"
+  check_version "5.0"     "$(chown --version | head -n1 | cut -d")" -f2)"      "COREUTILS"
+  check_version "2.8"     "$(diff --version  | head -n1 | cut -d" " -f4)"      "DIFF"
+  check_version "4.1.20"  "$(find --version  | head -n1 | cut -d" " -f4)"      "FIND"
+  check_version "3.0"     "$(gawk --version  | head -n1 | cut -d" " -f3)"      "GAWK"
+  check_version "2.5"     "$(grep --version  | head -n1 | cut -d" " -f4)"      "GREP"
+  check_version "1.2.4"   "$(gzip --version 2>&1 | head -n1 | cut -d" " -f2)"  "GZIP"
+  check_version "3.79.1"  "$(make --version  | head -n1 | cut -d " " -f3 | cut -c1-4)"  "MAKE"
+  check_version "2.5.4"   "$(patch --version | head -n1 | cut -d" " -f2)"      "PATCH"
+  check_version "3.0.2"   "$(sed --version   | head -n1 | cut -d" " -f4)"      "SED"
+
+  # Check for minimum sudo version
+  SUDO_LOC="$(whereis -b sudo | cut -d" " -f2)"
+  if [ -x $SUDO_LOC ]; then
+    sudoVer="$(sudo -V | head -n1 | cut -d" " -f3)"
+    check_version "1.6.8"  "${sudoVer}"      "SUDO"
+  else
+    echo "${nl_}\"${RED}sudo${OFF}\" ${BOLD}must be installed on your system for jhalfs to run"
+    exit 1
+  fi
+
+  # Check for minimum libxml2 and libxslt versions
+  xsltprocVer=$(xsltproc -V | head -n1 )
+  libxmlVer=$(echo $xsltprocVer | cut -d " " -f3)
+  libxsltVer=$(echo $xsltprocVer | cut -d " " -f5)
+
+  # Version numbers are packed strings not xx.yy.zz format.
+  check_version "2.06.20"  "${libxmlVer:0:1}.${libxmlVer:1:2}.${libxmlVer:3:2}"     "LIBXML2"
+  check_version "1.01.14"  "${libxsltVer:0:1}.${libxsltVer:1:2}.${libxsltVer:3:2}"  "LIBXSLT"
+
+  # The next versions checks are required only when BLFS_TOOL is set and
+  # this dependencies has not be selected for installation
+  if [[ "$BLFS_TOOL" = "y" ]] ; then
+
+    if [[ -z "$DEP_TIDY" ]] ; then
+      tidyVer=$(tidy -V | cut -d " " -f9)
+      check_version "2004" "${tidyVer}" "TIDY"
+    fi
+
+    # Check if the proper DocBook-XML-DTD and DocBook-XSL are correctly installed
+XML_FILE="<?xml version='1.0' encoding='ISO-8859-1'?>
+<?xml-stylesheet type='text/xsl' href='http://docbook.sourceforge.net/release/xsl/1.69.1/xhtml/docbook.xsl'?>
+<!DOCTYPE article PUBLIC '-//OASIS//DTD DocBook XML V4.5//EN'
+  'http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd'>
+<article>
+  <title>Test file</title>
+  <sect1>
+    <title>Some title</title>
+    <para>Some text</para>
+  </sect1>
+</article>"
+
+    if [[ -z "$DEP_DBXML" ]] ; then
+      if `echo $XML_FILE | xmllint -noout -postvalid - 2>/dev/null` ; then
+        check_version "4.5" "4.5" "DocBook XML DTD"
+      else
+        echo "Warning: not found a working DocBook XML DTD 4.5 installation"
+        exit 2
+      fi
+    fi
+
+#     if [[ -z "$DEP_DBXSL" ]] ; then
+#       if `echo $XML_FILE | xsltproc --noout - 2>/dev/null` ; then
+#         check_version "1.69.1" "1.69.1" "DocBook XSL"
+#       else
+#         echo "Warning: not found a working DocBook XSL 1.69.1 installation"
+#         exit 2
+#       fi
+#     fi
+
+  fi # end BLFS_TOOL=Y
+
+}
\ No newline at end of file
diff --git a/2.3/common/libs/func_compare.sh b/2.3/common/libs/func_compare.sh
new file mode 100644
index 0000000..e9c072c
--- /dev/null
+++ b/2.3/common/libs/func_compare.sh
@@ -0,0 +1,139 @@
+# $Id$
+
+#----------------------------------#
+wrt_compare_targets() {            #
+#----------------------------------#
+
+  for ((N=1; N <= ITERATIONS ; N++)) ; do # Double parentheses,
+                                          # and "ITERATIONS" with no "$".
+    ITERATION=iteration-$N
+    if [ "$N" != "1" ] ; then
+      wrt_system_build "$N" "$PREV_IT"
+    fi
+    this_script=$ITERATION
+    CHROOT_wrt_target "$ITERATION" "$PREV"
+    wrt_compare_work "$ITERATION" "$PREV_IT"
+    wrt_logs "$N"
+    wrt_touch
+    PREV_IT=$ITERATION
+    PREV=$ITERATION
+  done
+}
+
+#----------------------------------#
+wrt_system_build() {               #
+#----------------------------------#
+  local     RUN=$1
+  local PREV_IT=$2
+
+  if [[ "$PROGNAME" = "clfs" ]] ; then
+    final_system_Makefiles $RUN
+  else
+    chapter6_Makefiles $RUN
+  fi
+
+  if [[ "$PROGNAME" = "clfs" ]] ; then
+    basicsystem="$basicsystem $PREV_IT $system_build"
+  else
+    chapter6="$chapter6 $PREV_IT $system_build"
+  fi
+
+  if [[ "$RUN" = "$ITERATIONS" ]] ; then
+    if [[ "$PROGNAME" = "clfs" ]] ; then
+      basicsystem="$basicsystem iteration-$RUN"
+    else
+      chapter6="$chapter6 iteration-$RUN"
+    fi
+  fi
+}
+
+#----------------------------------#
+wrt_compare_work() {               #
+#----------------------------------#
+  local ITERATION=$1
+  local   PREV_IT=$2
+  local PRUNEPATH="/dev /home /${SCRIPT_ROOT} /lost+found /media /mnt /opt /proc \
+/sources /root /srv /sys /tmp /tools /usr/local /usr/src"
+
+  local    ROOT_DIR=/
+  local DEST_TOPDIR=/${SCRIPT_ROOT}
+  local   ICALOGDIR=/${SCRIPT_ROOT}/logs/ICA
+  local FARCELOGDIR=/${SCRIPT_ROOT}/logs/farce
+
+  if [[ "$RUN_ICA" = "y" ]] ; then
+    local DEST_ICA=$DEST_TOPDIR/ICA && \
+(
+    cat << EOF
+	@extras/do_copy_files "$PRUNEPATH" $ROOT_DIR $DEST_ICA/$ITERATION >>logs/\$@ 2>&1 && \\
+	extras/do_ica_prep $DEST_ICA/$ITERATION >>logs/\$@ 2>&1
+EOF
+) >> $MKFILE.tmp
+    if [[ "$ITERATION" != "iteration-1" ]] ; then
+      wrt_do_ica_work "$PREV_IT" "$ITERATION" "$DEST_ICA"
+    fi
+  fi
+
+  if [[ "$RUN_FARCE" = "y" ]] ; then
+    local DEST_FARCE=$DEST_TOPDIR/farce && \
+(
+    cat << EOF
+	@extras/do_copy_files "$PRUNEPATH" $ROOT_DIR $DEST_FARCE/$ITERATION >>logs/\$@ 2>&1 && \\
+	extras/filelist $DEST_FARCE/$ITERATION $DEST_FARCE/filelist-$ITERATION >>logs/\$@ 2>&1
+EOF
+) >> $MKFILE.tmp
+    if [[ "$ITERATION" != "iteration-1" ]] ; then
+      wrt_do_farce_work "$PREV_IT" "$ITERATION" "$DEST_FARCE"
+    fi
+  fi
+}
+
+#----------------------------------#
+wrt_do_ica_work() {                #
+#----------------------------------#
+  echo -e "\t@extras/do_ica_work $1 $2 $ICALOGDIR $3 >>logs/\$@ 2>&1" >> $MKFILE.tmp
+}
+
+#----------------------------------#
+wrt_do_farce_work() {              #
+#----------------------------------#
+  local OUTPUT=$FARCELOGDIR/${1}_V_${2}
+  local PREDIR=$3/$1
+  local PREFILE=$3/filelist-$1
+  local ITEDIR=$3/$2
+  local ITEFILE=$3/filelist-$2
+  echo -e "\t@extras/farce --directory $OUTPUT $PREDIR $PREFILE $ITEDIR $ITEFILE >>logs/\$@ 2>&1" >> $MKFILE.tmp
+}
+
+#----------------------------------#
+wrt_logs() {                       #
+#----------------------------------#
+  local build=build_$1
+  local file
+
+(
+    cat << EOF
+	@cd logs && \\
+	mkdir $build && \\
+	mv -f ${system_build} $build && \\
+	if [ ! $build = build_1 ] ; then \\
+	  cd $build && \\
+	  for file in \`ls .\` ; do \\
+	    mv -f \$\$file \`echo \$\$file | sed -e 's,-$build,,'\` ; \\
+	  done ; \\
+	fi ;
+	@cd /\$(SCRIPT_ROOT)
+	@if [ -d test-logs ] ; then \\
+	  cd test-logs && \\
+	  mkdir $build && \\
+	  mv -f ${system_build} $build && \\
+	  if [ ! $build = build_1 ] ; then \\
+	    cd $build && \\
+	    for file in \`ls .\` ; do \\
+	      mv -f \$\$file \`echo \$\$file | sed -e 's,-$build,,'\` ; \\
+	    done ; \\
+	  fi ; \\
+	  cd /\$(SCRIPT_ROOT) ; \\
+	fi ;
+EOF
+) >> $MKFILE.tmp
+}
diff --git a/2.3/common/libs/func_custom_pkgs b/2.3/common/libs/func_custom_pkgs
new file mode 100644
index 0000000..d865f98
--- /dev/null
+++ b/2.3/common/libs/func_custom_pkgs
@@ -0,0 +1,118 @@
+#!/bin/bash
+
+# $Id$
+
+#----------------------------------#
+wrt_CustomTools_target() {         # Add any users supplied scripts
+#----------------------------------#
+  PREV=""
+
+  echo "  Adding custom packages... ${BOLD}START${OFF}"
+
+  # Create the custom_tools scripts directory
+  mkdir -p custom-tools
+
+  for file in $JHALFSDIR/custom-commands/*; do
+    if [[ `basename ${file}` = "*" ]]; then
+      break
+    fi
+    source $file
+    this_script=$(basename ${file})
+    echo "$tab_${GREEN}Adding${OFF} ${this_script}"
+
+      # Create a Makefile entry
+    if [[ "x${PKG}" = "x" ]]; then
+    # Create an entry for a self contained cmd script that does not
+    # reference a package tarball
+      case $PROGNAME in
+        clfs2 | clfs3 )
+          LUSER_wrt_target "${this_script}" "$PREV"
+          LUSER_wrt_RunAsUser "custom-tools/${this_script}"
+          ;;
+        *)
+          CHROOT_wrt_target "${this_script}" "$PREV"
+          CHROOT_wrt_RunAsRoot "custom-tools/${this_script}"
+          ;;
+      esac
+      wrt_touch
+
+    # Create the build script file
+( cat <<- xEOFx
+#!/bin/bash
+set -e
+
+`cat tmp`
+exit
+xEOFx
+) > custom-tools/${this_script}
+
+    else
+    # Create an entry for package
+      case $PROGNAME in
+        clfs2 | clfs3 )
+          LUSER_wrt_target "${this_script}" "$PREV"
+          LUSER_wrt_unpack "${PKG_FILE}"
+          LUSER_wrt_RunAsUser "custom-tools/${this_script}"
+          LUSER_RemoveBuildDirs "${PKG}"
+          echo -e "\t@touch \$(MOUNT_PT)$TRACKING_DIR/${PKG}-${PKG_VERSION}" >>  $MKFILE.tmp
+          ;;
+        *)
+          CHROOT_wrt_target "${this_script}" "$PREV"
+          CHROOT_Unpack "${PKG_FILE}"
+          CHROOT_wrt_RunAsRoot "custom-tools/${this_script}"
+          CHROOT_wrt_RemoveBuildDirs "${PKG}"
+          echo -e "\t@touch $TRACKING_DIR/${PKG}-${PKG_VERSION}" >>  $MKFILE.tmp
+          ;;
+      esac
+      wrt_touch
+
+    # Create the build script file
+( cat <<- xEOFx
+#!/bin/bash
+set -e
+
+cd \$PKGDIR
+`cat tmp`
+exit
+xEOFx
+) > custom-tools/$this_script
+    fi
+
+    rm -f tmp
+    PREV=$this_script
+    custom_list="${custom_list} ${this_script}"
+  done
+
+  # Make the scripts executable.
+  chmod +x custom-tools/*
+
+  echo "  Adding custom packages... ${BOLD}DONE${OFF}"
+}
+
+
+#----------------------------------#
+add_CustomToolsURLS() {            # Add any users supplied scripts URL information
+#----------------------------------#
+  local BLFS_SERVER="${SERVER}/pub/blfs/conglomeration/"
+  local this_script
+  local URL PKG PKG_VERSION PKG_FILE MD5
+
+  > urls.lst.tmp
+  for this_script in $JHALFSDIR/custom-commands/*; do
+    if [[ `basename ${this_script}` = "*" ]]; then
+      CUSTOM_TOOLS="n"
+      break
+    fi
+    source $this_script
+      # A cmd only script had no PKG defined
+    [[ "x${PKG}" = "x" ]] && continue
+
+    echo "${URL} ${BLFS_SERVER}${PKG}/${PKG_FILE} ${MD5}" >> urls.lst.tmp
+     # Add any patches..
+    for PATCH in PATCH{1..10}; do
+      [[ -n ${!PATCH} ]] && echo "dummy-url ${!PATCH}" >> urls.lst.tmp
+    done
+  done
+  cat  urls.lst.tmp >> $BUILDDIR/sources/urls.lst
+  rm urls.lst.tmp
+}
diff --git a/2.3/common/libs/func_download_pkgs b/2.3/common/libs/func_download_pkgs
new file mode 100644
index 0000000..265a593
--- /dev/null
+++ b/2.3/common/libs/func_download_pkgs
@@ -0,0 +1,195 @@
+#!/bin/bash
+
+# $Id$
+
+
+#----------------------------#
+get_sources() {              # Download file, write name to MISSING_FILES.DMP if an error
+#----------------------------#
+  local saveIFS=$IFS
+  local IFS line URL1 URL2 FILE BOOKMD5 MD5 HAVEMD5 fromARCHIVE
+
+    # Test if the packages must be downloaded
+  [ ! "$GETPKG" = "y" ] && return
+
+  gs_wrt_message(){
+    echo "${RED}$1${OFF}"
+    echo "$1" >> MISSING_FILES.DMP
+  }
+    # Housekeeping
+  [[ ! -d $BUILDDIR/sources ]] && mkdir $BUILDDIR/sources
+  cd $BUILDDIR/sources
+  [[ -f MD5SUMS ]] && rm MD5SUMS
+  [[ -f MISSING_FILES.DMP ]] && rm MISSING_FILES.DMP
+  [[ -f urls.lst ]] && rm urls.lst
+
+    # Generate URLs file
+  create_urls
+
+  IFS=$'\x0A'  # Modify the 'internal field separator' to break on 'LF' only
+  for line in `cat urls.lst`; do
+    IFS=$saveIFS  # Restore the system defaults
+
+      # Skip some packages if they aren't needed
+    case $line in
+        */tcl* | */expect* | */dejagnu* | */tree* | */gcc-testsuite* )
+            [[ "$TEST" = "0" ]] && continue
+          ;;
+        */vim-*-lang* )
+            [[ "$VIMLANG" = "0" ]] && continue
+          ;;
+        *linux/linux-* )
+            [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] && \
+            [[ "$GETKERNEL" = "n" ]] && continue
+          ;;
+    esac
+
+      # Locations
+    URL1=`echo $line | cut -d" " -f2` # Preferred URL
+    URL2=`echo $line | cut -d" " -f1` # Fallback Upstream URL
+    FILE=`basename $URL1` # File name
+    BOOKMD5=`echo $line | cut -d" " -f3` # MD5 book value
+
+      # Validation pair
+    MD5="$BOOKMD5  $FILE"
+    HAVEMD5=1
+
+    set -e
+      # If the file exists in the archive copy it to the
+      # $BUILDDIR/sources dir. MD5SUM will be validated later.
+    if [ ! -z ${SRC_ARCHIVE} ] &&
+       [   -d ${SRC_ARCHIVE} ] &&
+       [   -f ${SRC_ARCHIVE}/$FILE ]; then
+      cp ${SRC_ARCHIVE}/$FILE .
+      echo "$FILE: -- copied from $SRC_ARCHIVE"
+      fromARCHIVE=1
+    else
+      echo "${BOLD}${YELLOW}$FILE: not found in ${SRC_ARCHIVE}${OFF}"
+      fromARCHIVE=0
+      # If the file does not exist yet in /sources download a fresh one
+      if [ ! -f $FILE ] ; then
+        if ! wget $URL1 && ! wget $URL2 ; then
+          gs_wrt_message "$FILE not found in the SRC_ARCHIVE or on any server..SKIPPING"
+          continue
+        fi
+      fi
+    fi
+
+      # IF the md5sum does not match the existing files
+    if ! echo "$MD5" | md5sum -c - >/dev/null ; then
+      [[ $fromARCHIVE = "1" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match SRC_ARCHIVE copy${OFF}"
+      [[ $fromARCHIVE = "0" ]] && echo "${BOLD}${YELLOW}MD5SUM did not match REMOTE copy${OFF}"
+        # Remove the old file and download a new one
+      rm -fv $FILE
+        # Force storage in SRC_ARCHIVE
+      fromARCHIVE=0;
+        # Try to retrieve again the file. Servers in reverse order.
+      if ! wget $URL2 && ! wget $URL1 ; then
+        gs_wrt_message "$FILE not found on the servers.. SKIPPING"
+        continue
+      fi
+    fi
+
+      # Validate the MD5SUM one last time
+    if ! echo "$MD5" | md5sum -c - >/dev/null ; then
+      gs_wrt_message "$FILE does not match MD5SUMS value"
+      # Force generation of MD5SUM
+      HAVEMD5=0
+    fi
+
+      # Generate a fresh MD5SUM for this file
+    if [[ "$HAVEMD5" = "0" ]] ; then
+      echo "${BOLD}${YELLOW}Generating a new MD5SUM for ${OFF}$FILE"
+      echo "NEW MD5SUM: $(md5sum $FILE)" >> MISSING_FILES.DMP
+    fi
+
+      # Good or bad we write the original md5sum to a file
+    echo "$MD5" >> MD5SUMS
+
+     # Copy the freshly downloaded file
+     # to the source archive.
+   if [ ! -z ${SRC_ARCHIVE}  ] &&
+      [   -d ${SRC_ARCHIVE}  ] &&
+      [   -w ${SRC_ARCHIVE}  ] &&
+      [ "$fromARCHIVE" = "0" ] ; then
+        echo "Storing file:<$FILE> in the package archive"
+        cp -f $FILE ${SRC_ARCHIVE}
+   fi
+
+  done
+
+  if [[ -s MISSING_FILES.DMP ]]; then
+    echo  -e "\n\n${tab_}${RED} One or more files were not retrieved or have bad MD5SUMS.\n${tab_} Check ${L_arrow}$BUILDDIR/sources/MISSING_FILES.DMP${R_arrow} for names ${OFF}\n"
+      # Do not allow the automatic execution of the Makefile.
+    echo "${tab_}${BOLD}${RED}*** ${YELLOW}Automatic execution of the generated makefile has been inhibited. ${RED}***${OFF}${nl_}"
+    RUNMAKE="n"
+  fi
+}
+
+#----------------------------#
+create_urls() {              #
+#----------------------------#
+  cd $JHALFSDIR
+
+  case ${PROGNAME} in
+    clfs)
+        echo -n "Creating CLFS <${ARCH}> specific URLs file"
+        xsltproc --nonet --xinclude \
+                 --stringparam server $SERVER \
+                 --stringparam family clfs \
+                 -o $BUILDDIR/sources/urls.lst urls.xsl \
+                 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
+        echo " ...OK"
+      ;;
+    clfs2)
+        echo -n "Creating CLFS2 <${ARCH}> specific URLs file"
+        xsltproc --nonet --xinclude \
+                 --stringparam server $SERVER \
+                 --stringparam family clfs \
+                 -o $BUILDDIR/sources/urls.lst urls.xsl \
+                 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
+        echo " ...OK"
+      ;;
+    clfs3)
+        echo -n "Creating CLFS3 <${ARCH}> specific URLs file"
+        xsltproc --nonet --xinclude \
+                 --stringparam server $SERVER \
+                 --stringparam family clfs \
+                 -o $BUILDDIR/sources/urls.lst urls.xsl \
+                 $BOOK/materials/$ARCH-chapter.xml >>$LOGDIR/$LOG 2>&1
+        echo " ...OK"
+      ;;
+    hlfs)
+        echo -n "Creating HLFS <${MODEL}> + <${KERNEL}> specific URLs file"
+        xsltproc --nonet --xinclude \
+                 --stringparam server $SERVER \
+                 --stringparam family lfs \
+                 --stringparam model $MODEL \
+                 --stringparam kernel $KERNEL \
+                 -o $BUILDDIR/sources/urls.lst urls.xsl \
+                 $BOOK/chapter04/chapter04.xml >>$LOGDIR/$LOG 2>&1
+        echo " ...OK"
+      ;;
+    lfs)
+        echo -n "Creating LFS specific URLs file"
+        xsltproc --nonet --xinclude \
+                 --stringparam server $SERVER \
+                 --stringparam family lfs \
+                 -o ../sources/urls.lst urls.xsl \
+                 $BOOK/chapter03/chapter03.xml >>$LOGDIR/$LOG 2>&1
+        echo " ...OK"
+      ;;
+  esac
+
+  cd $BUILDDIR/sources
+
+  if [[ "${BLFS_TOOL}" = "y" ]]; then
+    add_blfs_deps_urls
+  fi
+
+  if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
+    add_CustomToolsURLS
+  fi
+
+}
+
diff --git a/2.3/common/libs/func_validate_configs.sh b/2.3/common/libs/func_validate_configs.sh
new file mode 100644
index 0000000..2336647
--- /dev/null
+++ b/2.3/common/libs/func_validate_configs.sh
@@ -0,0 +1,211 @@
+# $Id$
+
+declare -r dotSTR=".................."
+
+
+#----------------------------#
+validate_config() {          # Are the config values sane (within reason)
+#----------------------------#
+: <<inline_doc
+      Validates the configuration parameters. The global var PROGNAME selects the
+    parameter list.
+
+    input vars: none
+    externals:  color constants
+                PROGNAME (lfs,hlfs,clfs,clfs2,clfs3,blfs)
+    modifies:   none
+    returns:    nothing
+    on error:   write text to console and dies
+    on success: write text to console and returns
+inline_doc
+
+  # Common settings by Config.in sections and books family
+  local -r     BOOK_common="BOOK CUSTOM_TOOLS"
+  local -r      BOOK_clfsX="ARCH TARGET"
+  local -r  GENERAL_common="LUSER LGROUP LHOME BUILDDIR CLEAN GETPKG SRC_ARCHIVE \
+                            SERVER GETKERNEL RUNMAKE"
+  local -r    BUILD_chroot="TEST BOMB_TEST STRIP"
+  local -r    BUILD_common="FSTAB CONFIG TIMEZONE PAGE LANG INSTALL_LOG"
+  local -r ADVANCED_chroot="COMPARE RUN_ICA RUN_FARCE ITERATIONS OPTIMIZE"
+  local -r ADVANCED_common="REPORT REBUILD_MAKEFILE"
+
+  # BOOK Settings by book
+  local -r   LFS_book="$BOOK_common BLFS_TOOL"
+  #local -r HLFS_added="SET_SSP SET_ASLR SET_PAX SET_HARDENED_TMP SET_WARNINGS \
+  #                     SET_MISC SET_BLOWFISH"
+  local -r HLFS_added=""
+  local -r  HLFS_book="$BOOK_common BLFS_TOOL MODEL KERNEL GRSECURITY_HOST $HLFS_added"
+  local -r  CLFS_book="$BOOK_common BLFS_TOOL METHOD $BOOK_clfsX TARGET32 BOOT_CONFIG"
+  local -r CLFS2_book="$BOOK_common BLFS_TOOL        $BOOK_clfsX"
+  local -r CLFS3_book="$BOOK_common                  $BOOK_clfsX PLATFORM MIPS_LEVEL"
+
+  # Build Settings by book
+  local -r   LFS_build="$BUILD_chroot VIMLANG $BUILD_common"
+  local -r  HLFS_build="$BUILD_chroot         $BUILD_common"
+  local -r  CLFS_build="$BUILD_chroot VIMLANG $BUILD_common"
+  local -r CLFS2_build="STRIP         VIMLANG $BUILD_common"
+  local -r CLFS3_build="                      $BUILD_common"
+
+  # Full list of books settings
+  local -r   lfs_PARAM_LIST="$LFS_book   $GENERAL_common $LFS_build   $ADVANCED_chroot $ADVANCED_common"
+  local -r  hlfs_PARAM_LIST="$HLFS_book  $GENERAL_common $HLFS_build  $ADVANCED_chroot $ADVANCED_common"
+  local -r  clfs_PARAM_LIST="$CLFS_book  $GENERAL_common $CLFS_build  $ADVANCED_chroot $ADVANCED_common"
+  local -r clfs2_PARAM_LIST="$CLFS2_book $GENERAL_common $CLFS2_build                  $ADVANCED_common"
+  local -r clfs3_PARAM_LIST="$CLFS3_book $GENERAL_common $CLFS3_build                  $ADVANCED_common"
+  local -r  blfs_PARAM_LIST="BRANCH_ID BLFS_ROOT BLFS_XML TRACKING_DIR"
+
+  # Additional variables (add DEP_DBXSL when required again)
+  local -r blfs_tool_PARAM_LIST="BLFS_BRANCH_ID BLFS_ROOT BLFS_XML TRACKING_DIR \
+                                 DEP_LIBXML DEP_LIBXSLT DEP_TIDY DEP_UNZIP \
+                                 DEP_DBXML DEP_LINKS DEP_SUDO DEP_WGET \
+                                 DEP_SVN DEP_GPM"
+  local -r custom_tool_PARAM_LIST="TRACKING_DIR"
+
+  # Internal variables
+  local -r ERROR_MSG_pt1='The variable \"${L_arrow}${config_param}${R_arrow}\" value ${L_arrow}${BOLD}${!config_param}${R_arrow} is invalid,'
+  local -r ERROR_MSG_pt2='rerun make and fix your configuration settings${OFF}'
+  local -r PARAM_VALS='${config_param}${dotSTR:${#config_param}} ${L_arrow}${BOLD}${!config_param}${OFF}${R_arrow}'
+
+  local PARAM_LIST=
+  local config_param
+  local validation_str
+  local save_param
+
+  write_error_and_die() {
+    echo -e "\n${DD_BORDER}"
+    echo -e "`eval echo ${ERROR_MSG_pt1}`" >&2
+    echo -e "`eval echo ${ERROR_MSG_pt2}`" >&2
+    echo -e "${DD_BORDER}\n"
+    exit 1
+  }
+
+  validate_file() {
+     # For parameters ending with a '+' failure causes a warning message only
+     echo -n "`eval echo $PARAM_VALS`"
+     while test $# -gt 0 ; do
+       case $1 in
+        # Failures caused program exit
+        "-z")  [[   -z "${!config_param}" ]] && echo "${tab_}<-- NO file name given"  && write_error_and_die ;;
+        "-e")  [[ ! -e "${!config_param}" ]] && echo "${tab_}<-- file does not exist" && write_error_and_die ;;
+        "-s")  [[ ! -s "${!config_param}" ]] && echo "${tab_}<-- file has zero bytes" && write_error_and_die ;;
+        "-r")  [[ ! -r "${!config_param}" ]] && echo "${tab_}<-- no read permission " && write_error_and_die ;;
+        "-w")  [[ ! -w "${!config_param}" ]] && echo "${tab_}<-- no write permission" && write_error_and_die ;;
+        "-x")  [[ ! -x "${!config_param}" ]] && echo "${tab_}<-- file cannot be executed" && write_error_and_die ;;
+        # Warning messages only
+        "-z+") [[   -z "${!config_param}" ]] && echo && return ;;
+       esac
+       shift 1
+     done
+     echo
+  }
+
+  validate_dir() {
+     # For parameters ending with a '+' failure causes a warning message only
+     echo -n "`eval echo $PARAM_VALS`"
+     while test $# -gt 0 ; do
+       case $1 in
+        "-z") [[   -z "${!config_param}" ]] && echo "${tab_}NO directory name given" && write_error_and_die ;;
+        "-d") [[ ! -d "${!config_param}" ]] && echo "${tab_}This is NOT a directory" && write_error_and_die ;;
+        "-w") if [[ ! -w "${!config_param}" ]]; then
+                echo "${nl_}${DD_BORDER}"
+                echo "${tab_}${RED}You do not have ${L_arrow}write${R_arrow}${RED} access to the directory${OFF}"
+                echo "${tab_}${BOLD}${!config_param}${OFF}"
+                echo "${DD_BORDER}${nl_}"
+                exit 1
+              fi  ;;
+        # Warnings only
+        "-w+") if [[ ! -w "${!config_param}" ]]; then
+                 echo "${nl_}${DD_BORDER}"
+                 echo "${tab_}WARNING-- You do not have ${L_arrow}write${R_arrow} access to the directory${OFF}"
+                 echo "${tab_}       -- ${BOLD}${!config_param}${OFF}"
+                 echo "${DD_BORDER}"
+               fi  ;;
+        "-z+") [[ -z "${!config_param}" ]] && echo "${tab_}<-- NO directory name given" && return
+       esac
+       shift 1
+     done
+     echo
+  }
+
+  set +e
+  PARAM_GROUP=${PROGNAME}_PARAM_LIST
+  for config_param in ${!PARAM_GROUP}; do
+    case $config_param in
+      # Envvars that depend on other settings to be displayed
+      GETKERNEL ) if [[ -z "$CONFIG" ]] && [[ -z "$BOOT_CONFIG" ]] ; then
+                    [[ "$GETPKG" = "y" ]] && echo -e "`eval echo $PARAM_VALS`"
+                  fi ;;
+      COMPARE)    [[ ! "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+      RUN_ICA)    [[ "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+      RUN_FARCE)  [[ "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+      ITERATIONS) [[ "$COMPARE" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+      BOMB_TEST)  [[ ! "$TEST" = "0" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+      TARGET32)   [[ -n "${TARGET32}" ]] &&  echo -e "`eval echo $PARAM_VALS`" ;;
+      MIPS_LEVEL) [[ "${ARCH}" = "mips" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+      SERVER)     [[ "$GETPKG" = "y" ]] && echo -e "`eval echo $PARAM_VALS`" ;;
+
+      # Envars that requires some validation
+      LUSER)      echo -e "`eval echo $PARAM_VALS`"
+                  [[ "${!config_param}" = "**EDIT ME**" ]] && write_error_and_die
+                  ;;
+      LGROUP)     echo -e "`eval echo $PARAM_VALS`"
+                  [[ "${!config_param}" = "**EDIT ME**" ]] && write_error_and_die
+                  ;;
+        # BOOK validation. Very ugly, need be fixed
+      BOOK)        if [[ "${WORKING_COPY}" = "y" ]] ; then
+                     validate_dir -z -d
+                   else
+                     echo -e "`eval echo $PARAM_VALS`"
+                   fi
+                  ;;
+        # Validate directories, testable states:
+        #  fatal   -z -d -w,
+        #  warning -z+   -w+
+      SRC_ARCHIVE) [[ "$GETPKG" = "y" ]] && validate_dir -z+ -d -w+ ;;
+        # The build directory/partition MUST exist and be writable by the user
+      BUILDDIR)   validate_dir -z -d -w
+                  [[ "xx x/x" =~ x${!config_param}x ]] && write_error_and_die ;;
+      LHOME)      validate_dir -z -d ;;
+
+        # Validate files, testable states:
+        #  fatal   -z -e -s -w -x -r,
+        #  warning -z+
+      FSTAB)       validate_file -z+ -e -s ;;
+      CONFIG)      validate_file -z+ -e -s ;;
+      BOOT_CONFIG) [[ "${METHOD}" = "boot" ]] && validate_file -z -e -s ;;
+
+        # Treatment of LANG parameter
+      LANG )  # See it the locale value has been set
+               echo -n "`eval echo $PARAM_VALS`"
+               [[ -z "${!config_param}" ]] &&
+                 echo " -- Variable $config_param cannot be empty!" &&
+                 write_error_and_die
+               echo
+               ;;
+
+      # BLFS params.
+      BRANCH_ID | BLFS_ROOT | BLFS_XML )  echo "`eval echo $PARAM_VALS`" ;;
+      TRACKING_DIR ) validate_dir -z -d -w ;;
+
+      # Display non-validated envars found in ${PROGNAME}_PARAM_LIST
+      * ) echo -e "`eval echo $PARAM_VALS`" ;;
+
+    esac
+  done
+
+  if [[ "${BLFS_TOOL}" = "y" ]] ; then
+    echo "${nl_}    ${BLUE}blfs-tool settings${OFF}"
+    for config_param in ${blfs_tool_PARAM_LIST}; do
+      echo -e "`eval echo $PARAM_VALS`"
+    done
+  fi
+
+  if [[ "${CUSTOM_TOOLS}" = "y" ]] && [[ "${BLFS_TOOL}" = "n" ]]  ; then
+    for config_param in ${custom_tool_PARAM_LIST}; do
+      echo -e "`eval echo $PARAM_VALS`"
+    done
+  fi
+
+  set -e
+  echo "${nl_}***${BOLD}${GREEN} ${PARAM_GROUP%%_*T} config parameters look good${OFF} ***${nl_}"
+}
diff --git a/2.3/common/libs/func_wrt_Makefile b/2.3/common/libs/func_wrt_Makefile
new file mode 100644
index 0000000..4a51ea3
--- /dev/null
+++ b/2.3/common/libs/func_wrt_Makefile
@@ -0,0 +1,398 @@
+#!/bin/bash
+
+# $Id$
+
+#=== MAKEFILE HEADER ===
+
+#----------------------------------#
+wrt_Makefile_header() {            #
+#----------------------------------#
+(
+    cat << EOF
+# This file is automatically generated by jhalfs
+# DO NOT EDIT THIS FILE MANUALLY
+#
+# Generated on `date "+%F %X %Z"`
+
+
+SHELL = /bin/bash
+
+SRC            = /sources
+MOUNT_PT       = $BUILDDIR
+PKG_LST        = $PKG_LST
+LUSER          = $LUSER
+LGROUP         = $LGROUP
+LHOME          = $LHOME
+SCRIPT_ROOT    = $SCRIPT_ROOT
+
+BASEDIR        = \$(MOUNT_PT)
+SRCSDIR        = \$(BASEDIR)/sources
+CMDSDIR        = \$(BASEDIR)/\$(SCRIPT_ROOT)/$PROGNAME-commands
+LOGDIR         = \$(BASEDIR)/\$(SCRIPT_ROOT)/$LOGDIRBASE
+TESTLOGDIR     = \$(BASEDIR)/\$(SCRIPT_ROOT)/$TESTLOGDIRBASE
+
+crCMDSDIR      = /\$(SCRIPT_ROOT)/$PROGNAME-commands
+crLOGDIR       = /\$(SCRIPT_ROOT)/$LOGDIRBASE
+crTESTLOGDIR   = /\$(SCRIPT_ROOT)/$TESTLOGDIRBASE
+crFILELOGDIR   = /\$(SCRIPT_ROOT)/$FILELOGDIRBASE
+
+SU_LUSER       = su - \$(LUSER) -c
+LUSER_HOME     = \$(LHOME)/\$(LUSER)
+PRT_DU         = echo -e "\nKB: \`du -skx --exclude=\$(SCRIPT_ROOT) --exclude=lost+found \$(MOUNT_PT) \`\n"
+PRT_DU_CR      = echo -e "\nKB: \`du -skx --exclude=\$(SCRIPT_ROOT) --exclude=lost+found / \`\n"
+TIME_MARK      = \`date +%s.%N\`
+BUILD_TIME     = perl -e "printf \"\nTotalseconds: %.3f\", ('\$\$end' - '\$\$start')"
+
+ADD_REPORT       = $REPORT
+ADD_CUSTOM_TOOLS = $CUSTOM_TOOLS
+ADD_BLFS_TOOLS   = $BLFS_TOOL
+
+
+export PATH := \${PATH}:/usr/sbin
+
+include makefile-functions
+
+EOF
+) > $MKFILE
+}
+
+#=======================
+
+
+#==== PACKAGES NAMES ===
+
+#----------------------------------#
+get_package_tarball_name() {       #
+#----------------------------------#
+  local script_name=`echo ${1} | sed -e 's@[0-9]\{1\}-@@'`
+
+   # The use of 'head' is necessary to limit the return value to the FIRST match..
+   # hopefully this will not cause problems.
+   #
+   case $script_name in
+     tcl) echo $(grep "^tcl" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         ;;
+     powerpc-utils) echo $(grep "^powerpc-utils" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         ;;
+     uClibc)
+         if [[ "${PROGNAME}" = "clfs3" ]]; then
+           echo $(grep "^uClibc-" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         else
+           echo $(grep "^$script_name-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         fi
+         ;;
+     linux-headers)
+         if [[ "${PROGNAME}" = "lfs" ]] || [[ "${PROGNAME}" = "hlfs" ]] ; then
+           # Uses kernel headers directly
+           echo $(grep "^linux-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         else
+           # CLFS{,2,3} use massaged headers package
+           echo $(grep "^linux-headers-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         fi
+         ;;
+     *)  echo $(grep "^$script_name-[[:digit:]]" $JHALFSDIR/pkg_tarball_list | head -n1 )
+         ;;
+   esac
+
+}
+
+#=======================
+
+
+#==== TARGET HEADER ====
+
+#----------------------------------#
+LUSER_wrt_target() {               # Create target and initialize log file
+#----------------------------------#
+  local i=$1
+  local PREV=$2
+(
+cat << EOF
+
+$i:  $PREV
+	@\$(call echo_message, Building)
+	@export BASHBIN=\$(SHELL) && \$(SHELL) progress_bar.sh \$@ \$\$PPID &
+	@echo "\$(nl_)\`date\`\$(nl_)" >logs/\$@
+	@\$(PRT_DU) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_target() {              # Create target and initialize log file
+#----------------------------------#
+  local i=$1
+  local PREV=$2
+(
+cat << EOF
+
+$i:  $PREV
+	@\$(call echo_message, Building)
+	@export BASHBIN=\$(SHELL) && \$(SHELL) progress_bar.sh \$@ \$\$PPID &
+	@echo "\$(nl_)\`date\`\$(nl_)" >logs/\$@
+	@\$(PRT_DU_CR) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
+
+
+#======== UNPACK =======
+
+#----------------------------------#
+LUSER_wrt_unpack() {               # Unpack and set 'ROOT' var
+#----------------------------------#
+  local FILE=$1
+  local optSAVE_PREVIOUS=$2
+
+  if [[ "${optSAVE_PREVIOUS}" != "1" ]]; then
+(
+cat << EOF
+	@\$(call remove_existing_dirs,$FILE)
+EOF
+) >> $MKFILE.tmp
+  fi
+
+(
+cat << EOF
+	@\$(call unpack,$FILE)
+	@\$(call get_pkg_root_LUSER)
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_Unpack() {                  #
+#----------------------------------#
+  local FILE=$1
+  local optSAVE_PREVIOUS=$2
+
+  if [ "${optSAVE_PREVIOUS}" != "1" ]; then
+(
+cat << EOF
+	@\$(call remove_existing_dirs2,$FILE)
+EOF
+) >> $MKFILE.tmp
+  fi
+(
+cat  << EOF
+	@\$(call unpack2,$FILE)
+	@\$(call get_pkg_root2)
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
+
+
+#===== TESTS LOGS ======
+
+#----------------------------------#
+LUSER_wrt_test_log() {             # Initialize testsuite log file
+#----------------------------------#
+  local TESTLOGFILE=$1
+(
+cat  << EOF
+	@echo "export  TEST_LOG=\$(TESTLOGDIR)/$TESTLOGFILE" >> envars && \\
+	echo "\$(nl_)\`date\`\$(nl_)" >\$(TESTLOGDIR)/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_test_log() {            #
+#----------------------------------#
+  local TESTLOGFILE=$1
+(
+cat  << EOF
+	@echo "export TEST_LOG=\$(crTESTLOGDIR)/$TESTLOGFILE" >> envars && \\
+	echo "\$(nl_)\`date\`\$(nl_)" >test-logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
+
+
+#======== RUN AS =======
+
+#----------------------------------#
+wrt_RunAsRoot() {                  # Some scripts must be run as root..
+#----------------------------------#
+  local MOUNT_ENV
+  local file=$1
+
+  case ${PROGNAME} in
+    lfs   ) MOUNT_ENV="LFS" ;;
+    clfs  ) MOUNT_ENV="CLFS" ;;
+    clfs2 ) MOUNT_ENV="CLFS" ;;
+    clfs3 ) MOUNT_ENV="CLFS" ;;
+    hlfs  ) MOUNT_ENV="HLFS" ;;
+    *) echo "undefined progname $PROGNAME"; exit 1 ;;
+  esac
+
+(
+cat << EOF
+	@start=\$(TIME_MARK) && \\
+	export ${MOUNT_ENV}=\$(MOUNT_PT) && \\
+	${PROGNAME}-commands/`dirname $file`/\$@ >>logs/\$@ 2>&1 && \\
+	end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
+	\$(PRT_DU) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+LUSER_wrt_RunAsUser() {            # Calculate time with perl, footer to log file
+#----------------------------------#
+  local file=$1
+
+(
+cat << EOF
+	@start=\$(TIME_MARK) && \\
+	source ~/.bashrc && \\
+	\$(CMDSDIR)/`dirname $file`/\$@ >> logs/\$@ 2>&1 && \\
+	end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
+	\$(PRT_DU) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_RunAsRoot() {           #
+#----------------------------------#
+  local file=$1
+(
+cat << EOF
+	@start=\$(TIME_MARK) && \\
+	source envars && \\
+	\$(crCMDSDIR)/`dirname $file`/\$@ >>logs/\$@ 2>&1 && \\
+	end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
+	\$(PRT_DU_CR) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+
+}
+
+#=======================
+
+
+#====== COPY FSTAB =====
+
+#----------------------------------#
+LUSER_wrt_CopyFstab() {            #
+#----------------------------------#
+(
+cat << EOF
+	@start=\$(TIME_MARK) && \\
+	cp -v \$(MOUNT_PT)/sources/fstab \$(MOUNT_PT)/etc/fstab >>logs/\$@ 2>&1 && \\
+	end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
+	\$(PRT_DU) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_CopyFstab() {           #
+#----------------------------------#
+(
+cat << EOF
+	@start=\$(TIME_MARK) && \\
+	cp -v /sources/fstab /etc/fstab >>logs/\$@ 2>&1 && \\
+	end=\$(TIME_MARK) && \$(BUILD_TIME) >>logs/\$@ && \\
+	\$(PRT_DU_CR) >>logs/\$@
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
+
+
+#==== INSTALLED FILES LOGS ====
+
+#----------------------------------#
+LUSER_wrt_TouchTimestamp() {       #
+#----------------------------------#
+(
+cat << EOF
+	@\$(call touch_timestamp_LUSER)
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_TouchTimestamp() {      #
+#----------------------------------#
+(
+cat << EOF
+	@\$(call touch_timestamp)
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+LUSER_wrt_LogNewFiles() {          #
+#----------------------------------#
+  local name=$1
+(
+cat << EOF
+	@\$(call log_new_files_LUSER,$name)
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_LogNewFiles() {         #
+#----------------------------------#
+  local name=$1
+(
+cat << EOF
+	@\$(call log_new_files,$name)
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
+
+
+#==== RM BUILD DIRS ====
+
+#----------------------------------#
+LUSER_RemoveBuildDirs() {          #
+#----------------------------------#
+  local name=$1
+(
+cat << EOF
+	@\$(call remove_build_dirs,$name)
+EOF
+) >> $MKFILE.tmp
+}
+
+#----------------------------------#
+CHROOT_wrt_RemoveBuildDirs() {     #
+#----------------------------------#
+  local name=$1
+(
+cat << EOF
+	@\$(call remove_build_dirs2,$name)
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
+
+
+#======== TOUCH ========
+
+#----------------------------------#
+wrt_touch() {                      #
+#----------------------------------#
+(
+cat << EOF
+	@\$(call housekeeping)
+EOF
+) >> $MKFILE.tmp
+}
+
+#=======================
diff --git a/2.3/common/makefile-functions b/2.3/common/makefile-functions
new file mode 100644
index 0000000..d54938d
--- /dev/null
+++ b/2.3/common/makefile-functions
@@ -0,0 +1,242 @@
+
+# $Id$
+
+BOLD    = ""
+RED     = ""
+GREEN   = ""
+ORANGE  = ""
+BLUE    = ""
+WHITE   = ""
+YELLOW  = ""
+
+OFF     = ""
+REVERSE = ""
+
+tab_    = "	"
+nl_     = ""
+
+#==== BUILD MESSAGES ===
+
+define echo_PHASE
+  @echo $(BOLD)--------------------------------------------------------------------------------
+  @echo  $(tab_)$(tab_)Executing $(BLUE)$(1)$(WHITE) scripts
+  @echo $(BOLD)--------------------------------------------------------------------------------
+  @echo $(WHITE)
+endef
+
+define sh_echo_PHASE
+  echo $(BOLD)--------------------------------------------------------------------------------;\
+  echo  $(tab_)$(tab_)Executing $(BLUE)$(1)$(WHITE) scripts; \
+  echo $(BOLD)--------------------------------------------------------------------------------echo $(WHITE)
+endef
+
+define echo_SU_request
+  @echo $(BOLD)--------------------------------------------------------------------------------
+  @echo $(BLUE)$@
+  @echo $(WHITE)ROOT privilege is required to perform a number commands
+  @echo sudo will request a password to all high privilege cmds to execute correctly
+endef
+
+define echo_SULUSER_request
+  @echo $(BOLD)--------------------------------------------------------------------------------
+  @echo $(BOLD)$(BLUE)$@
+  @echo $(WHITE)You are going to log into the user account $(BOLD)$(YELLOW)$(LUSER)$(OFF)
+  @echo sudo requires a password
+endef
+
+define echo_CHROOT_request
+  @echo $(BOLD)--------------------------------------------------------------------------------
+  @echo $(BOLD)$(BLUE)$@
+  @echo $(WHITE)You are going to CHROOT into $(MOUNT_PT) $(BOLD)$(YELLOW)$(LUSER)$(OFF)
+  @echo a password is required
+endef
+
+define echo_message
+  @echo $(BOLD)--------------------------------------------------------------------------------
+  @echo $(BOLD)$(1) target $(BLUE)$@$(BOLD)$(WHITE)
+endef
+
+#=======================
+
+
+#=== BUILD FUNCTIONS ===
+
+define remove_existing_dirs
+  @PKG_PATH=`ls -t $(SRCSDIR)/$(1) | head -n1` && \
+  ROOT=`tar -tf $$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'` && \
+  rm -rf $(SRCSDIR)/$$ROOT && \
+  rm -rf $(SRCSDIR)/$${ROOT%-*}-build
+endef
+
+define remove_existing_dirs2
+  @PKG_PATH=`ls -t $(SRC)/$(1) | head -n1` && \
+  ROOT=`tar -tf $$PKG_PATH | head -n1 | sed -e 's@^./@@;s@/.*@@'` && \
+  rm -rf $(SRC)/$$ROOT && \
+  rm -rf $(SRC)/$${ROOT%-*}-build
+endef
+
+#==#
+
+define unpack
+  @cd $(SRCSDIR) && \
+  tar -xvf `ls -t $(1) | head -n1` > $(PKG_LST)
+endef
+
+define unpack2
+  @cd $(SRC) && \
+  tar -xvf `ls -t $(1) | head -n1` > $(PKG_LST)
+endef
+
+#==#
+
+define get_pkg_root
+  @ROOT=`head -n1 $(SRCSDIR)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
+  if [ "$(1)" != "nouser" ]; then \
+    echo "export PKGDIR=$(SRCSDIR)/$$ROOT" > envars; \
+    chown -R $(LUSER) $(SRCSDIR)/$$ROOT; \
+  else \
+    echo "export PKGDIR=$(crSRCSDIR)/$$ROOT" > envars; \
+  fi;
+endef
+
+define get_pkg_root2
+  @ROOT=`head -n1 $(SRC)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
+  echo "export PKGDIR=$(SRC)/$$ROOT" > envars
+endef
+
+define get_pkg_root_LUSER
+  @ROOT=`head -n1 $(SRCSDIR)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
+  echo "export PKGDIR=$(SRCSDIR)/$$ROOT" > envars
+endef
+
+#==#
+
+define touch_timestamp
+  @touch $(SRC)/timestamp-marker && sleep 1
+endef
+
+define touch_timestamp_LUSER
+  @touch $(SRCSDIR)/timestamp-marker && sleep 1
+endef
+
+define log_new_files
+  @find / -xdev ! -path "/$(SCRIPT_ROOT)/*" ! -path "/tmp/*" ! -path "$(SRC)/*" \
+  -newer $(SRC)/timestamp-marker -not -type d \
+  -printf "%p\t%s\t%u:%g\t%m\t%l\n" | sort > $(crFILELOGDIR)/$(1)
+endef
+
+define log_new_files_LUSER
+  @find $(BASEDIR) -xdev ! -path "$(BASEDIR)/$(SCRIPT_ROOT)/*" ! -path "$(BASEDIR)/tmp/*" ! -path "$(SRCSDIR)/*" \
+  -newer $(SRCSDIR)/timestamp-marker -not -type d \
+  -printf "%p\t%s\t%u:%g\t%m\t%l\n" | sort > $(BASEDIR)$(crFILELOGDIR)/$(1)
+endef
+
+#==@
+
+define remove_build_dirs
+  @ROOT=`head -n1 $(SRCSDIR)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
+  rm -rf $(SRCSDIR)/$$ROOT && \
+  rm -rf $(SRCSDIR)/$(1)-build
+endef
+
+define remove_build_dirs2
+  @ROOT=`head -n1 $(SRC)/$(PKG_LST) | sed 's@^./@@;s@/.*@@'` && \
+  rm -rf $(SRC)/$$ROOT && \
+  rm -rf $(SRC)/$(1)-build
+endef
+
+#==#
+
+define housekeeping
+  @touch  $@ && \
+  sleep .25 && \
+  echo  -e "\n" $(BOLD)Target $(BLUE)$@ $(WHITE)$(BOLD)OK && \
+  echo --------------------------------------------------------------------------------$(WHITE) && \
+  if [ "$(BREAKPOINT)" = "$@" ] ; then \
+     echo $(tab_)$(RED)The build has been stopped at $(BLUE)$@ $(RED)as requested$(WHITE) ; \
+     false ; \
+  fi
+endef
+
+#=======================
+
+
+#==== FINAL MESSAGES ===
+
+define echo_report
+  echo ; \
+  echo $(BOLD) The report file $(BLUE)$(1)$(BOLD) has been created ; \
+  echo ; \
+  echo $(WHITE)Please send the $(BOLD)$(MOUNT_PT)/jhalfs/$(1)$(WHITE) ; \
+  echo file to $(BOLD)manuel@linuxfromscratch.org$(WHITE) ; \
+  echo ; \
+  echo That will help us to keep more accurate SBU and ; \
+  echo disk usage values into the book. Thanks. ; \
+  echo $(BOLD)--------------------------------------------------------------------------------$(WHITE)
+endef
+
+define echo_finished
+  @echo $(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo $(BOLD) Finished the build of $(BLUE)$(1)$(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo  $(tab_)$(tab_)$(RED)W A R N I N G$(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo
+  @echo To be able to boot your new system you need to follow
+  @echo the next steps:$(WHITE)
+  @echo
+  @echo  $(tab_)- Enter to the chroot using the command found
+  @echo  $(tab_)in the section -Entering the Chroot Environment-
+  @echo  $(tab_)except if building CLFS with METHOD=boot.
+  @echo
+  @echo  $(tab_)- Set a password for the root user.
+  @echo
+  @echo  $(tab_)- Edit or create /etc/fstab, /etc/hosts, /etc/sysconfig/clock,
+  @echo  $(tab_)/etc/sysconfig/console, /etc/sysconfig/network,
+  @echo  $(tab_)/etc/sysconfig//network-devices/ifconfig.eth0/ipv4 and
+  @echo  $(tab_)any other configuration file required to suit your needs.
+  @echo
+  @echo  $(tab_)- Exit from the chroot.
+  @echo
+  @echo  $(tab_)- Set-up the boot loader, except if building CLFS with METHOD=boot.
+  @echo  $(tab_)You can set-up the host bootloader or the new boot-loader
+  @echo  $(tab_)installed on the new system.
+  @echo  $(tab_)If the last, you must to mount the virtual filesystems, re-enter
+  @echo  $(tab_)the chroot and be sure that /dev is populated with the
+  @echo  $(tab_)required devices before configure the boot-loader. When ready,
+  @echo  $(tab_)exit from the chroot and umount the filesystems
+  @echo
+  @echo If you are an experienced LFS user, several of those steps can be
+  @echo skipped or done in a different way. But then, that is something
+  @echo that you already know and there is no need to discuss it here.
+  @echo $(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo  $(tab_)$(tab_)$(GREEN)Have a nice day $(ORANGE):-\)$(BOLD)
+  @echo --------------------------------------------------------------------------------$(WHITE)
+endef
+
+define echo_boot_finished
+  @echo $(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo        $(BOLD) Finished building a minimal boot system for $(BLUE)$(1)$(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo  $(tab_)$(tab_)$(RED)W A R N I N G$(BOLD)
+  @echo --------------------------------------------------------------------------------
+  @echo
+  @echo The build is not complete. Follow the next steps:$(WHITE)
+  @echo
+  @echo  $(tab_)- Edit or create $(MOUNT_PT)/etc/fstab
+  @echo  $(tab_) and any other configuration file required to suit your needs.
+  @echo $(BOLD)
+  @echo $(BOLD)$(YELLOW)
+  @echo  1.If it is necessary, transfer the newly created partition to the target machine
+  @echo  2.Boot the new partition.
+  @echo  3.Once you are logged in issue the following commands
+  @echo  $(tab_) $(BOLD)cd /jhalfs
+  @echo  $(tab_) $(BOLD)make makesys
+  @echo  The build process should resume. Follow any instructions that appear.
+  @echo --------------------------------------------------------------------------------
+  @echo  $(tab_)$(tab_)$(GREEN)Have a nice day $(ORANGE):-\)$(BOLD)
+  @echo --------------------------------------------------------------------------------$(WHITE)
+endef
diff --git a/2.3/common/packages.xsl b/2.3/common/packages.xsl
new file mode 100644
index 0000000..5eab0a7
--- /dev/null
+++ b/2.3/common/packages.xsl
@@ -0,0 +1,56 @@
+<?xml version='1.0' encoding='ISO-8859-1'?>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    version="1.0">
+
+  <xsl:output method="text"/>
+
+  <!-- The libc model used for HLFS -->
+  <xsl:param name="model" select="glibc"/>
+
+  <!-- The kernel series used for HLFS -->
+  <xsl:param name="kernel" select="2.6"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//para"/>
+  </xsl:template>
+
+  <xsl:template match="para">
+    <xsl:if test="contains(string(),'Download:') and
+                  (ancestor::varlistentry[@condition=$model]
+                  or not(ancestor::varlistentry[@condition])) and
+                  (ancestor::varlistentry[@vendor=$kernel]
+                  or not(ancestor::varlistentry[@vendor]))">
+      <xsl:call-template name="package_name">
+        <xsl:with-param name="url" select="ulink/@url"/>
+      </xsl:call-template>
+      <xsl:text>&#xA;</xsl:text>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="package_name">
+    <xsl:param name="url" select="foo"/>
+    <xsl:param name="sub-url" select="substring-after($url,'/')"/>
+    <xsl:choose>
+      <xsl:when test="contains($sub-url,'/')">
+        <xsl:call-template name="package_name">
+          <xsl:with-param name="url" select="$sub-url"/>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:choose>
+          <xsl:when test="contains($sub-url,'.patch')"/>
+          <xsl:when test="contains($sub-url,'?')">
+            <xsl:value-of select="substring-before($sub-url,'?')"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="$sub-url"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/common/progress_bar.sh b/2.3/common/progress_bar.sh
new file mode 100644
index 0000000..41926fe
--- /dev/null
+++ b/2.3/common/progress_bar.sh
@@ -0,0 +1,68 @@
+
+# $Id$
+
+set -e
+
+# Be sure that we know the taget name
+[[ -z $1 ]] && exit
+TARGET=$1  # Remember the target build we are looking for
+MAKE_PPID=$2
+
+declare -r  CSI=$'\e['  # DEC terminology, Control Sequence Introducer
+declare -r  CURSOR_OFF=${CSI}$'?25l'
+declare -r  CURSOR_ON=${CSI}$'?25h'
+declare -r  ERASE_LINE=${CSI}$'2K'
+declare -r  FRAME_OPEN=${CSI}$'2G['
+declare -r  FRAME_CLOSE=${CSI}$'63G]'
+declare -r  TS_POSITION=${CSI}$'65G'
+declare -r  LINE_WRAP_OFF=${CSI}$'?7l'
+declare -r  LINE_WRAP_ON=${CSI}$'?7h'
+declare -a  RESET_LINE=${CURSOR_OFF}${ERASE_LINE}${FRAME_OPEN}${FRAME_CLOSE}
+
+declare -a  GRAPHIC_STR="| / - \\ + "
+declare -i  SEC=0  # Seconds accumulator
+declare -i  PREV_SEC=0
+
+# Prevent segfault on stripping phases
+if [[ "$BASHBIN" = "/tools/bin/bash" ]] ; then
+  SLEEP=/tools/bin/sleep
+else
+  SLEEP=/bin/sleep
+fi
+
+write_or_exit() {
+    # make has been killed or failed or run to completion, leave
+  [[ ! -e /proc/${MAKE_PPID} ]] && echo -n "${CURSOR_ON}" && exit
+
+    # Target build complete, leave.
+  [[ -f ${TARGET} ]] && echo -n "${CURSOR_ON}" && exit
+
+    # It is safe to write to the screen
+  echo -n "$1"
+}
+
+  # initialize screen
+write_or_exit "${RESET_LINE}${TS_POSITION}0 min. 0 sec"
+
+  # loop forever..
+while true ; do
+
+      # Loop through the animation string
+    for GRAPHIC_CHAR in ${GRAPHIC_STR} ; do
+      write_or_exit "${CSI}$((SEC + 3))G${GRAPHIC_CHAR}"
+      $SLEEP .12 # This value MUST be less than .2 seconds.
+    done
+
+      # A BASH internal variable, the number of seconds the script
+      # has been running. modulo convert to 0-59
+    SEC=$(($SECONDS % 60))
+
+      # Detect rollover of the seconds.
+    (( PREV_SEC > SEC )) && write_or_exit "${RESET_LINE}"
+    (( PREV_SEC = SEC ))
+
+      # Display the accumulated time. div minutes.. modulo seconds.
+    write_or_exit "${TS_POSITION}$(($SECONDS / 60)) min. $SEC sec"
+done
+
+exit
diff --git a/2.3/common/urls.xsl b/2.3/common/urls.xsl
new file mode 100644
index 0000000..b136eb5
--- /dev/null
+++ b/2.3/common/urls.xsl
@@ -0,0 +1,130 @@
+<?xml version='1.0' encoding='ISO-8859-1'?>
+
+<!-- $Id$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    version="1.0">
+
+  <xsl:output method="text"/>
+
+  <!-- The FTP server used as fallback -->
+  <xsl:param name="server">ftp://ftp.osuosl.org</xsl:param>
+
+  <!-- The book family (lfs or clfs). Needed to use the proper FTP path. -->
+  <xsl:param name="family">lfs</xsl:param>
+
+  <!-- The libc model used for HLFS -->
+  <xsl:param name="model" select="glibc"/>
+
+  <!-- The kernel series used for HLFS -->
+  <xsl:param name="kernel" select="2.6"/>
+
+  <xsl:template match="/">
+    <xsl:apply-templates select="//ulink"/>
+  </xsl:template>
+
+  <xsl:template match="ulink">
+      <!-- If some package don't have the predefined strings in their
+      name, the next test must be fixed to match it also. Skip possible
+      duplicated URLs due that may be splitted for PDF output -->
+    <xsl:if test="(ancestor::varlistentry[@condition=$model]
+                  or not(ancestor::varlistentry[@condition])) and
+                  (ancestor::varlistentry[@vendor=$kernel]
+                  or not(ancestor::varlistentry[@vendor])) and
+                  (contains(@url, '.bz2') or contains(@url, '.tar.gz') or
+                  contains(@url, '.tgz') or contains(@url, '.patch')) and
+                  not(ancestor-or-self::*/@condition = 'pdf')">
+      <!-- Extract the package name -->
+      <xsl:variable name="package">
+        <xsl:call-template name="package.name">
+          <xsl:with-param name="url" select="@url"/>
+        </xsl:call-template>
+      </xsl:variable>
+      <!-- Extract the directory for that package -->
+      <xsl:variable name="cut"
+                    select="translate(substring-after($package, '-'),
+                    '0123456789', '0000000000')"/>
+      <xsl:variable name="package2">
+        <xsl:value-of select="substring-before($package, '-')"/>
+        <xsl:text>-</xsl:text>
+        <xsl:value-of select="$cut"/>
+      </xsl:variable>
+      <xsl:variable name="dirname" select="substring-before($package2, '-0')"/>
+      <!-- Write the upstream URLs, fixing the redirected ones -->
+      <xsl:choose>
+        <xsl:when test="contains(@url,'?')">
+          <xsl:value-of select="substring-before(@url,'?')"/>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="@url"/>
+        </xsl:otherwise>
+      </xsl:choose>
+      <xsl:text> </xsl:text>
+      <!-- Write FTP mirror URLs -->
+      <xsl:value-of select="$server"/>
+      <xsl:text>/pub/</xsl:text>
+      <xsl:value-of select="$family"/>
+      <xsl:text>/conglomeration/</xsl:text>
+      <xsl:choose>
+        <!-- Fix some directories. Test against $dirname to be sure that we
+        are matching the start of a package name, not a string in a patch name
+        But some packages requires test against $package. -->
+        <xsl:when test="contains($dirname, 'bash')">
+          <xsl:text>bash/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($package, 'dvhtool')">
+          <xsl:text>dvhtool/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($dirname, 'gcc')">
+          <xsl:text>gcc/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($dirname, 'glibc')">
+          <xsl:text>glibc/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($package, 'powerpc-utils')">
+          <xsl:text>powerpc-utils/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($package, 'tcl')">
+          <xsl:text>tcl/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($package, 'uClibc')">
+          <xsl:text>uClibc/</xsl:text>
+        </xsl:when>
+        <xsl:when test="contains($dirname, 'udev')">
+          <xsl:text>udev/</xsl:text>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:value-of select="$dirname"/>
+          <xsl:text>/</xsl:text>
+        </xsl:otherwise>
+      </xsl:choose>
+      <xsl:value-of select="$package"/>
+      <!-- Write MD5SUM value -->
+      <xsl:text> </xsl:text>
+      <xsl:value-of select="../..//para/literal"/>
+      <xsl:text>&#x0a;</xsl:text>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="package.name">
+    <xsl:param name="url"/>
+    <xsl:choose>
+      <xsl:when test="contains($url, '/')">
+        <xsl:call-template name="package.name">
+          <xsl:with-param name="url" select="substring-after($url, '/')"/>
+        </xsl:call-template>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:choose>
+          <xsl:when test="contains($url, '?')">
+            <xsl:value-of select="substring-before($url, '?')"/>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:value-of select="$url"/>
+          </xsl:otherwise>
+        </xsl:choose>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+</xsl:stylesheet>
diff --git a/2.3/custom/examples/950-bc b/2.3/custom/examples/950-bc
new file mode 100644
index 0000000..e70d3dc
--- /dev/null
+++ b/2.3/custom/examples/950-bc
@@ -0,0 +1,22 @@
+#
+# $Id$
+#
+PKG="bc"
+PKG_VERSION="1.06"
+PKG_FILE="bc-1.06.tar.gz"
+URL="http://ftp.gnu.org/gnu/bc/${PKG_FILE}"
+MD5="d44b5dddebd8a7a7309aea6c36fda117"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+sed -i '/PROTO.*readline/d' bc/scan.l &&
+sed -i '/flex -I8/s/8//' configure &&
+sed -i '/stdlib/a #include <string.h>' lib/number.c &&
+sed -i 's/program.*save/static &/' bc/load.c &&
+./configure --prefix=/usr --with-readline &&
+make
+make install
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/951-glib b/2.3/custom/examples/951-glib
new file mode 100644
index 0000000..ddb0985
--- /dev/null
+++ b/2.3/custom/examples/951-glib
@@ -0,0 +1,22 @@
+#
+# $Id$
+#
+PKG="glib"
+PKG_VERSION="1.2.10"
+PKG_FILE="glib-1.2.10.tar.gz"
+URL="http://gd.tuwien.ac.at/graphics/gimp/gtk/v1.2/${PKG_FILE}"
+MD5="6fe30dad87c77b91b632def29dd69ef9"
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1="http://www.linuxfromscratch.org/patches/blfs/svn/glib-1.2.10-gcc34-1.patch 0077a1cce5e8a2231ac5a9b08c6263ba"
+
+
+( cat << "xEOFx"
+patch -Np1 -i ../glib-1.2.10-gcc34-1.patch &&
+./configure --prefix=/usr &&
+make
+make install &&
+chmod -v 755 /usr/lib/libgmodule-1.2.so.0.0.10
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/952-mc b/2.3/custom/examples/952-mc
new file mode 100644
index 0000000..43af312
--- /dev/null
+++ b/2.3/custom/examples/952-mc
@@ -0,0 +1,18 @@
+#
+# $Id$
+#
+PKG="mc"
+PKG_VERSION="4.6.1"
+PKG_FILE="mc-4.6.1.tar.gz"
+URL="http://www.ibiblio.org/pub/Linux/utils/file/managers/mc/${PKG_FILE}"
+MD5="18b20db6e40480a53bac2870c56fc3c4"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+./configure --prefix=/usr &&
+make
+make install
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/960-pppd b/2.3/custom/examples/960-pppd
new file mode 100644
index 0000000..feacb91
--- /dev/null
+++ b/2.3/custom/examples/960-pppd
@@ -0,0 +1,26 @@
+#
+# $Id$
+#
+# The PPP package contains the pppd daemon and the chat program.
+# This is used for connecting to other machines; often for connecting 
+# to the Internet via a dial-up or PPPoE connection to an ISP. 
+#
+
+PKG="ppp"
+PKG_VERSION="2.4.4"
+PKG_FILE="ppp-${PKG_VERSION}.tar.gz"
+URL="http://samba.org/ftp/ppp/${PKG_FILE}"
+MD5="183800762e266132218b204dfb428d29"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+./configure --prefix=/usr &&
+make
+
+make install &&
+make install-etcppp
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/961-openssl b/2.3/custom/examples/961-openssl
new file mode 100644
index 0000000..e928c7c
--- /dev/null
+++ b/2.3/custom/examples/961-openssl
@@ -0,0 +1,35 @@
+#
+# $Id$
+#
+# The OpenSSL package contains management tools and libraries
+# relating to cryptography. These are useful for providing
+# cryptography functions to other packages, notably OpenSSH,
+# email applications and web browsers (for accessing HTTPS sites).
+#
+
+PKG="openssl"
+PKG_VERSION="0.9.8d"
+PKG_FILE="openssl-${PKG_VERSION}.tar.gz"
+URL="ftp://ftp.openssl.org/source/${PKG_FILE}"
+MD5="8ed1853538e1d05a1f5ada61ebf8bffa"
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1=" http://www.linuxfromscratch.org/patches/blfs/svn/openssl-0.9.8d-fix_manpages-1.patch"
+
+( cat << "xEOFx"
+
+sed -i -e 's/mcpu/march/' config
+patch -Np1 -i ../openssl-0.9.8d-fix_manpages-1.patch &&
+./config --openssldir=/etc/ssl --prefix=/usr shared &&
+make MANDIR=/usr/share/man
+
+make MANDIR=/usr/share/man install &&
+cp -v -r certs /etc/ssl &&
+install -v -d -m755 /usr/share/doc/openssl-0.9.8d &&
+cp -v -r doc/{HOWTO,README,*.{txt,html,gif}} \
+    /usr/share/doc/openssl-0.9.8d
+    
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/963-gpm b/2.3/custom/examples/963-gpm
new file mode 100644
index 0000000..fce2d68
--- /dev/null
+++ b/2.3/custom/examples/963-gpm
@@ -0,0 +1,43 @@
+#
+# $Id$
+#
+PKG="gpm"
+PKG_VERSION="1.20.1"
+PKG_FILE="gpm-${PKG_VERSION}.tar.bz2"
+URL="ftp://arcana.linux.it/pub/gpm/${PKG_FILE}"
+MD5="2c63e827d755527950d9d13fe3d87692"
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-segfault-1.patch"
+PATCH2=" http://www.linuxfromscratch.org/patches/blfs/svn/gpm-1.20.1-silent-1.patch"
+
+
+( cat << "xEOFx"
+
+patch -Np1 -i ../gpm-1.20.1-segfault-1.patch &&
+patch -Np1 -i ../gpm-1.20.1-silent-1.patch &&
+./configure --prefix=/usr --sysconfdir=/etc &&
+LDFLAGS="-lm" make
+
+make install &&
+cp -v conf/gpm-root.conf /etc &&
+ldconfig
+
+# The normal cmd to install the boot script for gpm
+# --- PUT THIS CMD INSIDE 999-blfs_bootscripts
+#make install-gpm
+
+cat > /etc/sysconfig/mouse << "EOF"
+# Begin /etc/sysconfig/mouse
+
+MDEVICE="/dev/psaux"
+PROTOCOL="imps2"
+GPMOPTS=""
+
+# End /etc/sysconfig/mouse
+EOF
+
+xEOFx
+) > tmp
+
diff --git a/2.3/custom/examples/963-lynx b/2.3/custom/examples/963-lynx
new file mode 100644
index 0000000..45ac0da
--- /dev/null
+++ b/2.3/custom/examples/963-lynx
@@ -0,0 +1,32 @@
+#
+# $Id$
+#
+# Lynx is a text based web browser.
+#
+
+PKG="lynx"
+PKG_VERSION="2.8.6"
+PKG_FILE="lynx${PKG_VERSION}.tar.bz2"
+URL="ftp://lynx.isc.org/lynx2.8.6/${PKG_FILE}"
+MD5="dc80497b7dda6a28fd80404684d27548"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+
+./configure --prefix=/usr \
+            --sysconfdir=/etc/lynx \
+            --datadir=/usr/share/doc/lynx-2.8.6 \
+            --with-zlib \
+            --with-bzlib \
+            --with-screen=ncursesw \
+            --enable-locale-charset &&
+
+make
+
+make install-full &&
+chgrp -v -R root /usr/share/doc/lynx-2.8.6/lynx_doc
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/964-hdcpcd b/2.3/custom/examples/964-hdcpcd
new file mode 100644
index 0000000..9f07569
--- /dev/null
+++ b/2.3/custom/examples/964-hdcpcd
@@ -0,0 +1,27 @@
+#
+# $Id$
+#
+# dhcpcd is an implementation of the DHCP client specified in RFC2131.
+# This is useful for connecting your computer to a network which uses
+# DHCP to assign network addresses.
+#
+
+PKG="dhcpcd"
+PKG_VERSION="2.0.8"
+PKG_FILE="dhcpcd-${PKG_VERSION}.tar.bz2"
+URL="ftp://ftp.osuosl.org/pub/gentoo/distfiles/${PKG_FILE}"
+MD5="ec91c33b6d9cb46a42f9564e573fd249"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+
+./configure --prefix="" --mandir=/usr/share/man &&
+make
+
+make install &&
+chmod -v 754 /etc/dhcpc/dhcpcd.exe
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/965-eject b/2.3/custom/examples/965-eject
new file mode 100644
index 0000000..686fe59
--- /dev/null
+++ b/2.3/custom/examples/965-eject
@@ -0,0 +1,25 @@
+#
+# $Id$
+#
+#  Program for ejecting removable media under software control.
+#  Can also control the auto-eject feature of some drives and
+#  can be used to switch CDs on an IDE/ATAPI CD changer. 
+#
+
+PKG="eject"
+PKG_VERSION="2.10"
+PKG_FILE="eject-${PKG_VERSION}.tar.gz"
+URL="ftp://sunsite.unc.edu/pub/Linux/utils/disk-management/${PKG_FILE}"
+MD5="82e3a7a4d7e3323018c6938015ff25f7"
+PATCH1=""
+
+( cat << "xEOFx"
+
+./configure --prefix=/usr \
+            --enable-default-device=/dev/cdrom \
+            --disable-nls
+make
+make install
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/997-nasm b/2.3/custom/examples/997-nasm
new file mode 100644
index 0000000..ebeee4c
--- /dev/null
+++ b/2.3/custom/examples/997-nasm
@@ -0,0 +1,33 @@
+#
+# $Id:$
+# NASM (Netwide Assembler) is an 80x86 assembler designed
+# for portability and modularity. It includes a
+# disassembler as well.
+
+PKG="nasm"
+PKG_VERSION="0.98.39"
+PKG_FILE="nasm-${PKG_VERSION}.tar.bz2"
+URL="http://downloads.sourceforge.net/nasm/${PKG_FILE}"
+MD5="2032ad44c7359f7a9a166a40a633e772"
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1="http://www.linuxfromscratch.org/patches/blfs/svn/nasm-0.98.39-security_fix-1.patch"
+
+( cat << "xEOFx"
+
+patch -Np1 -i ../nasm-0.98.39-security_fix-1.patch &&
+./configure --prefix=/usr &&
+make
+make -C rdoff/doc
+make -C rdoff/doc html
+
+make install &&
+make install_rdf &&
+install -v -m644 rdoff/doc/rdoff.info /usr/share/info &&
+install -v -m755 -d /usr/share/doc/nasm/html &&
+install -v -m644 rdoff/doc/v1-v2.txt /usr/share/doc/nasm &&
+cp -v -R rdoff/doc/rdoff /usr/share/doc/nasm/html
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/998-syslinux b/2.3/custom/examples/998-syslinux
new file mode 100644
index 0000000..59d5f12
--- /dev/null
+++ b/2.3/custom/examples/998-syslinux
@@ -0,0 +1,35 @@
+#
+# $Id$
+#
+# SYSLINUX is a collection of boot loaders for the Linux
+# operating system which operates off Linux ext2/3
+# filesystems, MS-DOS FAT filesystems, network servers
+# using PXE firmware, or from CD-ROMs.  The FAT
+# filesystem version can be installed from DOS, NT, or
+# Linux.
+# 
+# It includes a sophisticated API for add-on "COM32"
+# modules, including a significant subset of the
+# standard C library.
+# 
+# It also includes MEMDISK, a tool to boot legacy
+# operating systems from nontraditional media like PXE
+# or CD-ROM.
+#
+
+PKG="syslinux"
+PKG_VERSION="3.36"
+PKG_FILE="syslinux-$PKG_VERSION}.tar.bz2"
+URL="http://www.kernel.org/pub/linux/utils/boot/syslinux/${PKG_FILE}"
+MD5="d1bfdaa53d31f572f540be55d1480027"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+
+make
+make install
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples/999-blfs_bootscripts b/2.3/custom/examples/999-blfs_bootscripts
new file mode 100644
index 0000000..0494477
--- /dev/null
+++ b/2.3/custom/examples/999-blfs_bootscripts
@@ -0,0 +1,22 @@
+#
+# $Id$
+#
+PKG="blfs-bootscripts"
+PKG_VERSION="20060910"
+PKG_FILE="blfs-bootscripts-${PKG_VERSION}.tar.bz2"
+URL="http://www.linuxfromscratch.org/blfs/downloads/svn/${PKG_FILE}"
+MD5="e1715c58dc694bf474c4468e6bade3ad"
+for i in PATCH{1..10}; do
+   unset $i
+done
+
+( cat << "xEOFx"
+
+#
+# Insert ALL the blfs bootscripts you want to install
+# EXAMPLE
+#
+make install-gpm
+make install-service-dhcpcd
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples_CLFS-E/950-dropbear b/2.3/custom/examples_CLFS-E/950-dropbear
new file mode 100644
index 0000000..bd98ae0
--- /dev/null
+++ b/2.3/custom/examples_CLFS-E/950-dropbear
@@ -0,0 +1,49 @@
+#
+# $Id$
+#
+# Code taken from CLFS-Embedded
+# Chapter 12 Beyond CLFS Embedded
+#
+# Dropbear is a relatively small SSH 2 server and client.
+# Dropbear has a small memory footprint suitable for memory-constrained
+# environments, while still having the same features as OpenSSH. It
+# does not depend on OpenSSL and it has a MIT style license. Optionally
+# it can even be made smaller.
+#
+
+PKG="DROPBEAR"
+PKG_VERSION="0.48.1"
+PKG_FILE="${PKG}-${PKG_VERSION}.tar.gz"
+URL="http://matt.ucc.asn.au/dropbear/releases/${PKG_FILE}"
+MD5="ca8e53a766faec831882831364568421"
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1="http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-embedded/patches/dropbear-0.48.1-autotool-1.patch"
+
+( cat << "xEOFx"
+
+patch -Np1 -i ../dropbear-0.48.1-autotool-1.patch
+
+cp Makefile.in{,.orig}
+sed -e s/@LD@/@CC@/ Makefile.in.orig > Makefile.in
+
+CC="${CC} ${BUILD}" ./configure --prefix=/usr --host=${CLFS_TARGET}
+
+cp -v options.h options.h.backup
+sed -e "s@/dev/random@/dev/urandom@" options.h.backup > options.h
+
+make MULTI=1 PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
+
+make MULTI=1 PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install DESTDIR=${CLFS}
+ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/sbin/dropbear
+ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/dbclient
+ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/dropbearkey
+ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/dropbearconvert
+ln -svf ../../usr/bin/dropbearmulti ${CLFS}/usr/bin/scp
+
+install -dv ${CLFS}/etc/ssh
+
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/examples_CLFS-E/960-iptables b/2.3/custom/examples_CLFS-E/960-iptables
new file mode 100644
index 0000000..17c2627
--- /dev/null
+++ b/2.3/custom/examples_CLFS-E/960-iptables
@@ -0,0 +1,42 @@
+#
+# $Id:$
+#
+# Code taken from CLFS-Embedded
+# Chapter 12 Beyond CLFS Embedded
+#
+# iptables is the userspace command line program 
+# used to configure the Linux firewall.
+#
+
+PKG="iptables"
+PKG_VERSION="1.3.7"
+PKG_FILE="${PKG}-${PKG_VERSION}.tar.bz2"
+URL=" http://www.netfilter.org/projects/iptables/files/iptables-1.3.7.tar.bz2"
+MD5="077e886a9c90a11bb47f3d7a4fc4a689"
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1="http://svn.cross-lfs.org/svn/repos/cross-lfs/branches/clfs-embedded/patches/iptables-1.3.7-do_multi-1.patch"
+
+( cat << "xEOFx"
+
+patch -Np1 -i ../iptables-1.3.7-do_multi-1.patch
+
+make CC="${CC} ${BUILD}" \
+     COPT_FLAGS="-Os" \
+     LD=${LD} DO_MULTI=1 \
+     PREFIX=/usr \
+     KERNEL_DIR=${CLFS}/lib/modules/2.6.19.2/build \
+     LIBDIR=/lib \
+     BINDIR=/sbin
+
+make CC="${CC} ${BUILD}" \
+     COPT_FLAGS="-Os" \
+     LD=${LD} DO_MULTI=1 \
+     PREFIX=/usr \
+     KERNEL_DIR=${CLFS}/lib/modules/2.6.19.2/build \
+     LIBDIR=/lib BINDIR=/sbin \
+     DESTDIR=${CLFS} install
+
+xEOFx
+) > tmp
diff --git a/2.3/custom/template b/2.3/custom/template
new file mode 100644
index 0000000..f55201e
--- /dev/null
+++ b/2.3/custom/template
@@ -0,0 +1,20 @@
+#
+# $Id$
+#
+# Any comments you wish to add
+#
+
+PKG=""
+PKG_VERSION=""
+PKG_FILE=""
+URL=""
+MD5=""
+for i in PATCH{1..10}; do
+   unset $i
+done
+PATCH1=""
+
+( cat << "xEOFx"
+
+xEOFx
+) > tmp
diff --git a/2.3/extras/do_copy_files b/2.3/extras/do_copy_files
new file mode 100755
index 0000000..a176d7b
--- /dev/null
+++ b/2.3/extras/do_copy_files
@@ -0,0 +1,36 @@
+#!/bin/bash
+# $Id$
+set -e
+
+: <<inline_doc
+    desc:       Copy files from one dir to another dir using tar
+    usage:      do_copy_files $PRUNEPATH $ROOT_DIR $DEST_DIR
+    input vars: $1 list of dirs that must be skipped by tar
+                $2 the root dir of the files that will be copied
+                $3 the dir where the copied files will be placed
+    externals:  --
+    modifies:   --
+    returns:    --
+    on error:
+    on success:
+inline_doc
+
+TMP_FILE=/tmp/prunelist
+
+echo -en "\nCopying system files to $3 ..."
+
+# Create a file that we can pass to tar as an "exclude list".
+# There might be an easier way to achieve tar exclusions? Strip
+# the leading /.
+for F in $1 ; do
+  echo .${F} >> $TMP_FILE
+done
+
+mkdir -p $3
+cd $2
+tar -X $TMP_FILE -cf - . | tar -C $3 -xf -
+
+# Clear out the temporary file
+rm -f ${TMP_FILE}
+
+echo "done."
diff --git a/2.3/extras/do_ica_prep b/2.3/extras/do_ica_prep
new file mode 100755
index 0000000..1bbfaba
--- /dev/null
+++ b/2.3/extras/do_ica_prep
@@ -0,0 +1,77 @@
+#!/bin/bash
+# $Id$
+
+# Acknowledgment:
+#  The following code is a modified version of an original work written by
+#  Greg Schafer for the "DIY Linux" project and is included here with his
+#  permission.
+#  ref: http://www.diy-linux.org
+#
+
+set -e
+
+: <<inline_doc
+    desc:       prepare current iteration files for ICA report
+    usage:      do_ica_prep $DEST_ICA/$ITERATION
+    input vars: $1 directory where files from current iteration are stored
+    externals:  --
+    modifies:   --
+    returns:    --
+    on error:
+    on success:
+inline_doc
+
+CMP_DIR=$1
+
+# Run ica_prep if it hasn't been done already
+if [ ! -f "$CMP_DIR/icaprep" ]; then
+
+  echo -en "\nRemoving symbolic links in ${CMP_DIR}... "
+  find $CMP_DIR -type l | xargs rm -f
+  echo "done."
+
+  echo -n "Gunzipping \".gz\" files in ${CMP_DIR}... "
+  find $CMP_DIR -name '*.gz' | xargs gunzip
+  echo "done."
+
+  #echo -n "Bunzipping \".bz2\" files in ${CMP_DIR}... "
+  #find $CMP_DIR -name '*.bz2' | xargs bunzip2
+  #echo "done."
+
+  # ar archives contain date & time stamp info that causes us
+  # grief when trying to find differences. Here we perform some
+  # hackery to allow easy diffing. Essentially, replace each
+  # archive with a dir of the same name and extract the object
+  # files from the archive into this dir. Despite their names,
+  # libieee.a & libmcheck.a are not actual ar archives.
+  echo -n "Extracting object files from \".a\" files in ${CMP_DIR}... "
+  L=$(find $CMP_DIR -name '*.a' ! -name 'libieee.a' ! -name 'libmcheck.a')
+  for F in $L; do
+    mv $F ${F}.XX
+    mkdir $F
+    cd $F
+    BN=${F##*/}
+    ar x ../${BN}.XX || {
+    echo -e "\nError: ar archive extraction failed!\n" >&2
+    exit 1
+    }
+    rm -f ../${BN}.XX
+  done
+  echo "done."
+
+  echo -n "Stripping (debug) symbols from \".o\" files in ${CMP_DIR}... "
+  find $CMP_DIR -name '*.o' | xargs strip -p -g 2>/dev/null
+  echo "done."
+
+  echo -n "Stripping (all) symbols from files OTHER THAN \".o\" files in ${CMP_DIR}... "
+  find $CMP_DIR ! -name '*.o' | xargs strip -p 2>/dev/null || :
+  echo "done."
+
+  # We're all done
+  echo -en "\nSuccess: ICA preparation for "
+  echo -e "${CMP_DIR} complete."
+  touch $CMP_DIR/icaprep
+else
+  echo -e "\n$CMP_DIR was already processed\n"
+fi
+
diff --git a/2.3/extras/do_ica_work b/2.3/extras/do_ica_work
new file mode 100755
index 0000000..fde1fd1
--- /dev/null
+++ b/2.3/extras/do_ica_work
@@ -0,0 +1,55 @@
+#!/bin/bash
+# $Id$
+
+# Acknowledgment:
+#  The following code is a modified version of an original work written by
+#  Greg Schafer for the "DIY Linux" project and is included here with his
+#  permission.
+#  ref: http://www.diy-linux.org
+#
+
+set -e
+
+: <<inline_doc
+    desc:       creates the ICA report
+    usage:      do_ica_work $PREV $ITERATION $ICALOGDIR $DEST_ICA
+    input vars: $1 previous iteration
+                $2 current iteration
+                $3 ICA log dir
+                $4 directory where ICA iterations are stored
+    externals:  --
+    modifies:   --
+    returns:    --
+    on error:
+    on success:
+inline_doc
+
+RAWDIFF=/tmp/rawdiff.$$
+REPORT="${3}/REPORT.${1}V${2}"
+
+echo -en "\nGenerating ICA analysis report $1 versus $2 ..."
+
+mkdir -p $3
+
+cd $4
+
+echo -e "Diffing ${1} and ${2}... " > $REPORT
+diff -ur ${1} ${2} > $RAWDIFF || :
+
+echo -e "The list of binary files that differ:\n" > $REPORT
+grep "iles.*differ$" $RAWDIFF >> $REPORT
+
+echo -e "The list of files that exist \"only in\" 1 of the directories:\n" >> $REPORT
+
+if grep "^Only in" $RAWDIFF >/dev/null 2>&1; then
+  grep "^Only in" $RAWDIFF >> $REPORT
+else
+  echo NONE >> $REPORT
+fi
+
+grep -v "iles.*differ$" $RAWDIFF | \
+grep -v "^Only in" > ${3}/${1}V${2}.ASCII.DIFF
+
+rm -f $RAWDIFF
+
+echo "done."
diff --git a/2.3/extras/farce b/2.3/extras/farce
new file mode 100755
index 0000000..776aed4
--- /dev/null
+++ b/2.3/extras/farce
@@ -0,0 +1,896 @@
+#!/bin/bash
+
+# Acknowledgment:
+#  The following code is a no-modified version (except for this comment
+#  and the inline_doc fragment) of an original work written by
+#  Ken Moffat and is included here with his permission.
+#
+
+# FARCE: Farce Assists Rebuild Comparison Evaluation ;)
+#
+# to answer the question "can it rebuild itself?"
+#
+#  We expect four arguments - first directory path, filelist
+# containing the files in this directory which we wish to compare,
+# second directory path, filelist for second directory.
+#
+# Yes, we could just compare everything in each tree, but the
+# filelist script knows about files it can reasonably ignore,
+# and this also allows us to build a sytem, boot it and get a
+# list of files, build a full desktop environment, and only then
+# build and boot the "can it build itself" test system and get
+# _its_ filelist.
+#
+# What this script aims to do:
+# ____________________________
+#
+# First, report files not in both builds.
+#
+# Then, confirm symlinks point to same targets.
+#
+# After that, compare individual files -
+#  if different, run the file name through 'expected'
+# to pick out files that are unlikely to match (logs,
+# pids, fstab [assumes '/' is a different device each time],
+# count these as 'expected'.
+#
+# For whatever is left, check the file type - ar archives
+# have their members extraced and compared (every member has
+# a timestamp), gzipped files are compared beyond their
+# timestamp, binaries, at least those using shared libs or
+# which are shared objects, are copied and subjected to
+# --strip-debug.  If files match at this stage, count them as
+# 'accepted'.
+#
+# As a last step for any file that doesn't match, copy it
+# through some perl regexps to "process" it (convert any
+# date, time, kernel-version information from standard formats
+# into tokens, then see if the tokensi match.
+#
+# For details of the regexps, see the tokenize function.
+# Those files that match after this are also counted as
+# 'accepted'.  Note that I don't always start from the kernel
+# version that I'm going to build, so this copes with e.g. perl
+# files that hardcode the kernel version.
+#
+# We now have files that don't match.  A few of these seem to be
+# common to all builds - some (members of) c++ libraries or ar
+# archives, a few programs which perhaps use some sort of c++ code).
+# The file name # is passed to the 'failure' function - these
+# recognized filenames are labelled as 'predictable FAIL:',
+# anything else is labelled as 'unexpected FAIL:'.
+#
+# output:
+# stderr - files only in one of the builds, failure messages,
+#  and totals.
+#
+# farce-results - more details, including which files were treated
+# as expected differences, files where neither copy could be read,
+# files treated as accepted, with the reason (and member for ar
+# archives).  This data is typically up to 100 characters wide -
+# sometimes it's a bit more, but it doesn't wrap too badly in a
+# 100 character xterm.
+#
+# farce-extras - diffs for the files, or members, that didn't
+# match.  This file is to establish new regexps for picking up
+# date/time/kernel-version formats.
+#
+# farce-identical - the names of the files which are identical
+#
+# farce-substitutions - whenever using tokenizeanddiff results in a
+# difference being accepted, for both versions diff the before and
+# after versions to show what got changed.  If the file is a binary,
+# the output may still be hard to read.  Note that I _know_ glibc
+# version strings pass one of the regexps looking for a kernel version
+# - since I expect you to use the same version of glibc for each
+# build, this is not a problem.
+#
+# farce-differ - the names of the files which could not be treated
+# as matching (whether or not I regard the failure as predictable)
+# for possible input to ICA processing.
+#
+# Copyright (C) 2005, 2006 Ken Moffat <ken@linuxfromscratch.org>
+#
+# All rights reserved.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or (at
+# your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+# NON INFRINGEMENT.  See the GNU General Public License for more
+# details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+
+: <<inline_doc
+    desc:       do farce analisys and report
+    usage:      farce -directory $FARCELOGDIR/dir path1 list1 path2 list2
+    input vars: $1 farce log dir for this comparation
+                $2 full path to previous iteration
+                $3 full path to filelist for previos iteration
+                $4 full path to current iteration
+                $5 full path to filelist for current iteration
+    externals:  --
+    modifies:   --
+    returns:    --
+    on error:
+    on success:
+inline_doc
+
+
+VERSION="002"
+
+# variables for output files
+RESULT=farce-results
+EXTRAS=farce-extras
+IDENTICAL=farce-identical
+SUBS=farce-substitutions
+DIFFER=farce-differ
+
+# documenting the variables
+# C1, C2	temp files to hold disassembled code
+# D1, D2	temp directories for extracting member of ar archive
+# DIFF		temp file for diffing the filelists
+# F1, F2	temp files for tokenizeanddiff
+# FTYPE		obsolete, commented out
+# M1, M2	temp files to hold members of an ar archive
+# MEMBERS	temp file to list members of ar archive
+# OP1, OP2	the original $PWD, needed when extracting members of ar
+#		archives
+# P1, P2	paths to first and second build
+# S1, S2	temp files for shared objects
+
+# functions
+function dohelp() {
+	echo "`basename $0`: compare trees of files from a build"
+	echo "and lists of the files they contained"
+	echo ""
+	echo "`basename $0` [ -help | -version ] || path1 list1 path2 list2"
+}
+
+function emessage() {
+	# write a string to both stderr and $RESULT
+	echo "$@" >&2
+	echo "$@" >&5
+}
+
+function expected() {
+	# if we expect it to differ because of its name,
+	# allow it and report, return true ; else return false
+	case $1 in
+	/boot/grub/menu.lst)
+		# just in case somebody puts this into the main filesystem
+		true;;
+	/etc/aliases.db)
+		# some sort of database for postfix, not parsable
+		true;;
+	/etc/blkid.tab)
+		# includes dev name for rootfs
+		true;;
+	/etc/fstab)
+		# fstab, e.g. ' / ' will differ
+		true;;
+	/etc/group*)
+		true;;
+	/etc/hosts)
+		# with dhcp client, I add current ip address to this in a hook
+		true;;
+	/etc/ld.so.*)
+		# .conf and .cache can vary,
+		# particularly if one system has a full build when I run this
+		true;;
+	/etc/lilo.conf|/etc/yaboot.conf)
+		# bootloader control, I assume grub will all be on a separate
+		true;;
+	/etc/mtab)
+		# at a minimum, different '/'
+		true;;
+	/etc/ntp.drift)
+		true;;
+	/etc/passwd*)
+		true;;
+	/etc/shadow*)
+		true;;
+	/etc/ssh/*key|/etc/ssh/*pub)
+		# openssh keys
+		true;;
+	/misc/*)
+		# where I put buildscripts (which mostly won't change)
+		# and stamps containing name/time/space which will differ in the times
+		true;;
+	/root/*)
+		# expect .bash_history etc to differ - if we can read them
+		true;;
+	/usr/bin/lynx)
+		# part of my inital builds, I guess this uses anonymous namespaces
+		true;;
+	/usr/include/c++/*/*/bits/stdc++.h.gch/*)
+		# precompiled headers
+		true;;
+	/usr/lib*/libstdc++.a|/usr/lib*/libstdc++.so*|/usr/lib*/libsupc++.a)
+		# probably, anonymous namespaces
+		# libstdc++.a, libstdc++.so.n.n.n, libsupc++.a
+		true;;
+	/usr/share/info/dir)
+		# if one system has had extra stuff built, this will likely be bigger
+		true;;
+	/usr/share/man/whatis)
+		# if one system has had extra stuff built, this will likely be bigger
+		true;;
+	/var/lib/locate/locatedb)
+		# if one system has had extra stuff built, this will likely be bigger
+		true;;
+	/var/lib/nfs/*)
+		# allow nfs bookkeeping
+		true;;
+	/var/log/*)
+		true;;
+	/var/run/utmp)
+		true;;
+	/var/spool/fcron*)
+		true;;
+	/var/state/*)
+		# allow dhcp leases
+		true;;
+	/var/tmp/random-seed)
+		true;;
+	# following start with wildcards
+	*Image*|*.PPCBoot*|*vmlinuz*|*lfskernel*)
+		# compressed kernels, sometimes just building at a different
+		# date/time is enough to change the length of them, because the
+		# long format date and time is part of the compressed data
+		true;;
+	*pid*)
+		# pids, including e.g. /var/spool/postfix/pid/*
+		true;;
+	*)
+		# nothing else is expected to be different
+		false;;
+	esac
+	if [ $? -eq 0 ]; then
+		message "expected difference in $1"
+		let expected=$expected+1
+		case $TYPE in
+			AR)
+				let EXPAR=$EXPAR+1
+				;;
+			ELF)
+				let EXPELF=$EXPELF+1
+				;;
+			UNK)
+				let EXPUNK=$EXPUNK+1
+				;;
+			# so far, no other valid types, so don't accumulate them
+			*)
+				emessage "internal error, expected difference for $1 of type $TYPE not allowed"
+				exit 2
+				;;
+		esac
+		true
+	else
+		false
+	fi
+}
+
+function failure() {
+	# first parm is filename or token
+	# second parm is the error message
+	# update the appropriate total
+	# and write to both stderr and the results
+	# by using emessage
+
+	let different=$different+1
+	case $TYPE in
+		AR)
+			let DIFAR=$DIFAR+1
+			;;
+		ELF)
+			let DIFELF=$DIFELF+1
+			;;
+		GZ)
+			let DIFGZ=$DIFGZ+1
+			;;
+		SYM)
+			let DIFSYM=$DIFSYM+1
+			;;
+		UNK)
+			let DIFUNK=$DIFUNK+1
+			;;
+		*)
+			emessage "internal error in failure() for TYPE $TYPE"
+			exit 2
+			;;
+		esac
+		test -f ${P1}$1 && echo $1 >&9
+		emessage "FAIL: $2"
+}
+
+function fatal() {
+	# unrecoverable error
+	echo $*
+	exit 1
+}
+
+function filetype() {
+	TYPE=`file ${P1}${FILE}`
+	case $TYPE in
+	*'current ar archive'*)
+		let TOTAR=$TOTAR+1
+		TYPE=AR
+		;;
+	*' ELF '*)
+		let TOTELF=$TOTELF+1
+		TYPE=ELF
+		;;
+	*'gzip compressed data'*)
+		let TOTGZ=$TOTGZ+1
+		TYPE=GZ
+		;;
+	*)
+		let TOTUNK=$TOTUNK+1
+		TYPE=UNK
+		;;
+	esac
+}
+
+function message() {
+	# write a string to $RESULT
+	echo $* >&5
+}
+
+function onlyone() {
+	#report files only in one build
+	# text should go to both stderr and the results,
+	# but blank lines only go to the results
+	if [ $1 == '<' ]; then
+		emessage "File(s) only in the first build"
+	else
+		emessage "File(s) only in the second build"
+	fi
+	message ""
+	FILES=`cat $DIFF | grep "^$1" | cut -d ' ' -f 2`
+	for F in $FILES; do
+		emessage $F
+		let only=$only+1
+	done
+	message ""
+}
+
+# 'test' functions are called with three arguments:
+# the two pathes and the filename
+# - we know the file is of this type, so see if we
+# can get it to match by reasonalbe means.
+# if not, treat it as different.
+#
+# NB if pathes are absolute, we need to prefix them
+# with the original $PWD to access the .a files
+#
+function testar() {
+	# ar archives include timestamps for the members,
+	# but diff doesn't show file timestamps unless the data differs
+	# put out a message to help locate which archive any messages
+	# about the members refer to.
+
+	# try just stripping them U1,2 undebuggable
+	U1=`mktemp` || fatal "cannot create a temporary file"
+	U2=`mktemp` || fatal "cannot create a temporary file"
+	cp ${1}${3} $U1
+	cp ${2}${3} $U2
+	strip --strip-debug $U1
+	strip --strip-debug $U2
+	cmp -s $U1 $U2
+	rm $U1 $U2
+	if [ $? -eq 0 ]; then
+		let accepted=$accepted+1
+		let ACCAR=$ACCAR+1
+		message "archive $3 matches after strip --strip-debug"
+		return
+	fi
+	# rest of this function retained primarily for pathologically bad builds
+	# put out a message in the log to help identify which archive has issues.
+	message "examining ar archive $3"
+	D1=`mktemp -d` || fatal "cannot create a temporary directory"
+	D2=`mktemp -d` || fatal "cannot create a temporary directory"
+	cd $D1
+	ar -x ${OP1}${1}${3}
+	cd $D2
+	ar -x ${OP2}${2}${3}
+	cd
+	# diff the members - true means they match
+	diff -Na $D1 $D2 >/dev/null
+	if [ $? -eq 0 ]; then
+		message "accept: $3 after diffing the members"
+		let accepted=$accepted+1
+		let ACCAR=$ACCAR+1
+	else
+		# process individual members to eliminate date/time/kernel-version
+		# first, check the members are the same
+		M1=`mktemp` || fatal "cannot create a temporary file"
+		M2=`mktemp` || fatal "cannot create a temporary file"
+		cd $D1
+		MEMBERS=
+		for F in *; do
+			MEMBERS="$MEMBERS $F"
+		done
+		cd
+		echo $MEMBERS | sort >$M1
+		cd $D2
+		MEMBERS=
+		for F in *; do
+			MEMBERS="$MEMBERS $F"
+		done
+		cd
+		echo $MEMBERS | sort >$M2
+		cmp -s $M1 $M2
+		if [ $? -ne 0 ]; then
+			# oh dear, different members
+			echo "list of members differs for archive $3" >&6
+			diff $M1 $M2 >&6
+			failure $3 "$3 list of members differs"
+		else
+			# members (names) are same,
+			# process each one
+			STATUS=0
+			for M in $MEMBERS; do
+				#avoid firing up perl on matching members
+				cmp -s $D1/$M $D2/$M
+				if [ $? -ne 0 ]; then
+					tokenizeanddiff $D1/$M $D2/$M $FILE:$M
+					if [ $? -eq 0 ]; then
+						message "member $M matches after processing"
+					else
+						message "member $M DIFFERS after processing"
+						STATUS=1
+					fi
+				fi
+			done
+			if [ $STATUS -eq 0 ]; then
+				let accepted=$accepted+1
+				let ACCAR=$ACCAR+1
+			else
+				let different=$different+1
+				let DIFAR=$DIFAR+1
+				echo $3 >&9
+				emessage "FAIL: in $3"
+			fi
+		fi
+		rm $M1 $M2
+	fi
+	rm -rf $D1 $D2
+}
+
+function testgzip() {
+	# bytes 4,5,6,7 are the timestamp, so ignore these
+	cmp -s -i 8 ${1}${3} ${2}${3}
+	if [ $? -eq 0 ]; then
+		message "accept: $3 after ignoring gzip timestamp"
+		let accepted=$accepted+1
+		let ACCGZ=$ACCGZ+1
+	else
+		failure $3 " $3 even after ignoring gzip timestamp"
+	fi
+}
+
+function testso() {
+	# shared object - first try stripping it
+	# in fact, this now handles ALL ELF files
+	S1=`mktemp` || fatal "cannot create a temporary file"
+	S2=`mktemp` || fatal "cannot create a temporary file"
+	cp ${1}${3} $S1
+	strip --strip-debug $S1
+	cp ${2}${3} $S2
+	strip --strip-debug $S2
+	cmp -s $S1 $S2
+	if [ $? -eq 0 ]; then
+		message "accept: $3 after --strip-debug"
+		let accepted=$accepted+1
+		let ACCELF=$ACCELF+1
+	else
+		tokenizeanddiff $S1 $S2 $3
+		if [ $? -ne 0 ]; then
+			failure $3 " $3 differs after stripping and processing"
+		else
+			message "accept: $3 after --strip-debug and processing"
+			let accepted=$accepted+1
+			let ACCELF=$ACCELF+1
+		fi
+	fi
+	rm $S1 $S2
+}
+
+function tokenize() {
+	# use regexes to replace date/time/kernel-version text
+	# with tokens which may allow files to match even though
+	# they have hardcoded date/time/kernel-version.
+	# arguments are file to process, and where to put it.
+	# these regexes are somewhat long, and the order they
+	# are applied in is important (to stop short ones being
+	# used when a longer version would match).
+	# KV00 linux version date (e.g. as in the kernel itself)
+	# allow 2 or 3 groups of three alphas here - optional smp,  with day, mon
+	# KV01 kernel version, including possible cpu details (that is for cdda2wav)
+	# KV02 just the version, in quotes e.g. "2.6.12.6" or '2.6.13', for perl stuff
+	# except that "|' gives me grif, so try a boundary
+	# also, it might need local version on the end, I really want
+	# quote2.\d+.\d+.{0,32}quote - it is the quotes that don't work.
+	# DT00 Day Mon .d+ hh:mm:ss TZN CCYY variations include non-caps and 'mon d'
+	# DT01 Mon .d+ CCYY hh:mm:ss
+	# DT02 hh:mm:ss Mon .d CCYY
+	# DT03 Mon .d CCYY
+	# DT04 Day Mon { ,d}d hh:mm:ss CCYY - for groff example postscript files
+	# (somewhat similar to DT00, but '  d' or ' dd' for day of month and no TZN )
+	# DT05 hh:mm:ss
+	# DT06 ISO date using space as separator
+	# DT07 ISO date using dash as separator
+	# DT08 ISO date using slash as separator
+	# DT09 fullmonth (capitalised), day number, comma, 4-digit year (groff 1.18.1 ps)
+	# DT10 dd, fullmonth (capitalised), 4-digit year (groff 1.18.1 manpages)
+	# DT11 '(xample comma space digit(s) backslash ) in groff memef.ps which is
+	# quite clearly the day of the month when it was compiled, preceded by 'example'
+	# with something weird between the e and the x.
+
+	if [ $# -ne 2 ]; then
+		fatal "tokenizing called with $# arguments : $*"
+	fi
+
+	cat $1 | perl -p \
+	 -e 's/(L|l)inux.*\d\.\d\.\d+.* \#\d+( [A-Za-z][a-z]{2}){2,3} \d+ \d\d:\d\d:\d\d [A-Za-z]{3} \d{4}\b/%KV00%/g;' \
+	 -e 's/(L|l)inux( (\w|_)+)?(-| |_)\d\.\d(\.\d+){1,2}((-|_)?(\w|_)+)?( |\000)*/%KV01%/g;' \
+	 -e 's/\W2(\.\d+){2,3}(-|_)?((\w|_)+)?\s*\W/%KV02%/g;' \
+	 -e 's/\b([A-Za-z][a-z]{2} ){2}( |\d)?\d \d\d:\d\d:\d\d [A-Za-z]{3} \d{4}\b/%DT00%/g;' \
+	 -e 's/\b[A-Z][a-z]{2} ( |\d)\d \d{4} \d\d:\d\d:\d\d\b/%DT01%/g;' \
+	 -e 's/\b\d\d:\d\d:\d\d [A-Z][a-z]{2} ( |\d)\d \d{4}\b/%DT02%/g;' \
+	 -e 's/\b[A-Z][a-z]{2} ( |\d)\d \d{4}\b/%DT03%/g;' \
+	 -e 's/\b([A-Z][a-z]{2} ){2}( |\d)\d \d\d:\d\d:\d\d \d{4}/%DT04%/g;' \
+	 -e 's/\b\d\d:\d\d:\d\d\b/%DT05%/g;' \
+	 -e 's/\b\d{4} \d\d \d\d\b/%DT06%/g;' \
+	 -e 's/\b\d{4}-\d\d-\d\d\b/%DT07%/g;' \
+	 -e 's/\b\d{4}\/\d\d\/\d\d\b/%DT08%/g;' \
+	 -e 's/\b[A-Z][a-z]{2,} \d{1,2}, \d{4}/%DT09%/g;' \
+	 -e 's/\b\d\d [A-Z][a-z]{2,} \d{4}/%DT10%/g;' \
+	 -e 's/\(xample, \d{1,2}\\\)/%DT11%/g;' \
+	>$2
+}
+
+function tokenizeanddiff() {
+	# Call tokenize for the inputs, then compare the results
+	# Input arguments are path/filename for old and new versions
+	# third parm is readable name (filename, or archivename:member)
+	# to help understand what is in the extras output.
+	#  - sometimes called for files, but other times called for
+	# members of ar archives extracted into temporary directories
+	#message tokenizeanddiff called for $1 $2 $3
+	F1=`mktemp` || fatal "cannot create a temporary file"
+	F2=`mktemp` || fatal "cannot create a temporary file"
+	tokenize $1 $F1
+	tokenize $2 $F2
+
+	# actually, cmp is probably more efficient
+	# but for picking up the pieces it will be better to
+	# use diff to see what got through.
+	cmp -s $F1 $F2
+	TOKENRESULT=$?
+	if [ $TOKENRESULT -ne 0 ]; then
+		echo "failure in $3..." >&6
+		diff -a $F1 $F2 >&6
+		rm $F1 $F2
+		false
+	else
+		# show what we did
+		echo "substitutions for $3" >&8
+		echo "build one" >&8
+		diff -a $1 $F1 >&8
+		echo "build two" >&8
+		diff -a $2 $F2 >&8
+		rm $F1 $F2
+		true
+	fi
+}
+
+function validateargs() {
+# validate the arguments
+BAD=0
+if ! [ -d $1 ]; then
+	echo "Error: first argument is not a directory" >&2
+	let BAD=$BAD+1
+fi
+NAME=`basename ${2%%-*}`
+if [ $NAME != filelist ]; then
+	echo "Error: second argument is not a recognized filelist" >&2
+	let BAD=$BAD+1
+fi
+if ! [ -d $3 ]; then
+	echo "Error: third argument is not a directory" >&2
+	let BAD=$BAD+1
+fi
+NAME=`basename ${4%%-*}`
+if [ $NAME != filelist ]; then
+	echo "Error: fourth argument is not a recognized filelist" >&2
+	let BAD=$BAD+1
+fi
+for I in $1 $2 $3 $4; do
+	if ! [ -r $I ]; then
+		echo "Error: cannot read $I" >&2
+		let BAD=$BAD+1
+	fi
+done
+if [ $1 == $3 ]; then
+	echo "Error: directory pathes are identical" >&2
+	let BAD=$BAD+1
+fi
+if [ $2 == $4 ]; then
+	echo "Error: filelist names are identical" >&2
+	let BAD=$BAD+1
+fi
+if [ $BAD -eq 0 ]; then
+	ARGS=valid
+fi
+}
+
+# Mainline
+ARGS=unproven
+OUTDIR=
+if [ $# -eq 1 ]; then
+	case $1 in
+		-version|--version)
+			echo "`basename $0` version $VERSION"
+			exit 0
+			;;
+		-help|--help)
+			dohelp
+			exit 0
+			;;
+	esac
+fi
+if [ $1 = "--directory" ]; then
+	OUTDIR=$2
+	shift 2
+	grep '/$' $OUTDIR >/dev/null 2>&1 || OUTDIR=`echo $OUTDIR | sed 's%$%/%'`
+	echo "creating directory $OUTDIR"
+	mkdir -p $OUTDIR
+	if [ $? -ne 0 ]; then
+		echo "cannot mkdir $OUTDIR"
+		exit 1
+	fi
+fi
+if [ $# -eq 4 ]; then
+	validateargs $*
+fi
+if ! [ $ARGS == valid ]; then
+	dohelp
+	fatal "`basename $0`: error in arguments"
+fi
+
+# ok, we're happy, lets hit these files
+exec 5>${OUTDIR}$RESULT
+exec 6>${OUTDIR}$EXTRAS
+exec 7>${OUTDIR}$IDENTICAL
+exec 8>${OUTDIR}$SUBS
+exec 9>${OUTDIR}$DIFFER
+
+>${OUTDIR}$RESULT
+if [ $? -ne 0 ]; then
+	fatal "cannot write to ${OUTDIR}$RESULT"
+fi
+
+emessage "will compare:"
+emessage " first build at $1 with files listed in $2"
+emessage "second build at $3 with files listed in $4"
+
+let accepted=0
+let different=0
+let expected=0
+let matched=0
+let only=0
+let predictable=0
+let unreadable=0
+let total=0
+
+# break down the accepted
+let ACCAR=0
+let ACCELF=0
+let ACCGZ=0
+let ACCUNK=0
+
+# break down definitely different
+let DIFAR=0
+let DIFELF=0
+let DIFGZ=0
+let DIFSYM=0
+let DIFUNK=0
+
+# break down the expected differences
+let EXPAR=0
+let EXPELF=0
+let EXPGZ=0
+let EXPUNK=0
+
+# break down the identical files
+let MATAR=0
+let MATELF=0
+let MATGZ=0
+let MATSYM=0
+let MATUNK=0
+
+# break down how many of each type
+let TOTAR=0
+let TOTELF=0
+let TOTGZ=0
+let TOTSYM=0
+let TOTUNK=0
+
+# now identify differences between the two trees
+DIFF=`mktemp` || fatal "cannot create a temporary file"
+diff $2 $4 >$DIFF
+
+for RUN in '<' '>' ; do
+	grep -q "$RUN" $DIFF && onlyone "$RUN"
+done
+
+rm $DIFF
+
+# and compare them
+message "Results of file comparison:"
+message ""
+
+# Strip any trailing slash from the path for tidyness,
+# because the filenames all start with a slash.  Unfortunately,
+# unfortunately, '/' becomes empty, which breaks subroutines,
+# so special case it.
+# also, to process ar archives we need to extract them in temp
+# directories - that means that after cd'ing we've broken any
+# relative path, so save original pwd as necessary.
+P1=`echo $1 | sed 's%/$%%'`
+echo $1 | grep '^/' >/dev/null
+if [ $? -ne 0 ]; then
+	# relative path
+	OP1=${PWD}/
+	#echo "setting OP1 to $OP1"
+else
+	OP1=
+	#echo "$1 is an absolute path"
+fi
+test -z "$P1" && P1='/'
+P2=`echo $3 | sed 's%/$%%'`
+echo $3 | grep '^/' >/dev/null
+if [ $? -ne 0 ]; then
+	# relative path
+	OP2=${PWD}/
+	#echo "setting OP2 to $OP2"
+else
+	OP2=
+	#echo "$3 is an absolute path"
+fi
+test -z "$P2" && P2='/'
+
+echo "about to read $2"
+while read FILE ; do
+#echo "process $FILE"
+#echo "test existence of ${P2}${FILE}"
+	# confirm it exists in second build
+	# we have already reported files only in one build
+	if [ -f ${P2}"${FILE}" ]; then
+		let total=$total+1
+		# check we can read both of them
+		# or count as unreadable - I used to separate only-one-unreadable,
+		# but if you compre '/' and a _copy_  of /mnt/lfs that assumption
+		# breaks, so be less picky.
+		if ! [ -r "${P1}${FILE}" ] || ! [ -r "${P2}${FILE}" ]; then
+			message "cannot read one or both versions of $FILE"
+			let unreadable=$unreadable+1
+			continue
+		fi
+		if [ -h "${P1}${FILE}" ]; then
+			# for symlink, look at what it points to
+			# exceptionally, do not call filetype
+			TYPE=SYM
+			let TOTSYM=$TOTSYM+1
+			SL1=`ls -l "${P1}${FILE}" | awk '{ print $11 }'`
+			SL2=`ls -l "${P2}${FILE}" | awk '{ print $11 }'`
+			if [ "$SL1" = "$SL2" ]; then
+				echo "symlink $FILE matches for $SL1" >&5
+				let matched=$matched+1
+				let MATSYM=$MATSYM+1
+			else
+				failure TARGET " symlink $FILE points to $SL1 and $SL2"
+				echo $FILE >&9
+			fi
+		else
+			# regular file, start by typing it for accounting,
+			# then compare it
+			filetype ${P1}${FILE}
+			cmp -s "${P1}${FILE}" "${P2}${FILE}"
+			if [ $? -eq 0 ]; then
+				let matched=$matched+1
+				case $TYPE in
+					AR)
+						let MATAR=$MATAR+1
+						;;
+					ELF)
+						let MATELF=$MATELF+1
+						;;
+					GZ)
+						let MATGZ=$MATGZ+1
+						;;
+					UNK)
+						let MATUNK=$MATUNK+1
+						;;
+					*)
+						echo "unexpected TYPE of $TYPE for $FILE" >&2
+						exit 2
+						;;
+				esac
+				echo ${FILE} >&7
+			else
+				# seems different, can we do better ?
+				# test if we expect it to differ
+				expected $FILE
+				if [ $? -ne 0 ]; then
+					case $TYPE in
+					GZ)
+						testgzip $P1 $P2 $FILE ;;
+					AR)
+						testar $P1 $P2 $FILE ;;
+					ELF)
+						testso $P1 $P2 $FILE ;;
+					*)
+						# long-stop - strip dates from text files
+						tokenizeanddiff "${P1}${FILE}" "${P2}${FILE}" "$FILE"
+						if [ $? -eq 0 ]; then
+							message "accepted $FILE after processing"
+							let accepted=$accepted+1
+							let ACCUNK=$ACCUNK+1
+						else
+							failure "$FILE" " $FILE is different"
+						fi
+						;;
+					esac
+				fi
+			fi
+		fi
+	fi
+done < $2
+
+message ""
+# write totals to stderr as well as the results file
+emessage "$only files in only one of the builds"
+emessage "$total files compared, of which"
+emessage "$unreadable files could not be read, skipped"
+emessage "$matched files are identical"
+emessage "$expected files differed as expected"
+emessage "$accepted files had allowable differences"
+#emessage "$predictable files differed as they normally do"
+emessage "$different files differed"
+
+# totals of different file types
+emessage ""
+emessage "$TOTAR ar archives"
+emessage " of which $MATAR are identical"
+emessage " of which $ACCAR are accepted after strip-debug or extracting, diffing, tokenizing"
+emessage " of which $EXPAR differed as expected"
+emessage "    of which $DIFAR differed"
+emessage "$TOTELF ELF executables or shared libraries"
+emessage " of which $MATELF are identical"
+emessage " of which $ACCELF are accepted after stripping and tokenizing"
+emessage " of which $EXPELF differed as expected"
+emessage "    of which $DIFELF differed"
+emessage "$TOTGZ gzipped files"
+emessage " of which $MATGZ are identical"
+emessage " of which $ACCGZ are accepted after comparing beyond timestamp"
+emessage " of which $DIFGZ are different"
+emessage "$TOTSYM symbolic links"
+emessage " of which $MATSYM are identical"
+emessage "    of which $DIFSYM have different targets"
+emessage "$TOTUNK other files"
+emessage " of which $MATUNK are identical"
+emessage " of which $ACCUNK are accepted after tokenizing"
+emessage " of which $EXPUNK differed as expected"
+emessage "    of which $DIFUNK differed"
+
diff --git a/2.3/extras/filelist b/2.3/extras/filelist
new file mode 100755
index 0000000..f9b1b08
--- /dev/null
+++ b/2.3/extras/filelist
@@ -0,0 +1,60 @@
+#!/bin/bash
+#$Id$
+
+# Acknowledgment:
+#  The following code is a modified version of an original work written by
+#  Ken Moffat for their "farce" project and is included here with his
+#  permission.
+#
+
+set -e
+
+: <<inline_doc
+    desc:       creates farce file lists
+    usage:      filelist $DEST_FARCE/$ITERATION $DEST_FARCE/$ITERATION.filelist
+    input vars: $1 directory where files from current iteration are stored
+                $2 name of the file list to be created
+    externals:  --
+    modifies:   --
+    returns:    --
+    on error:
+    on success:
+inline_doc
+
+if [ $# -eq 2 ]; then
+  OUTFILE=$2
+  if [ -e $2 ]; then
+    echo -e "\nOutput $2 already exists\n"
+    exit
+  fi
+else
+  echo -e "\nMissing argument\n"
+  exit 2
+fi
+
+if [ "$1" == "/" ]; then
+  LOC=$1
+else
+  # ensure the path or mountpoint ends with a slash
+  # because of the seds after the 'find'
+  LOC=`echo $1 | sed 's%[^/]$%&/%'`
+fi
+
+echo -en "\nCreating file list for farce amalysis in $OUTFILE ..."
+if [ -f $OUTFILE ]; then
+  echo "refusing to overwrite $OUTFILE"
+  exit 1
+fi
+
+# check we can indeed do this
+>$OUTFILE
+if [ $? -ne 0 ]; then
+  echo "error, cannot write to $OUTFILE"
+  exit 1
+fi
+
+find $LOC -xdev -xtype f | sed "s%^${LOC}%/%" | sort >$OUTFILE
+
+echo -e "done.\n"
+
+exit
diff --git a/2.3/jhalfs b/2.3/jhalfs
new file mode 100755
index 0000000..b933d8a
--- /dev/null
+++ b/2.3/jhalfs
@@ -0,0 +1,449 @@
+#!/bin/bash
+# $Id$
+set -e
+
+# VT100 colors
+declare -r  BLACK=$'\e[1;30m'
+declare -r  DK_GRAY=$'\e[0;30m'
+
+declare -r  RED=$'\e[31m'
+declare -r  GREEN=$'\e[32m'
+declare -r  YELLOW=$'\e[33m'
+declare -r  BLUE=$'\e[34m'
+declare -r  MAGENTA=$'\e[35m'
+declare -r  CYAN=$'\e[36m'
+declare -r  WHITE=$'\e[37m'
+
+declare -r  OFF=$'\e[0m'
+declare -r  BOLD=$'\e[1m'
+declare -r  REVERSE=$'\e[7m'
+declare -r  HIDDEN=$'\e[8m'
+
+declare -r  tab_=$'\t'
+declare -r  nl_=$'\n'
+
+declare -r   DD_BORDER="${BOLD}==============================================================================${OFF}"
+declare -r   SD_BORDER="${BOLD}------------------------------------------------------------------------------${OFF}"
+declare -r STAR_BORDER="${BOLD}******************************************************************************${OFF}"
+
+# bold yellow > <  pair
+declare -r R_arrow=$'\e[1;33m>\e[0m'
+declare -r L_arrow=$'\e[1;33m<\e[0m'
+
+
+#>>>>>>>>>>>>>>>ERROR TRAPPING >>>>>>>>>>>>>>>>>>>>
+#-----------------------#
+simple_error() {        # Basic error trap.... JUST DIE
+#-----------------------#
+  # If +e then disable text output
+  if [[ "$-" =~ e ]]; then
+    echo -e "\n${RED}ERROR:${GREEN} basic error trapped!${OFF}\n" >&2
+  fi
+}
+
+see_ya() {
+    echo -e "\n${L_arrow}${BOLD}jhalfs 2.3${R_arrow} exit${OFF}\n"
+}
+##### Simple error TRAPS
+# ctrl-c   SIGINT
+# ctrl-y
+# ctrl-z   SIGTSTP
+# SIGHUP   1 HANGUP
+# SIGINT   2 INTRERRUPT FROM KEYBOARD Ctrl-C
+# SIGQUIT  3
+# SIGKILL  9 KILL
+# SIGTERM 15 TERMINATION
+# SIGSTOP 17,18,23 STOP THE PROCESS
+#####
+set -e
+trap see_ya 0
+trap simple_error ERR
+trap 'echo -e "\n\n${RED}INTERRUPT${OFF} trapped\n" &&  exit 2'  1 2 3 15 17 18 23
+#>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
+
+version="
+${BOLD}  \"jhalfs 2.3\"${OFF} builder tool (stable) \$Rev$
+  \$Date$
+
+  Written by George Boudreau and Manuel Canales Esparcia,
+  plus several contributions.
+
+  Based on an idea from Jeremy Huntwork
+
+  This set of files are published under the
+  ${BOLD}Gnu General Public License, Version 2.${OFF}
+"
+
+case $1 in
+  -v ) echo "$version" && exit 1 ;;
+  run ) : ;;
+  * )
+    echo "${nl_}${tab_}${BOLD}${RED}This script cannot be called directly: EXITING ${OFF}${nl_}"
+    exit 1
+    ;;
+esac
+
+VERBOSITY=1
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading config params from <configuration>..."
+source configuration
+[[ $? > 0 ]] && echo "file:configuration did not load.." && exit 1
+[[ $VERBOSITY > 0 ]] && echo "OK"
+
+# These are boolean vars generated from Config.in.
+# ISSUE: If a boolean parameter is not set <true> that
+# variable is not defined by the menu app. This can
+# cause a headache if you are not careful.
+#  The following parameters MUST be created and have a
+#  default value.
+RUNMAKE=${RUNMAKE:-n}
+GETPKG=${GETPKG:-n}
+GETKERNEL=${GETKERNEL:-n}
+COMPARE=${COMPARE:-n}
+RUN_FARCE=${RUN_FARCE:-n}
+RUN_ICA=${RUN_ICA:-n}
+BOMB_TEST=${BOMB_TEST:-n}
+STRIP=${STRIP:=n}
+REPORT=${REPORT:=n}
+VIMLANG=${VIMLANG:-n}
+GRSECURITY_HOST=${GRSECURITY_HOST:-n}
+CUSTOM_TOOLS=${CUSTOM_TOOLS:-n}
+REBUILD_MAKEFILE=${REBUILD_MAKEFILE:-n}
+INSTALL_LOG=${INSTALL_LOG:-n}
+CLEAN=${CLEAN:=n}
+SET_SSP=${SET_SSP:=n}
+SET_ASLR=${SET_ASLR:=n}
+SET_PAX=${SET_PAX:=n}
+SET_HARDENED_TMP=${SET_HARDENED_TMP:=n}
+SET_WARNINGS=${SET_WARNINGS:=n}
+SET_MISC=${SET_MISC:=n}
+SET_BLOWFISH=${SET_BLOWFISH:=n}
+
+# Book surces envars
+BRANCH_ID=${BRANCH_ID:=development}
+
+case $BRANCH_ID in
+  development )
+    case $PROGNAME in
+      clfs2 ) TREE=branches/clfs-sysroot/BOOK ;;
+      clfs3 ) TREE=branches/clfs-embedded/BOOK ;;
+           *) TREE=trunk/BOOK ;;
+    esac
+    LFSVRS=development
+    ;;
+  *EDIT* )  echo " You forgot to set the branch or stable book version."
+            echo " Please rerun make and fix the configuration."
+            exit 2 ;;
+  branch-* )
+    LFSVRS=${BRANCH_ID}
+    TREE=branches/${BRANCH_ID#branch-}/BOOK
+    ;;
+  * )
+    case $PROGNAME in
+      lfs | hlfs )
+        LFSVRS=${BRANCH_ID}
+        TREE=tags/${BRANCH_ID}/BOOK
+        ;;
+      clfs | clfs2 | clfs3)
+        LFSVRS=${BRANCH_ID}
+        TREE=tags/${BRANCH_ID}
+        ;;
+    esac
+    ;;
+esac
+
+# Set the document location...
+BOOK=${BOOK:=$PROGNAME-$LFSVRS}
+
+# blfs-tool envars
+BLFS_TOOL=${BLFS_TOOL:-n}
+if [[ "${BLFS_TOOL}" = "y" ]] ; then
+  BLFS_BRANCH_ID=${BLFS_BRANCH_ID:=development}
+  case $BLFS_BRANCH_ID in
+    development )  BLFS_TREE=trunk/BOOK ;;
+         *EDIT* )  echo " You forgot to set the BLFS branch or stable book version."
+                   echo " Please rerun make and fix the configuration."
+                   exit 2 ;;
+       branch-* )  BLFS_TREE=branches/${BLFS_BRANCH_ID#branch-} ;;
+              * )  BLFS_TREE=tags/${BLFS_BRANCH_ID} ;;
+  esac
+  # Dependencies envars, to can update it more easy.
+  # Tidy and Unzip version are harcoded also in wrt_blfs_tool_targets()
+    # libxml2
+  LIBXML_PKG="libxml2-2.6.29.tar.gz"
+  LIBXML_URL="ftp://xmlsoft.org/libxml2/${LIBXML_PKG}"
+  LIBXML_MD5="8b99b6e8b08e838438d9e6b639d79ebd"
+    # libxslt
+  LIBXSLT_PKG="libxslt-1.1.21.tar.gz"
+  LIBXSLT_URL="ftp://xmlsoft.org/libxslt/${LIBXSLT_PKG}"
+  LIBXSLT_MD5="59fe34e85692f71df2a38c2ee291b3ca"
+    # tidy
+  TIDY_PKG="tidy-cvs_20070326.tar.bz2"
+  TIDY_URL="http://anduin.linuxfromscratch.org/files/BLFS/sources/${TIDY_PKG}"
+  TIDY_MD5="468bfaa5cf917a8ecbe7834c13a61376"
+    # unzip
+  UNZIP_PKG="unzip552.tar.gz"
+  UNZIP_URL="http://downloads.sourceforge.net/infozip/${UNZIP_PKG}"
+  UNZIP_MD5="9d23919999d6eac9217d1f41472034a9"
+    # unzip security patch
+  UNZIP_PATCH="unzip-5.52-security_fix-1.patch"
+  UNZIP_PATCH_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${UNZIP_PATCH}"
+  UNZIP_PATCH_MD5="00ebf64fdda2ad54ddfc619f85f328bb"
+    # DocBook XML DTD
+  DBXML_PKG="docbook-xml-4.5.zip"
+  DBXML_URL="http://www.docbook.org/xml/4.5/${DBXML_PKG}"
+  DBXML_MD5="03083e288e87a7e829e437358da7ef9e"
+    # DocBook XSL
+#   DBXSL_PKG="docbook-xsl-1.69.1.tar.bz2"
+#   DBXSL_URL="http://prdownloads.sourceforge.net/docbook/${DBXSL_PKG}"
+#   DBXSL_MD5="6ebd29a67f2dcc3f2220f475ee6f6552"
+    # Links
+  LINKS_PKG="links-2.1pre23.tar.bz2"
+  LINKS_URL="http://links.twibright.com/download/${LINKS_PKG}"
+  LINKS_MD5="4a1fb575c133eee821b9a1f8e9220b40"
+    # sudo
+  SUDO_PKG="sudo-1.6.8p12.tar.gz"
+  SUDO_URL="http://anduin.linuxfromscratch.org/sources/BLFS/svn/s/${SUDO_PKG}"
+  SUDO_MD5="b29893c06192df6230dd5f340f3badf5"
+    # sudo envar fix patch
+  SUDO_PATCH="sudo-1.6.8p12-envvar_fix-1.patch"
+  SUDO_PATCH_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${SUDO_PATCH}"
+  SUDO_PATCH_MD5="454925aedfe054dff8fe0d03b209f986"
+    # wget
+  WGET_PKG="wget-1.10.2.tar.gz"
+  WGET_URL="ftp://ftp.gnu.org/gnu/wget/${WGET_PKG}"
+  WGET_MD5="795fefbb7099f93e2d346b026785c4b8"
+    # Subversion
+  SVN_PKG="subversion-1.3.1.tar.bz2"
+  SVN_URL="http://subversion.tigris.org/tarballs/${SVN_PKG}"
+  SVN_MD5="07b95963968ae345541ca99d0e7bf082"
+    # GPM
+  GPM_PKG="gpm-1.20.1.tar.bz2"
+  GPM_URL="ftp://ftp.linux.ee/pub/gentoo/distfiles/distfiles/${GPM_PKG}"
+  GPM_MD5="2c63e827d755527950d9d13fe3d87692"
+    # GPM segfaul patch
+  GPM_PATCH_1="gpm-1.20.1-segfault-1.patch"
+  GPM_PATCH_1_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${GPM_PATCH_1}"
+  GPM_PATCH_1_MD5="8c88f92990ba7613014fcd1db14ca7ac"
+    # GPM silent patch
+  GPM_PATCH_2="gpm-1.20.1-silent-1.patch"
+  GPM_PATCH_2_URL="http://www.linuxfromscratch.org/patches/blfs/svn/${GPM_PATCH_2}"
+  GPM_PATCH_2_MD5="bf6cbefe20c6f15b587f19ebc1c8a37a"
+fi
+
+#--- Envars not sourced from configuration
+case $PROGNAME in
+  clfs* ) declare -r SVN="http://svn.cross-lfs.org/svn/repos" ;;
+      * ) declare -r SVN="svn://svn.linuxfromscratch.org" ;;
+esac
+declare -r LOG=000-masterscript.log
+  # Needed to can fetch BLFS book sources when building CLFS
+declare -r SVN_2="svn://svn.linuxfromscratch.org"
+
+# Set true internal variables
+COMMON_DIR="common"
+PACKAGE_DIR=$(echo $PROGNAME | tr '[a-z]' '[A-Z]')
+MODULE=$PACKAGE_DIR/master.sh
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading common-functions module..."
+source $COMMON_DIR/common-functions
+[[ $? > 0 ]] && echo " $COMMON_DIR/common-functions did not load.." && exit
+[[ $VERBOSITY > 0 ]] && echo "OK"
+[[ $VERBOSITY > 0 ]] && echo -n "Loading code module <$MODULE>..."
+source $MODULE
+[[ $? > 0 ]] && echo "$MODULE did not load.." && exit 2
+[[ $VERBOSITY > 0 ]] && echo "OK"
+#
+[[ $VERBOSITY > 0 ]] && echo "${SD_BORDER}${nl_}"
+
+
+#*******************************************************************#
+[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_check_version.sh>..."
+source $COMMON_DIR/libs/func_check_version.sh
+[[ $? > 0 ]] && echo " function module did not load.." && exit 2
+[[ $VERBOSITY > 0 ]] && echo "OK"
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_validate_configs.sh>..."
+source $COMMON_DIR/libs/func_validate_configs.sh
+[[ $? > 0 ]] && echo " function module did not load.." && exit 2
+[[ $VERBOSITY > 0 ]] && echo "OK"
+
+[[ $VERBOSITY > 0 ]] && echo -n "Loading function <func_custom_pkgs>..."
+source $COMMON_DIR/libs/func_custom_pkgs
+[[ $? > 0 ]] && echo " function module did not load.." && exit 2
+[[ $VERBOSITY > 0 ]] && echo "OK"
+
+
+[[ $VERBOSITY > 0 ]] && echo "${SD_BORDER}${nl_}"
+
+
+###################################
+###          MAIN               ###
+###################################
+
+# Check for build prereequisites.
+echo
+  check_prerequisites
+echo "${SD_BORDER}${nl_}"
+
+validate_config
+echo "${SD_BORDER}${nl_}"
+echo -n "Are you happy with these settings? yes/no (no): "
+read ANSWER
+if [ x$ANSWER != "xyes" ] ; then
+  echo "${nl_}Rerun make to fix the configuration options.${nl_}"
+  exit 1
+fi
+echo "${nl_}${SD_BORDER}${nl_}"
+
+# Load additional modules or configuration files based on global settings
+# compare module
+if [[ "$COMPARE" = "y" ]]; then
+  [[ $VERBOSITY > 0 ]] && echo -n "Loading compare module..."
+  source $COMMON_DIR/libs/func_compare.sh
+  [[ $? > 0 ]] && echo "$COMMON_DIR/libs/func_compare.sh did not load.." && exit
+  [[ $VERBOSITY > 0 ]] && echo "OK"
+fi
+#
+# optimize module
+if [[ "$OPTIMIZE" != "0" ]]; then
+  [[ $VERBOSITY > 0 ]] && echo -n "Loading optimization module..."
+  source optimize/optimize_functions
+  [[ $? > 0 ]] && echo " optimize/optimize_functions did not load.." && exit
+  [[ $VERBOSITY > 0 ]] && echo "OK"
+  #
+  # optimize configurations
+  [[ $VERBOSITY > 0 ]] && echo -n "Loading optimization config..."
+  source optimize/opt_config
+  [[ $? > 0 ]] && echo " optimize/opt_config did not load.." && exit
+  [[ $VERBOSITY > 0 ]] && echo "OK"
+  # Validate optimize settings, if required
+  validate_opt_settings
+fi
+#
+
+if [[ "$REBUILD_MAKEFILE" = "n" ]] ; then
+
+  # If $BUILDDIR has subdirectories like tools/ or bin/, stop the run
+  # and notify the user about that.
+  if [ -d $BUILDDIR/tools -o -d $BUILDDIR/bin ] && [ -z $CLEAN ] ; then
+    eval "$no_empty_builddir"
+  fi
+
+  # If requested, clean the build directory
+  clean_builddir
+
+  if [[ ! -d $JHALFSDIR ]]; then
+    mkdir -p $JHALFSDIR
+  fi
+
+  # Create $BUILDDIR/sources even though it could be created by get_sources()
+  if [[ ! -d $BUILDDIR/sources ]]; then
+    mkdir -p $BUILDDIR/sources
+  fi
+  #
+  # Create the log directory
+  if [[ ! -d $LOGDIR ]]; then
+    mkdir $LOGDIR
+  fi
+  >$LOGDIR/$LOG
+  #
+  # Copy common helper files
+  cp $COMMON_DIR/{makefile-functions,progress_bar.sh,packages.xsl} $JHALFSDIR/
+  #
+  # Fix the XSL book parser
+  sed 's,FAKEDIR,'$BOOK',' $PACKAGE_DIR/$XSL > $JHALFSDIR/${XSL}
+  export XSL=$JHALFSDIR/${XSL}
+  #
+
+  # Copy urls.xsl, if needed
+  [[ "$GETPKG" = "y" ]] && cp $COMMON_DIR/urls.xsl  $JHALFSDIR/
+  #
+  # Create the test-log directory, if needed
+  [[ "$TEST" != "0" ]] && [[ ! -d $TESTLOGDIR ]] && install -d -m 1777 $TESTLOGDIR
+  #
+  # Create the installed-files directory, if needed
+  [[ "$INSTALL_LOG" = "y" ]] && [[ ! -d $FILELOGDIR ]] && install -d -m 1777 $FILELOGDIR
+  #
+  # Prepare report creation, if needed
+  if [[ "$REPORT" = "y" ]]; then
+    cp $COMMON_DIR/create-sbu_du-report.sh  $JHALFSDIR/
+    # After being sure that all looks sane, dump the settings to a file
+    # This file will be used to create the REPORT header
+    validate_config > $JHALFSDIR/jhalfs.config
+  fi
+  #
+  # Copy optimize files, if needed
+  [[ "$OPTIMIZE" != "0" ]] && cp optimize/opt_override $JHALFSDIR/
+  #
+  # Copy compare files, if needed
+  if [[ "$COMPARE" = "y" ]]; then
+    mkdir -p $JHALFSDIR/extras
+    cp extras/* $JHALFSDIR/extras
+  fi
+  #
+
+  # Copy custom tools config files, if requested
+  if [[ "${CUSTOM_TOOLS}" = "y" ]]; then
+    echo "Copying custom tool scripts to $JHALFSDIR"
+    mkdir -p $JHALFSDIR/custom-commands
+    cp -f custom/config/* $JHALFSDIR/custom-commands
+  fi
+  #
+  # Install blfs-tool, if requested.
+  if [[ "${BLFS_TOOL}" = "y" ]] ; then
+    # Install the files
+    [[ ! -d ${BUILDDIR}${BLFS_ROOT} ]] && mkdir -p ${BUILDDIR}${BLFS_ROOT}
+    cp -r BLFS/* ${BUILDDIR}${BLFS_ROOT}
+    cp -r menu ${BUILDDIR}${BLFS_ROOT}
+    cp $COMMON_DIR/progress_bar.sh ${BUILDDIR}${BLFS_ROOT}
+    chmod 777 ${BUILDDIR}${BLFS_ROOT}/progress_bar.sh
+    cp README.BLFS ${BUILDDIR}${BLFS_ROOT}
+    # Clean-up
+    rm -rf ${BUILDDIR}${BLFS_ROOT}/libs/.svn
+    rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/.svn
+    rm -rf ${BUILDDIR}${BLFS_ROOT}/menu/lxdialog/.svn
+    # Set some harcoded envars to their proper values
+    sed -i 's,blfs-xml,'$BLFS_XML',' ${BUILDDIR}${BLFS_ROOT}/{update_book.sh,libs/book.xsl}
+    sed -i 's,tracking-dir,'$TRACKING_DIR',' ${BUILDDIR}${BLFS_ROOT}/{update_book.sh,gen-makefile.sh}
+    # Copy the dependencies build scripts
+    cp -r $COMMON_DIR/blfs-tool-deps $JHALFSDIR/
+    rm -rf $JHALFSDIR/blfs-tool-deps/.svn
+  fi
+  #
+
+  get_book
+  echo "${SD_BORDER}${nl_}"
+
+  # Get the BLFS book, if requested.
+  if [[ "${BLFS_TOOL}" = "y" ]] ; then
+    echo -n "Downloading the BLFS document, $BLFS_BRANCH_ID version... "
+    if [[ ! -d ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML} ]] ; then
+      mkdir -p ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML}
+      svn co $SVN_2/BLFS/$BLFS_TREE ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML} >>$LOGDIR/$LOG 2>&1
+    else
+      pushd ${BUILDDIR}${BLFS_ROOT}/${BLFS_XML} 1> /dev/null
+        svn up >>$LOGDIR/$LOG 2>&1
+      popd 1> /dev/null
+    fi
+    echo -ne "done\n"
+    echo "${SD_BORDER}${nl_}"
+  fi
+
+fi
+
+# When regeneration the Makefile we need to know also the canonical book version
+if [[ "$REBUILD_MAKEFILE" = "y" ]] ; then
+  case $PROGNAME in
+    clfs | clfs2 | clfs3 )
+      VERSION=$(xmllint --noent $JHALFSDIR/$BOOK/prologue/$ARCH/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //'  -e 's/<\/.*//') ;;
+    *)
+      VERSION=$(xmllint --noent $JHALFSDIR/$BOOK/prologue/bookinfo.xml 2>/dev/null | grep subtitle | sed -e 's/^.*ion //'  -e 's/<\/.*//')  ;;
+  esac
+fi
+
+build_Makefile
+
+echo "${SD_BORDER}${nl_}"
+
+run_make
diff --git a/2.3/menu/BusyBox-1.1.3-menu.patch b/2.3/menu/BusyBox-1.1.3-menu.patch
new file mode 100644
index 0000000..6a4be25
--- /dev/null
+++ b/2.3/menu/BusyBox-1.1.3-menu.patch
@@ -0,0 +1,507 @@
+diff -Npr menu-bb/conf.c menu/conf.c
+*** menu-bb/conf.c	2006-03-22 16:16:18.000000000 -0500
+--- menu/conf.c	2006-07-26 17:26:45.000000000 -0400
+*************** int main(int ac, char **av)
+*** 535,554 ****
+  	conf_parse(name);
+  	//zconfdump(stdout);
+  	switch (input_mode) {
+- 	case set_default:
+- 		if (!defconfig_file)
+- 			defconfig_file = conf_get_default_confname();
+- 		if (conf_read(defconfig_file)) {
+- 			printf("***\n"
+- 				"*** Can't find default configuration \"%s\"!\n"
+- 				"***\n", defconfig_file);
+- 			exit(1);
+- 		}
+- 		break;
+  	case ask_silent:
+  		if (stat(".config", &tmpstat)) {
+  			printf("***\n"
+! 				"*** You have not yet configured BusyBox!\n"
+  				"***\n"
+  				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+  				"*** \"make menuconfig\" or \"make config\").\n"
+--- 535,544 ----
+  	conf_parse(name);
+  	//zconfdump(stdout);
+  	switch (input_mode) {
+  	case ask_silent:
+  		if (stat(".config", &tmpstat)) {
+  			printf("***\n"
+! 				"*** You have not yet configured JHALFS!\n"
+  				"***\n"
+  				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+  				"*** \"make menuconfig\" or \"make config\").\n"
+*************** int main(int ac, char **av)
+*** 576,582 ****
+  		check_conf(&rootmenu);
+  	} while (conf_cnt);
+  	if (conf_write(NULL)) {
+! 		fprintf(stderr, "\n*** Error during writing of the BusyBox configuration.\n\n");
+  		return 1;
+  	}
+  	return 0;
+--- 566,572 ----
+  		check_conf(&rootmenu);
+  	} while (conf_cnt);
+  	if (conf_write(NULL)) {
+! 		fprintf(stderr, "\n*** Error during writing of the JHALFS configuration.\n\n");
+  		return 1;
+  	}
+  	return 0;
+diff -Npr menu-bb/confdata.c menu/confdata.c
+*** menu-bb/confdata.c	2006-03-22 16:16:18.000000000 -0500
+--- menu/confdata.c	2006-07-26 17:26:45.000000000 -0400
+***************
+*** 13,24 ****
+  #define LKC_DIRECT_LINK
+  #include "lkc.h"
+  
+! const char conf_def_filename[] = ".config";
+  
+  const char conf_defname[] = "defconfig";
+  
+  const char *conf_confnames[] = {
+! 	".config",
+  	conf_defname,
+  	NULL,
+  };
+--- 13,24 ----
+  #define LKC_DIRECT_LINK
+  #include "lkc.h"
+  
+! const char conf_def_filename[] = "configuration";
+  
+  const char conf_defname[] = "defconfig";
+  
+  const char *conf_confnames[] = {
+! 	"configuration",
+  	conf_defname,
+  	NULL,
+  };
+*************** static char *conf_expand_value(const cha
+*** 49,70 ****
+  	return res_value;
+  }
+  
+- char *conf_get_default_confname(void)
+- {
+- 	struct stat buf;
+- 	static char fullname[PATH_MAX+1];
+- 	char *env, *name;
+- 
+- 	name = conf_expand_value(conf_defname);
+- 	env = getenv(SRCTREE);
+- 	if (env) {
+- 		sprintf(fullname, "%s/%s", env, name);
+- 		if (!stat(fullname, &buf))
+- 			return fullname;
+- 	}
+- 	return name;
+- }
+- 
+  int conf_read(const char *name)
+  {
+  	FILE *in = NULL;
+--- 49,54 ----
+*************** struct menu *next_menu(struct menu *menu
+*** 271,277 ****
+  
+  int conf_write(const char *name)
+  {
+! 	FILE *out, *out_h;
+  	struct symbol *sym;
+  	struct menu *menu;
+  	const char *basename;
+--- 255,261 ----
+  
+  int conf_write(const char *name)
+  {
+! 	FILE *out;
+  	struct symbol *sym;
+  	struct menu *menu;
+  	const char *basename;
+*************** int conf_write(const char *name)
+*** 279,288 ****
+  	int type, l;
+  	const char *str;
+  
+- 	/* busybox`s code */
+- 	const char *opt_name;
+- 	int use_flg;
+- 
+  	dirname[0] = 0;
+  	if (name && name[0]) {
+  		struct stat st;
+--- 263,268 ----
+*************** int conf_write(const char *name)
+*** 309,342 ****
+  	out = fopen(newname, "w");
+  	if (!out)
+  		return 1;
+- 	out_h = NULL;
+- 	if (!name) {
+- 		out_h = fopen(".tmpconfig.h", "w");
+- 		if (!out_h)
+- 			return 1;
+- 	}
+  	fprintf(out, "#\n"
+! 		     "# Automatically generated make config: don't edit\n"
+  		     "#\n");
+  
+- 	/* busybox`s code */
+- 	if (out_h) {
+- 		fprintf(out_h, "#ifndef BB_CONFIG_H\n#define BB_CONFIG_H\n");
+- 		fprintf(out_h, "/*\n"
+- 			     " * Automatically generated header file: don't edit\n"
+- 			     " */\n\n"
+- 			     "/* Version Number */\n"
+- 			     "#define BB_VER \"%s\"\n"
+- 			     "#define BB_BT \"%s\"\n",
+- 			     getenv("VERSION"),
+- 			     getenv("BUILDTIME"));
+- 		if (getenv("EXTRA_VERSION"))
+- 			fprintf(out_h, "#define BB_EXTRA_VERSION \"%s\"\n",
+- 				     getenv("EXTRA_VERSION"));
+- 		fprintf(out_h, "\n");
+- 	}
+- 	/* end busybox`s code */
+- 
+  	if (!sym_change_count)
+  		sym_clear_all_valid();
+  
+--- 289,299 ----
+  	out = fopen(newname, "w");
+  	if (!out)
+  		return 1;
+  	fprintf(out, "#\n"
+! 		     "# Automatically generated configuration: don't edit\n"
+! 		     "# use make menuconfig or make config to make changes\n"
+  		     "#\n");
+  
+  	if (!sym_change_count)
+  		sym_clear_all_valid();
+  
+*************** int conf_write(const char *name)
+*** 357,367 ****
+  				     "#\n"
+  				     "# %s\n"
+  				     "#\n", str);
+- 			if (out_h)
+- 				fprintf(out_h, "\n"
+- 					       "/*\n"
+- 					       " * %s\n"
+- 					       " */\n", str);
+  		} else if (!(sym->flags & SYMBOL_CHOICE)) {
+  			sym_calc_value(sym);
+  			if (!(sym->flags & SYMBOL_FORCEWRITE))
+--- 314,319 ----
+*************** int conf_write(const char *name)
+*** 375,388 ****
+  					type = S_BOOLEAN;
+  			}
+  
+- 			/* busybox`s code */
+- 			opt_name = strchr(sym->name, '_');
+- 			if(opt_name == NULL)
+- 				opt_name = sym->name;
+- 			else
+- 				opt_name++;
+- 			use_flg = 1;
+- 			/* end busybox`s code */
+  
+  			switch (type) {
+  			case S_BOOLEAN:
+--- 327,332 ----
+*************** int conf_write(const char *name)
+*** 390,410 ****
+  				switch (sym_get_tristate_value(sym)) {
+  				case no:
+  					fprintf(out, "# %s is not set\n", sym->name);
+- 					if (out_h)
+- 						fprintf(out_h, "#undef %s\n", sym->name);
+- 					use_flg = 0;    /* busybox`s code */
+  					break;
+  				case mod:
+- #if 0   /* busybox`s code */
+  					fprintf(out, "%s=m\n", sym->name);
+- 					if (out_h)
+- 						fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
+- #endif  /* busybox`s code */
+  					break;
+  				case yes:
+  					fprintf(out, "%s=y\n", sym->name);
+- 					if (out_h)
+- 						fprintf(out_h, "#define %s 1\n", sym->name);
+  					break;
+  				}
+  				break;
+--- 334,345 ----
+*************** int conf_write(const char *name)
+*** 412,473 ****
+  				// fix me
+  				str = sym_get_string_value(sym);
+  				fprintf(out, "%s=\"", sym->name);
+- 				if (out_h)
+- 					fprintf(out_h, "#define %s \"", sym->name);
+  				do {
+  					l = strcspn(str, "\"\\");
+  					if (l) {
+  						fwrite(str, l, 1, out);
+- 						if (out_h)
+- 							fwrite(str, l, 1, out_h);
+  					}
+  					str += l;
+  					while (*str == '\\' || *str == '"') {
+  						fprintf(out, "\\%c", *str);
+- 						if (out_h)
+- 							fprintf(out_h, "\\%c", *str);
+  						str++;
+  					}
+  				} while (*str);
+  				fputs("\"\n", out);
+- 				if (out_h)
+- 					fputs("\"\n", out_h);
+  				break;
+  			case S_HEX:
+  				str = sym_get_string_value(sym);
+  				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+  					fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
+- 					if (out_h)
+- 						fprintf(out_h, "#define %s 0x%s\n", sym->name, str);
+  					break;
+  				}
+  			case S_INT:
+  				str = sym_get_string_value(sym);
+  				fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
+- 				if (out_h)
+- 					fprintf(out_h, "#define %s %s\n", sym->name, str);
+  				break;
+  			}
+- 			/* busybox`s code */
+- 			if (out_h) {
+- 				fprintf(out_h, "#define ENABLE_%s %d\n", opt_name, use_flg);
+- 				fprintf(out_h, "#define USE_%s(...)%s\n", opt_name,
+- 					(use_flg ? "  __VA_ARGS__" : ""));
+- 				fprintf(out_h, "#define SKIP_%s(...)%s\n\n", opt_name,
+- 					(use_flg ? "" : "  __VA_ARGS__"));
+- 			}
+- 			/* end busybox`s code */
+  		}
+  next:
+  		menu = next_menu(menu);
+  	}
+  	fclose(out);
+- 	if (out_h) {
+- 		fprintf(out_h, "#endif /* BB_CONFIG_H */\n");   /* busybox`s code */
+- 		fclose(out_h);
+- 		rename(".tmpconfig.h", "include/bb_config.h");  /* busybox`s config name */
+- 		file_write_dep(NULL);
+- 	}
+  	if (!name || basename != conf_def_filename) {
+  		if (!name)
+  			name = conf_def_filename;
+--- 347,381 ----
+diff -Npr menu-bb/Makefile menu/Makefile
+*** menu-bb/Makefile	2006-03-22 16:16:18.000000000 -0500
+--- menu/Makefile	2006-07-26 18:06:25.000000000 -0400
+***************
+*** 1,11 ****
+  # Makefile for BusyBox
+  #
+  # Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
+  
+- top_srcdir=../..
+- top_builddir=../..
+- srcdir=$(top_srcdir)/scripts/config
+- include $(top_srcdir)/Rules.mak
+  
+  all: ncurses conf mconf
+  
+--- 1,30 ----
+  # Makefile for BusyBox
+  #
+  # Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
++ # Modified by George Boudreau georgeb@LinuxFromScratch.org
++ 
++ top_srcdir=.
++ top_builddir=.
++ srcdir=$(top_srcdir)
++ 
++ # Select the compiler needed to build binaries for your development system
++ HOSTCC    = gcc
++ HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
++ 
++ # Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
++ LC_ALL:= C
++ 
++ SED       ?= sed
++ SECHO     := @-false
++ DISP      := pur
++ Q         := @
++ 
++ show_objs          = $(subst $(top_builddir)/,,$(subst ../,,$@))
++ pur_disp_compile.h = echo "  "HOSTCC $(show_objs)
++ disp_compile.h     = $($(DISP)_disp_compile.h)
++ cmd_compile.h      = $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $<
++ compile.h          = @$(disp_compile.h) ; $(cmd_compile.h)
+  
+  
+  all: ncurses conf mconf
+  
+diff -Npr menu-bb/mconf.c menu/mconf.c
+*** menu-bb/mconf.c	2006-03-22 16:16:18.000000000 -0500
+--- menu/mconf.c	2006-07-26 17:26:45.000000000 -0400
+*************** static char menu_backtitle[128];
+*** 32,38 ****
+  static const char mconf_readme[] =
+  "Overview\n"
+  "--------\n"
+! "Some features may be built directly into BusyBox.  Some features\n"
+  "may be completely removed altogether.  There are also certain\n"
+  "parameters which are not really features, but must be\n"
+  "entered in as decimal or hexadecimal numbers or possibly text.\n"
+--- 32,38 ----
+  static const char mconf_readme[] =
+  "Overview\n"
+  "--------\n"
+! "Some features may be built directly into JHALFS.  Some features\n"
+  "may be completely removed altogether.  There are also certain\n"
+  "parameters which are not really features, but must be\n"
+  "entered in as decimal or hexadecimal numbers or possibly text.\n"
+*************** load_config_text[] =
+*** 194,204 ****
+  	"last retrieved.  Leave blank to abort.",
+  load_config_help[] =
+  	"\n"
+! 	"For various reasons, one may wish to keep several different BusyBox\n"
+  	"configurations available on a single machine.\n"
+  	"\n"
+  	"If you have saved a previous configuration in a file other than the\n"
+! 	"BusyBox's default, entering the name of the file here will allow you\n"
+  	"to modify that configuration.\n"
+  	"\n"
+  	"If you are uncertain, then you have probably never used alternate\n"
+--- 194,204 ----
+  	"last retrieved.  Leave blank to abort.",
+  load_config_help[] =
+  	"\n"
+! 	"For various reasons, one may wish to keep several different JHALFS\n"
+  	"configurations available on a single machine.\n"
+  	"\n"
+  	"If you have saved a previous configuration in a file other than the\n"
+! 	"JHALFS's default, entering the name of the file here will allow you\n"
+  	"to modify that configuration.\n"
+  	"\n"
+  	"If you are uncertain, then you have probably never used alternate\n"
+*************** save_config_text[] =
+*** 208,214 ****
+  	"as an alternate.  Leave blank to abort.",
+  save_config_help[] =
+  	"\n"
+! 	"For various reasons, one may wish to keep different BusyBox\n"
+  	"configurations available on a single machine.\n"
+  	"\n"
+  	"Entering a file name here will allow you to later retrieve, modify\n"
+--- 208,214 ----
+  	"as an alternate.  Leave blank to abort.",
+  save_config_help[] =
+  	"\n"
+! 	"For various reasons, one may wish to keep different JHALFS\n"
+  	"configurations available on a single machine.\n"
+  	"\n"
+  	"Entering a file name here will allow you to later retrieve, modify\n"
+*************** int main(int ac, char **av)
+*** 940,946 ****
+  
+  	sym = sym_lookup("VERSION", 0);
+  	sym_calc_value(sym);
+! 	snprintf(menu_backtitle, 128, "BusyBox v%s Configuration",
+  		sym_get_string_value(sym));
+  
+  	mode = getenv("MENUCONFIG_MODE");
+--- 940,946 ----
+  
+  	sym = sym_lookup("VERSION", 0);
+  	sym_calc_value(sym);
+! 	snprintf(menu_backtitle, 128, "JHALFS v%s Configuration",
+  		sym_get_string_value(sym));
+  
+  	mode = getenv("MENUCONFIG_MODE");
+*************** int main(int ac, char **av)
+*** 961,976 ****
+  	init_dialog();
+  	do {
+  		stat = dialog_yesno(NULL,
+! 				    "Do you wish to save your new BusyBox configuration?", 5, 60);
+  	} while (stat < 0);
+  	end_dialog();
+  
+  	if (stat == 0) {
+  		conf_write(NULL);
+  		printf("\n"
+! 			"*** End of BusyBox configuration.\n");
+  	} else
+! 		printf("\n\nYour BusyBox configuration changes were NOT saved.\n\n");
+  
+  	return 0;
+  }
+--- 961,976 ----
+  	init_dialog();
+  	do {
+  		stat = dialog_yesno(NULL,
+! 				    "Do you wish to save your new JHALFS configuration?", 5, 60);
+  	} while (stat < 0);
+  	end_dialog();
+  
+  	if (stat == 0) {
+  		conf_write(NULL);
+  		printf("\n"
+! 			"*** End of JHALFS configuration.\n");
+  	} else
+! 		printf("\n\nYour JHALFS configuration changes were NOT saved.\n\n");
+  
+  	return 0;
+  }
+diff -Npr menu-bb/zconf.tab.c_shipped menu/zconf.tab.c_shipped
+*** menu-bb/zconf.tab.c_shipped	2006-03-22 16:16:18.000000000 -0500
+--- menu/zconf.tab.c_shipped	2006-07-26 17:26:45.000000000 -0400
+*************** void conf_parse(const char *name)
+*** 1925,1931 ****
+  	sym_init();
+  	menu_init();
+  	modules_sym = sym_lookup("MODULES", 0);
+! 	rootmenu.prompt = menu_add_prop(P_MENU, "BusyBox Configuration", NULL, NULL);
+  
+  	//zconfdebug = 1;
+  	zconfparse();
+--- 1925,1931 ----
+  	sym_init();
+  	menu_init();
+  	modules_sym = sym_lookup("MODULES", 0);
+! 	rootmenu.prompt = menu_add_prop(P_MENU, "JHALFS Configuration", NULL, NULL);
+  
+  	//zconfdebug = 1;
+  	zconfparse();
+diff -Npr menu-bb/zconf.y menu/zconf.y
+*** menu-bb/zconf.y	2006-03-22 16:16:18.000000000 -0500
+--- menu/zconf.y	2006-07-26 17:26:45.000000000 -0400
+*************** void conf_parse(const char *name)
+*** 487,493 ****
+  	sym_init();
+  	menu_init();
+  	modules_sym = sym_lookup("MODULES", 0);
+! 	rootmenu.prompt = menu_add_prop(P_MENU, "BusyBox Configuration", NULL, NULL);
+  
+  	//zconfdebug = 1;
+  	zconfparse();
+--- 487,493 ----
+  	sym_init();
+  	menu_init();
+  	modules_sym = sym_lookup("MODULES", 0);
+! 	rootmenu.prompt = menu_add_prop(P_MENU, "JHALFS Configuration", NULL, NULL);
+  
+  	//zconfdebug = 1;
+  	zconfparse();
diff --git a/2.3/menu/Kconfig-language.txt b/2.3/menu/Kconfig-language.txt
new file mode 100644
index 0000000..493749b
--- /dev/null
+++ b/2.3/menu/Kconfig-language.txt
@@ -0,0 +1,255 @@
+Introduction
+------------
+
+The configuration database is collection of configuration options
+organized in a tree structure:
+
+	+- Code maturity level options
+	|  +- Prompt for development and/or incomplete code/drivers
+	+- General setup
+	|  +- Networking support
+	|  +- System V IPC
+	|  +- BSD Process Accounting
+	|  +- Sysctl support
+	+- Loadable module support
+	|  +- Enable loadable module support
+	|     +- Set version information on all module symbols
+	|     +- Kernel module loader
+	+- ...
+
+Every entry has its own dependencies. These dependencies are used
+to determine the visible of an entry. Any child entry is only
+visible if its parent entry is also visible.
+
+Menu entries
+------------
+
+Most entries define a config option, all other entries help to organize
+them. A single configuration option is defined like this:
+
+config MODVERSIONS
+	bool "Set version information on all module symbols"
+	depends MODULES
+	help
+	  Usually, modules have to be recompiled whenever you switch to a new
+	  kernel.  ...
+
+Every line starts with a key word and can be followed by multiple
+arguments.  "config" starts a new config entry. The following lines
+define attributes for this config option. Attributes can be the type of
+the config option, input prompt, dependencies, help text and default
+values. A config option can be defined multiple times with the same
+name, but every definition can have only a single input prompt and the
+type must not conflict.
+
+Menu attributes
+---------------
+
+A menu entry can have a number of attributes. Not all of them are
+applicable everywhere (see syntax).
+
+- type definition: "bool"/"tristate"/"string"/"hex"/"integer"
+  Every config option must have a type. There are only two basic types:
+  tristate and string, the other types base on these two. The type
+  definition optionally accepts an input prompt, so these two examples
+  are equivalent:
+
+	bool "Networking support"
+  and
+	bool
+	prompt "Networking support"
+
+- input prompt: "prompt" <prompt> ["if" <expr>]
+  Every menu entry can have at most one prompt, which is used to display
+  to the user. Optionally dependencies only for this prompt can be added
+  with "if".
+
+- default value: "default" <symbol> ["if" <expr>]
+  A config option can have any number of default values. If multiple
+  default values are visible, only the first defined one is active.
+  Default values are not limited to the menu entry, where they are
+  defined, this means the default can be defined somewhere else or be
+  overriden by an earlier definition.
+  The default value is only assigned to the config symbol if no other
+  value was set by the user (via the input prompt above). If an input
+  prompt is visible the default value is presented to the user and can
+  be overridden by him.
+  Optionally dependencies only for this default value can be added with
+  "if".
+
+- dependencies: "depends on"/"requires" <expr>
+  This defines a dependency for this menu entry. If multiple
+  dependencies are defined they are connected with '&&'. Dependencies
+  are applied to all other options within this menu entry (which also
+  accept "if" expression), so these two examples are equivalent:
+
+	bool "foo" if BAR
+	default y if BAR
+  and
+	depends on BAR
+	bool "foo"
+	default y
+
+- help text: "help"
+  This defines a help text. The end of the help text is determined by
+  the level indentation, this means it ends at the first line which has
+  a smaller indentation than the first line of the help text.
+
+
+Menu dependencies
+-----------------
+
+Dependencies define the visibility of a menu entry and can also reduce
+the input range of tristate symbols. The tristate logic used in the
+expressions uses one more state than normal boolean logic to express the
+module state. Dependency expressions have the following syntax:
+
+<expr> ::= <symbol>                             (1)
+           <symbol> '=' <symbol>                (2)
+           <symbol> '!=' <symbol>               (3)
+           '(' <expr> ')'                       (4)
+           '!' <expr>                           (5)
+           <expr> '||' <expr>                   (6)
+           <expr> '&&' <expr>                   (7)
+
+Expressions are listed in decreasing order of precedence.
+
+(1) Convert the symbol into an expression. Boolean and tristate symbols
+    are simply converted into the respective expression values. All
+    other symbol types result in 'n'.
+(2) If the values of both symbols are equal, it returns 'y',
+    otherwise 'n'.
+(3) If the values of both symbols are equal, it returns 'n',
+    otherwise 'y'.
+(4) Returns the value of the expression. Used to override precedence.
+(5) Returns the result of (2-/expr/).
+(6) Returns the result of min(/expr/, /expr/).
+(7) Returns the result of max(/expr/, /expr/).
+
+An expression can have a value of 'n', 'm' or 'y' (or 0, 1, 2
+respectively for calculations). A menu entry becomes visible when it's
+expression evaluates to 'm' or 'y'.
+
+There are two type of symbols: constant and nonconstant symbols.
+Nonconstant symbols are the most common ones and are defined with the
+'config' statement. Nonconstant symbols consist entirely of alphanumeric
+characters or underscores.
+Constant symbols are only part of expressions. Constant symbols are
+always surrounded by single or double quotes. Within the quote any
+other character is allowed and the quotes can be escaped using '\'.
+
+Menu structure
+--------------
+
+The position of a menu entry in the tree is determined in two ways. First
+it can be specified explicitely:
+
+menu "Network device support"
+	depends NET
+
+config NETDEVICES
+	...
+
+endmenu
+
+All entries within the "menu" ... "endmenu" block become a submenu of
+"Network device support". All subentries inherit the dependencies from
+the menu entry, e.g. this means the dependency "NET" is added to the
+dependency list of the config option NETDEVICES.
+
+The other way to generate the menu structure is done by analyzing the
+dependencies. If a menu entry somehow depends on the previous entry, it
+can be made a submenu of it. First the the previous (parent) symbol must
+be part of the dependency list and then one of these two condititions
+must be true:
+- the child entry must become invisible, if the parent is set to 'n'
+- the child entry must only be visible, if the parent is visible
+
+config MODULES
+	bool "Enable loadable module support"
+
+config MODVERSIONS
+	bool "Set version information on all module symbols"
+	depends MODULES
+
+comment "module support disabled"
+	depends !MODULES
+
+MODVERSIONS directly depends on MODULES, this means it's only visible if
+MODULES is different from 'n'. The comment on the other hand is always
+visible when MODULES it's visible (the (empty) dependency of MODULES is
+also part of the comment dependencies).
+
+
+Kconfig syntax
+--------------
+
+The configuration file describes a series of menu entries, where every
+line starts with a keyword (except help texts). The following keywords
+end a menu entry:
+- config
+- choice/endchoice
+- comment
+- menu/endmenu
+- if/endif
+- source
+The first four also start the definition of a menu entry.
+
+config:
+
+	"config" <symbol>
+	<config options>
+
+This defines a config symbol <symbol> and accepts any of above
+attributes as options.
+
+choices:
+
+	"choice"
+	<choice options>
+	<choice block>
+	"endchoice"
+
+This defines a choice group and accepts any of above attributes as
+options. A choice can only be of type bool or tristate, while a boolean
+choice only allows a single config entry to be selected, a tristate
+choice also allows any number of config entries to be set to 'm'. This
+can be used if multiple drivers for a single hardware exists and only a
+single driver can be compiled/loaded into the kernel, but all drivers
+can be compiled as modules.
+A choice accepts another option "optional", which allows to set the
+choice to 'n' and no entry needs to be selected.
+
+comment:
+
+	"comment" <prompt>
+	<comment options>
+
+This defines a comment which is displayed to the user during the
+configuration process and is also echoed to the output files. The only
+possible options are dependencies.
+
+menu:
+
+	"menu" <prompt>
+	<menu options>
+	<menu block>
+	"endmenu"
+
+This defines a menu block, see "Menu structure" above for more
+information. The only possible options are dependencies.
+
+if:
+
+	"if" <expr>
+	<if block>
+	"endif"
+
+This defines an if block. The dependency expression <expr> is appended
+to all enclosed menu entries.
+
+source:
+
+	"source" <prompt>
+
+This reads the specified configuration file. This file is always parsed.
diff --git a/2.3/menu/Makefile b/2.3/menu/Makefile
new file mode 100644
index 0000000..b619a4e
--- /dev/null
+++ b/2.3/menu/Makefile
@@ -0,0 +1,145 @@
+# Makefile for BusyBox
+#
+# Copyright (C) 2002 Erik Andersen <andersen@codepoet.org>
+# Modified by George Boudreau georgeb@LinuxFromScratch.org
+
+top_srcdir=.
+top_builddir=.
+srcdir=$(top_srcdir)
+
+# Select the compiler needed to build binaries for your development system
+HOSTCC    = gcc
+HOSTCFLAGS= -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
+
+# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
+LC_ALL:= C
+
+SED       ?= sed
+SECHO     := @-false
+DISP      := pur
+Q         := @
+
+show_objs          = $(subst $(top_builddir)/,,$(subst ../,,$@))
+pur_disp_compile.h = echo "  "HOSTCC $(show_objs)
+disp_compile.h     = $($(DISP)_disp_compile.h)
+cmd_compile.h      = $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $<
+compile.h          = @$(disp_compile.h) ; $(cmd_compile.h)
+
+
+all: ncurses conf mconf
+
+ifeq ($(shell uname),SunOS)
+LIBS = -lcurses
+else
+LIBS = -lncurses
+endif
+ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
+	HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/include/ncurses/curses.h, $(wildcard /usr/include/ncurses/curses.h))
+	HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/local/include/ncurses/ncurses.h, $(wildcard /usr/local/include/ncurses/ncurses.h))
+	HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses.h>"
+else
+ifeq (/usr/local/include/ncurses/curses.h, $(wildcard /usr/local/include/ncurses/curses.h))
+	HOSTCFLAGS += -I/usr/local/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"
+else
+ifeq (/usr/include/ncurses.h, $(wildcard /usr/include/ncurses.h))
+	HOSTNCURSES += -DCURSES_LOC="<ncurses.h>"
+else
+	HOSTNCURSES += -DCURSES_LOC="<curses.h>"
+endif
+endif
+endif
+endif
+endif
+
+ifeq (/usr/include/locale.h, $(wildcard /usr/include/locale.h))
+	HOSTNCURSES += -DLOCALE=1
+endif
+
+CONF_SRC     = conf.c
+MCONF_SRC    = mconf.c
+LXD_SRC      = lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c \
+               lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c \
+               lxdialog/msgbox.c
+
+SHARED_SRC   = zconf.tab.c
+SHARED_DEPS := $(srcdir)/lkc.h $(srcdir)/lkc_proto.h \
+               lkc_defs.h $(srcdir)/expr.h zconf.tab.h
+CONF_OBJS    = $(patsubst %.c,%.o, $(CONF_SRC))
+MCONF_OBJS   = $(patsubst %.c,%.o, $(MCONF_SRC) $(LXD_SRC))
+SHARED_OBJS  = $(patsubst %.c,%.o, $(SHARED_SRC))
+
+conf: $(CONF_OBJS) $(SHARED_OBJS)
+	$(SECHO) "  "HOSTCC $@ ; true
+	$(Q)$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
+
+mconf: $(MCONF_OBJS) $(SHARED_OBJS)
+	$(SECHO) "  "HOSTCC $@ ; true
+	$(Q)$(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ $(LIBS)
+
+$(CONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS)
+	$(compile.h) -I.
+
+$(MCONF_OBJS): %.o : $(srcdir)/%.c $(SHARED_DEPS)
+	@[ -d $(@D) ] || mkdir $(@D)
+	$(compile.h) $(HOSTNCURSES) -I.
+
+lkc_defs.h: $(srcdir)/lkc_proto.h
+	@$(SED) < $< > $@ 's/P(\([^,]*\),.*/#define \1 (\*\1_p)/'
+
+###
+# The following requires flex/bison
+# By default we use the _shipped versions, uncomment the
+# following line if you are modifying the flex/bison src.
+#LKC_GENPARSER := 1
+
+ifdef LKC_GENPARSER
+
+%.tab.c %.tab.h: $(srcdir)/%.y
+	bison -t -d -v -b $* -p $(notdir $*) $<
+
+lex.%.c: $(srcdir)/%.l
+	flex -P$(notdir $*) -o$@ $<
+else
+
+lex.zconf.o: lex.zconf.c $(SHARED_DEPS)
+	$(compile.h) -I$(srcdir)
+
+lex.zconf.c: $(srcdir)/lex.zconf.c_shipped
+	$(Q)cp $< $@
+
+zconf.tab.c: $(srcdir)/zconf.tab.c_shipped
+	$(Q)cp $< $@
+
+zconf.tab.h: $(srcdir)/zconf.tab.h_shipped
+	$(Q)cp $< $@
+endif
+
+zconf.tab.o: zconf.tab.c lex.zconf.c $(srcdir)/confdata.c $(srcdir)/expr.c \
+             $(srcdir)/symbol.c $(srcdir)/menu.c $(SHARED_DEPS)
+	$(compile.h) -I$(srcdir) -I.
+
+.PHONY: ncurses
+
+ncurses:
+	@echo "main() {}" > lxtemp.c
+	@if $(HOSTCC) lxtemp.c $(LIBS) ; then \
+		rm -f lxtemp.c a.out; \
+	else \
+		rm -f lxtemp.c; \
+		echo -e "\007" ;\
+		echo ">> Unable to find the Ncurses libraries." ;\
+		echo ">>" ;\
+		echo ">> You must have Ncurses installed in order" ;\
+		echo ">> to use 'make menuconfig'" ;\
+		echo ;\
+		exit 1 ;\
+	fi
+
+clean:
+	rm -f *.o *~ core $(TARGETS) $(MCONF_OBJS) $(CONF_OBJS) \
+		conf mconf zconf.tab.c zconf.tab.h lex.zconf.c lkc_defs.h
+
diff --git a/2.3/menu/conf.c b/2.3/menu/conf.c
new file mode 100644
index 0000000..fdb3e5b
--- /dev/null
+++ b/2.3/menu/conf.c
@@ -0,0 +1,573 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <time.h>
+#include <sys/stat.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static void conf(struct menu *menu);
+static void check_conf(struct menu *menu);
+
+enum {
+	ask_all,
+	ask_new,
+	ask_silent,
+	set_default,
+	set_yes,
+	set_mod,
+	set_no,
+	set_random
+} input_mode = ask_all;
+char *defconfig_file;
+
+static int indent = 1;
+static int valid_stdin = 1;
+static int conf_cnt;
+static char line[128];
+static struct menu *rootEntry;
+
+static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
+
+static void strip(char *str)
+{
+	char *p = str;
+	int l;
+
+	while ((isspace(*p)))
+		p++;
+	l = strlen(p);
+	if (p != str)
+		memmove(str, p, l + 1);
+	if (!l)
+		return;
+	p = str + l - 1;
+	while ((isspace(*p)))
+		*p-- = 0;
+}
+
+static void check_stdin(void)
+{
+	if (!valid_stdin && input_mode == ask_silent) {
+		printf("aborted!\n\n");
+		printf("Console input/output is redirected. ");
+		printf("Run 'make oldconfig' to update configuration.\n\n");
+		exit(1);
+	}
+}
+
+static void conf_askvalue(struct symbol *sym, const char *def)
+{
+	enum symbol_type type = sym_get_type(sym);
+	tristate val;
+
+	if (!sym_has_value(sym))
+		printf("(NEW) ");
+
+	line[0] = '\n';
+	line[1] = 0;
+
+	if (!sym_is_changable(sym)) {
+		printf("%s\n", def);
+		line[0] = '\n';
+		line[1] = 0;
+		return;
+	}
+
+	switch (input_mode) {
+	case ask_new:
+	case ask_silent:
+		if (sym_has_value(sym)) {
+			printf("%s\n", def);
+			return;
+		}
+		check_stdin();
+	case ask_all:
+		fflush(stdout);
+		fgets(line, 128, stdin);
+		return;
+	case set_default:
+		printf("%s\n", def);
+		return;
+	default:
+		break;
+	}
+
+	switch (type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		printf("%s\n", def);
+		return;
+	default:
+		;
+	}
+	switch (input_mode) {
+	case set_yes:
+		if (sym_tristate_within_range(sym, yes)) {
+			line[0] = 'y';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_mod:
+		if (type == S_TRISTATE) {
+			if (sym_tristate_within_range(sym, mod)) {
+				line[0] = 'm';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		} else {
+			if (sym_tristate_within_range(sym, yes)) {
+				line[0] = 'y';
+				line[1] = '\n';
+				line[2] = 0;
+				break;
+			}
+		}
+	case set_no:
+		if (sym_tristate_within_range(sym, no)) {
+			line[0] = 'n';
+			line[1] = '\n';
+			line[2] = 0;
+			break;
+		}
+	case set_random:
+		do {
+			val = (tristate)(random() % 3);
+		} while (!sym_tristate_within_range(sym, val));
+		switch (val) {
+		case no: line[0] = 'n'; break;
+		case mod: line[0] = 'm'; break;
+		case yes: line[0] = 'y'; break;
+		}
+		line[1] = '\n';
+		line[2] = 0;
+		break;
+	default:
+		break;
+	}
+	printf("%s", line);
+}
+
+int conf_string(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	const char *def, *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		printf("(%s) ", sym->name);
+		def = sym_get_string_value(sym);
+		if (sym_get_string_value(sym))
+			printf("[%s] ", def);
+		conf_askvalue(sym, def);
+		switch (line[0]) {
+		case '\n':
+			break;
+		case '?':
+			/* print help */
+			if (line[1] == '\n') {
+				help = nohelp_text;
+				if (menu->sym->help)
+					help = menu->sym->help;
+				printf("\n%s\n", menu->sym->help);
+				def = NULL;
+				break;
+			}
+		default:
+			line[strlen(line)-1] = 0;
+			def = line;
+		}
+		if (def && sym_set_string_value(sym, def))
+			return 0;
+	}
+}
+
+static int conf_sym(struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	int type;
+	tristate oldval, newval;
+	const char *help;
+
+	while (1) {
+		printf("%*s%s ", indent - 1, "", menu->prompt->text);
+		if (sym->name)
+			printf("(%s) ", sym->name);
+		type = sym_get_type(sym);
+		putchar('[');
+		oldval = sym_get_tristate_value(sym);
+		switch (oldval) {
+		case no:
+			putchar('N');
+			break;
+		case mod:
+			putchar('M');
+			break;
+		case yes:
+			putchar('Y');
+			break;
+		}
+		if (oldval != no && sym_tristate_within_range(sym, no))
+			printf("/n");
+		if (oldval != mod && sym_tristate_within_range(sym, mod))
+			printf("/m");
+		if (oldval != yes && sym_tristate_within_range(sym, yes))
+			printf("/y");
+		if (sym->help)
+			printf("/?");
+		printf("] ");
+		conf_askvalue(sym, sym_get_string_value(sym));
+		strip(line);
+
+		switch (line[0]) {
+		case 'n':
+		case 'N':
+			newval = no;
+			if (!line[1] || !strcmp(&line[1], "o"))
+				break;
+			continue;
+		case 'm':
+		case 'M':
+			newval = mod;
+			if (!line[1])
+				break;
+			continue;
+		case 'y':
+		case 'Y':
+			newval = yes;
+			if (!line[1] || !strcmp(&line[1], "es"))
+				break;
+			continue;
+		case 0:
+			newval = oldval;
+			break;
+		case '?':
+			goto help;
+		default:
+			continue;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			return 0;
+help:
+		help = nohelp_text;
+		if (sym->help)
+			help = sym->help;
+		printf("\n%s\n", help);
+	}
+}
+
+static int conf_choice(struct menu *menu)
+{
+	struct symbol *sym, *def_sym;
+	struct menu *child;
+	int type;
+	bool is_new;
+
+	sym = menu->sym;
+	type = sym_get_type(sym);
+	is_new = !sym_has_value(sym);
+	if (sym_is_changable(sym)) {
+		conf_sym(menu);
+		sym_calc_value(sym);
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			return 0;
+		case yes:
+			break;
+		}
+	} else {
+		switch (sym_get_tristate_value(sym)) {
+		case no:
+			return 1;
+		case mod:
+			printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+			return 0;
+		case yes:
+			break;
+		}
+	}
+
+	while (1) {
+		int cnt, def;
+
+		printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
+		def_sym = sym_get_choice_value(sym);
+		cnt = def = 0;
+		line[0] = '0';
+		line[1] = 0;
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			if (!child->sym) {
+				printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+				continue;
+			}
+			cnt++;
+			if (child->sym == def_sym) {
+				def = cnt;
+				printf("%*c", indent, '>');
+			} else
+				printf("%*c", indent, ' ');
+			printf(" %d. %s", cnt, menu_get_prompt(child));
+			if (child->sym->name)
+				printf(" (%s)", child->sym->name);
+			if (!sym_has_value(child->sym))
+				printf(" (NEW)");
+			printf("\n");
+		}
+		printf("%*schoice", indent - 1, "");
+		if (cnt == 1) {
+			printf("[1]: 1\n");
+			goto conf_childs;
+		}
+		printf("[1-%d", cnt);
+		if (sym->help)
+			printf("?");
+		printf("]: ");
+		switch (input_mode) {
+		case ask_new:
+		case ask_silent:
+			if (!is_new) {
+				cnt = def;
+				printf("%d\n", cnt);
+				break;
+			}
+			check_stdin();
+		case ask_all:
+			fflush(stdout);
+			fgets(line, 128, stdin);
+			strip(line);
+			if (line[0] == '?') {
+				printf("\n%s\n", menu->sym->help ?
+					menu->sym->help : nohelp_text);
+				continue;
+			}
+			if (!line[0])
+				cnt = def;
+			else if (isdigit(line[0]))
+				cnt = atoi(line);
+			else
+				continue;
+			break;
+		case set_random:
+			def = (random() % cnt) + 1;
+		case set_default:
+		case set_yes:
+		case set_mod:
+		case set_no:
+			cnt = def;
+			printf("%d\n", cnt);
+			break;
+		}
+
+	conf_childs:
+		for (child = menu->list; child; child = child->next) {
+			if (!child->sym || !menu_is_visible(child))
+				continue;
+			if (!--cnt)
+				break;
+		}
+		if (!child)
+			continue;
+		if (line[strlen(line) - 1] == '?') {
+			printf("\n%s\n", child->sym->help ?
+				child->sym->help : nohelp_text);
+			continue;
+		}
+		sym_set_choice_value(sym, child->sym);
+		if (child->list) {
+			indent += 2;
+			conf(child->list);
+			indent -= 2;
+		}
+		return 1;
+	}
+}
+
+static void conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (prop) {
+		const char *prompt;
+
+		switch (prop->type) {
+		case P_MENU:
+			if (input_mode == ask_silent && rootEntry != menu) {
+				check_conf(menu);
+				return;
+			}
+		case P_COMMENT:
+			prompt = menu_get_prompt(menu);
+			if (prompt)
+				printf("%*c\n%*c %s\n%*c\n",
+					indent, '*',
+					indent, '*', prompt,
+					indent, '*');
+		default:
+			;
+		}
+	}
+
+	if (!sym)
+		goto conf_childs;
+
+	if (sym_is_choice(sym)) {
+		conf_choice(menu);
+		if (sym->curr.tri != mod)
+			return;
+		goto conf_childs;
+	}
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		conf_string(menu);
+		break;
+	default:
+		conf_sym(menu);
+		break;
+	}
+
+conf_childs:
+	if (sym)
+		indent += 2;
+	for (child = menu->list; child; child = child->next)
+		conf(child);
+	if (sym)
+		indent -= 2;
+}
+
+static void check_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct menu *child;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	if (sym) {
+		if (sym_is_changable(sym) && !sym_has_value(sym)) {
+			if (!conf_cnt++)
+				printf("*\n* Restart config...\n*\n");
+			rootEntry = menu_get_parent_menu(menu);
+			conf(rootEntry);
+		}
+		if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
+			return;
+	}
+
+	for (child = menu->list; child; child = child->next)
+		check_conf(child);
+}
+
+int main(int ac, char **av)
+{
+	int i = 1;
+	const char *name;
+	struct stat tmpstat;
+
+	if (ac > i && av[i][0] == '-') {
+		switch (av[i++][1]) {
+		case 'o':
+			input_mode = ask_new;
+			break;
+		case 's':
+			input_mode = ask_silent;
+			valid_stdin = isatty(0) && isatty(1) && isatty(2);
+			break;
+		case 'd':
+			input_mode = set_default;
+			break;
+		case 'D':
+			input_mode = set_default;
+			defconfig_file = av[i++];
+			if (!defconfig_file) {
+				printf("%s: No default config file specified\n",
+					av[0]);
+				exit(1);
+			}
+			break;
+		case 'n':
+			input_mode = set_no;
+			break;
+		case 'm':
+			input_mode = set_mod;
+			break;
+		case 'y':
+			input_mode = set_yes;
+			break;
+		case 'r':
+			input_mode = set_random;
+			srandom(time(NULL));
+			break;
+		case 'h':
+		case '?':
+			printf("%s [-o|-s] config\n", av[0]);
+			exit(0);
+		}
+	}
+	name = av[i];
+	if (!name) {
+		printf("%s: configuration file missing\n", av[0]);
+	}
+	conf_parse(name);
+	//zconfdump(stdout);
+	switch (input_mode) {
+	case ask_silent:
+		if (stat(".config", &tmpstat)) {
+			printf("***\n"
+				"*** You have not yet configured JHALFS!\n"
+				"***\n"
+				"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
+				"*** \"make menuconfig\" or \"make config\").\n"
+				"***\n");
+			exit(1);
+		}
+	case ask_all:
+	case ask_new:
+		conf_read(NULL);
+		break;
+	default:
+		break;
+	}
+
+	if (input_mode != ask_silent) {
+		rootEntry = &rootmenu;
+		conf(&rootmenu);
+		if (input_mode == ask_all) {
+			input_mode = ask_silent;
+			valid_stdin = 1;
+		}
+	}
+	do {
+		conf_cnt = 0;
+		check_conf(&rootmenu);
+	} while (conf_cnt);
+	if (conf_write(NULL)) {
+		fprintf(stderr, "\n*** Error during writing of the JHALFS configuration.\n\n");
+		return 1;
+	}
+	return 0;
+}
diff --git a/2.3/menu/confdata.c b/2.3/menu/confdata.c
new file mode 100644
index 0000000..55cb512
--- /dev/null
+++ b/2.3/menu/confdata.c
@@ -0,0 +1,392 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <sys/stat.h>
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+const char conf_def_filename[] = "configuration";
+
+const char conf_defname[] = "defconfig";
+
+const char *conf_confnames[] = {
+	"configuration",
+	conf_defname,
+	NULL,
+};
+
+static char *conf_expand_value(const char *in)
+{
+	struct symbol *sym;
+	const char *src;
+	static char res_value[SYMBOL_MAXLENGTH];
+	char *dst, name[SYMBOL_MAXLENGTH];
+
+	res_value[0] = 0;
+	dst = name;
+	while ((src = strchr(in, '$'))) {
+		strncat(res_value, in, src - in);
+		src++;
+		dst = name;
+		while (isalnum(*src) || *src == '_')
+			*dst++ = *src++;
+		*dst = 0;
+		sym = sym_lookup(name, 0);
+		sym_calc_value(sym);
+		strcat(res_value, sym_get_string_value(sym));
+		in = src;
+	}
+	strcat(res_value, in);
+
+	return res_value;
+}
+
+int conf_read(const char *name)
+{
+	FILE *in = NULL;
+	char line[1024];
+	char *p, *p2;
+	int lineno = 0;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *e;
+	int i;
+
+	if (name) {
+		in = zconf_fopen(name);
+	} else {
+		const char **names = conf_confnames;
+		while ((name = *names++)) {
+			name = conf_expand_value(name);
+			in = zconf_fopen(name);
+			if (in) {
+				printf("#\n"
+				       "# using defaults found in %s\n"
+				       "#\n", name);
+				break;
+			}
+		}
+	}
+
+	if (!in)
+		return 1;
+
+	for_all_symbols(i, sym) {
+		sym->flags |= SYMBOL_NEW | SYMBOL_CHANGED;
+		sym->flags &= ~SYMBOL_VALID;
+		switch (sym->type) {
+		case S_INT:
+		case S_HEX:
+		case S_STRING:
+			free(sym->user.val);
+		default:
+			sym->user.val = NULL;
+			sym->user.tri = no;
+		}
+	}
+
+	while (fgets(line, sizeof(line), in)) {
+		lineno++;
+		sym = NULL;
+		switch (line[0]) {
+		case '#':
+			if (line[1]!=' ')
+				continue;
+			p = strchr(line + 2, ' ');
+			if (!p)
+				continue;
+			*p++ = 0;
+			if (strncmp(p, "is not set", 10))
+				continue;
+			sym = sym_find(line + 2);
+			if (!sym) {
+				fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
+				break;
+			}
+			switch (sym->type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				sym->user.tri = no;
+				sym->flags &= ~SYMBOL_NEW;
+				break;
+			default:
+				;
+			}
+			break;
+
+		case 'A' ... 'Z':
+			p = strchr(line, '=');
+			if (!p)
+				continue;
+			*p++ = 0;
+			p2 = strchr(p, '\n');
+			if (p2)
+				*p2 = 0;
+			sym = sym_find(line);
+			if (!sym) {
+				fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line);
+				break;
+			}
+			switch (sym->type) {
+			case S_TRISTATE:
+				if (p[0] == 'm') {
+					sym->user.tri = mod;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+			case S_BOOLEAN:
+				if (p[0] == 'y') {
+					sym->user.tri = yes;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+				if (p[0] == 'n') {
+					sym->user.tri = no;
+					sym->flags &= ~SYMBOL_NEW;
+					break;
+				}
+				break;
+			case S_STRING:
+				if (*p++ != '"')
+					break;
+				for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) {
+					if (*p2 == '"') {
+						*p2 = 0;
+						break;
+					}
+					memmove(p2, p2 + 1, strlen(p2));
+				}
+				if (!p2) {
+					fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+					exit(1);
+				}
+			case S_INT:
+			case S_HEX:
+				if (sym_string_valid(sym, p)) {
+					sym->user.val = strdup(p);
+					sym->flags &= ~SYMBOL_NEW;
+				} else {
+					fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+					exit(1);
+				}
+				break;
+			default:
+				;
+			}
+			break;
+		case '\n':
+			break;
+		default:
+			continue;
+		}
+		if (sym && sym_is_choice_value(sym)) {
+			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+			switch (sym->user.tri) {
+			case no:
+				break;
+			case mod:
+				if (cs->user.tri == yes)
+					/* warn? */;
+				break;
+			case yes:
+				if (cs->user.tri != no)
+					/* warn? */;
+				cs->user.val = sym;
+				break;
+			}
+			cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
+			cs->flags &= ~SYMBOL_NEW;
+		}
+	}
+	fclose(in);
+
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+	for_all_symbols(i, sym) {
+		sym_calc_value(sym);
+		if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+			if (sym->visible == no)
+				sym->flags |= SYMBOL_NEW;
+			switch (sym->type) {
+			case S_STRING:
+			case S_INT:
+			case S_HEX:
+				if (!sym_string_within_range(sym, sym->user.val))
+					sym->flags |= SYMBOL_NEW;
+			default:
+				break;
+			}
+		}
+		if (!sym_is_choice(sym))
+			continue;
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr)
+			if (e->right.sym->visible != no)
+				sym->flags |= e->right.sym->flags & SYMBOL_NEW;
+	}
+
+	sym_change_count = 1;
+
+	return 0;
+}
+
+struct menu *next_menu(struct menu *menu)
+{
+	if (menu->list) return menu->list;
+	do {
+		if (menu->next) {
+			menu = menu->next;
+			break;
+		}
+	} while ((menu = menu->parent));
+
+	return menu;
+}
+
+#define SYMBOL_FORCEWRITE (1<<31)
+
+int conf_write(const char *name)
+{
+	FILE *out;
+	struct symbol *sym;
+	struct menu *menu;
+	const char *basename;
+	char dirname[128], tmpname[128], newname[128];
+	int type, l;
+	const char *str;
+
+	dirname[0] = 0;
+	if (name && name[0]) {
+		struct stat st;
+		char *slash;
+
+		if (!stat(name, &st) && S_ISDIR(st.st_mode)) {
+			strcpy(dirname, name);
+			strcat(dirname, "/");
+			basename = conf_def_filename;
+		} else if ((slash = strrchr(name, '/'))) {
+			int size = slash - name + 1;
+			memcpy(dirname, name, size);
+			dirname[size] = 0;
+			if (slash[1])
+				basename = slash + 1;
+			else
+				basename = conf_def_filename;
+		} else
+			basename = name;
+	} else
+		basename = conf_def_filename;
+
+	sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid());
+	out = fopen(newname, "w");
+	if (!out)
+		return 1;
+	fprintf(out, "#\n"
+		     "# Automatically generated configuration: don't edit\n"
+		     "# use make menuconfig or make config to make changes\n"
+		     "#\n");
+
+	if (!sym_change_count)
+		sym_clear_all_valid();
+
+	/* Force write of all non-duplicate symbols. */
+
+	/* Write out everything by default. */
+	for(menu = rootmenu.list; menu; menu = next_menu(menu))
+		if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE;
+
+	menu = rootmenu.list;
+	while (menu) {
+		sym = menu->sym;
+		if (!sym) {
+			if (!menu_is_visible(menu))
+				goto next;
+			str = menu_get_prompt(menu);
+			fprintf(out, "\n"
+				     "#\n"
+				     "# %s\n"
+				     "#\n", str);
+		} else if (!(sym->flags & SYMBOL_CHOICE)) {
+			sym_calc_value(sym);
+			if (!(sym->flags & SYMBOL_FORCEWRITE))
+				goto next;
+
+			sym->flags &= ~SYMBOL_FORCEWRITE;
+			type = sym->type;
+			if (type == S_TRISTATE) {
+				sym_calc_value(modules_sym);
+				if (modules_sym->curr.tri == no)
+					type = S_BOOLEAN;
+			}
+
+
+			switch (type) {
+			case S_BOOLEAN:
+			case S_TRISTATE:
+				switch (sym_get_tristate_value(sym)) {
+				case no:
+					fprintf(out, "# %s is not set\n", sym->name);
+					break;
+				case mod:
+					fprintf(out, "%s=m\n", sym->name);
+					break;
+				case yes:
+					fprintf(out, "%s=y\n", sym->name);
+					break;
+				}
+				break;
+			case S_STRING:
+				// fix me
+				str = sym_get_string_value(sym);
+				fprintf(out, "%s=\"", sym->name);
+				do {
+					l = strcspn(str, "\"\\");
+					if (l) {
+						fwrite(str, l, 1, out);
+					}
+					str += l;
+					while (*str == '\\' || *str == '"') {
+						fprintf(out, "\\%c", *str);
+						str++;
+					}
+				} while (*str);
+				fputs("\"\n", out);
+				break;
+			case S_HEX:
+				str = sym_get_string_value(sym);
+				if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
+					fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
+					break;
+				}
+			case S_INT:
+				str = sym_get_string_value(sym);
+				fprintf(out, "%s=%s\n", sym->name, *str ? str : "0");
+				break;
+			}
+		}
+next:
+		menu = next_menu(menu);
+	}
+	fclose(out);
+	if (!name || basename != conf_def_filename) {
+		if (!name)
+			name = conf_def_filename;
+		sprintf(tmpname, "%s.old", name);
+		rename(name, tmpname);
+	}
+	sprintf(tmpname, "%s%s", dirname, basename);
+	if (rename(newname, tmpname))
+		return 1;
+
+	sym_change_count = 0;
+
+	return 0;
+}
diff --git a/2.3/menu/expr.c b/2.3/menu/expr.c
new file mode 100644
index 0000000..6f39e7a
--- /dev/null
+++ b/2.3/menu/expr.c
@@ -0,0 +1,1099 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define DEBUG_EXPR	0
+
+struct expr *expr_alloc_symbol(struct symbol *sym)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = E_SYMBOL;
+	e->left.sym = sym;
+	return e;
+}
+
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = ce;
+	return e;
+}
+
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.expr = e1;
+	e->right.expr = e2;
+	return e;
+}
+
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2)
+{
+	struct expr *e = malloc(sizeof(*e));
+	memset(e, 0, sizeof(*e));
+	e->type = type;
+	e->left.sym = s1;
+	e->right.sym = s2;
+	return e;
+}
+
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
+}
+
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+	if (!e1)
+		return e2;
+	return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
+struct expr *expr_copy(struct expr *org)
+{
+	struct expr *e;
+
+	if (!org)
+		return NULL;
+
+	e = malloc(sizeof(*org));
+	memcpy(e, org, sizeof(*org));
+	switch (org->type) {
+	case E_SYMBOL:
+		e->left = org->left;
+		break;
+	case E_NOT:
+		e->left.expr = expr_copy(org->left.expr);
+		break;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		e->left.sym = org->left.sym;
+		e->right.sym = org->right.sym;
+		break;
+	case E_AND:
+	case E_OR:
+	case E_CHOICE:
+		e->left.expr = expr_copy(org->left.expr);
+		e->right.expr = expr_copy(org->right.expr);
+		break;
+	default:
+		printf("can't copy type %d\n", e->type);
+		free(e);
+		e = NULL;
+		break;
+	}
+
+	return e;
+}
+
+void expr_free(struct expr *e)
+{
+	if (!e)
+		return;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		break;
+	case E_NOT:
+		expr_free(e->left.expr);
+		return;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		break;
+	case E_OR:
+	case E_AND:
+		expr_free(e->left.expr);
+		expr_free(e->right.expr);
+		break;
+	default:
+		printf("how to free type %d?\n", e->type);
+		break;
+	}
+	free(e);
+}
+
+static int trans_count;
+
+#define e1 (*ep1)
+#define e2 (*ep2)
+
+static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+	if (e1->type == type) {
+		__expr_eliminate_eq(type, &e1->left.expr, &e2);
+		__expr_eliminate_eq(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		__expr_eliminate_eq(type, &e1, &e2->left.expr);
+		__expr_eliminate_eq(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+	    e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO)))
+		return;
+	if (!expr_eq(e1, e2))
+		return;
+	trans_count++;
+	expr_free(e1); expr_free(e2);
+	switch (type) {
+	case E_OR:
+		e1 = expr_alloc_symbol(&symbol_no);
+		e2 = expr_alloc_symbol(&symbol_no);
+		break;
+	case E_AND:
+		e1 = expr_alloc_symbol(&symbol_yes);
+		e2 = expr_alloc_symbol(&symbol_yes);
+		break;
+	default:
+		;
+	}
+}
+
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
+{
+	if (!e1 || !e2)
+		return;
+	switch (e1->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e1->type, ep1, ep2);
+	default:
+		;
+	}
+	if (e1->type != e2->type) switch (e2->type) {
+	case E_OR:
+	case E_AND:
+		__expr_eliminate_eq(e2->type, ep1, ep2);
+	default:
+		;
+	}
+	e1 = expr_eliminate_yn(e1);
+	e2 = expr_eliminate_yn(e2);
+}
+
+#undef e1
+#undef e2
+
+int expr_eq(struct expr *e1, struct expr *e2)
+{
+	int res, old_count;
+
+	if (e1->type != e2->type)
+		return 0;
+	switch (e1->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym;
+	case E_SYMBOL:
+		return e1->left.sym == e2->left.sym;
+	case E_NOT:
+		return expr_eq(e1->left.expr, e2->left.expr);
+	case E_AND:
+	case E_OR:
+		e1 = expr_copy(e1);
+		e2 = expr_copy(e2);
+		old_count = trans_count;
+		expr_eliminate_eq(&e1, &e2);
+		res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL &&
+		       e1->left.sym == e2->left.sym);
+		expr_free(e1);
+		expr_free(e2);
+		trans_count = old_count;
+		return res;
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+
+	if (DEBUG_EXPR) {
+		expr_fprint(e1, stdout);
+		printf(" = ");
+		expr_fprint(e2, stdout);
+		printf(" ?\n");
+	}
+
+	return 0;
+}
+
+struct expr *expr_eliminate_yn(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (e) switch (e->type) {
+	case E_AND:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				e->right.expr = NULL;
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			}
+		}
+		break;
+	case E_OR:
+		e->left.expr = expr_eliminate_yn(e->left.expr);
+		e->right.expr = expr_eliminate_yn(e->right.expr);
+		if (e->left.expr->type == E_SYMBOL) {
+			if (e->left.expr->left.sym == &symbol_no) {
+				free(e->left.expr);
+				tmp = e->right.expr;
+				*e = *(e->right.expr);
+				free(tmp);
+				return e;
+			} else if (e->left.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		if (e->right.expr->type == E_SYMBOL) {
+			if (e->right.expr->left.sym == &symbol_no) {
+				free(e->right.expr);
+				tmp = e->left.expr;
+				*e = *(e->left.expr);
+				free(tmp);
+				return e;
+			} else if (e->right.expr->left.sym == &symbol_yes) {
+				expr_free(e->left.expr);
+				expr_free(e->right.expr);
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				e->right.expr = NULL;
+				return e;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * bool FOO!=n => FOO
+ */
+struct expr *expr_trans_bool(struct expr *e)
+{
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_AND:
+	case E_OR:
+	case E_NOT:
+		e->left.expr = expr_trans_bool(e->left.expr);
+		e->right.expr = expr_trans_bool(e->right.expr);
+		break;
+	case E_UNEQUAL:
+		// FOO!=n -> FOO
+		if (e->left.sym->type == S_TRISTATE) {
+			if (e->right.sym == &symbol_no) {
+				e->type = E_SYMBOL;
+				e->right.sym = NULL;
+			}
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+/*
+ * e1 || e2 -> ?
+ */
+struct expr *expr_join_or(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+		     (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='m') -> (a!='n')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) {
+			// (a='y') || (a='n') -> (a!='m')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod);
+		}
+		if (e1->type == E_EQUAL && e2->type == E_EQUAL &&
+		    ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+		     (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) {
+			// (a='m') || (a='n') -> (a!='y')
+			return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes);
+		}
+	}
+	if (sym1->type == S_BOOLEAN && sym1 == sym2) {
+		if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) ||
+		    (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL))
+			return expr_alloc_symbol(&symbol_yes);
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") || (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+struct expr *expr_join_and(struct expr *e1, struct expr *e2)
+{
+	struct expr *tmp;
+	struct symbol *sym1, *sym2;
+
+	if (expr_eq(e1, e2))
+		return expr_copy(e1);
+	if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT)
+		return NULL;
+	if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT)
+		return NULL;
+	if (e1->type == E_NOT) {
+		tmp = e1->left.expr;
+		if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL)
+			return NULL;
+		sym1 = tmp->left.sym;
+	} else
+		sym1 = e1->left.sym;
+	if (e2->type == E_NOT) {
+		if (e2->left.expr->type != E_SYMBOL)
+			return NULL;
+		sym2 = e2->left.expr->left.sym;
+	} else
+		sym2 = e2->left.sym;
+	if (sym1 != sym2)
+		return NULL;
+	if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE)
+		return NULL;
+
+	if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) ||
+	    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes))
+		// (a) && (a='y') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no))
+		// (a) && (a!='n') -> (a)
+		return expr_alloc_symbol(sym1);
+
+	if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) ||
+	    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod))
+		// (a) && (a!='m') -> (a='y')
+		return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+	if (sym1->type == S_TRISTATE) {
+		if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e1->right.sym;
+			if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) {
+			// (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b'
+			sym2 = e2->right.sym;
+			if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST))
+				return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2)
+							     : expr_alloc_symbol(&symbol_no);
+		}
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) ||
+			    (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes)))
+			// (a!='y') && (a!='m') -> (a='n')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_no);
+
+		if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL &&
+			   ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) ||
+			    (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod)))
+			// (a!='m') && (a!='n') -> (a='m')
+			return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes);
+
+		if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) ||
+		    (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) ||
+		    (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) ||
+		    (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes))
+			return NULL;
+	}
+
+	if (DEBUG_EXPR) {
+		printf("optimize (");
+		expr_fprint(e1, stdout);
+		printf(") && (");
+		expr_fprint(e2, stdout);
+		printf(")?\n");
+	}
+	return NULL;
+}
+
+static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp;
+
+	if (e1->type == type) {
+		expr_eliminate_dups1(type, &e1->left.expr, &e2);
+		expr_eliminate_dups1(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups1(type, &e1, &e2->left.expr);
+		expr_eliminate_dups1(type, &e1, &e2->right.expr);
+		return;
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR: case E_AND:
+		expr_eliminate_dups1(e1->type, &e1, &e1);
+	default:
+		;
+	}
+
+	switch (type) {
+	case E_OR:
+		tmp = expr_join_or(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	case E_AND:
+		tmp = expr_join_and(e1, e2);
+		if (tmp) {
+			expr_free(e1); expr_free(e2);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = tmp;
+			trans_count++;
+		}
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	struct expr *tmp, *tmp1, *tmp2;
+
+	if (e1->type == type) {
+		expr_eliminate_dups2(type, &e1->left.expr, &e2);
+		expr_eliminate_dups2(type, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_eliminate_dups2(type, &e1, &e2->left.expr);
+		expr_eliminate_dups2(type, &e1, &e2->right.expr);
+	}
+	if (e1 == e2)
+		return;
+
+	switch (e1->type) {
+	case E_OR:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO || BAR) && (!FOO && !BAR) -> n
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_and(&tmp1, &tmp2);
+		if (expr_is_yes(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_no);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	case E_AND:
+		expr_eliminate_dups2(e1->type, &e1, &e1);
+		// (FOO && BAR) || (!FOO || !BAR) -> y
+		tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1)));
+		tmp2 = expr_copy(e2);
+		tmp = expr_extract_eq_or(&tmp1, &tmp2);
+		if (expr_is_no(tmp1)) {
+			expr_free(e1);
+			e1 = expr_alloc_symbol(&symbol_yes);
+			trans_count++;
+		}
+		expr_free(tmp2);
+		expr_free(tmp1);
+		expr_free(tmp);
+		break;
+	default:
+		;
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_eliminate_dups(struct expr *e)
+{
+	int oldcount;
+	if (!e)
+		return e;
+
+	oldcount = trans_count;
+	while (1) {
+		trans_count = 0;
+		switch (e->type) {
+		case E_OR: case E_AND:
+			expr_eliminate_dups1(e->type, &e, &e);
+			expr_eliminate_dups2(e->type, &e, &e);
+		default:
+			;
+		}
+		if (!trans_count)
+			break;
+		e = expr_eliminate_yn(e);
+	}
+	trans_count = oldcount;
+	return e;
+}
+
+struct expr *expr_transform(struct expr *e)
+{
+	struct expr *tmp;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+	case E_SYMBOL:
+	case E_CHOICE:
+		break;
+	default:
+		e->left.expr = expr_transform(e->left.expr);
+		e->right.expr = expr_transform(e->right.expr);
+	}
+
+	switch (e->type) {
+	case E_EQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_no;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_UNEQUAL:
+		if (e->left.sym->type != S_BOOLEAN)
+			break;
+		if (e->right.sym == &symbol_no) {
+			e->type = E_SYMBOL;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_mod) {
+			printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name);
+			e->type = E_SYMBOL;
+			e->left.sym = &symbol_yes;
+			e->right.sym = NULL;
+			break;
+		}
+		if (e->right.sym == &symbol_yes) {
+			e->type = E_NOT;
+			e->left.expr = expr_alloc_symbol(e->left.sym);
+			e->right.sym = NULL;
+			break;
+		}
+		break;
+	case E_NOT:
+		switch (e->left.expr->type) {
+		case E_NOT:
+			// !!a -> a
+			tmp = e->left.expr->left.expr;
+			free(e->left.expr);
+			free(e);
+			e = tmp;
+			e = expr_transform(e);
+			break;
+		case E_EQUAL:
+		case E_UNEQUAL:
+			// !a='x' -> a!='x'
+			tmp = e->left.expr;
+			free(e);
+			e = tmp;
+			e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL;
+			break;
+		case E_OR:
+			// !(a || b) -> !a && !b
+			tmp = e->left.expr;
+			e->type = E_AND;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_AND:
+			// !(a && b) -> !a || !b
+			tmp = e->left.expr;
+			e->type = E_OR;
+			e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr);
+			tmp->type = E_NOT;
+			tmp->right.expr = NULL;
+			e = expr_transform(e);
+			break;
+		case E_SYMBOL:
+			if (e->left.expr->left.sym == &symbol_yes) {
+				// !'y' -> 'n'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_no;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_mod) {
+				// !'m' -> 'm'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_mod;
+				break;
+			}
+			if (e->left.expr->left.sym == &symbol_no) {
+				// !'n' -> 'y'
+				tmp = e->left.expr;
+				free(e);
+				e = tmp;
+				e->type = E_SYMBOL;
+				e->left.sym = &symbol_yes;
+				break;
+			}
+			break;
+		default:
+			;
+		}
+		break;
+	default:
+		;
+	}
+	return e;
+}
+
+int expr_contains_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return 0;
+
+	switch (dep->type) {
+	case E_AND:
+	case E_OR:
+		return expr_contains_symbol(dep->left.expr, sym) ||
+		       expr_contains_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+	case E_UNEQUAL:
+		return dep->left.sym == sym ||
+		       dep->right.sym == sym;
+	case E_NOT:
+		return expr_contains_symbol(dep->left.expr, sym);
+	default:
+		;
+	}
+	return 0;
+}
+
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym)
+{
+	if (!dep)
+		return false;
+
+	switch (dep->type) {
+	case E_AND:
+		return expr_depends_symbol(dep->left.expr, sym) ||
+		       expr_depends_symbol(dep->right.expr, sym);
+	case E_SYMBOL:
+		return dep->left.sym == sym;
+	case E_EQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod)
+				return true;
+		}
+		break;
+	case E_UNEQUAL:
+		if (dep->left.sym == sym) {
+			if (dep->right.sym == &symbol_no)
+				return true;
+		}
+		break;
+	default:
+		;
+	}
+	return false;
+}
+
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_AND, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2)
+{
+	struct expr *tmp = NULL;
+	expr_extract_eq(E_OR, &tmp, ep1, ep2);
+	if (tmp) {
+		*ep1 = expr_eliminate_yn(*ep1);
+		*ep2 = expr_eliminate_yn(*ep2);
+	}
+	return tmp;
+}
+
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2)
+{
+#define e1 (*ep1)
+#define e2 (*ep2)
+	if (e1->type == type) {
+		expr_extract_eq(type, ep, &e1->left.expr, &e2);
+		expr_extract_eq(type, ep, &e1->right.expr, &e2);
+		return;
+	}
+	if (e2->type == type) {
+		expr_extract_eq(type, ep, ep1, &e2->left.expr);
+		expr_extract_eq(type, ep, ep1, &e2->right.expr);
+		return;
+	}
+	if (expr_eq(e1, e2)) {
+		*ep = *ep ? expr_alloc_two(type, *ep, e1) : e1;
+		expr_free(e2);
+		if (type == E_AND) {
+			e1 = expr_alloc_symbol(&symbol_yes);
+			e2 = expr_alloc_symbol(&symbol_yes);
+		} else if (type == E_OR) {
+			e1 = expr_alloc_symbol(&symbol_no);
+			e2 = expr_alloc_symbol(&symbol_no);
+		}
+	}
+#undef e1
+#undef e2
+}
+
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym)
+{
+	struct expr *e1, *e2;
+
+	if (!e) {
+		e = expr_alloc_symbol(sym);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	}
+	switch (e->type) {
+	case E_AND:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_OR:
+		e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym);
+		e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym);
+		if (sym == &symbol_yes)
+			e = expr_alloc_two(E_OR, e1, e2);
+		if (sym == &symbol_no)
+			e = expr_alloc_two(E_AND, e1, e2);
+		if (type == E_UNEQUAL)
+			e = expr_alloc_one(E_NOT, e);
+		return e;
+	case E_NOT:
+		return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym);
+	case E_UNEQUAL:
+	case E_EQUAL:
+		if (type == E_EQUAL) {
+			if (sym == &symbol_yes)
+				return expr_copy(e);
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_no);
+			if (sym == &symbol_no)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+		} else {
+			if (sym == &symbol_yes)
+				return expr_alloc_one(E_NOT, expr_copy(e));
+			if (sym == &symbol_mod)
+				return expr_alloc_symbol(&symbol_yes);
+			if (sym == &symbol_no)
+				return expr_copy(e);
+		}
+		break;
+	case E_SYMBOL:
+		return expr_alloc_comp(type, e->left.sym, sym);
+	case E_CHOICE:
+	case E_RANGE:
+	case E_NONE:
+		/* panic */;
+	}
+	return NULL;
+}
+
+tristate expr_calc_value(struct expr *e)
+{
+	tristate val1, val2;
+	const char *str1, *str2;
+
+	if (!e)
+		return yes;
+
+	switch (e->type) {
+	case E_SYMBOL:
+		sym_calc_value(e->left.sym);
+		return e->left.sym->curr.tri;
+	case E_AND:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_AND(val1, val2);
+	case E_OR:
+		val1 = expr_calc_value(e->left.expr);
+		val2 = expr_calc_value(e->right.expr);
+		return E_OR(val1, val2);
+	case E_NOT:
+		val1 = expr_calc_value(e->left.expr);
+		return E_NOT(val1);
+	case E_EQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? yes : no;
+	case E_UNEQUAL:
+		sym_calc_value(e->left.sym);
+		sym_calc_value(e->right.sym);
+		str1 = sym_get_string_value(e->left.sym);
+		str2 = sym_get_string_value(e->right.sym);
+		return !strcmp(str1, str2) ? no : yes;
+	default:
+		printf("expr_calc_value: %d?\n", e->type);
+		return no;
+	}
+}
+
+int expr_compare_type(enum expr_type t1, enum expr_type t2)
+{
+#if 0
+	return 1;
+#else
+	if (t1 == t2)
+		return 0;
+	switch (t1) {
+	case E_EQUAL:
+	case E_UNEQUAL:
+		if (t2 == E_NOT)
+			return 1;
+	case E_NOT:
+		if (t2 == E_AND)
+			return 1;
+	case E_AND:
+		if (t2 == E_OR)
+			return 1;
+	case E_OR:
+		if (t2 == E_CHOICE)
+			return 1;
+	case E_CHOICE:
+		if (t2 == 0)
+			return 1;
+	default:
+		return -1;
+	}
+	printf("[%dgt%d?]", t1, t2);
+	return 0;
+#endif
+}
+
+void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)
+{
+	if (!e) {
+		fn(data, "y");
+		return;
+	}
+
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, "(");
+	switch (e->type) {
+	case E_SYMBOL:
+		if (e->left.sym->name)
+			fn(data, e->left.sym->name);
+		else
+			fn(data, "<choice>");
+		break;
+	case E_NOT:
+		fn(data, "!");
+		expr_print(e->left.expr, fn, data, E_NOT);
+		break;
+	case E_EQUAL:
+		fn(data, e->left.sym->name);
+		fn(data, "=");
+		fn(data, e->right.sym->name);
+		break;
+	case E_UNEQUAL:
+		fn(data, e->left.sym->name);
+		fn(data, "!=");
+		fn(data, e->right.sym->name);
+		break;
+	case E_OR:
+		expr_print(e->left.expr, fn, data, E_OR);
+		fn(data, " || ");
+		expr_print(e->right.expr, fn, data, E_OR);
+		break;
+	case E_AND:
+		expr_print(e->left.expr, fn, data, E_AND);
+		fn(data, " && ");
+		expr_print(e->right.expr, fn, data, E_AND);
+		break;
+	case E_CHOICE:
+		fn(data, e->right.sym->name);
+		if (e->left.expr) {
+			fn(data, " ^ ");
+			expr_print(e->left.expr, fn, data, E_CHOICE);
+		}
+		break;
+	case E_RANGE:
+		fn(data, "[");
+		fn(data, e->left.sym->name);
+		fn(data, " ");
+		fn(data, e->right.sym->name);
+		fn(data, "]");
+		break;
+	default:
+	  {
+		char buf[32];
+		sprintf(buf, "<unknown type %d>", e->type);
+		fn(data, buf);
+		break;
+	  }
+	}
+	if (expr_compare_type(prevtoken, e->type) > 0)
+		fn(data, ")");
+}
+
+static void expr_print_file_helper(void *data, const char *str)
+{
+	fwrite(str, strlen(str), 1, data);
+}
+
+void expr_fprint(struct expr *e, FILE *out)
+{
+	expr_print(e, expr_print_file_helper, out, E_NONE);
+}
+
+static void expr_print_gstr_helper(void *data, const char *str)
+{
+	str_append((struct gstr*)data, str);
+}
+
+void expr_gstr_print(struct expr *e, struct gstr *gs)
+{
+	expr_print(e, expr_print_gstr_helper, gs, E_NONE);
+}
diff --git a/2.3/menu/expr.h b/2.3/menu/expr.h
new file mode 100644
index 0000000..7d39ff4
--- /dev/null
+++ b/2.3/menu/expr.h
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef EXPR_H
+#define EXPR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdio.h>
+#ifndef __cplusplus
+#include <stdbool.h>
+#endif
+
+struct file {
+	struct file *next;
+	struct file *parent;
+	char *name;
+	int lineno;
+	int flags;
+};
+
+#define FILE_BUSY		0x0001
+#define FILE_SCANNED		0x0002
+#define FILE_PRINTED		0x0004
+
+typedef enum tristate {
+	no, mod, yes
+} tristate;
+
+enum expr_type {
+	E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
+};
+
+union expr_data {
+	struct expr *expr;
+	struct symbol *sym;
+};
+
+struct expr {
+	enum expr_type type;
+	union expr_data left, right;
+};
+
+#define E_OR(dep1, dep2)	(((dep1)>(dep2))?(dep1):(dep2))
+#define E_AND(dep1, dep2)	(((dep1)<(dep2))?(dep1):(dep2))
+#define E_NOT(dep)		(2-(dep))
+
+struct expr_value {
+	struct expr *expr;
+	tristate tri;
+};
+
+struct symbol_value {
+	void *val;
+	tristate tri;
+};
+
+enum symbol_type {
+	S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
+};
+
+struct symbol {
+	struct symbol *next;
+	char *name;
+	char *help;
+	enum symbol_type type;
+	struct symbol_value curr, user;
+	tristate visible;
+	int flags;
+	struct property *prop;
+	struct expr *dep, *dep2;
+	struct expr_value rev_dep;
+};
+
+#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
+
+#define SYMBOL_YES		0x0001
+#define SYMBOL_MOD		0x0002
+#define SYMBOL_NO		0x0004
+#define SYMBOL_CONST		0x0007
+#define SYMBOL_CHECK		0x0008
+#define SYMBOL_CHOICE		0x0010
+#define SYMBOL_CHOICEVAL	0x0020
+#define SYMBOL_PRINTED		0x0040
+#define SYMBOL_VALID		0x0080
+#define SYMBOL_OPTIONAL		0x0100
+#define SYMBOL_WRITE		0x0200
+#define SYMBOL_CHANGED		0x0400
+#define SYMBOL_NEW		0x0800
+#define SYMBOL_AUTO		0x1000
+#define SYMBOL_CHECKED		0x2000
+#define SYMBOL_CHECK_DONE	0x4000
+#define SYMBOL_WARNED		0x8000
+
+#define SYMBOL_MAXLENGTH	256
+#define SYMBOL_HASHSIZE		257
+#define SYMBOL_HASHMASK		0xff
+
+enum prop_type {
+	P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
+};
+
+struct property {
+	struct property *next;
+	struct symbol *sym;
+	enum prop_type type;
+	const char *text;
+	struct expr_value visible;
+	struct expr *expr;
+	struct menu *menu;
+	struct file *file;
+	int lineno;
+};
+
+#define for_all_properties(sym, st, tok) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->type == (tok))
+#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
+#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+#define for_all_prompts(sym, st) \
+	for (st = sym->prop; st; st = st->next) \
+		if (st->text)
+
+struct menu {
+	struct menu *next;
+	struct menu *parent;
+	struct menu *list;
+	struct symbol *sym;
+	struct property *prompt;
+	struct expr *dep;
+	unsigned int flags;
+	//char *help;
+	struct file *file;
+	int lineno;
+	void *data;
+};
+
+#define MENU_CHANGED		0x0001
+#define MENU_ROOT		0x0002
+
+#ifndef SWIG
+
+extern struct file *file_list;
+extern struct file *current_file;
+struct file *lookup_file(const char *name);
+
+extern struct symbol symbol_yes, symbol_no, symbol_mod;
+extern struct symbol *modules_sym;
+extern int cdebug;
+struct expr *expr_alloc_symbol(struct symbol *sym);
+struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
+struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
+struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
+struct expr *expr_copy(struct expr *org);
+void expr_free(struct expr *e);
+int expr_eq(struct expr *e1, struct expr *e2);
+void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
+tristate expr_calc_value(struct expr *e);
+struct expr *expr_eliminate_yn(struct expr *e);
+struct expr *expr_trans_bool(struct expr *e);
+struct expr *expr_eliminate_dups(struct expr *e);
+struct expr *expr_transform(struct expr *e);
+int expr_contains_symbol(struct expr *dep, struct symbol *sym);
+bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
+struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
+struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
+void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
+struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
+
+void expr_fprint(struct expr *e, FILE *out);
+struct gstr; /* forward */
+void expr_gstr_print(struct expr *e, struct gstr *gs);
+
+static inline int expr_is_yes(struct expr *e)
+{
+	return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
+}
+
+static inline int expr_is_no(struct expr *e)
+{
+	return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXPR_H */
diff --git a/2.3/menu/lex.zconf.c_shipped b/2.3/menu/lex.zconf.c_shipped
new file mode 100644
index 0000000..8e5e85e
--- /dev/null
+++ b/2.3/menu/lex.zconf.c_shipped
@@ -0,0 +1,3688 @@
+
+#line 3 "lex.zconf.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t;
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE zconfrestart(zconfin  )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#define YY_BUF_SIZE 16384
+#endif
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+extern int zconfleng;
+
+extern FILE *zconfin, *zconfout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+    #define YY_LESS_LINENO(n)
+
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		*yy_cp = (yy_hold_char); \
+		YY_RESTORE_YY_MORE_OFFSET \
+		(yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up zconftext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via zconfrestart()), so that the user can continue scanning by
+	 * just pointing zconfin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+
+	};
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when zconftext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+int zconfleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow zconfwrap()'s to do buffer switches
+ * instead of setting up a fresh zconfin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void zconfrestart (FILE *input_file  );
+void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size  );
+void zconf_delete_buffer (YY_BUFFER_STATE b  );
+void zconf_flush_buffer (YY_BUFFER_STATE b  );
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void zconfpop_buffer_state (void );
+
+static void zconfensure_buffer_stack (void );
+static void zconf_load_buffer_state (void );
+static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file  );
+
+#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len  );
+
+void *zconfalloc (yy_size_t  );
+void *zconfrealloc (void *,yy_size_t  );
+void zconffree (void *  );
+
+#define yy_new_buffer zconf_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){ \
+        zconfensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! YY_CURRENT_BUFFER ){\
+        zconfensure_buffer_stack (); \
+		YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+	} \
+	YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+
+#define zconfwrap(n) 1
+#define YY_SKIP_YYWRAP
+
+typedef unsigned char YY_CHAR;
+
+FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
+
+typedef int yy_state_type;
+
+extern int zconflineno;
+
+int zconflineno = 1;
+
+extern char *zconftext;
+#define yytext_ptr zconftext
+static yyconst flex_int16_t yy_nxt[][38] =
+    {
+    {
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+
+       12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
+       12,   12,   12,   12,   12,   12,   12,   12
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   18,   18,   19,   20,
+       21,   22,   18,   18,   23,   24,   18,   25,   18,   26,
+       27,   18,   28,   29,   30,   18,   18,   16
+    },
+
+    {
+       11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
+       16,   16,   16,   18,   16,   16,   18,   18,   19,   20,
+       21,   22,   18,   18,   23,   24,   18,   25,   18,   26,
+       27,   18,   28,   29,   30,   18,   18,   16
+
+    },
+
+    {
+       11,   31,   32,   33,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31
+    },
+
+    {
+       11,   31,   32,   33,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
+       31,   31,   31,   31,   31,   31,   31,   31
+    },
+
+    {
+       11,   34,   34,   35,   34,   36,   34,   34,   36,   34,
+       34,   34,   34,   34,   34,   37,   34,   34,   34,   34,
+
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34
+    },
+
+    {
+       11,   34,   34,   35,   34,   36,   34,   34,   36,   34,
+       34,   34,   34,   34,   34,   37,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
+       34,   34,   34,   34,   34,   34,   34,   34
+    },
+
+    {
+       11,   38,   38,   39,   40,   41,   42,   43,   41,   44,
+       45,   46,   47,   47,   48,   49,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   47,   47,   47,   51,
+       47,   47,   47,   47,   47,   47,   47,   52
+
+    },
+
+    {
+       11,   38,   38,   39,   40,   41,   42,   43,   41,   44,
+       45,   46,   47,   47,   48,   49,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   47,   47,   47,   51,
+       47,   47,   47,   47,   47,   47,   47,   52
+    },
+
+    {
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11
+    },
+
+    {
+       11,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+
+      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
+      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12
+    },
+
+    {
+       11,  -13,   53,   54,  -13,  -13,   55,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13
+    },
+
+    {
+       11,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14
+
+    },
+
+    {
+       11,   56,   56,   57,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56
+    },
+
+    {
+       11,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
+      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16
+    },
+
+    {
+       11,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17
+    },
+
+    {
+       11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
+      -18,  -18,  -18,   58,  -18,  -18,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -18
+    },
+
+    {
+       11,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
+      -19,  -19,  -19,   58,  -19,  -19,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   59,
+       58,   58,   58,   58,   58,   58,   58,  -19
+
+    },
+
+    {
+       11,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
+      -20,  -20,  -20,   58,  -20,  -20,   58,   58,   58,   58,
+       58,   58,   58,   58,   60,   58,   58,   58,   58,   61,
+       58,   58,   58,   58,   58,   58,   58,  -20
+    },
+
+    {
+       11,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
+      -21,  -21,  -21,   58,  -21,  -21,   58,   58,   58,   58,
+       58,   62,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -21
+    },
+
+    {
+       11,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
+      -22,  -22,  -22,   58,  -22,  -22,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   63,   58,
+       58,   58,   58,   58,   58,   58,   58,  -22
+    },
+
+    {
+       11,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
+      -23,  -23,  -23,   58,  -23,  -23,   58,   58,   58,   58,
+       58,   64,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -23
+    },
+
+    {
+       11,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
+      -24,  -24,  -24,   58,  -24,  -24,   58,   58,   58,   58,
+       58,   58,   65,   58,   58,   58,   58,   58,   66,   58,
+       58,   58,   58,   58,   58,   58,   58,  -24
+
+    },
+
+    {
+       11,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
+      -25,  -25,  -25,   58,  -25,  -25,   58,   67,   58,   58,
+       58,   68,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -25
+    },
+
+    {
+       11,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
+      -26,  -26,  -26,   58,  -26,  -26,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       69,   58,   58,   58,   58,   58,   58,  -26
+    },
+
+    {
+       11,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
+      -27,  -27,  -27,   58,  -27,  -27,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   70,   58,   58,   58,   58,  -27
+    },
+
+    {
+       11,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
+      -28,  -28,  -28,   58,  -28,  -28,   58,   71,   58,   58,
+       58,   72,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -28
+    },
+
+    {
+       11,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
+      -29,  -29,  -29,   58,  -29,  -29,   58,   58,   58,   58,
+       58,   73,   58,   58,   58,   58,   58,   58,   58,   74,
+       58,   58,   58,   58,   75,   58,   58,  -29
+
+    },
+
+    {
+       11,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
+      -30,  -30,  -30,   58,  -30,  -30,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   76,   58,   58,   58,   58,  -30
+    },
+
+    {
+       11,   77,   77,  -31,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77
+    },
+
+    {
+       11,  -32,   78,   79,  -32,  -32,  -32,  -32,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
+
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32
+    },
+
+    {
+       11,   80,  -33,  -33,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80
+    },
+
+    {
+       11,   81,   81,   82,   81,  -34,   81,   81,  -34,   81,
+       81,   81,   81,   81,   81,  -34,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81
+
+    },
+
+    {
+       11,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35
+    },
+
+    {
+       11,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36
+    },
+
+    {
+       11,   83,   83,   84,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
+
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   83,   83
+    },
+
+    {
+       11,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38
+    },
+
+    {
+       11,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
+      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39
+
+    },
+
+    {
+       11,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,   85,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40
+    },
+
+    {
+       11,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
+      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
+      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
+      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41
+    },
+
+    {
+       11,   86,   86,  -42,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86
+    },
+
+    {
+       11,  -43,  -43,  -43,  -43,  -43,  -43,   87,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43
+    },
+
+    {
+       11,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
+      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44
+
+    },
+
+    {
+       11,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45
+    },
+
+    {
+       11,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,
+      -46,   88,   89,   89,  -46,  -46,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -46
+    },
+
+    {
+       11,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
+      -47,   89,   89,   89,  -47,  -47,   89,   89,   89,   89,
+
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -47
+    },
+
+    {
+       11,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48
+    },
+
+    {
+       11,  -49,  -49,   90,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,
+      -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49
+
+    },
+
+    {
+       11,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
+      -50,   89,   89,   89,  -50,  -50,   89,   89,   89,   89,
+       89,   89,   91,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -50
+    },
+
+    {
+       11,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,   89,   89,   89,  -51,  -51,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   92,   89,
+       89,   89,   89,   89,   89,   89,   89,  -51
+    },
+
+    {
+       11,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+
+      -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
+      -52,  -52,  -52,  -52,  -52,  -52,  -52,   93
+    },
+
+    {
+       11,  -53,   53,   54,  -53,  -53,   55,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53
+    },
+
+    {
+       11,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,
+      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,
+      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,
+      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54
+
+    },
+
+    {
+       11,   56,   56,   57,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56
+    },
+
+    {
+       11,   56,   56,   57,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56
+    },
+
+    {
+       11,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57
+    },
+
+    {
+       11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
+      -58,  -58,  -58,   58,  -58,  -58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -58
+    },
+
+    {
+       11,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,
+      -59,  -59,  -59,   58,  -59,  -59,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   94,
+       58,   58,   58,   58,   58,   58,   58,  -59
+
+    },
+
+    {
+       11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
+      -60,  -60,  -60,   58,  -60,  -60,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   95,
+       58,   58,   58,   58,   58,   58,   58,  -60
+    },
+
+    {
+       11,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,
+      -61,  -61,  -61,   58,  -61,  -61,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   96,   97,   58,
+       58,   58,   58,   58,   58,   58,   58,  -61
+    },
+
+    {
+       11,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,
+      -62,  -62,  -62,   58,  -62,  -62,   58,   58,   58,   58,
+
+       58,   58,   98,   58,   58,   58,   58,   58,   58,   58,
+       99,   58,   58,   58,   58,   58,   58,  -62
+    },
+
+    {
+       11,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,
+      -63,  -63,  -63,   58,  -63,  -63,   58,  100,   58,   58,
+      101,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -63
+    },
+
+    {
+       11,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,
+      -64,  -64,  -64,   58,  -64,  -64,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  102,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  103,  -64
+
+    },
+
+    {
+       11,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,
+      -65,  -65,  -65,   58,  -65,  -65,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -65
+    },
+
+    {
+       11,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,
+      -66,  -66,  -66,   58,  -66,  -66,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  104,   58,   58,  -66
+    },
+
+    {
+       11,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,
+      -67,  -67,  -67,   58,  -67,  -67,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,  105,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -67
+    },
+
+    {
+       11,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,
+      -68,  -68,  -68,   58,  -68,  -68,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  106,   58,
+       58,   58,   58,   58,   58,   58,   58,  -68
+    },
+
+    {
+       11,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,
+      -69,  -69,  -69,   58,  -69,  -69,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  107,   58,   58,  -69
+
+    },
+
+    {
+       11,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,
+      -70,  -70,  -70,   58,  -70,  -70,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  108,
+       58,   58,   58,   58,   58,   58,   58,  -70
+    },
+
+    {
+       11,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,
+      -71,  -71,  -71,   58,  -71,  -71,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  109,   58,
+       58,   58,   58,   58,   58,   58,   58,  -71
+    },
+
+    {
+       11,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,
+      -72,  -72,  -72,   58,  -72,  -72,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,  110,   58,   58,   58,   58,   58,  -72
+    },
+
+    {
+       11,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,
+      -73,  -73,  -73,   58,  -73,  -73,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  111,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -73
+    },
+
+    {
+       11,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
+      -74,  -74,  -74,   58,  -74,  -74,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  112,   58,  -74
+
+    },
+
+    {
+       11,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
+      -75,  -75,  -75,   58,  -75,  -75,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  113,   58,   58,   58,   58,  -75
+    },
+
+    {
+       11,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
+      -76,  -76,  -76,   58,  -76,  -76,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  114,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -76
+    },
+
+    {
+       11,   77,   77,  -77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77
+    },
+
+    {
+       11,  -78,   78,   79,  -78,  -78,  -78,  -78,  -78,  -78,
+      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
+      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
+      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78
+    },
+
+    {
+       11,   80,  -79,  -79,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80
+
+    },
+
+    {
+       11,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
+      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
+      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
+      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80
+    },
+
+    {
+       11,   81,   81,   82,   81,  -81,   81,   81,  -81,   81,
+       81,   81,   81,   81,   81,  -81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81
+    },
+
+    {
+       11,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
+      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
+
+      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
+      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82
+    },
+
+    {
+       11,  -83,  -83,   84,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83
+    },
+
+    {
+       11,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
+      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
+      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
+      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84
+
+    },
+
+    {
+       11,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85
+    },
+
+    {
+       11,   86,   86,  -86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86
+    },
+
+    {
+       11,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
+      -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
+
+      -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
+      -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87
+    },
+
+    {
+       11,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,
+      -88,  115,   89,   89,  -88,  -88,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -88
+    },
+
+    {
+       11,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,
+      -89,   89,   89,   89,  -89,  -89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -89
+
+    },
+
+    {
+       11,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90
+    },
+
+    {
+       11,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,
+      -91,   89,   89,   89,  -91,  -91,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -91
+    },
+
+    {
+       11,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,
+      -92,   89,   89,   89,  -92,  -92,   89,   89,   89,   89,
+
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -92
+    },
+
+    {
+       11,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93
+    },
+
+    {
+       11,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,
+      -94,  -94,  -94,   58,  -94,  -94,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  116,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -94
+
+    },
+
+    {
+       11,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,
+      -95,  -95,  -95,   58,  -95,  -95,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  117,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -95
+    },
+
+    {
+       11,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,
+      -96,  -96,  -96,   58,  -96,  -96,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  118,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -96
+    },
+
+    {
+       11,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,
+      -97,  -97,  -97,   58,  -97,  -97,   58,   58,   58,   58,
+
+       58,   58,  119,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -97
+    },
+
+    {
+       11,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,
+      -98,  -98,  -98,   58,  -98,  -98,  120,  121,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -98
+    },
+
+    {
+       11,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,
+      -99,  -99,  -99,   58,  -99,  -99,   58,   58,   58,   58,
+       58,  122,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -99
+
+    },
+
+    {
+       11, -100, -100, -100, -100, -100, -100, -100, -100, -100,
+     -100, -100, -100,   58, -100, -100,   58,   58,  123,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -100
+    },
+
+    {
+       11, -101, -101, -101, -101, -101, -101, -101, -101, -101,
+     -101, -101, -101,   58, -101, -101,   58,   58,   58,  124,
+       58,   58,   58,   58,   58,  125,   58,  126,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -101
+    },
+
+    {
+       11, -102, -102, -102, -102, -102, -102, -102, -102, -102,
+     -102, -102, -102,   58, -102, -102,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+      127,   58,   58,   58,   58,   58,   58, -102
+    },
+
+    {
+       11, -103, -103, -103, -103, -103, -103, -103, -103, -103,
+     -103, -103, -103,   58, -103, -103,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -103
+    },
+
+    {
+       11, -104, -104, -104, -104, -104, -104, -104, -104, -104,
+     -104, -104, -104,   58, -104, -104,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -104
+
+    },
+
+    {
+       11, -105, -105, -105, -105, -105, -105, -105, -105, -105,
+     -105, -105, -105,   58, -105, -105,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  128,   58,
+       58,   58,   58,   58,   58,   58,   58, -105
+    },
+
+    {
+       11, -106, -106, -106, -106, -106, -106, -106, -106, -106,
+     -106, -106, -106,   58, -106, -106,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  129,   58, -106
+    },
+
+    {
+       11, -107, -107, -107, -107, -107, -107, -107, -107, -107,
+     -107, -107, -107,   58, -107, -107,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,  130,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -107
+    },
+
+    {
+       11, -108, -108, -108, -108, -108, -108, -108, -108, -108,
+     -108, -108, -108,   58, -108, -108,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  131,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -108
+    },
+
+    {
+       11, -109, -109, -109, -109, -109, -109, -109, -109, -109,
+     -109, -109, -109,   58, -109, -109,   58,   58,   58,   58,
+       58,   58,   58,  132,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -109
+
+    },
+
+    {
+       11, -110, -110, -110, -110, -110, -110, -110, -110, -110,
+     -110, -110, -110,   58, -110, -110,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  133,   58, -110
+    },
+
+    {
+       11, -111, -111, -111, -111, -111, -111, -111, -111, -111,
+     -111, -111, -111,   58, -111, -111,   58,   58,   58,   58,
+       58,  134,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -111
+    },
+
+    {
+       11, -112, -112, -112, -112, -112, -112, -112, -112, -112,
+     -112, -112, -112,   58, -112, -112,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  135,   58,   58,   58,   58, -112
+    },
+
+    {
+       11, -113, -113, -113, -113, -113, -113, -113, -113, -113,
+     -113, -113, -113,   58, -113, -113,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  136,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -113
+    },
+
+    {
+       11, -114, -114, -114, -114, -114, -114, -114, -114, -114,
+     -114, -114, -114,   58, -114, -114,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  137,   58,   58,   58, -114
+
+    },
+
+    {
+       11, -115, -115, -115, -115, -115, -115, -115, -115, -115,
+     -115,   89,   89,   89, -115, -115,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89, -115
+    },
+
+    {
+       11, -116, -116, -116, -116, -116, -116, -116, -116, -116,
+     -116, -116, -116,   58, -116, -116,   58,   58,   58,   58,
+       58,  138,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -116
+    },
+
+    {
+       11, -117, -117, -117, -117, -117, -117, -117, -117, -117,
+     -117, -117, -117,   58, -117, -117,   58,   58,   58,  139,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -117
+    },
+
+    {
+       11, -118, -118, -118, -118, -118, -118, -118, -118, -118,
+     -118, -118, -118,   58, -118, -118,   58,   58,   58,   58,
+       58,  140,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -118
+    },
+
+    {
+       11, -119, -119, -119, -119, -119, -119, -119, -119, -119,
+     -119, -119, -119,   58, -119, -119,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  141,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -119
+
+    },
+
+    {
+       11, -120, -120, -120, -120, -120, -120, -120, -120, -120,
+     -120, -120, -120,   58, -120, -120,   58,   58,  142,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  143,   58,   58, -120
+    },
+
+    {
+       11, -121, -121, -121, -121, -121, -121, -121, -121, -121,
+     -121, -121, -121,   58, -121, -121,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  144,   58, -121
+    },
+
+    {
+       11, -122, -122, -122, -122, -122, -122, -122, -122, -122,
+     -122, -122, -122,   58, -122, -122,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,  145,   58,
+       58,   58,   58,   58,   58,   58,   58, -122
+    },
+
+    {
+       11, -123, -123, -123, -123, -123, -123, -123, -123, -123,
+     -123, -123, -123,   58, -123, -123,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  146,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -123
+    },
+
+    {
+       11, -124, -124, -124, -124, -124, -124, -124, -124, -124,
+     -124, -124, -124,   58, -124, -124,   58,   58,   58,   58,
+       58,   58,   58,   58,  147,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -124
+
+    },
+
+    {
+       11, -125, -125, -125, -125, -125, -125, -125, -125, -125,
+     -125, -125, -125,   58, -125, -125,   58,   58,   58,   58,
+       58,   58,  148,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -125
+    },
+
+    {
+       11, -126, -126, -126, -126, -126, -126, -126, -126, -126,
+     -126, -126, -126,   58, -126, -126,   58,   58,   58,   58,
+       58,  149,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -126
+    },
+
+    {
+       11, -127, -127, -127, -127, -127, -127, -127, -127, -127,
+     -127, -127, -127,   58, -127, -127,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -127
+    },
+
+    {
+       11, -128, -128, -128, -128, -128, -128, -128, -128, -128,
+     -128, -128, -128,   58, -128, -128,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  150,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -128
+    },
+
+    {
+       11, -129, -129, -129, -129, -129, -129, -129, -129, -129,
+     -129, -129, -129,   58, -129, -129,   58,   58,   58,  151,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -129
+
+    },
+
+    {
+       11, -130, -130, -130, -130, -130, -130, -130, -130, -130,
+     -130, -130, -130,   58, -130, -130,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  152,
+       58,   58,   58,   58,   58,   58,   58, -130
+    },
+
+    {
+       11, -131, -131, -131, -131, -131, -131, -131, -131, -131,
+     -131, -131, -131,   58, -131, -131,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+      153,   58,   58,   58,   58,   58,   58, -131
+    },
+
+    {
+       11, -132, -132, -132, -132, -132, -132, -132, -132, -132,
+     -132, -132, -132,   58, -132, -132,   58,   58,   58,   58,
+
+       58,  154,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -132
+    },
+
+    {
+       11, -133, -133, -133, -133, -133, -133, -133, -133, -133,
+     -133, -133, -133,   58, -133, -133,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  155,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -133
+    },
+
+    {
+       11, -134, -134, -134, -134, -134, -134, -134, -134, -134,
+     -134, -134, -134,   58, -134, -134,   58,   58,   58,  156,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -134
+
+    },
+
+    {
+       11, -135, -135, -135, -135, -135, -135, -135, -135, -135,
+     -135, -135, -135,   58, -135, -135,   58,   58,   58,  157,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -135
+    },
+
+    {
+       11, -136, -136, -136, -136, -136, -136, -136, -136, -136,
+     -136, -136, -136,   58, -136, -136,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  158,   58,
+       58,   58,   58,   58,   58,   58,   58, -136
+    },
+
+    {
+       11, -137, -137, -137, -137, -137, -137, -137, -137, -137,
+     -137, -137, -137,   58, -137, -137,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  159,   58,   58, -137
+    },
+
+    {
+       11, -138, -138, -138, -138, -138, -138, -138, -138, -138,
+     -138, -138, -138,   58, -138, -138,   58,  160,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -138
+    },
+
+    {
+       11, -139, -139, -139, -139, -139, -139, -139, -139, -139,
+     -139, -139, -139,   58, -139, -139,   58,   58,   58,   58,
+       58,  161,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -139
+
+    },
+
+    {
+       11, -140, -140, -140, -140, -140, -140, -140, -140, -140,
+     -140, -140, -140,   58, -140, -140,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  162,   58,
+       58,   58,   58,   58,   58,   58,   58, -140
+    },
+
+    {
+       11, -141, -141, -141, -141, -141, -141, -141, -141, -141,
+     -141, -141, -141,   58, -141, -141,   58,   58,   58,   58,
+       58,   58,   58,  163,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -141
+    },
+
+    {
+       11, -142, -142, -142, -142, -142, -142, -142, -142, -142,
+     -142, -142, -142,   58, -142, -142,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  164,
+       58,   58,   58,   58,   58,   58,   58, -142
+    },
+
+    {
+       11, -143, -143, -143, -143, -143, -143, -143, -143, -143,
+     -143, -143, -143,   58, -143, -143,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  165,   58,   58,   58,   58, -143
+    },
+
+    {
+       11, -144, -144, -144, -144, -144, -144, -144, -144, -144,
+     -144, -144, -144,   58, -144, -144,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  166,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -144
+
+    },
+
+    {
+       11, -145, -145, -145, -145, -145, -145, -145, -145, -145,
+     -145, -145, -145,   58, -145, -145,   58,   58,   58,   58,
+      167,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -145
+    },
+
+    {
+       11, -146, -146, -146, -146, -146, -146, -146, -146, -146,
+     -146, -146, -146,   58, -146, -146,   58,   58,   58,   58,
+       58,  168,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -146
+    },
+
+    {
+       11, -147, -147, -147, -147, -147, -147, -147, -147, -147,
+     -147, -147, -147,   58, -147, -147,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  169,
+       58,   58,   58,   58,   58,   58,   58, -147
+    },
+
+    {
+       11, -148, -148, -148, -148, -148, -148, -148, -148, -148,
+     -148, -148, -148,   58, -148, -148,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -148
+    },
+
+    {
+       11, -149, -149, -149, -149, -149, -149, -149, -149, -149,
+     -149, -149, -149,   58, -149, -149,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  170,   58,
+       58,   58,   58,   58,   58,   58,   58, -149
+
+    },
+
+    {
+       11, -150, -150, -150, -150, -150, -150, -150, -150, -150,
+     -150, -150, -150,   58, -150, -150,   58,   58,   58,   58,
+       58,  171,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -150
+    },
+
+    {
+       11, -151, -151, -151, -151, -151, -151, -151, -151, -151,
+     -151, -151, -151,   58, -151, -151,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  172,
+       58,   58,   58,   58,   58,   58,   58, -151
+    },
+
+    {
+       11, -152, -152, -152, -152, -152, -152, -152, -152, -152,
+     -152, -152, -152,   58, -152, -152,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,  173,   58,
+       58,   58,   58,   58,   58,   58,   58, -152
+    },
+
+    {
+       11, -153, -153, -153, -153, -153, -153, -153, -153, -153,
+     -153, -153, -153,   58, -153, -153,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  174,   58,   58, -153
+    },
+
+    {
+       11, -154, -154, -154, -154, -154, -154, -154, -154, -154,
+     -154, -154, -154,   58, -154, -154,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -154
+
+    },
+
+    {
+       11, -155, -155, -155, -155, -155, -155, -155, -155, -155,
+     -155, -155, -155,   58, -155, -155,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  175,   58,   58,   58,   58, -155
+    },
+
+    {
+       11, -156, -156, -156, -156, -156, -156, -156, -156, -156,
+     -156, -156, -156,   58, -156, -156,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  176,   58,   58, -156
+    },
+
+    {
+       11, -157, -157, -157, -157, -157, -157, -157, -157, -157,
+     -157, -157, -157,   58, -157, -157,   58,   58,   58,   58,
+
+       58,  177,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -157
+    },
+
+    {
+       11, -158, -158, -158, -158, -158, -158, -158, -158, -158,
+     -158, -158, -158,   58, -158, -158,   58,   58,   58,   58,
+       58,   58,   58,  178,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -158
+    },
+
+    {
+       11, -159, -159, -159, -159, -159, -159, -159, -159, -159,
+     -159, -159, -159,   58, -159, -159,   58,  179,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -159
+
+    },
+
+    {
+       11, -160, -160, -160, -160, -160, -160, -160, -160, -160,
+     -160, -160, -160,   58, -160, -160,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  180,   58,
+       58,   58,   58,   58,   58,   58,   58, -160
+    },
+
+    {
+       11, -161, -161, -161, -161, -161, -161, -161, -161, -161,
+     -161, -161, -161,   58, -161, -161,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -161
+    },
+
+    {
+       11, -162, -162, -162, -162, -162, -162, -162, -162, -162,
+     -162, -162, -162,   58, -162, -162,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  181,   58,   58, -162
+    },
+
+    {
+       11, -163, -163, -163, -163, -163, -163, -163, -163, -163,
+     -163, -163, -163,   58, -163, -163,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -163
+    },
+
+    {
+       11, -164, -164, -164, -164, -164, -164, -164, -164, -164,
+     -164, -164, -164,   58, -164, -164,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  182,
+       58,   58,   58,   58,   58,   58,   58, -164
+
+    },
+
+    {
+       11, -165, -165, -165, -165, -165, -165, -165, -165, -165,
+     -165, -165, -165,   58, -165, -165,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  183,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -165
+    },
+
+    {
+       11, -166, -166, -166, -166, -166, -166, -166, -166, -166,
+     -166, -166, -166,   58, -166, -166,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  184,   58,   58, -166
+    },
+
+    {
+       11, -167, -167, -167, -167, -167, -167, -167, -167, -167,
+     -167, -167, -167,   58, -167, -167,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  185,   58,   58,   58, -167
+    },
+
+    {
+       11, -168, -168, -168, -168, -168, -168, -168, -168, -168,
+     -168, -168, -168,   58, -168, -168,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -168
+    },
+
+    {
+       11, -169, -169, -169, -169, -169, -169, -169, -169, -169,
+     -169, -169, -169,   58, -169, -169,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  186,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -169
+
+    },
+
+    {
+       11, -170, -170, -170, -170, -170, -170, -170, -170, -170,
+     -170, -170, -170,   58, -170, -170,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  187,   58, -170
+    },
+
+    {
+       11, -171, -171, -171, -171, -171, -171, -171, -171, -171,
+     -171, -171, -171,   58, -171, -171,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  188,   58,
+       58,   58,   58,   58,   58,   58,   58, -171
+    },
+
+    {
+       11, -172, -172, -172, -172, -172, -172, -172, -172, -172,
+     -172, -172, -172,   58, -172, -172,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,  189,   58,
+       58,   58,   58,   58,   58,   58,   58, -172
+    },
+
+    {
+       11, -173, -173, -173, -173, -173, -173, -173, -173, -173,
+     -173, -173, -173,   58, -173, -173,   58,  190,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -173
+    },
+
+    {
+       11, -174, -174, -174, -174, -174, -174, -174, -174, -174,
+     -174, -174, -174,   58, -174, -174,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -174
+
+    },
+
+    {
+       11, -175, -175, -175, -175, -175, -175, -175, -175, -175,
+     -175, -175, -175,   58, -175, -175,   58,   58,   58,   58,
+       58,  191,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -175
+    },
+
+    {
+       11, -176, -176, -176, -176, -176, -176, -176, -176, -176,
+     -176, -176, -176,   58, -176, -176,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -176
+    },
+
+    {
+       11, -177, -177, -177, -177, -177, -177, -177, -177, -177,
+     -177, -177, -177,   58, -177, -177,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -177
+    },
+
+    {
+       11, -178, -178, -178, -178, -178, -178, -178, -178, -178,
+     -178, -178, -178,   58, -178, -178,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -178
+    },
+
+    {
+       11, -179, -179, -179, -179, -179, -179, -179, -179, -179,
+     -179, -179, -179,   58, -179, -179,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  192,   58,   58, -179
+
+    },
+
+    {
+       11, -180, -180, -180, -180, -180, -180, -180, -180, -180,
+     -180, -180, -180,   58, -180, -180,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -180
+    },
+
+    {
+       11, -181, -181, -181, -181, -181, -181, -181, -181, -181,
+     -181, -181, -181,   58, -181, -181,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -181
+    },
+
+    {
+       11, -182, -182, -182, -182, -182, -182, -182, -182, -182,
+     -182, -182, -182,   58, -182, -182,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,  193,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -182
+    },
+
+    {
+       11, -183, -183, -183, -183, -183, -183, -183, -183, -183,
+     -183, -183, -183,   58, -183, -183,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  194,   58,   58,   58, -183
+    },
+
+    {
+       11, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+     -184, -184, -184,   58, -184, -184,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -184
+
+    },
+
+    {
+       11, -185, -185, -185, -185, -185, -185, -185, -185, -185,
+     -185, -185, -185,   58, -185, -185,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -185
+    },
+
+    {
+       11, -186, -186, -186, -186, -186, -186, -186, -186, -186,
+     -186, -186, -186,   58, -186, -186,   58,   58,   58,  195,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -186
+    },
+
+    {
+       11, -187, -187, -187, -187, -187, -187, -187, -187, -187,
+     -187, -187, -187,   58, -187, -187,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -187
+    },
+
+    {
+       11, -188, -188, -188, -188, -188, -188, -188, -188, -188,
+     -188, -188, -188,   58, -188, -188,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  196,   58, -188
+    },
+
+    {
+       11, -189, -189, -189, -189, -189, -189, -189, -189, -189,
+     -189, -189, -189,   58, -189, -189,   58,   58,   58,   58,
+       58,   58,  197,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -189
+
+    },
+
+    {
+       11, -190, -190, -190, -190, -190, -190, -190, -190, -190,
+     -190, -190, -190,   58, -190, -190,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  198,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -190
+    },
+
+    {
+       11, -191, -191, -191, -191, -191, -191, -191, -191, -191,
+     -191, -191, -191,   58, -191, -191,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  199,   58,   58,   58, -191
+    },
+
+    {
+       11, -192, -192, -192, -192, -192, -192, -192, -192, -192,
+     -192, -192, -192,   58, -192, -192,   58,   58,   58,   58,
+
+       58,  200,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -192
+    },
+
+    {
+       11, -193, -193, -193, -193, -193, -193, -193, -193, -193,
+     -193, -193, -193,   58, -193, -193,   58,   58,   58,   58,
+       58,  201,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -193
+    },
+
+    {
+       11, -194, -194, -194, -194, -194, -194, -194, -194, -194,
+     -194, -194, -194,   58, -194, -194,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  202,   58,   58, -194
+
+    },
+
+    {
+       11, -195, -195, -195, -195, -195, -195, -195, -195, -195,
+     -195, -195, -195,   58, -195, -195,   58,   58,   58,   58,
+       58,  203,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -195
+    },
+
+    {
+       11, -196, -196, -196, -196, -196, -196, -196, -196, -196,
+     -196, -196, -196,   58, -196, -196,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -196
+    },
+
+    {
+       11, -197, -197, -197, -197, -197, -197, -197, -197, -197,
+     -197, -197, -197,   58, -197, -197,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,  204,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -197
+    },
+
+    {
+       11, -198, -198, -198, -198, -198, -198, -198, -198, -198,
+     -198, -198, -198,   58, -198, -198,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -198
+    },
+
+    {
+       11, -199, -199, -199, -199, -199, -199, -199, -199, -199,
+     -199, -199, -199,   58, -199, -199,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -199
+
+    },
+
+    {
+       11, -200, -200, -200, -200, -200, -200, -200, -200, -200,
+     -200, -200, -200,   58, -200, -200,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -200
+    },
+
+    {
+       11, -201, -201, -201, -201, -201, -201, -201, -201, -201,
+     -201, -201, -201,   58, -201, -201,   58,  205,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -201
+    },
+
+    {
+       11, -202, -202, -202, -202, -202, -202, -202, -202, -202,
+     -202, -202, -202,   58, -202, -202,   58,  206,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -202
+    },
+
+    {
+       11, -203, -203, -203, -203, -203, -203, -203, -203, -203,
+     -203, -203, -203,   58, -203, -203,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -203
+    },
+
+    {
+       11, -204, -204, -204, -204, -204, -204, -204, -204, -204,
+     -204, -204, -204,   58, -204, -204,   58,   58,   58,   58,
+       58,   58,   58,  207,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -204
+
+    },
+
+    {
+       11, -205, -205, -205, -205, -205, -205, -205, -205, -205,
+     -205, -205, -205,   58, -205, -205,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  208,   58,
+       58,   58,   58,   58,   58,   58,   58, -205
+    },
+
+    {
+       11, -206, -206, -206, -206, -206, -206, -206, -206, -206,
+     -206, -206, -206,   58, -206, -206,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  209,   58,   58, -206
+    },
+
+    {
+       11, -207, -207, -207, -207, -207, -207, -207, -207, -207,
+     -207, -207, -207,   58, -207, -207,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -207
+    },
+
+    {
+       11, -208, -208, -208, -208, -208, -208, -208, -208, -208,
+     -208, -208, -208,   58, -208, -208,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -208
+    },
+
+    {
+       11, -209, -209, -209, -209, -209, -209, -209, -209, -209,
+     -209, -209, -209,   58, -209, -209,   58,   58,   58,   58,
+       58,  210,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -209
+
+    },
+
+    {
+       11, -210, -210, -210, -210, -210, -210, -210, -210, -210,
+     -210, -210, -210,   58, -210, -210,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -210
+    },
+
+    } ;
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up zconftext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	(yytext_ptr) = yy_bp; \
+	zconfleng = (size_t) (yy_cp - yy_bp); \
+	(yy_hold_char) = *yy_cp; \
+	*yy_cp = '\0'; \
+	(yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 64
+#define YY_END_OF_BUFFER 65
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+	{
+	flex_int32_t yy_verify;
+	flex_int32_t yy_nxt;
+	};
+static yyconst flex_int16_t yy_accept[211] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       65,    5,    4,    3,    2,   36,   37,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       63,   60,   62,   55,   59,   58,   57,   53,   48,   42,
+       47,   51,   53,   40,   41,   50,   50,   43,   53,   50,
+       50,   53,    4,    3,    2,    2,    1,   35,   35,   35,
+       35,   35,   35,   35,   16,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   63,   60,   62,   61,
+       55,   54,   57,   56,   44,   51,   38,   50,   50,   52,
+       45,   46,   39,   35,   35,   35,   35,   35,   35,   35,
+
+       35,   35,   30,   29,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   49,   25,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   15,   35,    7,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   17,   35,   35,
+       35,   35,   35,   34,   35,   35,   35,   35,   35,   35,
+       10,   35,   13,   35,   35,   35,   35,   33,   35,   35,
+       35,   35,   35,   22,   35,   32,    9,   31,   35,   26,
+       12,   35,   35,   21,   18,   35,    8,   35,   35,   35,
+       35,   35,   27,   35,   35,    6,   35,   20,   19,   23,
+
+       35,   35,   11,   35,   35,   35,   14,   28,   35,   24
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    5,    6,    1,    1,    7,    8,    9,
+       10,    1,    1,    1,   11,   12,   12,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,    1,    1,    1,
+       14,    1,    1,    1,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+        1,   15,    1,    1,   16,    1,   17,   18,   19,   20,
+
+       21,   22,   23,   24,   25,   13,   13,   26,   27,   28,
+       29,   30,   31,   32,   33,   34,   35,   13,   13,   36,
+       13,   13,    1,   37,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+extern int zconf_flex_debug;
+int zconf_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *zconftext;
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE	16
+
+char *text;
+static char *text_ptr;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static struct buffer *zconf_endfile(void);
+
+void new_string(void)
+{
+	text = malloc(START_STRSIZE);
+	text_asize = START_STRSIZE;
+	text_ptr = text;
+	text_size = 0;
+	*text_ptr = 0;
+}
+
+void append_string(const char *str, int size)
+{
+	int new_size = text_size + size + 1;
+	if (new_size > text_asize) {
+		text = realloc(text, new_size);
+		text_asize = new_size;
+		text_ptr = text + text_size;
+	}
+	memcpy(text_ptr, str, size);
+	text_ptr += size;
+	text_size += size;
+	*text_ptr = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+	text = malloc(size + 1);
+	memcpy(text, str, size);
+	text[size] = 0;
+}
+
+#define INITIAL 0
+#define COMMAND 1
+#define HELP 2
+#define STRING 3
+#define PARAM 4
+
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int zconfwrap (void );
+#else
+extern int zconfwrap (void );
+#endif
+#endif
+
+    static void yyunput (int c,char *buf_ptr  );
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
+#endif
+
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
+#else
+static int input (void );
+#endif
+
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	errno=0; \
+	while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \
+	{ \
+		if( errno != EINTR) \
+		{ \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+			break; \
+		} \
+		errno=0; \
+		clearerr(zconfin); \
+	}\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int zconflex (void);
+
+#define YY_DECL int zconflex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after zconftext and zconfleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+	int str = 0;
+	int ts, i;
+
+	if ( (yy_init) )
+		{
+		(yy_init) = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! (yy_start) )
+			(yy_start) = 1;	/* first start state */
+
+		if ( ! zconfin )
+			zconfin = stdin;
+
+		if ( ! zconfout )
+			zconfout = stdout;
+
+		if ( ! YY_CURRENT_BUFFER ) {
+			zconfensure_buffer_stack ();
+			YY_CURRENT_BUFFER_LVALUE =
+				zconf_create_buffer(zconfin,YY_BUF_SIZE );
+		}
+
+		zconf_load_buffer_state( );
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = (yy_c_buf_p);
+
+		/* Support of zconftext. */
+		*yy_cp = (yy_hold_char);
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = (yy_start);
+yy_match:
+		while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)]  ]) > 0 )
+			++yy_cp;
+
+		yy_current_state = -yy_current_state;
+
+yy_find_action:
+		yy_act = yy_accept[yy_current_state];
+
+		YY_DO_BEFORE_ACTION;
+
+do_action:	/* This label is used only to access EOF actions. */
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+case 1:
+/* rule 1 can match eol */
+YY_RULE_SETUP
+current_file->lineno++;
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+
+	YY_BREAK
+case 3:
+/* rule 3 can match eol */
+YY_RULE_SETUP
+current_file->lineno++; return T_EOL;
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+{
+	BEGIN(COMMAND);
+}
+	YY_BREAK
+case 5:
+YY_RULE_SETUP
+{
+	unput(zconftext[0]);
+	BEGIN(COMMAND);
+}
+	YY_BREAK
+
+case 6:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_MAINMENU;
+	YY_BREAK
+case 7:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_MENU;
+	YY_BREAK
+case 8:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_ENDMENU;
+	YY_BREAK
+case 9:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_SOURCE;
+	YY_BREAK
+case 10:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_CHOICE;
+	YY_BREAK
+case 11:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_ENDCHOICE;
+	YY_BREAK
+case 12:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_COMMENT;
+	YY_BREAK
+case 13:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_CONFIG;
+	YY_BREAK
+case 14:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_MENUCONFIG;
+	YY_BREAK
+case 15:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_HELP;
+	YY_BREAK
+case 16:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_IF;
+	YY_BREAK
+case 17:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_ENDIF;
+	YY_BREAK
+case 18:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_DEPENDS;
+	YY_BREAK
+case 19:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_REQUIRES;
+	YY_BREAK
+case 20:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_OPTIONAL;
+	YY_BREAK
+case 21:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_DEFAULT;
+	YY_BREAK
+case 22:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_PROMPT;
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_TRISTATE;
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_DEF_TRISTATE;
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_BOOLEAN;
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_BOOLEAN;
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_DEF_BOOLEAN;
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_DEF_BOOLEAN;
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_INT;
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_HEX;
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_STRING;
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_SELECT;
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_SELECT;
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_RANGE;
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+{
+		alloc_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	YY_BREAK
+case 36:
+YY_RULE_SETUP
+
+	YY_BREAK
+case 37:
+/* rule 37 can match eol */
+YY_RULE_SETUP
+current_file->lineno++; BEGIN(INITIAL);
+	YY_BREAK
+
+case 38:
+YY_RULE_SETUP
+return T_AND;
+	YY_BREAK
+case 39:
+YY_RULE_SETUP
+return T_OR;
+	YY_BREAK
+case 40:
+YY_RULE_SETUP
+return T_OPEN_PAREN;
+	YY_BREAK
+case 41:
+YY_RULE_SETUP
+return T_CLOSE_PAREN;
+	YY_BREAK
+case 42:
+YY_RULE_SETUP
+return T_NOT;
+	YY_BREAK
+case 43:
+YY_RULE_SETUP
+return T_EQUAL;
+	YY_BREAK
+case 44:
+YY_RULE_SETUP
+return T_UNEQUAL;
+	YY_BREAK
+case 45:
+YY_RULE_SETUP
+return T_IF;
+	YY_BREAK
+case 46:
+YY_RULE_SETUP
+return T_ON;
+	YY_BREAK
+case 47:
+YY_RULE_SETUP
+{
+		str = zconftext[0];
+		new_string();
+		BEGIN(STRING);
+	}
+	YY_BREAK
+case 48:
+/* rule 48 can match eol */
+YY_RULE_SETUP
+BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	YY_BREAK
+case 49:
+YY_RULE_SETUP
+/* ignore */
+	YY_BREAK
+case 50:
+YY_RULE_SETUP
+{
+		alloc_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	YY_BREAK
+case 51:
+YY_RULE_SETUP
+/* comment */
+	YY_BREAK
+case 52:
+/* rule 52 can match eol */
+YY_RULE_SETUP
+current_file->lineno++;
+	YY_BREAK
+case 53:
+YY_RULE_SETUP
+
+	YY_BREAK
+case YY_STATE_EOF(PARAM):
+{
+		BEGIN(INITIAL);
+	}
+	YY_BREAK
+
+case 54:
+/* rule 54 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	YY_BREAK
+case 55:
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+	}
+	YY_BREAK
+case 56:
+/* rule 56 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		append_string(zconftext + 1, zconfleng - 1);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	YY_BREAK
+case 57:
+YY_RULE_SETUP
+{
+		append_string(zconftext + 1, zconfleng - 1);
+	}
+	YY_BREAK
+case 58:
+YY_RULE_SETUP
+{
+		if (str == zconftext[0]) {
+			BEGIN(PARAM);
+			zconflval.string = text;
+			return T_WORD_QUOTE;
+		} else
+			append_string(zconftext, 1);
+	}
+	YY_BREAK
+case 59:
+/* rule 59 can match eol */
+YY_RULE_SETUP
+{
+		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+		current_file->lineno++;
+		BEGIN(INITIAL);
+		return T_EOL;
+	}
+	YY_BREAK
+case YY_STATE_EOF(STRING):
+{
+		BEGIN(INITIAL);
+	}
+	YY_BREAK
+
+case 60:
+YY_RULE_SETUP
+{
+		ts = 0;
+		for (i = 0; i < zconfleng; i++) {
+			if (zconftext[i] == '\t')
+				ts = (ts & ~7) + 8;
+			else
+				ts++;
+		}
+		last_ts = ts;
+		if (first_ts) {
+			if (ts < first_ts) {
+				zconf_endhelp();
+				return T_HELPTEXT;
+			}
+			ts -= first_ts;
+			while (ts > 8) {
+				append_string("        ", 8);
+				ts -= 8;
+			}
+			append_string("        ", ts);
+		}
+	}
+	YY_BREAK
+case 61:
+/* rule 61 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
+YY_RULE_SETUP
+{
+		current_file->lineno++;
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	YY_BREAK
+case 62:
+/* rule 62 can match eol */
+YY_RULE_SETUP
+{
+		current_file->lineno++;
+		append_string("\n", 1);
+	}
+	YY_BREAK
+case 63:
+YY_RULE_SETUP
+{
+		append_string(zconftext, zconfleng);
+		if (!first_ts)
+			first_ts = last_ts;
+	}
+	YY_BREAK
+case YY_STATE_EOF(HELP):
+{
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	YY_BREAK
+
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(COMMAND):
+{
+	if (current_buf) {
+		zconf_endfile();
+		return T_EOF;
+	}
+	fclose(zconfin);
+	yyterminate();
+}
+	YY_BREAK
+case 64:
+YY_RULE_SETUP
+YY_FATAL_ERROR( "flex scanner jammed" );
+	YY_BREAK
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = (yy_hold_char);
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed zconfin at a new source and called
+			 * zconflex().  If so, then we have to assure
+			 * consistency between YY_CURRENT_BUFFER and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+			YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			(yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state(  );
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++(yy_c_buf_p);
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = (yy_c_buf_p);
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer(  ) )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				(yy_did_buffer_switch_on_eof) = 0;
+
+				if ( zconfwrap( ) )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * zconftext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					(yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				(yy_c_buf_p) =
+					(yytext_ptr) + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				(yy_c_buf_p) =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+				yy_current_state = yy_get_previous_state(  );
+
+				yy_cp = (yy_c_buf_p);
+				yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+} /* end of zconflex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+	register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+	register char *source = (yytext_ptr);
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+	else
+		{
+			size_t num_to_read =
+			YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
+
+			int yy_c_buf_p_offset =
+				(int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+						number_to_move - 1;
+
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+			(yy_n_chars), num_to_read );
+
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	if ( (yy_n_chars) == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			zconfrestart(zconfin  );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	(yy_n_chars) += number_to_move;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+	YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+	(yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+	return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = (yy_start);
+
+	for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+		{
+		yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
+		}
+
+	return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+	register int yy_is_jam;
+
+	yy_current_state = yy_nxt[yy_current_state][1];
+	yy_is_jam = (yy_current_state <= 0);
+
+	return yy_is_jam ? 0 : yy_current_state;
+}
+
+    static void yyunput (int c, register char * yy_bp )
+{
+	register char *yy_cp;
+
+    yy_cp = (yy_c_buf_p);
+
+	/* undo effects of setting up zconftext */
+	*yy_cp = (yy_hold_char);
+
+	if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = (yy_n_chars) + 2;
+		register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+					YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+		register char *source =
+				&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+		while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+			(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+		if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+	(yytext_ptr) = yy_bp;
+	(yy_hold_char) = *yy_cp;
+	(yy_c_buf_p) = yy_cp;
+}
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+	int c;
+
+	*(yy_c_buf_p) = (yy_hold_char);
+
+	if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+			/* This was really a NUL. */
+			*(yy_c_buf_p) = '\0';
+
+		else
+			{ /* need more input */
+			int offset = (yy_c_buf_p) - (yytext_ptr);
+			++(yy_c_buf_p);
+
+			switch ( yy_get_next_buffer(  ) )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					zconfrestart(zconfin );
+
+					/*FALLTHROUGH*/
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( zconfwrap( ) )
+						return EOF;
+
+					if ( ! (yy_did_buffer_switch_on_eof) )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					(yy_c_buf_p) = (yytext_ptr) + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) (yy_c_buf_p);	/* cast for 8-bit char's */
+	*(yy_c_buf_p) = '\0';	/* preserve zconftext */
+	(yy_hold_char) = *++(yy_c_buf_p);
+
+	return c;
+}
+#endif	/* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ *
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void zconfrestart  (FILE * input_file )
+{
+
+	if ( ! YY_CURRENT_BUFFER ){
+        zconfensure_buffer_stack ();
+		YY_CURRENT_BUFFER_LVALUE =
+            zconf_create_buffer(zconfin,YY_BUF_SIZE );
+	}
+
+	zconf_init_buffer(YY_CURRENT_BUFFER,input_file );
+	zconf_load_buffer_state( );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ *
+ */
+    void zconf_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+
+	/* TODO. We should be able to replace this entire function body
+	 * with
+	 *		zconfpop_buffer_state();
+	 *		zconfpush_buffer_state(new_buffer);
+     */
+	zconfensure_buffer_stack ();
+	if ( YY_CURRENT_BUFFER == new_buffer )
+		return;
+
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+	zconf_load_buffer_state( );
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (zconfwrap()) processing, but the only time this flag
+	 * is looked at is after zconfwrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void zconf_load_buffer_state  (void)
+{
+	(yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+	(yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+	zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+	(yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ *
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE zconf_create_buffer  (FILE * file, int  size )
+{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2  );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	zconf_init_buffer(b,file );
+
+	return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with zconf_create_buffer()
+ *
+ */
+    void zconf_delete_buffer (YY_BUFFER_STATE  b )
+{
+
+	if ( ! b )
+		return;
+
+	if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+		YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		zconffree((void *) b->yy_ch_buf  );
+
+	zconffree((void *) b  );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a zconfrestart() or at EOF.
+ */
+    static void zconf_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+	int oerrno = errno;
+
+	zconf_flush_buffer(b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then zconf_init_buffer was _probably_
+     * called from zconfrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = 0;
+
+	errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ *
+ */
+    void zconf_flush_buffer (YY_BUFFER_STATE  b )
+{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == YY_CURRENT_BUFFER )
+		zconf_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *
+ */
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+	if (new_buffer == NULL)
+		return;
+
+	zconfensure_buffer_stack();
+
+	/* This block is copied from zconf_switch_to_buffer. */
+	if ( YY_CURRENT_BUFFER )
+		{
+		/* Flush out information for old buffer. */
+		*(yy_c_buf_p) = (yy_hold_char);
+		YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+		YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+		}
+
+	/* Only push if top exists. Otherwise, replace top. */
+	if (YY_CURRENT_BUFFER)
+		(yy_buffer_stack_top)++;
+	YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+	/* copied from zconf_switch_to_buffer. */
+	zconf_load_buffer_state( );
+	(yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *
+ */
+void zconfpop_buffer_state (void)
+{
+	if (!YY_CURRENT_BUFFER)
+		return;
+
+	zconf_delete_buffer(YY_CURRENT_BUFFER );
+	YY_CURRENT_BUFFER_LVALUE = NULL;
+	if ((yy_buffer_stack_top) > 0)
+		--(yy_buffer_stack_top);
+
+	if (YY_CURRENT_BUFFER) {
+		zconf_load_buffer_state( );
+		(yy_did_buffer_switch_on_eof) = 1;
+	}
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void zconfensure_buffer_stack (void)
+{
+	int num_to_alloc;
+
+	if (!(yy_buffer_stack)) {
+
+		/* First allocation is just for 2 elements, since we don't know if this
+		 * scanner will even need a stack. We use 2 instead of 1 to avoid an
+		 * immediate realloc on the next call.
+         */
+		num_to_alloc = 1;
+		(yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
+								(num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+		(yy_buffer_stack_max) = num_to_alloc;
+		(yy_buffer_stack_top) = 0;
+		return;
+	}
+
+	if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+		/* Increase the buffer to prepare for a possible push. */
+		int grow_size = 8 /* arbitrary grow size */;
+
+		num_to_alloc = (yy_buffer_stack_max) + grow_size;
+		(yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc
+								((yy_buffer_stack),
+								num_to_alloc * sizeof(struct yy_buffer_state*)
+								);
+
+		/* zero only the new slots.*/
+		memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+		(yy_buffer_stack_max) = num_to_alloc;
+	}
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE zconf_scan_buffer  (char * base, yy_size_t  size )
+{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	zconf_switch_to_buffer(b  );
+
+	return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to zconflex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ *
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       zconf_scan_bytes() instead.
+ */
+YY_BUFFER_STATE zconf_scan_string (yyconst char * str )
+{
+
+	return zconf_scan_bytes(str,strlen(str) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ *
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE zconf_scan_bytes  (yyconst char * bytes, int  len )
+{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) zconfalloc(n  );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = zconf_scan_buffer(buf,n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yy_fatal_error (yyconst char* msg )
+{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+		zconftext[zconfleng] = (yy_hold_char); \
+		(yy_c_buf_p) = zconftext + yyless_macro_arg; \
+		(yy_hold_char) = *(yy_c_buf_p); \
+		*(yy_c_buf_p) = '\0'; \
+		zconfleng = yyless_macro_arg; \
+		} \
+	while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ *
+ */
+int zconfget_lineno  (void)
+{
+
+    return zconflineno;
+}
+
+/** Get the input stream.
+ *
+ */
+FILE *zconfget_in  (void)
+{
+        return zconfin;
+}
+
+/** Get the output stream.
+ *
+ */
+FILE *zconfget_out  (void)
+{
+        return zconfout;
+}
+
+/** Get the length of the current token.
+ *
+ */
+int zconfget_leng  (void)
+{
+        return zconfleng;
+}
+
+/** Get the current token.
+ *
+ */
+
+char *zconfget_text  (void)
+{
+        return zconftext;
+}
+
+/** Set the current line number.
+ * @param line_number
+ *
+ */
+void zconfset_lineno (int  line_number )
+{
+
+    zconflineno = line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ *
+ * @see zconf_switch_to_buffer
+ */
+void zconfset_in (FILE *  in_str )
+{
+        zconfin = in_str ;
+}
+
+void zconfset_out (FILE *  out_str )
+{
+        zconfout = out_str ;
+}
+
+int zconfget_debug  (void)
+{
+        return zconf_flex_debug;
+}
+
+void zconfset_debug (int  bdebug )
+{
+        zconf_flex_debug = bdebug ;
+}
+
+/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
+int zconflex_destroy  (void)
+{
+
+    /* Pop the buffer stack, destroying each element. */
+	while(YY_CURRENT_BUFFER){
+		zconf_delete_buffer(YY_CURRENT_BUFFER  );
+		YY_CURRENT_BUFFER_LVALUE = NULL;
+		zconfpop_buffer_state();
+	}
+
+	/* Destroy the stack itself. */
+	zconffree((yy_buffer_stack) );
+	(yy_buffer_stack) = NULL;
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * s )
+{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+}
+#endif
+
+void *zconfalloc (yy_size_t  size )
+{
+	return (void *) malloc( size );
+}
+
+void *zconfrealloc  (void * ptr, yy_size_t  size )
+{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+}
+
+void zconffree (void * ptr )
+{
+	free( (char *) ptr );	/* see zconfrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
+#endif
+
+void zconf_starthelp(void)
+{
+	new_string();
+	last_ts = first_ts = 0;
+	BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+	zconflval.string = text;
+	BEGIN(INITIAL);
+}
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+	char *env, fullname[PATH_MAX+1];
+	FILE *f;
+
+	f = fopen(name, "r");
+	if (!f && name[0] != '/') {
+		env = getenv(SRCTREE);
+		if (env) {
+			sprintf(fullname, "%s/%s", env, name);
+			f = fopen(fullname, "r");
+		}
+	}
+	return f;
+}
+
+void zconf_initscan(const char *name)
+{
+	zconfin = zconf_fopen(name);
+	if (!zconfin) {
+		printf("can't find file %s\n", name);
+		exit(1);
+	}
+
+	current_buf = malloc(sizeof(*current_buf));
+	memset(current_buf, 0, sizeof(*current_buf));
+
+	current_file = file_lookup(name);
+	current_file->lineno = 1;
+	current_file->flags = FILE_BUSY;
+}
+
+void zconf_nextfile(const char *name)
+{
+	struct file *file = file_lookup(name);
+	struct buffer *buf = malloc(sizeof(*buf));
+	memset(buf, 0, sizeof(*buf));
+
+	current_buf->state = YY_CURRENT_BUFFER;
+	zconfin = zconf_fopen(name);
+	if (!zconfin) {
+		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+		exit(1);
+	}
+	zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
+	buf->parent = current_buf;
+	current_buf = buf;
+
+	if (file->flags & FILE_BUSY) {
+		printf("recursive scan (%s)?\n", name);
+		exit(1);
+	}
+	if (file->flags & FILE_SCANNED) {
+		printf("file %s already scanned?\n", name);
+		exit(1);
+	}
+	file->flags |= FILE_BUSY;
+	file->lineno = 1;
+	file->parent = current_file;
+	current_file = file;
+}
+
+static struct buffer *zconf_endfile(void)
+{
+	struct buffer *parent;
+
+	current_file->flags |= FILE_SCANNED;
+	current_file->flags &= ~FILE_BUSY;
+	current_file = current_file->parent;
+
+	parent = current_buf->parent;
+	if (parent) {
+		fclose(zconfin);
+		zconf_delete_buffer(YY_CURRENT_BUFFER);
+		zconf_switch_to_buffer(parent->state);
+	}
+	free(current_buf);
+	current_buf = parent;
+
+	return parent;
+}
+
+int zconf_lineno(void)
+{
+	if (current_buf)
+		return current_file->lineno - 1;
+	else
+		return 0;
+}
+
+char *zconf_curname(void)
+{
+	if (current_buf)
+		return current_file->name;
+	else
+		return "<none>";
+}
+
diff --git a/2.3/menu/lkc.h b/2.3/menu/lkc.h
new file mode 100644
index 0000000..b8a67fc
--- /dev/null
+++ b/2.3/menu/lkc.h
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#ifndef LKC_H
+#define LKC_H
+
+#include "expr.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef LKC_DIRECT_LINK
+#define P(name,type,arg)	extern type name arg
+#else
+#include "lkc_defs.h"
+#define P(name,type,arg)	extern type (*name ## _p) arg
+#endif
+#include "lkc_proto.h"
+#undef P
+
+#define SRCTREE "srctree"
+
+int zconfparse(void);
+void zconfdump(FILE *out);
+
+extern int zconfdebug;
+void zconf_starthelp(void);
+FILE *zconf_fopen(const char *name);
+void zconf_initscan(const char *name);
+void zconf_nextfile(const char *name);
+int zconf_lineno(void);
+char *zconf_curname(void);
+
+/* confdata.c */
+extern const char conf_def_filename[];
+extern char conf_filename[];
+
+char *conf_get_default_confname(void);
+
+/* kconfig_load.c */
+void kconfig_load(void);
+
+/* menu.c */
+void menu_init(void);
+void menu_add_menu(void);
+void menu_end_menu(void);
+void menu_add_entry(struct symbol *sym);
+void menu_end_entry(void);
+void menu_add_dep(struct expr *dep);
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
+void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
+void menu_finalize(struct menu *parent);
+void menu_set_type(int type);
+
+/* util.c */
+struct file *file_lookup(const char *name);
+int file_write_dep(const char *name);
+
+struct gstr {
+	size_t len;
+	char  *s;
+};
+struct gstr str_new(void);
+struct gstr str_assign(const char *s);
+void str_free(struct gstr *gs);
+void str_append(struct gstr *gs, const char *s);
+void str_printf(struct gstr *gs, const char *fmt, ...);
+const char *str_get(struct gstr *gs);
+
+/* symbol.c */
+void sym_init(void);
+void sym_clear_all_valid(void);
+void sym_set_changed(struct symbol *sym);
+struct symbol *sym_check_deps(struct symbol *sym);
+struct property *prop_alloc(enum prop_type type, struct symbol *sym);
+struct symbol *prop_get_symbol(struct property *prop);
+
+static inline tristate sym_get_tristate_value(struct symbol *sym)
+{
+	return sym->curr.tri;
+}
+
+
+static inline struct symbol *sym_get_choice_value(struct symbol *sym)
+{
+	return (struct symbol *)sym->curr.val;
+}
+
+static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
+{
+	return sym_set_tristate_value(chval, yes);
+}
+
+static inline bool sym_is_choice(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICE ? true : false;
+}
+
+static inline bool sym_is_choice_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_CHOICEVAL ? true : false;
+}
+
+static inline bool sym_is_optional(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_OPTIONAL ? true : false;
+}
+
+static inline bool sym_has_value(struct symbol *sym)
+{
+	return sym->flags & SYMBOL_NEW ? false : true;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* LKC_H */
diff --git a/2.3/menu/lkc_proto.h b/2.3/menu/lkc_proto.h
new file mode 100644
index 0000000..6dc6d0c
--- /dev/null
+++ b/2.3/menu/lkc_proto.h
@@ -0,0 +1,40 @@
+
+/* confdata.c */
+P(conf_parse,void,(const char *name));
+P(conf_read,int,(const char *name));
+P(conf_write,int,(const char *name));
+
+/* menu.c */
+P(rootmenu,struct menu,);
+
+P(menu_is_visible,bool,(struct menu *menu));
+P(menu_get_prompt,const char *,(struct menu *menu));
+P(menu_get_root_menu,struct menu *,(struct menu *menu));
+P(menu_get_parent_menu,struct menu *,(struct menu *menu));
+
+/* symbol.c */
+P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
+P(sym_change_count,int,);
+
+P(sym_lookup,struct symbol *,(const char *name, int isconst));
+P(sym_find,struct symbol *,(const char *name));
+P(sym_re_search,struct symbol **,(const char *pattern));
+P(sym_type_name,const char *,(enum symbol_type type));
+P(sym_calc_value,void,(struct symbol *sym));
+P(sym_get_type,enum symbol_type,(struct symbol *sym));
+P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
+P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
+P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
+P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
+P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
+P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
+P(sym_is_changable,bool,(struct symbol *sym));
+P(sym_get_choice_prop,struct property *,(struct symbol *sym));
+P(sym_get_default_prop,struct property *,(struct symbol *sym));
+P(sym_get_string_value,const char *,(struct symbol *sym));
+
+P(prop_get_type_name,const char *,(enum prop_type type));
+
+/* expr.c */
+P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2));
+P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken));
diff --git a/2.3/menu/lxdialog/BIG.FAT.WARNING b/2.3/menu/lxdialog/BIG.FAT.WARNING
new file mode 100644
index 0000000..a8999d8
--- /dev/null
+++ b/2.3/menu/lxdialog/BIG.FAT.WARNING
@@ -0,0 +1,4 @@
+This is NOT the official version of dialog.  This version has been
+significantly modified from the original.  It is for use by the Linux
+kernel configuration script.  Please do not bother Savio Lam with 
+questions about this program.
diff --git a/2.3/menu/lxdialog/checklist.c b/2.3/menu/lxdialog/checklist.c
new file mode 100644
index 0000000..7565b5d
--- /dev/null
+++ b/2.3/menu/lxdialog/checklist.c
@@ -0,0 +1,372 @@
+/*
+ *  checklist.c -- implements the checklist box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *     Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
+ *     Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static int list_width, check_x, item_x, checkflag;
+
+/*
+ * Print list item
+ */
+static void
+print_item (WINDOW * win, const char *item, int status,
+	    int choice, int selected)
+{
+    int i;
+
+    /* Clear 'residue' of last item */
+    wattrset (win, menubox_attr);
+    wmove (win, choice, 0);
+    for (i = 0; i < list_width; i++)
+	waddch (win, ' ');
+
+    wmove (win, choice, check_x);
+    wattrset (win, selected ? check_selected_attr : check_attr);
+    if (checkflag == FLAG_CHECK)
+	wprintw (win, "[%c]", status ? 'X' : ' ');
+    else
+	wprintw (win, "(%c)", status ? 'X' : ' ');
+
+    wattrset (win, selected ? tag_selected_attr : tag_attr);
+    mvwaddch(win, choice, item_x, item[0]);
+    wattrset (win, selected ? item_selected_attr : item_attr);
+    waddstr (win, (char *)item+1);
+    if (selected) {
+	wmove (win, choice, check_x+1);
+	wrefresh (win);
+    }
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void
+print_arrows (WINDOW * win, int choice, int item_no, int scroll,
+		int y, int x, int height)
+{
+    wmove(win, y, x);
+
+    if (scroll > 0) {
+	wattrset (win, uarrow_attr);
+	waddch (win, ACS_UARROW);
+	waddstr (win, "(-)");
+    }
+    else {
+	wattrset (win, menubox_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+    }
+
+   y = y + height + 1;
+   wmove(win, y, x);
+
+   if ((height < item_no) && (scroll + choice < item_no - 1)) {
+	wattrset (win, darrow_attr);
+	waddch (win, ACS_DARROW);
+	waddstr (win, "(+)");
+    }
+    else {
+	wattrset (win, menubox_border_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+   }
+}
+
+/*
+ *  Display the termination buttons
+ */
+static void
+print_buttons( WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 11;
+    int y = height - 2;
+
+    print_button (dialog, "Select", y, x, selected == 0);
+    print_button (dialog, " Help ", y, x + 14, selected == 1);
+
+    wmove(dialog, y, x+1 + 14*selected);
+    wrefresh (dialog);
+}
+
+/*
+ * Display a dialog box with a list of options that can be turned on or off
+ * The `flag' parameter is used to select between radiolist and checklist.
+ */
+int
+dialog_checklist (const char *title, const char *prompt, int height, int width,
+	int list_height, int item_no, struct dialog_list_item ** items,
+	int flag)
+
+{
+    int i, x, y, box_x, box_y;
+    int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
+    WINDOW *dialog, *list;
+
+    checkflag = flag;
+
+    /* Allocate space for storing item on/off status */
+    if ((status = malloc (sizeof (int) * item_no)) == NULL) {
+	endwin ();
+	fprintf (stderr,
+		 "\nCan't allocate memory in dialog_checklist().\n");
+	exit (-1);
+    }
+
+    /* Initializes status */
+    for (i = 0; i < item_no; i++) {
+	status[i] = (items[i]->selected == 1); /* ON */
+	if ((!choice && status[i]) || items[i]->selected == 2) /* SELECTED */
+	    choice = i + 1;
+    }
+    if (choice)
+	    choice--;
+
+    max_choice = MIN (list_height, item_no);
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    list_width = width - 6;
+    box_y = height - list_height - 5;
+    box_x = (width - list_width) / 2 - 1;
+
+    /* create new window for the list */
+    list = subwin (dialog, list_height, list_width, y+box_y+1, x+box_x+1);
+
+    keypad (list, TRUE);
+
+    /* draw a box around the list items */
+    draw_box (dialog, box_y, box_x, list_height + 2, list_width + 2,
+	      menubox_border_attr, menubox_attr);
+
+    /* Find length of longest item in order to center checklist */
+    check_x = 0;
+    for (i = 0; i < item_no; i++)
+	check_x = MAX (check_x, + strlen (items[i]->name) + 4);
+
+    check_x = (list_width - check_x) / 2;
+    item_x = check_x + 4;
+
+    if (choice >= list_height) {
+	scroll = choice - list_height + 1;
+	choice -= scroll;
+    }
+
+    /* Print the list */
+    for (i = 0; i < max_choice; i++) {
+	print_item (list, items[scroll + i]->name,
+		    status[i+scroll], i, i == choice);
+    }
+
+    print_arrows(dialog, choice, item_no, scroll,
+			box_y, box_x + check_x + 5, list_height);
+
+    print_buttons(dialog, height, width, 0);
+
+    wnoutrefresh (list);
+    wnoutrefresh (dialog);
+    doupdate ();
+
+    while (key != ESC) {
+	key = wgetch (dialog);
+
+	for (i = 0; i < max_choice; i++)
+	    if (toupper(key) == toupper(items[scroll + i]->name[0]))
+		break;
+
+
+	if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
+	    key == '+' || key == '-' ) {
+	    if (key == KEY_UP || key == '-') {
+		if (!choice) {
+		    if (!scroll)
+			continue;
+		    /* Scroll list down */
+		    if (list_height > 1) {
+			/* De-highlight current first item */
+			print_item (list, items[scroll]->name,
+					status[scroll], 0, FALSE);
+			scrollok (list, TRUE);
+			wscrl (list, -1);
+			scrollok (list, FALSE);
+		    }
+		    scroll--;
+		    print_item (list, items[scroll]->name,
+				status[scroll], 0, TRUE);
+		    wnoutrefresh (list);
+
+		    print_arrows(dialog, choice, item_no, scroll,
+				box_y, box_x + check_x + 5, list_height);
+
+		    wrefresh (dialog);
+
+		    continue;	/* wait for another key press */
+		} else
+		    i = choice - 1;
+	    } else if (key == KEY_DOWN || key == '+') {
+		if (choice == max_choice - 1) {
+		    if (scroll + choice >= item_no - 1)
+			continue;
+		    /* Scroll list up */
+		    if (list_height > 1) {
+			/* De-highlight current last item before scrolling up */
+			print_item (list, items[scroll + max_choice - 1]->name,
+				    status[scroll + max_choice - 1],
+				    max_choice - 1, FALSE);
+			scrollok (list, TRUE);
+			scroll (list);
+			scrollok (list, FALSE);
+		    }
+		    scroll++;
+		    print_item (list, items[scroll + max_choice - 1]->name,
+				status[scroll + max_choice - 1],
+				max_choice - 1, TRUE);
+		    wnoutrefresh (list);
+
+		    print_arrows(dialog, choice, item_no, scroll,
+				box_y, box_x + check_x + 5, list_height);
+
+		    wrefresh (dialog);
+
+		    continue;	/* wait for another key press */
+		} else
+		    i = choice + 1;
+	    }
+	    if (i != choice) {
+		/* De-highlight current item */
+		print_item (list, items[scroll + choice]->name,
+			    status[scroll + choice], choice, FALSE);
+		/* Highlight new item */
+		choice = i;
+		print_item (list, items[scroll + choice]->name,
+			    status[scroll + choice], choice, TRUE);
+		wnoutrefresh (list);
+		wrefresh (dialog);
+	    }
+	    continue;		/* wait for another key press */
+	}
+	switch (key) {
+	case 'H':
+	case 'h':
+	case '?':
+	    for (i = 0; i < item_no; i++)
+		items[i]->selected = 0;
+	    items[scroll + choice]->selected = 1;
+	    delwin (dialog);
+	    free (status);
+	    return 1;
+	case TAB:
+	case KEY_LEFT:
+	case KEY_RIGHT:
+	    button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			? 1 : (button > 1 ? 0 : button);
+
+	    print_buttons(dialog, height, width, button);
+	    wrefresh (dialog);
+	    break;
+	case 'S':
+	case 's':
+	case ' ':
+	case '\n':
+	    if (!button) {
+		if (flag == FLAG_CHECK) {
+		    status[scroll + choice] = !status[scroll + choice];
+		    wmove (list, choice, check_x);
+		    wattrset (list, check_selected_attr);
+		    wprintw (list, "[%c]", status[scroll + choice] ? 'X' : ' ');
+		} else {
+		    if (!status[scroll + choice]) {
+			for (i = 0; i < item_no; i++)
+			    status[i] = 0;
+			status[scroll + choice] = 1;
+			for (i = 0; i < max_choice; i++)
+			    print_item (list, items[scroll + i]->name,
+					status[scroll + i], i, i == choice);
+		    }
+		}
+		wnoutrefresh (list);
+		wrefresh (dialog);
+
+		for (i = 0; i < item_no; i++) {
+			items[i]->selected = status[i];
+		}
+	    } else {
+		    for (i = 0; i < item_no; i++)
+			    items[i]->selected = 0;
+		    items[scroll + choice]->selected = 1;
+	    }
+	    delwin (dialog);
+	    free (status);
+	    return button;
+	case 'X':
+	case 'x':
+	    key = ESC;
+	case ESC:
+	    break;
+	}
+
+	/* Now, update everything... */
+	doupdate ();
+    }
+
+
+    delwin (dialog);
+    free (status);
+    return -1;			/* ESC pressed */
+}
diff --git a/2.3/menu/lxdialog/colors.h b/2.3/menu/lxdialog/colors.h
new file mode 100644
index 0000000..d34dd37
--- /dev/null
+++ b/2.3/menu/lxdialog/colors.h
@@ -0,0 +1,161 @@
+/*
+ *  colors.h -- color attribute definitions
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+
+/*
+ *   Default color definitions
+ *
+ *   *_FG = foreground
+ *   *_BG = background
+ *   *_HL = highlight?
+ */
+#define SCREEN_FG                    COLOR_CYAN
+#define SCREEN_BG                    COLOR_BLUE
+#define SCREEN_HL                    TRUE
+
+#define SHADOW_FG                    COLOR_BLACK
+#define SHADOW_BG                    COLOR_BLACK
+#define SHADOW_HL                    TRUE
+
+#define DIALOG_FG                    COLOR_BLACK
+#define DIALOG_BG                    COLOR_WHITE
+#define DIALOG_HL                    FALSE
+
+#define TITLE_FG                     COLOR_YELLOW
+#define TITLE_BG                     COLOR_WHITE
+#define TITLE_HL                     TRUE
+
+#define BORDER_FG                    COLOR_WHITE
+#define BORDER_BG                    COLOR_WHITE
+#define BORDER_HL                    TRUE
+
+#define BUTTON_ACTIVE_FG             COLOR_WHITE
+#define BUTTON_ACTIVE_BG             COLOR_BLUE
+#define BUTTON_ACTIVE_HL             TRUE
+
+#define BUTTON_INACTIVE_FG           COLOR_BLACK
+#define BUTTON_INACTIVE_BG           COLOR_WHITE
+#define BUTTON_INACTIVE_HL           FALSE
+
+#define BUTTON_KEY_ACTIVE_FG         COLOR_WHITE
+#define BUTTON_KEY_ACTIVE_BG         COLOR_BLUE
+#define BUTTON_KEY_ACTIVE_HL         TRUE
+
+#define BUTTON_KEY_INACTIVE_FG       COLOR_RED
+#define BUTTON_KEY_INACTIVE_BG       COLOR_WHITE
+#define BUTTON_KEY_INACTIVE_HL       FALSE
+
+#define BUTTON_LABEL_ACTIVE_FG       COLOR_YELLOW
+#define BUTTON_LABEL_ACTIVE_BG       COLOR_BLUE
+#define BUTTON_LABEL_ACTIVE_HL       TRUE
+
+#define BUTTON_LABEL_INACTIVE_FG     COLOR_BLACK
+#define BUTTON_LABEL_INACTIVE_BG     COLOR_WHITE
+#define BUTTON_LABEL_INACTIVE_HL     TRUE
+
+#define INPUTBOX_FG                  COLOR_BLACK
+#define INPUTBOX_BG                  COLOR_WHITE
+#define INPUTBOX_HL                  FALSE
+
+#define INPUTBOX_BORDER_FG           COLOR_BLACK
+#define INPUTBOX_BORDER_BG           COLOR_WHITE
+#define INPUTBOX_BORDER_HL           FALSE
+
+#define SEARCHBOX_FG                 COLOR_BLACK
+#define SEARCHBOX_BG                 COLOR_WHITE
+#define SEARCHBOX_HL                 FALSE
+
+#define SEARCHBOX_TITLE_FG           COLOR_YELLOW
+#define SEARCHBOX_TITLE_BG           COLOR_WHITE
+#define SEARCHBOX_TITLE_HL           TRUE
+
+#define SEARCHBOX_BORDER_FG          COLOR_WHITE
+#define SEARCHBOX_BORDER_BG          COLOR_WHITE
+#define SEARCHBOX_BORDER_HL          TRUE
+
+#define POSITION_INDICATOR_FG        COLOR_YELLOW
+#define POSITION_INDICATOR_BG        COLOR_WHITE
+#define POSITION_INDICATOR_HL        TRUE
+
+#define MENUBOX_FG                   COLOR_BLACK
+#define MENUBOX_BG                   COLOR_WHITE
+#define MENUBOX_HL                   FALSE
+
+#define MENUBOX_BORDER_FG            COLOR_WHITE
+#define MENUBOX_BORDER_BG            COLOR_WHITE
+#define MENUBOX_BORDER_HL            TRUE
+
+#define ITEM_FG                      COLOR_BLACK
+#define ITEM_BG                      COLOR_WHITE
+#define ITEM_HL                      FALSE
+
+#define ITEM_SELECTED_FG             COLOR_WHITE
+#define ITEM_SELECTED_BG             COLOR_BLUE
+#define ITEM_SELECTED_HL             TRUE
+
+#define TAG_FG                       COLOR_YELLOW
+#define TAG_BG                       COLOR_WHITE
+#define TAG_HL                       TRUE
+
+#define TAG_SELECTED_FG              COLOR_YELLOW
+#define TAG_SELECTED_BG              COLOR_BLUE
+#define TAG_SELECTED_HL              TRUE
+
+#define TAG_KEY_FG                   COLOR_YELLOW
+#define TAG_KEY_BG                   COLOR_WHITE
+#define TAG_KEY_HL                   TRUE
+
+#define TAG_KEY_SELECTED_FG          COLOR_YELLOW
+#define TAG_KEY_SELECTED_BG          COLOR_BLUE
+#define TAG_KEY_SELECTED_HL          TRUE
+
+#define CHECK_FG                     COLOR_BLACK
+#define CHECK_BG                     COLOR_WHITE
+#define CHECK_HL                     FALSE
+
+#define CHECK_SELECTED_FG            COLOR_WHITE
+#define CHECK_SELECTED_BG            COLOR_BLUE
+#define CHECK_SELECTED_HL            TRUE
+
+#define UARROW_FG                    COLOR_GREEN
+#define UARROW_BG                    COLOR_WHITE
+#define UARROW_HL                    TRUE
+
+#define DARROW_FG                    COLOR_GREEN
+#define DARROW_BG                    COLOR_WHITE
+#define DARROW_HL                    TRUE
+
+/* End of default color definitions */
+
+#define C_ATTR(x,y)                  ((x ? A_BOLD : 0) | COLOR_PAIR((y)))
+#define COLOR_NAME_LEN               10
+#define COLOR_COUNT                  8
+
+/*
+ * Global variables
+ */
+
+typedef struct {
+    char name[COLOR_NAME_LEN];
+    int value;
+} color_names_st;
+
+extern color_names_st color_names[];
+extern int color_table[][3];
diff --git a/2.3/menu/lxdialog/dialog.h b/2.3/menu/lxdialog/dialog.h
new file mode 100644
index 0000000..f9dc0da
--- /dev/null
+++ b/2.3/menu/lxdialog/dialog.h
@@ -0,0 +1,203 @@
+
+/*
+ *  dialog.h -- common declarations for all dialog modules
+ *
+ *  AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <sys/types.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef LOCALE
+#include <locale.h>
+#endif
+
+#ifdef CURSES_LOC
+#ifdef __sun__
+#define CURS_MACROS
+#endif
+#include CURSES_LOC
+
+/*
+ * Colors in ncurses 1.9.9e do not work properly since foreground and
+ * background colors are OR'd rather than separately masked.  This version
+ * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible
+ * with standard curses.  The simplest fix (to make this work with standard
+ * curses) uses the wbkgdset() function, not used in the original hack.
+ * Turn it off if we're building with 1.9.9e, since it just confuses things.
+ */
+#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE)
+#define OLD_NCURSES 1
+#undef  wbkgdset
+#define wbkgdset(w,p) /*nothing*/
+#else
+#define OLD_NCURSES 0
+#endif
+
+#define TR(params) _tracef params
+
+#define ESC 27
+#define TAB 9
+#define MAX_LEN 2048
+#define BUF_SIZE (10*1024)
+#define MIN(x,y) (x < y ? x : y)
+#define MAX(x,y) (x > y ? x : y)
+
+
+#ifndef ACS_ULCORNER
+#define ACS_ULCORNER '+'
+#endif
+#ifndef ACS_LLCORNER
+#define ACS_LLCORNER '+'
+#endif
+#ifndef ACS_URCORNER
+#define ACS_URCORNER '+'
+#endif
+#ifndef ACS_LRCORNER
+#define ACS_LRCORNER '+'
+#endif
+#ifndef ACS_HLINE
+#define ACS_HLINE '-'
+#endif
+#ifndef ACS_VLINE
+#define ACS_VLINE '|'
+#endif
+#ifndef ACS_LTEE
+#define ACS_LTEE '+'
+#endif
+#ifndef ACS_RTEE
+#define ACS_RTEE '+'
+#endif
+#ifndef ACS_UARROW
+#define ACS_UARROW '^'
+#endif
+#ifndef ACS_DARROW
+#define ACS_DARROW 'v'
+#endif
+
+/*
+ * Attribute names
+ */
+#define screen_attr                   attributes[0]
+#define shadow_attr                   attributes[1]
+#define dialog_attr                   attributes[2]
+#define title_attr                    attributes[3]
+#define border_attr                   attributes[4]
+#define button_active_attr            attributes[5]
+#define button_inactive_attr          attributes[6]
+#define button_key_active_attr        attributes[7]
+#define button_key_inactive_attr      attributes[8]
+#define button_label_active_attr      attributes[9]
+#define button_label_inactive_attr    attributes[10]
+#define inputbox_attr                 attributes[11]
+#define inputbox_border_attr          attributes[12]
+#define searchbox_attr                attributes[13]
+#define searchbox_title_attr          attributes[14]
+#define searchbox_border_attr         attributes[15]
+#define position_indicator_attr       attributes[16]
+#define menubox_attr                  attributes[17]
+#define menubox_border_attr           attributes[18]
+#define item_attr                     attributes[19]
+#define item_selected_attr            attributes[20]
+#define tag_attr                      attributes[21]
+#define tag_selected_attr             attributes[22]
+#define tag_key_attr                  attributes[23]
+#define tag_key_selected_attr         attributes[24]
+#define check_attr                    attributes[25]
+#define check_selected_attr           attributes[26]
+#define uarrow_attr                   attributes[27]
+#define darrow_attr                   attributes[28]
+
+/* number of attributes */
+#define ATTRIBUTE_COUNT               29
+
+/*
+ * Global variables
+ */
+extern bool use_colors;
+
+extern chtype attributes[];
+#endif
+
+extern const char *backtitle;
+
+struct dialog_list_item {
+	char *name;
+	int namelen;
+	char *tag;
+	int selected; /* Set to 1 by dialog_*() function. */
+};
+
+/*
+ * Function prototypes
+ */
+
+void init_dialog (void);
+void end_dialog (void);
+void dialog_clear (void);
+#ifdef CURSES_LOC
+void attr_clear (WINDOW * win, int height, int width, chtype attr);
+void color_setup (void);
+void print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x);
+void print_button (WINDOW * win, const char *label, int y, int x, int selected);
+void draw_box (WINDOW * win, int y, int x, int height, int width, chtype box,
+		chtype border);
+void draw_shadow (WINDOW * win, int y, int x, int height, int width);
+#endif
+
+int first_alpha (const char *string, const char *exempt);
+int dialog_yesno (const char *title, const char *prompt, int height, int width);
+int dialog_msgbox (const char *title, const char *prompt, int height,
+		int width, int pause);
+int dialog_textbox (const char *title, const char *file, int height, int width);
+int dialog_menu (const char *title, const char *prompt, int height, int width,
+		int menu_height, const char *choice, int item_no,
+		struct dialog_list_item ** items);
+int dialog_checklist (const char *title, const char *prompt, int height,
+		int width, int list_height, int item_no,
+		struct dialog_list_item ** items, int flag);
+extern unsigned char dialog_input_result[];
+int dialog_inputbox (const char *title, const char *prompt, int height,
+		int width, const char *init);
+
+struct dialog_list_item *first_sel_item(int item_no,
+		struct dialog_list_item ** items);
+
+/*
+ * This is the base for fictitious keys, which activate
+ * the buttons.
+ *
+ * Mouse-generated keys are the following:
+ *   -- the first 32 are used as numbers, in addition to '0'-'9'
+ *   -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o')
+ *   -- uppercase chars are used to invoke the button (M_EVENT + 'O')
+ */
+#ifdef CURSES_LOC
+#define M_EVENT (KEY_MAX+1)
+#endif
+
+
+/*
+ * The `flag' parameter in checklist is used to select between
+ * radiolist and checklist
+ */
+#define FLAG_CHECK 1
+#define FLAG_RADIO 0
diff --git a/2.3/menu/lxdialog/inputbox.c b/2.3/menu/lxdialog/inputbox.c
new file mode 100644
index 0000000..fa7bebc
--- /dev/null
+++ b/2.3/menu/lxdialog/inputbox.c
@@ -0,0 +1,240 @@
+/*
+ *  inputbox.c -- implements the input box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+unsigned char dialog_input_result[MAX_LEN + 1];
+
+/*
+ *  Print the termination buttons
+ */
+static void
+print_buttons(WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 11;
+    int y = height - 2;
+
+    print_button (dialog, "  Ok  ", y, x, selected==0);
+    print_button (dialog, " Help ", y, x + 14, selected==1);
+
+    wmove(dialog, y, x+1+14*selected);
+    wrefresh(dialog);
+}
+
+/*
+ * Display a dialog box for inputing a string
+ */
+int
+dialog_inputbox (const char *title, const char *prompt, int height, int width,
+		 const char *init)
+{
+    int i, x, y, box_y, box_x, box_width;
+    int input_x = 0, scroll = 0, key = 0, button = -1;
+    unsigned char *instr = dialog_input_result;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    /* Draw the input field box */
+    box_width = width - 6;
+    getyx (dialog, y, x);
+    box_y = y + 2;
+    box_x = (width - box_width) / 2;
+    draw_box (dialog, y + 1, box_x - 1, 3, box_width + 2,
+	      border_attr, dialog_attr);
+
+    print_buttons(dialog, height, width, 0);
+
+    /* Set up the initial value */
+    wmove (dialog, box_y, box_x);
+    wattrset (dialog, inputbox_attr);
+
+    if (!init)
+	instr[0] = '\0';
+    else
+	strcpy (instr, init);
+
+    input_x = strlen (instr);
+
+    if (input_x >= box_width) {
+	scroll = input_x - box_width + 1;
+	input_x = box_width - 1;
+	for (i = 0; i < box_width - 1; i++)
+	    waddch (dialog, instr[scroll + i]);
+    } else
+	waddstr (dialog, instr);
+
+    wmove (dialog, box_y, box_x + input_x);
+
+    wrefresh (dialog);
+
+    while (key != ESC) {
+	key = wgetch (dialog);
+
+	if (button == -1) {	/* Input box selected */
+	    switch (key) {
+	    case TAB:
+	    case KEY_UP:
+	    case KEY_DOWN:
+		break;
+	    case KEY_LEFT:
+		continue;
+	    case KEY_RIGHT:
+		continue;
+	    case KEY_BACKSPACE:
+	    case 127:
+		if (input_x || scroll) {
+		    wattrset (dialog, inputbox_attr);
+		    if (!input_x) {
+			scroll = scroll < box_width - 1 ?
+			    0 : scroll - (box_width - 1);
+			wmove (dialog, box_y, box_x);
+			for (i = 0; i < box_width; i++)
+			    waddch (dialog, instr[scroll + input_x + i] ?
+				    instr[scroll + input_x + i] : ' ');
+			input_x = strlen (instr) - scroll;
+		    } else
+			input_x--;
+		    instr[scroll + input_x] = '\0';
+		    mvwaddch (dialog, box_y, input_x + box_x, ' ');
+		    wmove (dialog, box_y, input_x + box_x);
+		    wrefresh (dialog);
+		}
+		continue;
+	    default:
+		if (key < 0x100 && isprint (key)) {
+		    if (scroll + input_x < MAX_LEN) {
+			wattrset (dialog, inputbox_attr);
+			instr[scroll + input_x] = key;
+			instr[scroll + input_x + 1] = '\0';
+			if (input_x == box_width - 1) {
+			    scroll++;
+			    wmove (dialog, box_y, box_x);
+			    for (i = 0; i < box_width - 1; i++)
+				waddch (dialog, instr[scroll + i]);
+			} else {
+			    wmove (dialog, box_y, input_x++ + box_x);
+			    waddch (dialog, key);
+			}
+			wrefresh (dialog);
+		    } else
+			flash ();	/* Alarm user about overflow */
+		    continue;
+		}
+	    }
+	}
+	switch (key) {
+	case 'O':
+	case 'o':
+	    delwin (dialog);
+	    return 0;
+	case 'H':
+	case 'h':
+	    delwin (dialog);
+	    return 1;
+	case KEY_UP:
+	case KEY_LEFT:
+	    switch (button) {
+	    case -1:
+		button = 1;	/* Indicates "Cancel" button is selected */
+		print_buttons(dialog, height, width, 1);
+		break;
+	    case 0:
+		button = -1;	/* Indicates input box is selected */
+		print_buttons(dialog, height, width, 0);
+		wmove (dialog, box_y, box_x + input_x);
+		wrefresh (dialog);
+		break;
+	    case 1:
+		button = 0;	/* Indicates "OK" button is selected */
+		print_buttons(dialog, height, width, 0);
+		break;
+	    }
+	    break;
+	case TAB:
+	case KEY_DOWN:
+	case KEY_RIGHT:
+	    switch (button) {
+	    case -1:
+		button = 0;	/* Indicates "OK" button is selected */
+		print_buttons(dialog, height, width, 0);
+		break;
+	    case 0:
+		button = 1;	/* Indicates "Cancel" button is selected */
+		print_buttons(dialog, height, width, 1);
+		break;
+	    case 1:
+		button = -1;	/* Indicates input box is selected */
+		print_buttons(dialog, height, width, 0);
+		wmove (dialog, box_y, box_x + input_x);
+		wrefresh (dialog);
+		break;
+	    }
+	    break;
+	case ' ':
+	case '\n':
+	    delwin (dialog);
+	    return (button == -1 ? 0 : button);
+	case 'X':
+	case 'x':
+	    key = ESC;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    return -1;			/* ESC pressed */
+}
diff --git a/2.3/menu/lxdialog/menubox.c b/2.3/menu/lxdialog/menubox.c
new file mode 100644
index 0000000..d0990c3
--- /dev/null
+++ b/2.3/menu/lxdialog/menubox.c
@@ -0,0 +1,438 @@
+/*
+ *  menubox.c -- implements the menu box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+/*
+ *  Changes by Clifford Wolf (god@clifford.at)
+ *
+ *  [ 1998-06-13 ]
+ *
+ *    *)  A bugfix for the Page-Down problem
+ *
+ *    *)  Formerly when I used Page Down and Page Up, the cursor would be set
+ *        to the first position in the menu box.  Now lxdialog is a bit
+ *        smarter and works more like other menu systems (just have a look at
+ *        it).
+ *
+ *    *)  Formerly if I selected something my scrolling would be broken because
+ *        lxdialog is re-invoked by the Menuconfig shell script, can't
+ *        remember the last scrolling position, and just sets it so that the
+ *        cursor is at the bottom of the box.  Now it writes the temporary file
+ *        lxdialog.scrltmp which contains this information. The file is
+ *        deleted by lxdialog if the user leaves a submenu or enters a new
+ *        one, but it would be nice if Menuconfig could make another "rm -f"
+ *        just to be sure.  Just try it out - you will recognise a difference!
+ *
+ *  [ 1998-06-14 ]
+ *
+ *    *)  Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files
+ *        and menus change their size on the fly.
+ *
+ *    *)  If for some reason the last scrolling position is not saved by
+ *        lxdialog, it sets the scrolling so that the selected item is in the
+ *        middle of the menu box, not at the bottom.
+ *
+ * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net)
+ * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus.
+ * This fixes a bug in Menuconfig where using ' ' to descend into menus
+ * would leave mis-synchronized lxdialog.scrltmp files lying around,
+ * fscanf would read in 'scroll', and eventually that value would get used.
+ */
+
+#include "dialog.h"
+
+static int menu_width, item_x;
+
+/*
+ * Print menu item
+ */
+static void
+print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey)
+{
+    int j;
+    char menu_item[menu_width+1];
+
+    strncpy(menu_item, item, menu_width);
+    menu_item[menu_width] = 0;
+    j = first_alpha(menu_item, "YyNnMmHh");
+
+    /* Clear 'residue' of last item */
+    wattrset (win, menubox_attr);
+    wmove (win, choice, 0);
+#if OLD_NCURSES
+    {
+	int i;
+	for (i = 0; i < menu_width; i++)
+	    waddch (win, ' ');
+    }
+#else
+    wclrtoeol(win);
+#endif
+    wattrset (win, selected ? item_selected_attr : item_attr);
+    mvwaddstr (win, choice, item_x, menu_item);
+    if (hotkey) {
+	wattrset (win, selected ? tag_key_selected_attr : tag_key_attr);
+	mvwaddch(win, choice, item_x+j, menu_item[j]);
+    }
+    if (selected) {
+	wmove (win, choice, item_x+1);
+	wrefresh (win);
+    }
+}
+
+/*
+ * Print the scroll indicators.
+ */
+static void
+print_arrows (WINDOW * win, int item_no, int scroll,
+		int y, int x, int height)
+{
+    int cur_y, cur_x;
+
+    getyx(win, cur_y, cur_x);
+
+    wmove(win, y, x);
+
+    if (scroll > 0) {
+	wattrset (win, uarrow_attr);
+	waddch (win, ACS_UARROW);
+	waddstr (win, "(-)");
+    }
+    else {
+	wattrset (win, menubox_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+    }
+
+   y = y + height + 1;
+   wmove(win, y, x);
+
+   if ((height < item_no) && (scroll + height < item_no)) {
+	wattrset (win, darrow_attr);
+	waddch (win, ACS_DARROW);
+	waddstr (win, "(+)");
+    }
+    else {
+	wattrset (win, menubox_border_attr);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+	waddch (win, ACS_HLINE);
+   }
+
+   wmove(win, cur_y, cur_x);
+}
+
+/*
+ * Display the termination buttons.
+ */
+static void
+print_buttons (WINDOW *win, int height, int width, int selected)
+{
+    int x = width / 2 - 16;
+    int y = height - 2;
+
+    print_button (win, "Select", y, x, selected == 0);
+    print_button (win, " Exit ", y, x + 12, selected == 1);
+    print_button (win, " Help ", y, x + 24, selected == 2);
+
+    wmove(win, y, x+1+12*selected);
+    wrefresh (win);
+}
+
+/*
+ * Display a menu for choosing among a number of options
+ */
+int
+dialog_menu (const char *title, const char *prompt, int height, int width,
+		int menu_height, const char *current, int item_no,
+		struct dialog_list_item ** items)
+{
+    int i, j, x, y, box_x, box_y;
+    int key = 0, button = 0, scroll = 0, choice = 0, first_item = 0, max_choice;
+    WINDOW *dialog, *menu;
+    FILE *f;
+
+    max_choice = MIN (menu_height, item_no);
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height - 3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    wbkgdset (dialog, dialog_attr & A_COLOR);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    menu_width = width - 6;
+    box_y = height - menu_height - 5;
+    box_x = (width - menu_width) / 2 - 1;
+
+    /* create new window for the menu */
+    menu = subwin (dialog, menu_height, menu_width,
+		y + box_y + 1, x + box_x + 1);
+    keypad (menu, TRUE);
+
+    /* draw a box around the menu items */
+    draw_box (dialog, box_y, box_x, menu_height + 2, menu_width + 2,
+	      menubox_border_attr, menubox_attr);
+
+    /*
+     * Find length of longest item in order to center menu.
+     * Set 'choice' to default item.
+     */
+    item_x = 0;
+    for (i = 0; i < item_no; i++) {
+	item_x = MAX (item_x, MIN(menu_width, strlen (items[i]->name) + 2));
+	if (strcmp(current, items[i]->tag) == 0) choice = i;
+    }
+
+    item_x = (menu_width - item_x) / 2;
+
+    /* get the scroll info from the temp file */
+    if ( (f=fopen("lxdialog.scrltmp","r")) != NULL ) {
+	if ( (fscanf(f,"%d\n",&scroll) == 1) && (scroll <= choice) &&
+	     (scroll+max_choice > choice) && (scroll >= 0) &&
+	     (scroll+max_choice <= item_no) ) {
+	    first_item = scroll;
+	    choice = choice - scroll;
+	    fclose(f);
+	} else {
+	    scroll=0;
+	    remove("lxdialog.scrltmp");
+	    fclose(f);
+	    f=NULL;
+	}
+    }
+    if ( (choice >= max_choice) || (f==NULL && choice >= max_choice/2) ) {
+	if (choice >= item_no-max_choice/2)
+	    scroll = first_item = item_no-max_choice;
+	else
+	    scroll = first_item = choice - max_choice/2;
+	choice = choice - scroll;
+    }
+
+    /* Print the menu */
+    for (i=0; i < max_choice; i++) {
+	print_item (menu, items[first_item + i]->name, i, i == choice,
+		    (items[first_item + i]->tag[0] != ':'));
+    }
+
+    wnoutrefresh (menu);
+
+    print_arrows(dialog, item_no, scroll,
+		 box_y, box_x+item_x+1, menu_height);
+
+    print_buttons (dialog, height, width, 0);
+    wmove (menu, choice, item_x+1);
+    wrefresh (menu);
+
+    while (key != ESC) {
+	key = wgetch(menu);
+
+	if (key < 256 && isalpha(key)) key = tolower(key);
+
+	if (strchr("ynmh", key))
+		i = max_choice;
+	else {
+	for (i = choice+1; i < max_choice; i++) {
+		j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
+		if (key == tolower(items[scroll + i]->name[j]))
+			break;
+	}
+	if (i == max_choice)
+		for (i = 0; i < max_choice; i++) {
+			j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
+			if (key == tolower(items[scroll + i]->name[j]))
+				break;
+		}
+	}
+
+	if (i < max_choice ||
+	    key == KEY_UP || key == KEY_DOWN ||
+	    key == '-' || key == '+' ||
+	    key == KEY_PPAGE || key == KEY_NPAGE) {
+
+	    print_item (menu, items[scroll + choice]->name, choice, FALSE,
+		       (items[scroll + choice]->tag[0] != ':'));
+
+	    if (key == KEY_UP || key == '-') {
+		if (choice < 2 && scroll) {
+	            /* Scroll menu down */
+		    scrollok (menu, TRUE);
+		    wscrl (menu, -1);
+		    scrollok (menu, FALSE);
+
+		    scroll--;
+
+		    print_item (menu, items[scroll]->name, 0, FALSE,
+			       (items[scroll]->tag[0] != ':'));
+		} else
+		    choice = MAX(choice - 1, 0);
+
+	    } else if (key == KEY_DOWN || key == '+')  {
+
+		print_item (menu, items[scroll + choice]->name, choice, FALSE,
+				(items[scroll + choice]->tag[0] != ':'));
+
+		if ((choice > max_choice-3) &&
+		    (scroll + max_choice < item_no)
+		   ) {
+		    /* Scroll menu up */
+		    scrollok (menu, TRUE);
+		    scroll (menu);
+		    scrollok (menu, FALSE);
+
+		    scroll++;
+
+		    print_item (menu, items[scroll + max_choice - 1]->name,
+			       max_choice-1, FALSE,
+			       (items[scroll + max_choice - 1]->tag[0] != ':'));
+		} else
+		    choice = MIN(choice+1, max_choice-1);
+
+	    } else if (key == KEY_PPAGE) {
+	        scrollok (menu, TRUE);
+		for (i=0; (i < max_choice); i++) {
+		    if (scroll > 0) {
+			wscrl (menu, -1);
+			scroll--;
+			print_item (menu, items[scroll]->name, 0, FALSE,
+			(items[scroll]->tag[0] != ':'));
+		    } else {
+			if (choice > 0)
+			    choice--;
+		    }
+		}
+		scrollok (menu, FALSE);
+
+	    } else if (key == KEY_NPAGE) {
+		for (i=0; (i < max_choice); i++) {
+		    if (scroll+max_choice < item_no) {
+			scrollok (menu, TRUE);
+			scroll(menu);
+			scrollok (menu, FALSE);
+			scroll++;
+			print_item (menu, items[scroll + max_choice - 1]->name,
+			            max_choice-1, FALSE,
+			            (items[scroll + max_choice - 1]->tag[0] != ':'));
+		    } else {
+			if (choice+1 < max_choice)
+			    choice++;
+		    }
+		}
+
+	    } else
+		choice = i;
+
+	    print_item (menu, items[scroll + choice]->name, choice, TRUE,
+		       (items[scroll + choice]->tag[0] != ':'));
+
+	    print_arrows(dialog, item_no, scroll,
+			 box_y, box_x+item_x+1, menu_height);
+
+	    wnoutrefresh (dialog);
+	    wrefresh (menu);
+
+	    continue;		/* wait for another key press */
+	}
+
+	switch (key) {
+	case KEY_LEFT:
+	case TAB:
+	case KEY_RIGHT:
+	    button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			? 2 : (button > 2 ? 0 : button);
+
+	    print_buttons(dialog, height, width, button);
+	    wrefresh (menu);
+	    break;
+	case ' ':
+	case 's':
+	case 'y':
+	case 'n':
+	case 'm':
+	case '/':
+	    /* save scroll info */
+	    if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
+		fprintf(f,"%d\n",scroll);
+		fclose(f);
+	    }
+	    delwin (dialog);
+	    items[scroll + choice]->selected = 1;
+	    switch (key) {
+	    case 's': return 3;
+	    case 'y': return 3;
+	    case 'n': return 4;
+	    case 'm': return 5;
+	    case ' ': return 6;
+	    case '/': return 7;
+	    }
+	    return 0;
+	case 'h':
+	case '?':
+	    button = 2;
+	case '\n':
+	    delwin (dialog);
+	    items[scroll + choice]->selected = 1;
+
+	    remove("lxdialog.scrltmp");
+	    return button;
+	case 'e':
+	case 'x':
+	    key = ESC;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    remove("lxdialog.scrltmp");
+    return -1;			/* ESC pressed */
+}
diff --git a/2.3/menu/lxdialog/msgbox.c b/2.3/menu/lxdialog/msgbox.c
new file mode 100644
index 0000000..de0f32b
--- /dev/null
+++ b/2.3/menu/lxdialog/msgbox.c
@@ -0,0 +1,85 @@
+/*
+ *  msgbox.c -- implements the message box and info box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display a message box. Program will pause and display an "OK" button
+ * if the parameter 'pause' is non-zero.
+ */
+int
+dialog_msgbox (const char *title, const char *prompt, int height, int width,
+		int pause)
+{
+    int i, x, y, key = 0;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 2);
+
+    if (pause) {
+	wattrset (dialog, border_attr);
+	mvwaddch (dialog, height - 3, 0, ACS_LTEE);
+	for (i = 0; i < width - 2; i++)
+	    waddch (dialog, ACS_HLINE);
+	wattrset (dialog, dialog_attr);
+	waddch (dialog, ACS_RTEE);
+
+	print_button (dialog, "  Ok  ",
+		      height - 2, width / 2 - 4, TRUE);
+
+	wrefresh (dialog);
+	while (key != ESC && key != '\n' && key != ' ' &&
+	       key != 'O' && key != 'o' && key != 'X' && key != 'x')
+	    key = wgetch (dialog);
+    } else {
+	key = '\n';
+	wrefresh (dialog);
+    }
+
+    delwin (dialog);
+    return key == ESC ? -1 : 0;
+}
diff --git a/2.3/menu/lxdialog/textbox.c b/2.3/menu/lxdialog/textbox.c
new file mode 100644
index 0000000..b75e12a
--- /dev/null
+++ b/2.3/menu/lxdialog/textbox.c
@@ -0,0 +1,556 @@
+/*
+ *  textbox.c -- implements the text box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+static void back_lines (int n);
+static void print_page (WINDOW * win, int height, int width);
+static void print_line (WINDOW * win, int row, int width);
+static char *get_line (void);
+static void print_position (WINDOW * win, int height, int width);
+
+static int hscroll, fd, file_size, bytes_read;
+static int begin_reached = 1, end_reached, page_length;
+static char *buf, *page;
+
+/*
+ * Display text from a file in a dialog box.
+ */
+int
+dialog_textbox (const char *title, const char *file, int height, int width)
+{
+    int i, x, y, cur_x, cur_y, fpos, key = 0;
+    int passed_end;
+    char search_term[MAX_LEN + 1];
+    WINDOW *dialog, *text;
+
+    search_term[0] = '\0';	/* no search term entered yet */
+
+    /* Open input file for reading */
+    if ((fd = open (file, O_RDONLY)) == -1) {
+	endwin ();
+	fprintf (stderr,
+		 "\nCan't open input file in dialog_textbox().\n");
+	exit (-1);
+    }
+    /* Get file size. Actually, 'file_size' is the real file size - 1,
+       since it's only the last byte offset from the beginning */
+    if ((file_size = lseek (fd, 0, SEEK_END)) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError getting file size in dialog_textbox().\n");
+	exit (-1);
+    }
+    /* Restore file pointer to beginning of file after getting file size */
+    if (lseek (fd, 0, SEEK_SET) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError moving file pointer in dialog_textbox().\n");
+	exit (-1);
+    }
+    /* Allocate space for read buffer */
+    if ((buf = malloc (BUF_SIZE + 1)) == NULL) {
+	endwin ();
+	fprintf (stderr, "\nCan't allocate memory in dialog_textbox().\n");
+	exit (-1);
+    }
+    if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError reading file in dialog_textbox().\n");
+	exit (-1);
+    }
+    buf[bytes_read] = '\0';	/* mark end of valid data */
+    page = buf;			/* page is pointer to start of page to be displayed */
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    /* Create window for text region, used for scrolling text */
+    text = subwin (dialog, height - 4, width - 2, y + 1, x + 1);
+    wattrset (text, dialog_attr);
+    wbkgdset (text, dialog_attr & A_COLOR);
+
+    keypad (text, TRUE);
+
+    /* register the new window, along with its borders */
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    wbkgdset (dialog, dialog_attr & A_COLOR);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+    print_button (dialog, " Exit ", height - 2, width / 2 - 4, TRUE);
+    wnoutrefresh (dialog);
+    getyx (dialog, cur_y, cur_x);	/* Save cursor position */
+
+    /* Print first page of text */
+    attr_clear (text, height - 4, width - 2, dialog_attr);
+    print_page (text, height - 4, width - 2);
+    print_position (dialog, height, width);
+    wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+    wrefresh (dialog);
+
+    while ((key != ESC) && (key != '\n')) {
+	key = wgetch (dialog);
+	switch (key) {
+	case 'E':		/* Exit */
+	case 'e':
+	case 'X':
+	case 'x':
+	    delwin (dialog);
+	    free (buf);
+	    close (fd);
+	    return 0;
+	case 'g':		/* First page */
+	case KEY_HOME:
+	    if (!begin_reached) {
+		begin_reached = 1;
+		/* First page not in buffer? */
+		if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+		      "\nError moving file pointer in dialog_textbox().\n");
+		    exit (-1);
+		}
+		if (fpos > bytes_read) {	/* Yes, we have to read it in */
+		    if (lseek (fd, 0, SEEK_SET) == -1) {
+			endwin ();
+			fprintf (stderr, "\nError moving file pointer in "
+				 "dialog_textbox().\n");
+			exit (-1);
+		    }
+		    if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+			endwin ();
+			fprintf (stderr,
+			     "\nError reading file in dialog_textbox().\n");
+			exit (-1);
+		    }
+		    buf[bytes_read] = '\0';
+		}
+		page = buf;
+		print_page (text, height - 4, width - 2);
+		print_position (dialog, height, width);
+		wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+		wrefresh (dialog);
+	    }
+	    break;
+	case 'G':		/* Last page */
+	case KEY_END:
+
+	    end_reached = 1;
+	    /* Last page not in buffer? */
+	    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		endwin ();
+		fprintf (stderr,
+		      "\nError moving file pointer in dialog_textbox().\n");
+		exit (-1);
+	    }
+	    if (fpos < file_size) {	/* Yes, we have to read it in */
+		if (lseek (fd, -BUF_SIZE, SEEK_END) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+		      "\nError moving file pointer in dialog_textbox().\n");
+		    exit (-1);
+		}
+		if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+			     "\nError reading file in dialog_textbox().\n");
+		    exit (-1);
+		}
+		buf[bytes_read] = '\0';
+	    }
+	    page = buf + bytes_read;
+	    back_lines (height - 4);
+	    print_page (text, height - 4, width - 2);
+	    print_position (dialog, height, width);
+	    wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+	    wrefresh (dialog);
+	    break;
+	case 'K':		/* Previous line */
+	case 'k':
+	case KEY_UP:
+	    if (!begin_reached) {
+		back_lines (page_length + 1);
+
+		/* We don't call print_page() here but use scrolling to ensure
+		   faster screen update. However, 'end_reached' and
+		   'page_length' should still be updated, and 'page' should
+		   point to start of next page. This is done by calling
+		   get_line() in the following 'for' loop. */
+		scrollok (text, TRUE);
+		wscrl (text, -1);	/* Scroll text region down one line */
+		scrollok (text, FALSE);
+		page_length = 0;
+		passed_end = 0;
+		for (i = 0; i < height - 4; i++) {
+		    if (!i) {
+			/* print first line of page */
+			print_line (text, 0, width - 2);
+			wnoutrefresh (text);
+		    } else
+			/* Called to update 'end_reached' and 'page' */
+			get_line ();
+		    if (!passed_end)
+			page_length++;
+		    if (end_reached && !passed_end)
+			passed_end = 1;
+		}
+
+		print_position (dialog, height, width);
+		wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+		wrefresh (dialog);
+	    }
+	    break;
+	case 'B':		/* Previous page */
+	case 'b':
+	case KEY_PPAGE:
+	    if (begin_reached)
+		break;
+	    back_lines (page_length + height - 4);
+	    print_page (text, height - 4, width - 2);
+	    print_position (dialog, height, width);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case 'J':		/* Next line */
+	case 'j':
+	case KEY_DOWN:
+	    if (!end_reached) {
+		begin_reached = 0;
+		scrollok (text, TRUE);
+		scroll (text);	/* Scroll text region up one line */
+		scrollok (text, FALSE);
+		print_line (text, height - 5, width - 2);
+		wnoutrefresh (text);
+		print_position (dialog, height, width);
+		wmove (dialog, cur_y, cur_x);	/* Restore cursor position */
+		wrefresh (dialog);
+	    }
+	    break;
+	case KEY_NPAGE:		/* Next page */
+	case ' ':
+	    if (end_reached)
+		break;
+
+	    begin_reached = 0;
+	    print_page (text, height - 4, width - 2);
+	    print_position (dialog, height, width);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case '0':		/* Beginning of line */
+	case 'H':		/* Scroll left */
+	case 'h':
+	case KEY_LEFT:
+	    if (hscroll <= 0)
+		break;
+
+	    if (key == '0')
+		hscroll = 0;
+	    else
+		hscroll--;
+	    /* Reprint current page to scroll horizontally */
+	    back_lines (page_length);
+	    print_page (text, height - 4, width - 2);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case 'L':		/* Scroll right */
+	case 'l':
+	case KEY_RIGHT:
+	    if (hscroll >= MAX_LEN)
+		break;
+	    hscroll++;
+	    /* Reprint current page to scroll horizontally */
+	    back_lines (page_length);
+	    print_page (text, height - 4, width - 2);
+	    wmove (dialog, cur_y, cur_x);
+	    wrefresh (dialog);
+	    break;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    free (buf);
+    close (fd);
+    return 1;			/* ESC pressed */
+}
+
+/*
+ * Go back 'n' lines in text file. Called by dialog_textbox().
+ * 'page' will be updated to point to the desired line in 'buf'.
+ */
+static void
+back_lines (int n)
+{
+    int i, fpos;
+
+    begin_reached = 0;
+    /* We have to distinguish between end_reached and !end_reached
+       since at end of file, the line is not ended by a '\n'.
+       The code inside 'if' basically does a '--page' to move one
+       character backward so as to skip '\n' of the previous line */
+    if (!end_reached) {
+	/* Either beginning of buffer or beginning of file reached? */
+	if (page == buf) {
+	    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		endwin ();
+		fprintf (stderr, "\nError moving file pointer in "
+			 "back_lines().\n");
+		exit (-1);
+	    }
+	    if (fpos > bytes_read) {	/* Not beginning of file yet */
+		/* We've reached beginning of buffer, but not beginning of
+		   file yet, so read previous part of file into buffer.
+		   Note that we only move backward for BUF_SIZE/2 bytes,
+		   but not BUF_SIZE bytes to avoid re-reading again in
+		   print_page() later */
+		/* Really possible to move backward BUF_SIZE/2 bytes? */
+		if (fpos < BUF_SIZE / 2 + bytes_read) {
+		    /* No, move less then */
+		    if (lseek (fd, 0, SEEK_SET) == -1) {
+			endwin ();
+			fprintf (stderr, "\nError moving file pointer in "
+				 "back_lines().\n");
+			exit (-1);
+		    }
+		    page = buf + fpos - bytes_read;
+		} else {	/* Move backward BUF_SIZE/2 bytes */
+		    if (lseek (fd, -(BUF_SIZE / 2 + bytes_read), SEEK_CUR)
+			== -1) {
+			endwin ();
+			fprintf (stderr, "\nError moving file pointer "
+				 "in back_lines().\n");
+			exit (-1);
+		    }
+		    page = buf + BUF_SIZE / 2;
+		}
+		if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+		    endwin ();
+		    fprintf (stderr, "\nError reading file in back_lines().\n");
+		    exit (-1);
+		}
+		buf[bytes_read] = '\0';
+	    } else {		/* Beginning of file reached */
+		begin_reached = 1;
+		return;
+	    }
+	}
+	if (*(--page) != '\n') {	/* '--page' here */
+	    /* Something's wrong... */
+	    endwin ();
+	    fprintf (stderr, "\nInternal error in back_lines().\n");
+	    exit (-1);
+	}
+    }
+    /* Go back 'n' lines */
+    for (i = 0; i < n; i++)
+	do {
+	    if (page == buf) {
+		if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		    endwin ();
+		    fprintf (stderr,
+			  "\nError moving file pointer in back_lines().\n");
+		    exit (-1);
+		}
+		if (fpos > bytes_read) {
+		    /* Really possible to move backward BUF_SIZE/2 bytes? */
+		    if (fpos < BUF_SIZE / 2 + bytes_read) {
+			/* No, move less then */
+			if (lseek (fd, 0, SEEK_SET) == -1) {
+			    endwin ();
+			    fprintf (stderr, "\nError moving file pointer "
+				     "in back_lines().\n");
+			    exit (-1);
+			}
+			page = buf + fpos - bytes_read;
+		    } else {	/* Move backward BUF_SIZE/2 bytes */
+			if (lseek (fd, -(BUF_SIZE / 2 + bytes_read),
+				   SEEK_CUR) == -1) {
+			    endwin ();
+			    fprintf (stderr, "\nError moving file pointer"
+				     " in back_lines().\n");
+			    exit (-1);
+			}
+			page = buf + BUF_SIZE / 2;
+		    }
+		    if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+			endwin ();
+			fprintf (stderr, "\nError reading file in "
+				 "back_lines().\n");
+			exit (-1);
+		    }
+		    buf[bytes_read] = '\0';
+		} else {	/* Beginning of file reached */
+		    begin_reached = 1;
+		    return;
+		}
+	    }
+	} while (*(--page) != '\n');
+    page++;
+}
+
+/*
+ * Print a new page of text. Called by dialog_textbox().
+ */
+static void
+print_page (WINDOW * win, int height, int width)
+{
+    int i, passed_end = 0;
+
+    page_length = 0;
+    for (i = 0; i < height; i++) {
+	print_line (win, i, width);
+	if (!passed_end)
+	    page_length++;
+	if (end_reached && !passed_end)
+	    passed_end = 1;
+    }
+    wnoutrefresh (win);
+}
+
+/*
+ * Print a new line of text. Called by dialog_textbox() and print_page().
+ */
+static void
+print_line (WINDOW * win, int row, int width)
+{
+    int y, x;
+    char *line;
+
+    line = get_line ();
+    line += MIN (strlen (line), hscroll);	/* Scroll horizontally */
+    wmove (win, row, 0);	/* move cursor to correct line */
+    waddch (win, ' ');
+    waddnstr (win, line, MIN (strlen (line), width - 2));
+
+    getyx (win, y, x);
+    /* Clear 'residue' of previous line */
+#if OLD_NCURSES
+    {
+	int i;
+	for (i = 0; i < width - x; i++)
+	    waddch (win, ' ');
+    }
+#else
+    wclrtoeol(win);
+#endif
+}
+
+/*
+ * Return current line of text. Called by dialog_textbox() and print_line().
+ * 'page' should point to start of current line before calling, and will be
+ * updated to point to start of next line.
+ */
+static char *
+get_line (void)
+{
+    int i = 0, fpos;
+    static char line[MAX_LEN + 1];
+
+    end_reached = 0;
+    while (*page != '\n') {
+	if (*page == '\0') {
+	    /* Either end of file or end of buffer reached */
+	    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+		endwin ();
+		fprintf (stderr, "\nError moving file pointer in "
+			 "get_line().\n");
+		exit (-1);
+	    }
+	    if (fpos < file_size) {	/* Not end of file yet */
+		/* We've reached end of buffer, but not end of file yet,
+		   so read next part of file into buffer */
+		if ((bytes_read = read (fd, buf, BUF_SIZE)) == -1) {
+		    endwin ();
+		    fprintf (stderr, "\nError reading file in get_line().\n");
+		    exit (-1);
+		}
+		buf[bytes_read] = '\0';
+		page = buf;
+	    } else {
+		if (!end_reached)
+		    end_reached = 1;
+		break;
+	    }
+	} else if (i < MAX_LEN)
+	    line[i++] = *(page++);
+	else {
+	    /* Truncate lines longer than MAX_LEN characters */
+	    if (i == MAX_LEN)
+		line[i++] = '\0';
+	    page++;
+	}
+    }
+    if (i <= MAX_LEN)
+	line[i] = '\0';
+    if (!end_reached)
+	page++;			/* move pass '\n' */
+
+    return line;
+}
+
+/*
+ * Print current position
+ */
+static void
+print_position (WINDOW * win, int height, int width)
+{
+    int fpos, percent;
+
+    if ((fpos = lseek (fd, 0, SEEK_CUR)) == -1) {
+	endwin ();
+	fprintf (stderr, "\nError moving file pointer in print_position().\n");
+	exit (-1);
+    }
+    wattrset (win, position_indicator_attr);
+    wbkgdset (win, position_indicator_attr & A_COLOR);
+    percent = !file_size ?
+	100 : ((fpos - bytes_read + page - buf) * 100) / file_size;
+    wmove (win, height - 3, width - 9);
+    wprintw (win, "(%3d%%)", percent);
+}
diff --git a/2.3/menu/lxdialog/util.c b/2.3/menu/lxdialog/util.c
new file mode 100644
index 0000000..c48e337
--- /dev/null
+++ b/2.3/menu/lxdialog/util.c
@@ -0,0 +1,378 @@
+/*
+ *  util.c
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+
+/* use colors by default? */
+bool use_colors = 1;
+
+const char *backtitle = NULL;
+
+const char *dialog_result;
+
+/*
+ * Attribute values, default is for mono display
+ */
+chtype attributes[] =
+{
+    A_NORMAL,			/* screen_attr */
+    A_NORMAL,			/* shadow_attr */
+    A_NORMAL,			/* dialog_attr */
+    A_BOLD,			/* title_attr */
+    A_NORMAL,			/* border_attr */
+    A_REVERSE,			/* button_active_attr */
+    A_DIM,			/* button_inactive_attr */
+    A_REVERSE,			/* button_key_active_attr */
+    A_BOLD,			/* button_key_inactive_attr */
+    A_REVERSE,			/* button_label_active_attr */
+    A_NORMAL,			/* button_label_inactive_attr */
+    A_NORMAL,			/* inputbox_attr */
+    A_NORMAL,			/* inputbox_border_attr */
+    A_NORMAL,			/* searchbox_attr */
+    A_BOLD,			/* searchbox_title_attr */
+    A_NORMAL,			/* searchbox_border_attr */
+    A_BOLD,			/* position_indicator_attr */
+    A_NORMAL,			/* menubox_attr */
+    A_NORMAL,			/* menubox_border_attr */
+    A_NORMAL,			/* item_attr */
+    A_REVERSE,			/* item_selected_attr */
+    A_BOLD,			/* tag_attr */
+    A_REVERSE,			/* tag_selected_attr */
+    A_BOLD,			/* tag_key_attr */
+    A_REVERSE,			/* tag_key_selected_attr */
+    A_BOLD,			/* check_attr */
+    A_REVERSE,			/* check_selected_attr */
+    A_BOLD,			/* uarrow_attr */
+    A_BOLD			/* darrow_attr */
+};
+
+
+#include "colors.h"
+
+/*
+ * Table of color values
+ */
+int color_table[][3] =
+{
+    {SCREEN_FG, SCREEN_BG, SCREEN_HL},
+    {SHADOW_FG, SHADOW_BG, SHADOW_HL},
+    {DIALOG_FG, DIALOG_BG, DIALOG_HL},
+    {TITLE_FG, TITLE_BG, TITLE_HL},
+    {BORDER_FG, BORDER_BG, BORDER_HL},
+    {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
+    {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
+    {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
+    {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
+    {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
+    {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
+     BUTTON_LABEL_INACTIVE_HL},
+    {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
+    {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
+    {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
+    {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
+    {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
+    {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
+    {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
+    {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
+    {ITEM_FG, ITEM_BG, ITEM_HL},
+    {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
+    {TAG_FG, TAG_BG, TAG_HL},
+    {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
+    {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
+    {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
+    {CHECK_FG, CHECK_BG, CHECK_HL},
+    {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
+    {UARROW_FG, UARROW_BG, UARROW_HL},
+    {DARROW_FG, DARROW_BG, DARROW_HL},
+};				/* color_table */
+
+/*
+ * Set window to attribute 'attr'
+ */
+void
+attr_clear (WINDOW * win, int height, int width, chtype attr)
+{
+    int i, j;
+
+    wattrset (win, attr);
+    for (i = 0; i < height; i++) {
+	wmove (win, i, 0);
+	for (j = 0; j < width; j++)
+	    waddch (win, ' ');
+    }
+    touchwin (win);
+}
+
+void dialog_clear (void)
+{
+    attr_clear (stdscr, LINES, COLS, screen_attr);
+    /* Display background title if it exists ... - SLH */
+    if (backtitle != NULL) {
+	int i;
+
+	wattrset (stdscr, screen_attr);
+	mvwaddstr (stdscr, 0, 1, (char *)backtitle);
+	wmove (stdscr, 1, 1);
+	for (i = 1; i < COLS - 1; i++)
+	    waddch (stdscr, ACS_HLINE);
+    }
+    wnoutrefresh (stdscr);
+}
+
+/*
+ * Do some initialization for dialog
+ */
+void
+init_dialog (void)
+{
+#ifdef LOCALE
+    setlocale(LC_CTYPE, "");    /* required by ncurses on linux UTF-8 console */
+#endif
+    initscr ();			/* Init curses */
+    keypad (stdscr, TRUE);
+    cbreak ();
+    noecho ();
+
+
+    if (use_colors)	/* Set up colors */
+	color_setup ();
+
+
+    dialog_clear ();
+}
+
+/*
+ * Setup for color display
+ */
+void
+color_setup (void)
+{
+    int i;
+
+    if (has_colors ()) {	/* Terminal supports color? */
+	start_color ();
+
+	/* Initialize color pairs */
+	for (i = 0; i < ATTRIBUTE_COUNT; i++)
+	    init_pair (i + 1, color_table[i][0], color_table[i][1]);
+
+	/* Setup color attributes */
+	for (i = 0; i < ATTRIBUTE_COUNT; i++)
+	    attributes[i] = C_ATTR (color_table[i][2], i + 1);
+    }
+}
+
+/*
+ * End using dialog functions.
+ */
+void
+end_dialog (void)
+{
+    endwin ();
+}
+
+
+/*
+ * Print a string of text in a window, automatically wrap around to the
+ * next line if the string is too long to fit on one line. Newline
+ * characters '\n' are replaced by spaces.  We start on a new line
+ * if there is no room for at least 4 nonblanks following a double-space.
+ */
+void
+print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
+{
+    int newl, cur_x, cur_y;
+    int i, prompt_len, room, wlen;
+    char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
+
+    strcpy (tempstr, prompt);
+
+    prompt_len = strlen(tempstr);
+
+    /*
+     * Remove newlines
+     */
+    for(i=0; i<prompt_len; i++) {
+	if(tempstr[i] == '\n') tempstr[i] = ' ';
+    }
+
+    if (prompt_len <= width - x * 2) {	/* If prompt is short */
+	wmove (win, y, (width - prompt_len) / 2);
+	waddstr (win, tempstr);
+    } else {
+	cur_x = x;
+	cur_y = y;
+	newl = 1;
+	word = tempstr;
+	while (word && *word) {
+	    sp = index(word, ' ');
+	    if (sp)
+	        *sp++ = 0;
+
+	    /* Wrap to next line if either the word does not fit,
+	       or it is the first word of a new sentence, and it is
+	       short, and the next word does not fit. */
+	    room = width - cur_x;
+	    wlen = strlen(word);
+	    if (wlen > room ||
+	       (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
+		     && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
+		cur_y++;
+		cur_x = x;
+	    }
+	    wmove (win, cur_y, cur_x);
+	    waddstr (win, word);
+	    getyx (win, cur_y, cur_x);
+	    cur_x++;
+	    if (sp && *sp == ' ') {
+	        cur_x++;	/* double space */
+		while (*++sp == ' ');
+		newl = 1;
+	    } else
+	        newl = 0;
+	    word = sp;
+	}
+    }
+}
+
+/*
+ * Print a button
+ */
+void
+print_button (WINDOW * win, const char *label, int y, int x, int selected)
+{
+    int i, temp;
+
+    wmove (win, y, x);
+    wattrset (win, selected ? button_active_attr : button_inactive_attr);
+    waddstr (win, "<");
+    temp = strspn (label, " ");
+    label += temp;
+    wattrset (win, selected ? button_label_active_attr
+	      : button_label_inactive_attr);
+    for (i = 0; i < temp; i++)
+	waddch (win, ' ');
+    wattrset (win, selected ? button_key_active_attr
+	      : button_key_inactive_attr);
+    waddch (win, label[0]);
+    wattrset (win, selected ? button_label_active_attr
+	      : button_label_inactive_attr);
+    waddstr (win, (char *)label + 1);
+    wattrset (win, selected ? button_active_attr : button_inactive_attr);
+    waddstr (win, ">");
+    wmove (win, y, x + temp + 1);
+}
+
+/*
+ * Draw a rectangular box with line drawing characters
+ */
+void
+draw_box (WINDOW * win, int y, int x, int height, int width,
+	  chtype box, chtype border)
+{
+    int i, j;
+
+    wattrset (win, 0);
+    for (i = 0; i < height; i++) {
+	wmove (win, y + i, x);
+	for (j = 0; j < width; j++)
+	    if (!i && !j)
+		waddch (win, border | ACS_ULCORNER);
+	    else if (i == height - 1 && !j)
+		waddch (win, border | ACS_LLCORNER);
+	    else if (!i && j == width - 1)
+		waddch (win, box | ACS_URCORNER);
+	    else if (i == height - 1 && j == width - 1)
+		waddch (win, box | ACS_LRCORNER);
+	    else if (!i)
+		waddch (win, border | ACS_HLINE);
+	    else if (i == height - 1)
+		waddch (win, box | ACS_HLINE);
+	    else if (!j)
+		waddch (win, border | ACS_VLINE);
+	    else if (j == width - 1)
+		waddch (win, box | ACS_VLINE);
+	    else
+		waddch (win, box | ' ');
+    }
+}
+
+/*
+ * Draw shadows along the right and bottom edge to give a more 3D look
+ * to the boxes
+ */
+void
+draw_shadow (WINDOW * win, int y, int x, int height, int width)
+{
+    int i;
+
+    if (has_colors ()) {	/* Whether terminal supports color? */
+	wattrset (win, shadow_attr);
+	wmove (win, y + height, x + 2);
+	for (i = 0; i < width; i++)
+	    waddch (win, winch (win) & A_CHARTEXT);
+	for (i = y + 1; i < y + height + 1; i++) {
+	    wmove (win, i, x + width);
+	    waddch (win, winch (win) & A_CHARTEXT);
+	    waddch (win, winch (win) & A_CHARTEXT);
+	}
+	wnoutrefresh (win);
+    }
+}
+
+/*
+ *  Return the position of the first alphabetic character in a string.
+ */
+int
+first_alpha(const char *string, const char *exempt)
+{
+	int i, in_paren=0, c;
+
+	for (i = 0; i < strlen(string); i++) {
+		c = tolower(string[i]);
+
+		if (strchr("<[(", c)) ++in_paren;
+		if (strchr(">])", c) && in_paren > 0) --in_paren;
+
+		if ((! in_paren) && isalpha(c) &&
+		     strchr(exempt, c) == 0)
+			return i;
+	}
+
+	return 0;
+}
+
+/*
+ * Get the first selected item in the dialog_list_item list.
+ */
+struct dialog_list_item *
+first_sel_item(int item_no, struct dialog_list_item ** items)
+{
+	int i;
+
+	for (i = 0; i < item_no; i++) {
+		if (items[i]->selected)
+			return items[i];
+	}
+
+	return NULL;
+}
diff --git a/2.3/menu/lxdialog/yesno.c b/2.3/menu/lxdialog/yesno.c
new file mode 100644
index 0000000..11fcc25
--- /dev/null
+++ b/2.3/menu/lxdialog/yesno.c
@@ -0,0 +1,118 @@
+/*
+ *  yesno.c -- implements the yes/no box
+ *
+ *  ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
+ *  MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU General Public License
+ *  as published by the Free Software Foundation; either version 2
+ *  of the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "dialog.h"
+
+/*
+ * Display termination buttons
+ */
+static void
+print_buttons(WINDOW *dialog, int height, int width, int selected)
+{
+    int x = width / 2 - 10;
+    int y = height - 2;
+
+    print_button (dialog, " Yes ", y, x, selected == 0);
+    print_button (dialog, "  No  ", y, x + 13, selected == 1);
+
+    wmove(dialog, y, x+1 + 13*selected );
+    wrefresh (dialog);
+}
+
+/*
+ * Display a dialog box with two buttons - Yes and No
+ */
+int
+dialog_yesno (const char *title, const char *prompt, int height, int width)
+{
+    int i, x, y, key = 0, button = 0;
+    WINDOW *dialog;
+
+    /* center dialog box on screen */
+    x = (COLS - width) / 2;
+    y = (LINES - height) / 2;
+
+    draw_shadow (stdscr, y, x, height, width);
+
+    dialog = newwin (height, width, y, x);
+    keypad (dialog, TRUE);
+
+    draw_box (dialog, 0, 0, height, width, dialog_attr, border_attr);
+    wattrset (dialog, border_attr);
+    mvwaddch (dialog, height-3, 0, ACS_LTEE);
+    for (i = 0; i < width - 2; i++)
+	waddch (dialog, ACS_HLINE);
+    wattrset (dialog, dialog_attr);
+    waddch (dialog, ACS_RTEE);
+
+    if (title != NULL && strlen(title) >= width-2 ) {
+	/* truncate long title -- mec */
+	char * title2 = malloc(width-2+1);
+	memcpy( title2, title, width-2 );
+	title2[width-2] = '\0';
+	title = title2;
+    }
+
+    if (title != NULL) {
+	wattrset (dialog, title_attr);
+	mvwaddch (dialog, 0, (width - strlen(title))/2 - 1, ' ');
+	waddstr (dialog, (char *)title);
+	waddch (dialog, ' ');
+    }
+
+    wattrset (dialog, dialog_attr);
+    print_autowrap (dialog, prompt, width - 2, 1, 3);
+
+    print_buttons(dialog, height, width, 0);
+
+    while (key != ESC) {
+	key = wgetch (dialog);
+	switch (key) {
+	case 'Y':
+	case 'y':
+	    delwin (dialog);
+	    return 0;
+	case 'N':
+	case 'n':
+	    delwin (dialog);
+	    return 1;
+
+	case TAB:
+	case KEY_LEFT:
+	case KEY_RIGHT:
+	    button = ((key == KEY_LEFT ? --button : ++button) < 0)
+			? 1 : (button > 1 ? 0 : button);
+
+	    print_buttons(dialog, height, width, button);
+	    wrefresh (dialog);
+	    break;
+	case ' ':
+	case '\n':
+	    delwin (dialog);
+	    return button;
+	case ESC:
+	    break;
+	}
+    }
+
+    delwin (dialog);
+    return -1;			/* ESC pressed */
+}
diff --git a/2.3/menu/mconf.c b/2.3/menu/mconf.c
new file mode 100644
index 0000000..0722f4c
--- /dev/null
+++ b/2.3/menu/mconf.c
@@ -0,0 +1,976 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ *
+ * Introduced single menu mode (show all sub-menus in one large tree).
+ * 2002-11-06 Petr Baudis <pasky@ucw.cz>
+ *
+ * Directly use liblxdialog library routines.
+ * 2002-11-14 Petr Baudis <pasky@ucw.cz>
+ */
+
+#include <sys/ioctl.h>
+#include <sys/wait.h>
+#include <sys/termios.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "lxdialog/dialog.h"
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+static char menu_backtitle[128];
+static const char mconf_readme[] =
+"Overview\n"
+"--------\n"
+"Some features may be built directly into JHALFS.  Some features\n"
+"may be completely removed altogether.  There are also certain\n"
+"parameters which are not really features, but must be\n"
+"entered in as decimal or hexadecimal numbers or possibly text.\n"
+"\n"
+"Menu items beginning with [*] or [ ] represent features\n"
+"configured to be built in or removed respectively.\n"
+"\n"
+"To change any of these features, highlight it with the cursor\n"
+"keys and press <Y> to build it in or <N> to removed it.\n"
+"You may also press the <Space Bar> to cycle\n"
+"through the available options (ie. Y->N->Y).\n"
+"\n"
+"Some additional keyboard hints:\n"
+"\n"
+"Menus\n"
+"----------\n"
+"o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
+"   you wish to change or submenu wish to select and press <Enter>.\n"
+"   Submenus are designated by \"--->\".\n"
+"\n"
+"   Shortcut: Press the option's highlighted letter (hotkey).\n"
+"             Pressing a hotkey more than once will sequence\n"
+"             through all visible items which use that hotkey.\n"
+"\n"
+"   You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
+"   unseen options into view.\n"
+"\n"
+"o  To exit a menu use the cursor keys to highlight the <Exit> button\n"
+"   and press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
+"             using those letters.  You may press a single <ESC>, but\n"
+"             there is a delayed response which you may find annoying.\n"
+"\n"
+"   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
+"   <Exit> and <Help>\n"
+"\n"
+"o  To get help with an item, use the cursor keys to highlight <Help>\n"
+"   and Press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"\n"
+"Radiolists  (Choice lists)\n"
+"-----------\n"
+"o  Use the cursor keys to select the option you wish to set and press\n"
+"   <S> or the <SPACE BAR>.\n"
+"\n"
+"   Shortcut: Press the first letter of the option you wish to set then\n"
+"             press <S> or <SPACE BAR>.\n"
+"\n"
+"o  To see available help for the item, use the cursor keys to highlight\n"
+"   <Help> and Press <ENTER>.\n"
+"\n"
+"   Shortcut: Press <H> or <?>.\n"
+"\n"
+"   Also, the <TAB> and cursor keys will cycle between <Select> and\n"
+"   <Help>\n"
+"\n"
+"\n"
+"Data Entry\n"
+"-----------\n"
+"o  Enter the requested information and press <ENTER>\n"
+"   If you are entering hexadecimal values, it is not necessary to\n"
+"   add the '0x' prefix to the entry.\n"
+"\n"
+"o  For help, use the <TAB> or cursor keys to highlight the help option\n"
+"   and press <ENTER>.  You can try <TAB><H> as well.\n"
+"\n"
+"\n"
+"Text Box    (Help Window)\n"
+"--------\n"
+"o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
+"   keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
+"   who are familiar with less and lynx.\n"
+"\n"
+"o  Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
+"\n"
+"\n"
+"Alternate Configuration Files\n"
+"-----------------------------\n"
+"Menuconfig supports the use of alternate configuration files for\n"
+"those who, for various reasons, find it necessary to switch\n"
+"between different configurations.\n"
+"\n"
+"At the end of the main menu you will find two options.  One is\n"
+"for saving the current configuration to a file of your choosing.\n"
+"The other option is for loading a previously saved alternate\n"
+"configuration.\n"
+"\n"
+"Even if you don't use alternate configuration files, but you\n"
+"find during a Menuconfig session that you have completely messed\n"
+"up your settings, you may use the \"Load Alternate...\" option to\n"
+"restore your previously saved settings from \".config\" without\n"
+"restarting Menuconfig.\n"
+"\n"
+"Other information\n"
+"-----------------\n"
+"If you use Menuconfig in an XTERM window make sure you have your\n"
+"$TERM variable set to point to a xterm definition which supports color.\n"
+"Otherwise, Menuconfig will look rather bad.  Menuconfig will not\n"
+"display correctly in a RXVT window because rxvt displays only one\n"
+"intensity of color, bright.\n"
+"\n"
+"Menuconfig will display larger menus on screens or xterms which are\n"
+"set to display more than the standard 25 row by 80 column geometry.\n"
+"In order for this to work, the \"stty size\" command must be able to\n"
+"display the screen's current row and column geometry.  I STRONGLY\n"
+"RECOMMEND that you make sure you do NOT have the shell variables\n"
+"LINES and COLUMNS exported into your environment.  Some distributions\n"
+"export those variables via /etc/profile.  Some ncurses programs can\n"
+"become confused when those variables (LINES & COLUMNS) don't reflect\n"
+"the true screen size.\n"
+"\n"
+"Optional personality available\n"
+"------------------------------\n"
+"If you prefer to have all of the options listed in a single\n"
+"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
+"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
+"\n"
+"make MENUCONFIG_MODE=single_menu menuconfig\n"
+"\n"
+"<Enter> will then unroll the appropriate category, or enfold it if it\n"
+"is already unrolled.\n"
+"\n"
+"Note that this mode can eventually be a little more CPU expensive\n"
+"(especially with a larger number of unrolled categories) than the\n"
+"default mode.\n",
+menu_instructions[] =
+	"Arrow keys navigate the menu.  "
+	"<Enter> selects submenus --->.  "
+	"Highlighted letters are hotkeys.  "
+	"Pressing <Y> selectes a feature, while <N> will exclude a feature.  "
+	"Press <Esc><Esc> to exit, <?> for Help, </> for Search.  "
+	"Legend: [*] feature is selected  [ ] feature is excluded",
+radiolist_instructions[] =
+	"Use the arrow keys to navigate this window or "
+	"press the hotkey of the item you wish to select "
+	"followed by the <SPACE BAR>. "
+	"Press <?> for additional information about this option.",
+inputbox_instructions_int[] =
+	"Please enter a decimal value. "
+	"Fractions will not be accepted.  "
+	"Use the <TAB> key to move from the input field to the buttons below it.",
+inputbox_instructions_hex[] =
+	"Please enter a hexadecimal value. "
+	"Use the <TAB> key to move from the input field to the buttons below it.",
+inputbox_instructions_string[] =
+	"Please enter a string value. "
+	"Use the <TAB> key to move from the input field to the buttons below it.",
+setmod_text[] =
+	"This feature depends on another which has been configured as a module.\n"
+	"As a result, this feature will be built as a module.",
+nohelp_text[] =
+	"There is no help available for this option.\n",
+load_config_text[] =
+	"Enter the name of the configuration file you wish to load.  "
+	"Accept the name shown to restore the configuration you "
+	"last retrieved.  Leave blank to abort.",
+load_config_help[] =
+	"\n"
+	"For various reasons, one may wish to keep several different JHALFS\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"If you have saved a previous configuration in a file other than the\n"
+	"JHALFS's default, entering the name of the file here will allow you\n"
+	"to modify that configuration.\n"
+	"\n"
+	"If you are uncertain, then you have probably never used alternate\n"
+	"configuration files.  You should therefor leave this blank to abort.\n",
+save_config_text[] =
+	"Enter a filename to which this configuration should be saved "
+	"as an alternate.  Leave blank to abort.",
+save_config_help[] =
+	"\n"
+	"For various reasons, one may wish to keep different JHALFS\n"
+	"configurations available on a single machine.\n"
+	"\n"
+	"Entering a file name here will allow you to later retrieve, modify\n"
+	"and use the current configuration as an alternate to whatever\n"
+	"configuration options you have selected at that time.\n"
+	"\n"
+	"If you are uncertain what all this means then you should probably\n"
+	"leave this blank.\n",
+search_help[] =
+	"\n"
+	"Search for CONFIG_ symbols and display their relations.\n"
+	"Example: search for \"^FOO\"\n"
+	"Result:\n"
+	"-----------------------------------------------------------------\n"
+	"Symbol: FOO [=m]\n"
+	"Prompt: Foo bus is used to drive the bar HW\n"
+	"Defined at drivers/pci/Kconfig:47\n"
+	"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
+	"Location:\n"
+	"  -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
+	"    -> PCI support (PCI [=y])\n"
+	"      -> PCI access mode (<choice> [=y])\n"
+	"Selects: LIBCRC32\n"
+	"Selected by: BAR\n"
+	"-----------------------------------------------------------------\n"
+	"o The line 'Prompt:' shows the text used in the menu structure for\n"
+	"  this CONFIG_ symbol\n"
+	"o The 'Defined at' line tell at what file / line number the symbol\n"
+	"  is defined\n"
+	"o The 'Depends on:' line tell what symbols needs to be defined for\n"
+	"  this symbol to be visible in the menu (selectable)\n"
+	"o The 'Location:' lines tell where in the menu structure this symbol\n"
+	"  is located\n"
+	"    A location followed by a [=y] indicate that this is a selectable\n"
+	"    menu item - and current value is displayed inside brackets.\n"
+	"o The 'Selects:' line tell what symbol will be automatically\n"
+	"  selected if this symbol is selected (y or m)\n"
+	"o The 'Selected by' line tell what symbol has selected this symbol\n"
+	"\n"
+	"Only relevant lines are shown.\n"
+	"\n\n"
+	"Search examples:\n"
+	"Examples: USB	=> find all CONFIG_ symbols containing USB\n"
+	"          ^USB => find all CONFIG_ symbols starting with USB\n"
+	"          USB$ => find all CONFIG_ symbols ending with USB\n"
+	"\n";
+
+static char filename[PATH_MAX+1] = ".config";
+static int indent;
+static struct termios ios_org;
+static int rows = 0, cols = 0;
+static struct menu *current_menu;
+static int child_count;
+static int single_menu_mode;
+
+static struct dialog_list_item *items[16384]; /* FIXME: This ought to be dynamic. */
+static int item_no;
+
+static void conf(struct menu *menu);
+static void conf_choice(struct menu *menu);
+static void conf_string(struct menu *menu);
+static void conf_load(void);
+static void conf_save(void);
+static void show_textbox(const char *title, const char *text, int r, int c);
+static void show_helptext(const char *title, const char *text);
+static void show_help(struct menu *menu);
+static void show_file(const char *filename, const char *title, int r, int c);
+
+static void init_wsize(void)
+{
+	struct winsize ws;
+	char *env;
+
+	if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
+		rows = ws.ws_row;
+		cols = ws.ws_col;
+	}
+
+	if (!rows) {
+		env = getenv("LINES");
+		if (env)
+			rows = atoi(env);
+		if (!rows)
+			rows = 24;
+	}
+	if (!cols) {
+		env = getenv("COLUMNS");
+		if (env)
+			cols = atoi(env);
+		if (!cols)
+			cols = 80;
+	}
+
+	if (rows < 19 || cols < 80) {
+		fprintf(stderr, "Your display is too small to run Menuconfig!\n");
+		fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
+		exit(1);
+	}
+
+	rows -= 4;
+	cols -= 5;
+}
+
+static void cinit(void)
+{
+	item_no = 0;
+}
+
+static void cmake(void)
+{
+	items[item_no] = malloc(sizeof(struct dialog_list_item));
+	memset(items[item_no], 0, sizeof(struct dialog_list_item));
+	items[item_no]->tag = malloc(32); items[item_no]->tag[0] = 0;
+	items[item_no]->name = malloc(512); items[item_no]->name[0] = 0;
+	items[item_no]->namelen = 0;
+	item_no++;
+}
+
+static int cprint_name(const char *fmt, ...)
+{
+	va_list ap;
+	int res;
+
+	if (!item_no)
+		cmake();
+	va_start(ap, fmt);
+	res = vsnprintf(items[item_no - 1]->name + items[item_no - 1]->namelen,
+			512 - items[item_no - 1]->namelen, fmt, ap);
+	if (res > 0)
+		items[item_no - 1]->namelen += res;
+	va_end(ap);
+
+	return res;
+}
+
+static int cprint_tag(const char *fmt, ...)
+{
+	va_list ap;
+	int res;
+
+	if (!item_no)
+		cmake();
+	va_start(ap, fmt);
+	res = vsnprintf(items[item_no - 1]->tag, 32, fmt, ap);
+	va_end(ap);
+
+	return res;
+}
+
+static void cdone(void)
+{
+	int i;
+
+	for (i = 0; i < item_no; i++) {
+		free(items[i]->tag);
+		free(items[i]->name);
+		free(items[i]);
+	}
+
+	item_no = 0;
+}
+
+static void get_prompt_str(struct gstr *r, struct property *prop)
+{
+	int i, j;
+	struct menu *submenu[8], *menu;
+
+	str_printf(r, "Prompt: %s\n", prop->text);
+	str_printf(r, "  Defined at %s:%d\n", prop->menu->file->name,
+		prop->menu->lineno);
+	if (!expr_is_yes(prop->visible.expr)) {
+		str_append(r, "  Depends on: ");
+		expr_gstr_print(prop->visible.expr, r);
+		str_append(r, "\n");
+	}
+	menu = prop->menu->parent;
+	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
+		submenu[i++] = menu;
+	if (i > 0) {
+		str_printf(r, "  Location:\n");
+		for (j = 4; --i >= 0; j += 2) {
+			menu = submenu[i];
+			str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
+			if (menu->sym) {
+				str_printf(r, " (%s [=%s])", menu->sym->name ?
+					menu->sym->name : "<choice>",
+					sym_get_string_value(menu->sym));
+			}
+			str_append(r, "\n");
+		}
+	}
+}
+
+static void get_symbol_str(struct gstr *r, struct symbol *sym)
+{
+	bool hit;
+	struct property *prop;
+
+	str_printf(r, "Symbol: %s [=%s]\n", sym->name,
+	                               sym_get_string_value(sym));
+	for_all_prompts(sym, prop)
+		get_prompt_str(r, prop);
+	hit = false;
+	for_all_properties(sym, prop, P_SELECT) {
+		if (!hit) {
+			str_append(r, "  Selects: ");
+			hit = true;
+		} else
+			str_printf(r, " && ");
+		expr_gstr_print(prop->expr, r);
+	}
+	if (hit)
+		str_append(r, "\n");
+	if (sym->rev_dep.expr) {
+		str_append(r, "  Selected by: ");
+		expr_gstr_print(sym->rev_dep.expr, r);
+		str_append(r, "\n");
+	}
+	str_append(r, "\n\n");
+}
+
+static struct gstr get_relations_str(struct symbol **sym_arr)
+{
+	struct symbol *sym;
+	struct gstr res = str_new();
+	int i;
+
+	for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
+		get_symbol_str(&res, sym);
+	if (!i)
+		str_append(&res, "No matches found.\n");
+	return res;
+}
+
+static void search_conf(void)
+{
+	struct symbol **sym_arr;
+	struct gstr res;
+
+again:
+	switch (dialog_inputbox("Search Configuration Parameter",
+				"Enter Keyword", 10, 75,
+				NULL)) {
+	case 0:
+		break;
+	case 1:
+		show_helptext("Search Configuration", search_help);
+		goto again;
+	default:
+		return;
+	}
+
+	sym_arr = sym_re_search(dialog_input_result);
+	res = get_relations_str(sym_arr);
+	free(sym_arr);
+	show_textbox("Search Results", str_get(&res), 0, 0);
+	str_free(&res);
+}
+
+static void build_conf(struct menu *menu)
+{
+	struct symbol *sym;
+	struct property *prop;
+	struct menu *child;
+	int type, tmp, doint = 2;
+	tristate val;
+	char ch;
+
+	if (!menu_is_visible(menu))
+		return;
+
+	sym = menu->sym;
+	prop = menu->prompt;
+	if (!sym) {
+		if (prop && menu != current_menu) {
+			const char *prompt = menu_get_prompt(menu);
+			switch (prop->type) {
+			case P_MENU:
+				child_count++;
+				cmake();
+				cprint_tag("m%p", menu);
+
+				if (single_menu_mode) {
+					cprint_name("%s%*c%s",
+						menu->data ? "-->" : "++>",
+						indent + 1, ' ', prompt);
+				} else {
+					cprint_name("   %*c%s  --->", indent + 1, ' ', prompt);
+				}
+
+				if (single_menu_mode && menu->data)
+					goto conf_childs;
+				return;
+			default:
+				if (prompt) {
+					child_count++;
+					cmake();
+					cprint_tag(":%p", menu);
+					cprint_name("---%*c%s", indent + 1, ' ', prompt);
+				}
+			}
+		} else
+			doint = 0;
+		goto conf_childs;
+	}
+
+	cmake();
+	type = sym_get_type(sym);
+	if (sym_is_choice(sym)) {
+		struct symbol *def_sym = sym_get_choice_value(sym);
+		struct menu *def_menu = NULL;
+
+		child_count++;
+		for (child = menu->list; child; child = child->next) {
+			if (menu_is_visible(child) && child->sym == def_sym)
+				def_menu = child;
+		}
+
+		val = sym_get_tristate_value(sym);
+		if (sym_is_changable(sym)) {
+			cprint_tag("t%p", menu);
+			switch (type) {
+			case S_BOOLEAN:
+				cprint_name("[%c]", val == no ? ' ' : '*');
+				break;
+			case S_TRISTATE:
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				cprint_name("<%c>", ch);
+				break;
+			}
+		} else {
+			cprint_tag("%c%p", def_menu ? 't' : ':', menu);
+			cprint_name("   ");
+		}
+
+		cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+		if (val == yes) {
+			if (def_menu) {
+				cprint_name(" (%s)", menu_get_prompt(def_menu));
+				cprint_name("  --->");
+				if (def_menu->list) {
+					indent += 2;
+					build_conf(def_menu);
+					indent -= 2;
+				}
+			}
+			return;
+		}
+	} else {
+		if (menu == current_menu) {
+			cprint_tag(":%p", menu);
+			cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
+			goto conf_childs;
+		}
+		child_count++;
+		val = sym_get_tristate_value(sym);
+		if (sym_is_choice_value(sym) && val == yes) {
+			cprint_tag(":%p", menu);
+			cprint_name("   ");
+		} else {
+			switch (type) {
+			case S_BOOLEAN:
+				cprint_tag("t%p", menu);
+				if (sym_is_changable(sym))
+					cprint_name("[%c]", val == no ? ' ' : '*');
+				else
+					cprint_name("---");
+				break;
+			case S_TRISTATE:
+				cprint_tag("t%p", menu);
+				switch (val) {
+				case yes: ch = '*'; break;
+				case mod: ch = 'M'; break;
+				default:  ch = ' '; break;
+				}
+				if (sym_is_changable(sym))
+					cprint_name("<%c>", ch);
+				else
+					cprint_name("---");
+				break;
+			default:
+				cprint_tag("s%p", menu);
+				tmp = cprint_name("(%s)", sym_get_string_value(sym));
+				tmp = indent - tmp + 4;
+				if (tmp < 0)
+					tmp = 0;
+				cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
+					(sym_has_value(sym) || !sym_is_changable(sym)) ?
+					"" : " (NEW)");
+				goto conf_childs;
+			}
+		}
+		cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
+			(sym_has_value(sym) || !sym_is_changable(sym)) ?
+			"" : " (NEW)");
+		if (menu->prompt->type == P_MENU) {
+			cprint_name("  --->");
+			return;
+		}
+	}
+
+conf_childs:
+	indent += doint;
+	for (child = menu->list; child; child = child->next)
+		build_conf(child);
+	indent -= doint;
+}
+
+static void conf(struct menu *menu)
+{
+	struct dialog_list_item *active_item = NULL;
+	struct menu *submenu;
+	const char *prompt = menu_get_prompt(menu);
+	struct symbol *sym;
+	char active_entry[40];
+	int stat, type;
+
+	unlink("lxdialog.scrltmp");
+	active_entry[0] = 0;
+	while (1) {
+		indent = 0;
+		child_count = 0;
+		current_menu = menu;
+		cdone(); cinit();
+		build_conf(menu);
+		if (!child_count)
+			break;
+		if (menu == &rootmenu) {
+			cmake(); cprint_tag(":"); cprint_name("--- ");
+			cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File");
+			cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File");
+		}
+		dialog_clear();
+		stat = dialog_menu(prompt ? prompt : "Main Menu",
+				menu_instructions, rows, cols, rows - 10,
+				active_entry, item_no, items);
+		if (stat < 0)
+			return;
+
+		if (stat == 1 || stat == 255)
+			break;
+
+		active_item = first_sel_item(item_no, items);
+		if (!active_item)
+			continue;
+		active_item->selected = 0;
+		strncpy(active_entry, active_item->tag, sizeof(active_entry));
+		active_entry[sizeof(active_entry)-1] = 0;
+		type = active_entry[0];
+		if (!type)
+			continue;
+
+		sym = NULL;
+		submenu = NULL;
+		if (sscanf(active_entry + 1, "%p", &submenu) == 1)
+			sym = submenu->sym;
+
+		switch (stat) {
+		case 0:
+			switch (type) {
+			case 'm':
+				if (single_menu_mode)
+					submenu->data = (void *) (long) !submenu->data;
+				else
+					conf(submenu);
+				break;
+			case 't':
+				if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
+					conf_choice(submenu);
+				else if (submenu->prompt->type == P_MENU)
+					conf(submenu);
+				break;
+			case 's':
+				conf_string(submenu);
+				break;
+			case 'L':
+				conf_load();
+				break;
+			case 'S':
+				conf_save();
+				break;
+			}
+			break;
+		case 2:
+			if (sym)
+				show_help(submenu);
+			else
+				show_helptext("README", mconf_readme);
+			break;
+		case 3:
+			if (type == 't') {
+				if (sym_set_tristate_value(sym, yes))
+					break;
+				if (sym_set_tristate_value(sym, mod))
+					show_textbox(NULL, setmod_text, 6, 74);
+			}
+			break;
+		case 4:
+			if (type == 't')
+				sym_set_tristate_value(sym, no);
+			break;
+		case 5:
+			if (type == 't')
+				sym_set_tristate_value(sym, mod);
+			break;
+		case 6:
+			if (type == 't')
+				sym_toggle_tristate_value(sym);
+			else if (type == 'm')
+				conf(submenu);
+			break;
+		case 7:
+			search_conf();
+			break;
+		}
+	}
+}
+
+static void show_textbox(const char *title, const char *text, int r, int c)
+{
+	int fd;
+
+	fd = creat(".help.tmp", 0777);
+	write(fd, text, strlen(text));
+	close(fd);
+	show_file(".help.tmp", title, r, c);
+	unlink(".help.tmp");
+}
+
+static void show_helptext(const char *title, const char *text)
+{
+	show_textbox(title, text, 0, 0);
+}
+
+static void show_help(struct menu *menu)
+{
+	struct gstr help = str_new();
+	struct symbol *sym = menu->sym;
+
+	if (sym->help)
+	{
+		if (sym->name) {
+			str_printf(&help, "%s:\n\n", sym->name);
+			str_append(&help, sym->help);
+			str_append(&help, "\n");
+		}
+	} else {
+		str_append(&help, nohelp_text);
+	}
+	get_symbol_str(&help, sym);
+	show_helptext(menu_get_prompt(menu), str_get(&help));
+	str_free(&help);
+}
+
+static void show_file(const char *filename, const char *title, int r, int c)
+{
+	while (dialog_textbox(title, filename, r ? r : rows, c ? c : cols) < 0)
+		;
+}
+
+static void conf_choice(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+	struct menu *child;
+	struct symbol *active;
+
+	active = sym_get_choice_value(menu->sym);
+	while (1) {
+		current_menu = menu;
+		cdone(); cinit();
+		for (child = menu->list; child; child = child->next) {
+			if (!menu_is_visible(child))
+				continue;
+			cmake();
+			cprint_tag("%p", child);
+			cprint_name("%s", menu_get_prompt(child));
+			if (child->sym == sym_get_choice_value(menu->sym))
+				items[item_no - 1]->selected = 1; /* ON */
+			else if (child->sym == active)
+				items[item_no - 1]->selected = 2; /* SELECTED */
+			else
+				items[item_no - 1]->selected = 0; /* OFF */
+		}
+
+		switch (dialog_checklist(prompt ? prompt : "Main Menu",
+					radiolist_instructions, 15, 70, 6,
+					item_no, items, FLAG_RADIO)) {
+		case 0:
+			if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1)
+				break;
+			sym_set_tristate_value(child->sym, yes);
+			return;
+		case 1:
+			if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) == 1) {
+				show_help(child);
+				active = child->sym;
+			} else
+				show_help(menu);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_string(struct menu *menu)
+{
+	const char *prompt = menu_get_prompt(menu);
+
+	while (1) {
+		char *heading;
+
+		switch (sym_get_type(menu->sym)) {
+		case S_INT:
+			heading = (char *) inputbox_instructions_int;
+			break;
+		case S_HEX:
+			heading = (char *) inputbox_instructions_hex;
+			break;
+		case S_STRING:
+			heading = (char *) inputbox_instructions_string;
+			break;
+		default:
+			heading = "Internal mconf error!";
+			/* panic? */;
+		}
+
+		switch (dialog_inputbox(prompt ? prompt : "Main Menu",
+					heading, 10, 75,
+					sym_get_string_value(menu->sym))) {
+		case 0:
+			if (sym_set_string_value(menu->sym, dialog_input_result))
+				return;
+			show_textbox(NULL, "You have made an invalid entry.", 5, 43);
+			break;
+		case 1:
+			show_help(menu);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_load(void)
+{
+	while (1) {
+		switch (dialog_inputbox(NULL, load_config_text, 11, 55,
+					filename)) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_read(dialog_input_result))
+				return;
+			show_textbox(NULL, "File does not exist!", 5, 38);
+			break;
+		case 1:
+			show_helptext("Load Alternate Configuration", load_config_help);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_save(void)
+{
+	while (1) {
+		switch (dialog_inputbox(NULL, save_config_text, 11, 55,
+					filename)) {
+		case 0:
+			if (!dialog_input_result[0])
+				return;
+			if (!conf_write(dialog_input_result))
+				return;
+			show_textbox(NULL, "Can't create file!  Probably a nonexistent directory.", 5, 60);
+			break;
+		case 1:
+			show_helptext("Save Alternate Configuration", save_config_help);
+			break;
+		case 255:
+			return;
+		}
+	}
+}
+
+static void conf_cleanup(void)
+{
+	tcsetattr(1, TCSAFLUSH, &ios_org);
+	unlink(".help.tmp");
+}
+
+static void winch_handler(int sig)
+{
+	struct winsize ws;
+
+	if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
+		rows = 24;
+		cols = 80;
+	} else {
+		rows = ws.ws_row;
+		cols = ws.ws_col;
+	}
+
+	if (rows < 19 || cols < 80) {
+		end_dialog();
+		fprintf(stderr, "Your display is too small to run Menuconfig!\n");
+		fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");
+		exit(1);
+	}
+
+	rows -= 4;
+	cols -= 5;
+
+}
+
+int main(int ac, char **av)
+{
+	struct symbol *sym;
+	char *mode;
+	int stat;
+
+	conf_parse(av[1]);
+	conf_read(NULL);
+
+	sym = sym_lookup("VERSION", 0);
+	sym_calc_value(sym);
+	snprintf(menu_backtitle, 128, "JHALFS v%s Configuration",
+		sym_get_string_value(sym));
+
+	mode = getenv("MENUCONFIG_MODE");
+	if (mode) {
+		if (!strcasecmp(mode, "single_menu"))
+			single_menu_mode = 1;
+	}
+
+	tcgetattr(1, &ios_org);
+	atexit(conf_cleanup);
+	init_wsize();
+	init_dialog();
+	signal(SIGWINCH, winch_handler);
+	conf(&rootmenu);
+	end_dialog();
+
+	/* Restart dialog to act more like when lxdialog was still separate */
+	init_dialog();
+	do {
+		stat = dialog_yesno(NULL,
+				    "Do you wish to save your new JHALFS configuration?", 5, 60);
+	} while (stat < 0);
+	end_dialog();
+
+	if (stat == 0) {
+		conf_write(NULL);
+		printf("\n"
+			"*** End of JHALFS configuration.\n");
+	} else
+		printf("\n\nYour JHALFS configuration changes were NOT saved.\n\n");
+
+	return 0;
+}
diff --git a/2.3/menu/menu.c b/2.3/menu/menu.c
new file mode 100644
index 0000000..0c13156
--- /dev/null
+++ b/2.3/menu/menu.c
@@ -0,0 +1,390 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct menu rootmenu;
+static struct menu **last_entry_ptr;
+
+struct file *file_list;
+struct file *current_file;
+
+static void menu_warn(struct menu *menu, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+static void prop_warn(struct property *prop, const char *fmt, ...)
+{
+	va_list ap;
+	va_start(ap, fmt);
+	fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, "\n");
+	va_end(ap);
+}
+
+void menu_init(void)
+{
+	current_entry = current_menu = &rootmenu;
+	last_entry_ptr = &rootmenu.list;
+}
+
+void menu_add_entry(struct symbol *sym)
+{
+	struct menu *menu;
+
+	menu = malloc(sizeof(*menu));
+	memset(menu, 0, sizeof(*menu));
+	menu->sym = sym;
+	menu->parent = current_menu;
+	menu->file = current_file;
+	menu->lineno = zconf_lineno();
+
+	*last_entry_ptr = menu;
+	last_entry_ptr = &menu->next;
+	current_entry = menu;
+}
+
+void menu_end_entry(void)
+{
+}
+
+void menu_add_menu(void)
+{
+	current_menu = current_entry;
+	last_entry_ptr = &current_entry->list;
+}
+
+void menu_end_menu(void)
+{
+	last_entry_ptr = &current_menu->next;
+	current_menu = current_menu->parent;
+}
+
+struct expr *menu_check_dep(struct expr *e)
+{
+	if (!e)
+		return e;
+
+	switch (e->type) {
+	case E_NOT:
+		e->left.expr = menu_check_dep(e->left.expr);
+		break;
+	case E_OR:
+	case E_AND:
+		e->left.expr = menu_check_dep(e->left.expr);
+		e->right.expr = menu_check_dep(e->right.expr);
+		break;
+	case E_SYMBOL:
+		/* change 'm' into 'm' && MODULES */
+		if (e->left.sym == &symbol_mod)
+			return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
+		break;
+	default:
+		break;
+	}
+	return e;
+}
+
+void menu_add_dep(struct expr *dep)
+{
+	current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
+}
+
+void menu_set_type(int type)
+{
+	struct symbol *sym = current_entry->sym;
+
+	if (sym->type == type)
+		return;
+	if (sym->type == S_UNKNOWN) {
+		sym->type = type;
+		return;
+	}
+	menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'\n",
+	    sym->name ? sym->name : "<choice>",
+	    sym_type_name(sym->type), sym_type_name(type));
+}
+
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
+{
+	struct property *prop = prop_alloc(type, current_entry->sym);
+
+	prop->menu = current_entry;
+	prop->text = prompt;
+	prop->expr = expr;
+	prop->visible.expr = menu_check_dep(dep);
+
+	if (prompt) {
+		if (current_entry->prompt)
+			menu_warn(current_entry, "prompt redefined\n");
+		current_entry->prompt = prop;
+	}
+
+	return prop;
+}
+
+void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
+{
+	menu_add_prop(type, prompt, NULL, dep);
+}
+
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr, dep);
+}
+
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
+{
+	menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
+}
+
+void sym_check_prop(struct symbol *sym)
+{
+	struct property *prop;
+	struct symbol *sym2;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		switch (prop->type) {
+		case P_DEFAULT:
+			if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
+			    prop->expr->type != E_SYMBOL)
+				prop_warn(prop,
+				    "default for config symbol '%'"
+				    " must be a single symbol", sym->name);
+			break;
+		case P_SELECT:
+			sym2 = prop_get_symbol(prop);
+			if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
+				prop_warn(prop,
+				    "config symbol '%s' uses select, but is "
+				    "not boolean or tristate", sym->name);
+			else if (sym2->type == S_UNKNOWN)
+				prop_warn(prop,
+				    "'select' used by config symbol '%s' "
+				    "refer to undefined symbol '%s'",
+				    sym->name, sym2->name);
+			else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
+				prop_warn(prop,
+				    "'%s' has wrong type. 'select' only "
+				    "accept arguments of boolean and "
+				    "tristate type", sym2->name);
+			break;
+		case P_RANGE:
+			if (sym->type != S_INT && sym->type != S_HEX)
+				prop_warn(prop, "range is only allowed "
+				                "for int or hex symbols");
+			if (!sym_string_valid(sym, prop->expr->left.sym->name) ||
+			    !sym_string_valid(sym, prop->expr->right.sym->name))
+				prop_warn(prop, "range is invalid");
+			break;
+		default:
+			;
+		}
+	}
+}
+
+void menu_finalize(struct menu *parent)
+{
+	struct menu *menu, *last_menu;
+	struct symbol *sym;
+	struct property *prop;
+	struct expr *parentdep, *basedep, *dep, *dep2, **ep;
+
+	sym = parent->sym;
+	if (parent->list) {
+		if (sym && sym_is_choice(sym)) {
+			/* find the first choice value and find out choice type */
+			for (menu = parent->list; menu; menu = menu->next) {
+				if (menu->sym) {
+					current_entry = parent;
+					menu_set_type(menu->sym->type);
+					current_entry = menu;
+					menu_set_type(sym->type);
+					break;
+				}
+			}
+			parentdep = expr_alloc_symbol(sym);
+		} else if (parent->prompt)
+			parentdep = parent->prompt->visible.expr;
+		else
+			parentdep = parent->dep;
+
+		for (menu = parent->list; menu; menu = menu->next) {
+			basedep = expr_transform(menu->dep);
+			basedep = expr_alloc_and(expr_copy(parentdep), basedep);
+			basedep = expr_eliminate_dups(basedep);
+			menu->dep = basedep;
+			if (menu->sym)
+				prop = menu->sym->prop;
+			else
+				prop = menu->prompt;
+			for (; prop; prop = prop->next) {
+				if (prop->menu != menu)
+					continue;
+				dep = expr_transform(prop->visible.expr);
+				dep = expr_alloc_and(expr_copy(basedep), dep);
+				dep = expr_eliminate_dups(dep);
+				if (menu->sym && menu->sym->type != S_TRISTATE)
+					dep = expr_trans_bool(dep);
+				prop->visible.expr = dep;
+				if (prop->type == P_SELECT) {
+					struct symbol *es = prop_get_symbol(prop);
+					es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+							expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+				}
+			}
+		}
+		for (menu = parent->list; menu; menu = menu->next)
+			menu_finalize(menu);
+	} else if (sym) {
+		basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
+		basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
+		basedep = expr_eliminate_dups(expr_transform(basedep));
+		last_menu = NULL;
+		for (menu = parent->next; menu; menu = menu->next) {
+			dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
+			if (!expr_contains_symbol(dep, sym))
+				break;
+			if (expr_depends_symbol(dep, sym))
+				goto next;
+			dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no);
+			dep = expr_eliminate_dups(expr_transform(dep));
+			dep2 = expr_copy(basedep);
+			expr_eliminate_eq(&dep, &dep2);
+			expr_free(dep);
+			if (!expr_is_yes(dep2)) {
+				expr_free(dep2);
+				break;
+			}
+			expr_free(dep2);
+		next:
+			menu_finalize(menu);
+			menu->parent = parent;
+			last_menu = menu;
+		}
+		if (last_menu) {
+			parent->list = parent->next;
+			parent->next = last_menu->next;
+			last_menu->next = NULL;
+		}
+	}
+	for (menu = parent->list; menu; menu = menu->next) {
+		if (sym && sym_is_choice(sym) && menu->sym) {
+			menu->sym->flags |= SYMBOL_CHOICEVAL;
+			if (!menu->prompt)
+				menu_warn(menu, "choice value must have a prompt");
+			for (prop = menu->sym->prop; prop; prop = prop->next) {
+				if (prop->type == P_PROMPT && prop->menu != menu) {
+					prop_warn(prop, "choice values "
+					    "currently only support a "
+					    "single prompt");
+				}
+				if (prop->type == P_DEFAULT)
+					prop_warn(prop, "defaults for choice "
+					    "values not supported");
+			}
+			current_entry = menu;
+			menu_set_type(sym->type);
+			menu_add_symbol(P_CHOICE, sym, NULL);
+			prop = sym_get_choice_prop(sym);
+			for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
+				;
+			*ep = expr_alloc_one(E_CHOICE, NULL);
+			(*ep)->right.sym = menu->sym;
+		}
+		if (menu->list && (!menu->prompt || !menu->prompt->text)) {
+			for (last_menu = menu->list; ; last_menu = last_menu->next) {
+				last_menu->parent = parent;
+				if (!last_menu->next)
+					break;
+			}
+			last_menu->next = menu->next;
+			menu->next = menu->list;
+			menu->list = NULL;
+		}
+	}
+
+	if (sym && !(sym->flags & SYMBOL_WARNED)) {
+		if (sym->type == S_UNKNOWN)
+			menu_warn(parent, "config symbol defined "
+			    "without type\n");
+
+		if (sym_is_choice(sym) && !parent->prompt)
+			menu_warn(parent, "choice must have a prompt\n");
+
+		/* Check properties connected to this symbol */
+		sym_check_prop(sym);
+		sym->flags |= SYMBOL_WARNED;
+	}
+
+	if (sym && !sym_is_optional(sym) && parent->prompt) {
+		sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
+				expr_alloc_and(parent->prompt->visible.expr,
+					expr_alloc_symbol(&symbol_mod)));
+	}
+}
+
+bool menu_is_visible(struct menu *menu)
+{
+	struct menu *child;
+	struct symbol *sym;
+	tristate visible;
+
+	if (!menu->prompt)
+		return false;
+	sym = menu->sym;
+	if (sym) {
+		sym_calc_value(sym);
+		visible = menu->prompt->visible.tri;
+	} else
+		visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
+
+	if (visible != no)
+		return true;
+	if (!sym || sym_get_tristate_value(menu->sym) == no)
+		return false;
+
+	for (child = menu->list; child; child = child->next)
+		if (menu_is_visible(child))
+			return true;
+	return false;
+}
+
+const char *menu_get_prompt(struct menu *menu)
+{
+	if (menu->prompt)
+		return menu->prompt->text;
+	else if (menu->sym)
+		return menu->sym->name;
+	return NULL;
+}
+
+struct menu *menu_get_root_menu(struct menu *menu)
+{
+	return &rootmenu;
+}
+
+struct menu *menu_get_parent_menu(struct menu *menu)
+{
+	enum prop_type type;
+
+	for (; menu != &rootmenu; menu = menu->parent) {
+		type = menu->prompt ? menu->prompt->type : 0;
+		if (type == P_MENU)
+			break;
+	}
+	return menu;
+}
+
diff --git a/2.3/menu/symbol.c b/2.3/menu/symbol.c
new file mode 100644
index 0000000..ea62972
--- /dev/null
+++ b/2.3/menu/symbol.c
@@ -0,0 +1,809 @@
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <regex.h>
+#include <sys/utsname.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+struct symbol symbol_yes = {
+	.name = "y",
+	.curr = { "y", yes },
+	.flags = SYMBOL_YES|SYMBOL_VALID,
+}, symbol_mod = {
+	.name = "m",
+	.curr = { "m", mod },
+	.flags = SYMBOL_MOD|SYMBOL_VALID,
+}, symbol_no = {
+	.name = "n",
+	.curr = { "n", no },
+	.flags = SYMBOL_NO|SYMBOL_VALID,
+}, symbol_empty = {
+	.name = "",
+	.curr = { "", no },
+	.flags = SYMBOL_VALID,
+};
+
+int sym_change_count;
+struct symbol *modules_sym;
+tristate modules_val;
+
+void sym_add_default(struct symbol *sym, const char *def)
+{
+	struct property *prop = prop_alloc(P_DEFAULT, sym);
+
+	prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
+}
+
+void sym_init(void)
+{
+	struct symbol *sym;
+	char *p;
+	static bool inited = false;
+
+	if (inited)
+		return;
+	inited = true;
+
+	sym = sym_lookup("VERSION", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("VERSION");
+	if (p)
+		sym_add_default(sym, p);
+
+	sym = sym_lookup("TARGET_ARCH", 0);
+	sym->type = S_STRING;
+	sym->flags |= SYMBOL_AUTO;
+	p = getenv("TARGET_ARCH");
+	if (p)
+		sym_add_default(sym, p);
+
+}
+
+enum symbol_type sym_get_type(struct symbol *sym)
+{
+	enum symbol_type type = sym->type;
+
+	if (type == S_TRISTATE) {
+		if (sym_is_choice_value(sym) && sym->visible == yes)
+			type = S_BOOLEAN;
+		else if (modules_val == no)
+			type = S_BOOLEAN;
+	}
+	return type;
+}
+
+const char *sym_type_name(enum symbol_type type)
+{
+	switch (type) {
+	case S_BOOLEAN:
+		return "boolean";
+	case S_TRISTATE:
+		return "tristate";
+	case S_INT:
+		return "integer";
+	case S_HEX:
+		return "hex";
+	case S_STRING:
+		return "string";
+	case S_UNKNOWN:
+		return "unknown";
+	case S_OTHER:
+		break;
+	}
+	return "???";
+}
+
+struct property *sym_get_choice_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_choices(sym, prop)
+		return prop;
+	return NULL;
+}
+
+struct property *sym_get_default_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+struct property *sym_get_range_prop(struct symbol *sym)
+{
+	struct property *prop;
+
+	for_all_properties(sym, prop, P_RANGE) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri != no)
+			return prop;
+	}
+	return NULL;
+}
+
+static void sym_calc_visibility(struct symbol *sym)
+{
+	struct property *prop;
+	tristate tri;
+
+	/* any prompt visible? */
+	tri = no;
+	for_all_prompts(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		tri = E_OR(tri, prop->visible.tri);
+	}
+	if (tri == mod && (sym->type != S_TRISTATE || modules_val == no))
+		tri = yes;
+	if (sym->visible != tri) {
+		sym->visible = tri;
+		sym_set_changed(sym);
+	}
+	if (sym_is_choice_value(sym))
+		return;
+	tri = no;
+	if (sym->rev_dep.expr)
+		tri = expr_calc_value(sym->rev_dep.expr);
+	if (tri == mod && sym_get_type(sym) == S_BOOLEAN)
+		tri = yes;
+	if (sym->rev_dep.tri != tri) {
+		sym->rev_dep.tri = tri;
+		sym_set_changed(sym);
+	}
+}
+
+static struct symbol *sym_calc_choice(struct symbol *sym)
+{
+	struct symbol *def_sym;
+	struct property *prop;
+	struct expr *e;
+
+	/* is the user choice visible? */
+	def_sym = sym->user.val;
+	if (def_sym) {
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* any of the defaults visible? */
+	for_all_defaults(sym, prop) {
+		prop->visible.tri = expr_calc_value(prop->visible.expr);
+		if (prop->visible.tri == no)
+			continue;
+		def_sym = prop_get_symbol(prop);
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* just get the first visible value */
+	prop = sym_get_choice_prop(sym);
+	for (e = prop->expr; e; e = e->left.expr) {
+		def_sym = e->right.sym;
+		sym_calc_visibility(def_sym);
+		if (def_sym->visible != no)
+			return def_sym;
+	}
+
+	/* no choice? reset tristate value */
+	sym->curr.tri = no;
+	return NULL;
+}
+
+void sym_calc_value(struct symbol *sym)
+{
+	struct symbol_value newval, oldval;
+	struct property *prop;
+	struct expr *e;
+
+	if (!sym)
+		return;
+
+	if (sym->flags & SYMBOL_VALID)
+		return;
+	sym->flags |= SYMBOL_VALID;
+
+	oldval = sym->curr;
+
+	switch (sym->type) {
+	case S_INT:
+	case S_HEX:
+	case S_STRING:
+		newval = symbol_empty.curr;
+		break;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		newval = symbol_no.curr;
+		break;
+	default:
+		sym->curr.val = sym->name;
+		sym->curr.tri = no;
+		return;
+	}
+	if (!sym_is_choice_value(sym))
+		sym->flags &= ~SYMBOL_WRITE;
+
+	sym_calc_visibility(sym);
+
+	/* set default if recursively called */
+	sym->curr = newval;
+
+	switch (sym_get_type(sym)) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		if (sym_is_choice_value(sym) && sym->visible == yes) {
+			prop = sym_get_choice_prop(sym);
+			newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
+		} else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym))
+				newval.tri = sym->user.tri;
+			else if (!sym_is_choice(sym)) {
+				prop = sym_get_default_prop(sym);
+				if (prop)
+					newval.tri = expr_calc_value(prop->expr);
+			}
+			newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
+		} else if (!sym_is_choice(sym)) {
+			prop = sym_get_default_prop(sym);
+			if (prop) {
+				sym->flags |= SYMBOL_WRITE;
+				newval.tri = expr_calc_value(prop->expr);
+			}
+		}
+		if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN)
+			newval.tri = yes;
+		break;
+	case S_STRING:
+	case S_HEX:
+	case S_INT:
+		if (sym->visible != no) {
+			sym->flags |= SYMBOL_WRITE;
+			if (sym_has_value(sym)) {
+				newval.val = sym->user.val;
+				break;
+			}
+		}
+		prop = sym_get_default_prop(sym);
+		if (prop) {
+			struct symbol *ds = prop_get_symbol(prop);
+			if (ds) {
+				sym->flags |= SYMBOL_WRITE;
+				sym_calc_value(ds);
+				newval.val = ds->curr.val;
+			}
+		}
+		break;
+	default:
+		;
+	}
+
+	sym->curr = newval;
+	if (sym_is_choice(sym) && newval.tri == yes)
+		sym->curr.val = sym_calc_choice(sym);
+
+	if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
+		sym_set_changed(sym);
+	if (modules_sym == sym)
+		modules_val = modules_sym->curr.tri;
+
+	if (sym_is_choice(sym)) {
+		int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
+		prop = sym_get_choice_prop(sym);
+		for (e = prop->expr; e; e = e->left.expr) {
+			e->right.sym->flags |= flags;
+			if (flags & SYMBOL_CHANGED)
+				sym_set_changed(e->right.sym);
+		}
+	}
+}
+
+void sym_clear_all_valid(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym->flags &= ~SYMBOL_VALID;
+	sym_change_count++;
+	if (modules_sym)
+		sym_calc_value(modules_sym);
+}
+
+void sym_set_changed(struct symbol *sym)
+{
+	struct property *prop;
+
+	sym->flags |= SYMBOL_CHANGED;
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu)
+			prop->menu->flags |= MENU_CHANGED;
+	}
+}
+
+void sym_set_all_changed(void)
+{
+	struct symbol *sym;
+	int i;
+
+	for_all_symbols(i, sym)
+		sym_set_changed(sym);
+}
+
+bool sym_tristate_within_range(struct symbol *sym, tristate val)
+{
+	int type = sym_get_type(sym);
+
+	if (sym->visible == no)
+		return false;
+
+	if (type != S_BOOLEAN && type != S_TRISTATE)
+		return false;
+
+	if (type == S_BOOLEAN && val == mod)
+		return false;
+	if (sym->visible <= sym->rev_dep.tri)
+		return false;
+	if (sym_is_choice_value(sym) && sym->visible == yes)
+		return val == yes;
+	return val >= sym->rev_dep.tri && val <= sym->visible;
+}
+
+bool sym_set_tristate_value(struct symbol *sym, tristate val)
+{
+	tristate oldval = sym_get_tristate_value(sym);
+
+	if (oldval != val && !sym_tristate_within_range(sym, val))
+		return false;
+
+	if (sym->flags & SYMBOL_NEW) {
+		sym->flags &= ~SYMBOL_NEW;
+		sym_set_changed(sym);
+	}
+	if (sym_is_choice_value(sym) && val == yes) {
+		struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+
+		cs->user.val = sym;
+		cs->flags &= ~SYMBOL_NEW;
+	}
+
+	sym->user.tri = val;
+	if (oldval != val) {
+		sym_clear_all_valid();
+		if (sym == modules_sym)
+			sym_set_all_changed();
+	}
+
+	return true;
+}
+
+tristate sym_toggle_tristate_value(struct symbol *sym)
+{
+	tristate oldval, newval;
+
+	oldval = newval = sym_get_tristate_value(sym);
+	do {
+		switch (newval) {
+		case no:
+			newval = mod;
+			break;
+		case mod:
+			newval = yes;
+			break;
+		case yes:
+			newval = no;
+			break;
+		}
+		if (sym_set_tristate_value(sym, newval))
+			break;
+	} while (oldval != newval);
+	return newval;
+}
+
+bool sym_string_valid(struct symbol *sym, const char *str)
+{
+	signed char ch;
+
+	switch (sym->type) {
+	case S_STRING:
+		return true;
+	case S_INT:
+		ch = *str++;
+		if (ch == '-')
+			ch = *str++;
+		if (!isdigit(ch))
+			return false;
+		if (ch == '0' && *str != 0)
+			return false;
+		while ((ch = *str++)) {
+			if (!isdigit(ch))
+				return false;
+		}
+		return true;
+	case S_HEX:
+		if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X'))
+			str += 2;
+		ch = *str++;
+		do {
+			if (!isxdigit(ch))
+				return false;
+		} while ((ch = *str++));
+		return true;
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+		case 'm': case 'M':
+		case 'n': case 'N':
+			return true;
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_string_within_range(struct symbol *sym, const char *str)
+{
+	struct property *prop;
+	int val;
+
+	switch (sym->type) {
+	case S_STRING:
+		return sym_string_valid(sym, str);
+	case S_INT:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 10);
+		return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&
+		       val <= strtol(prop->expr->right.sym->name, NULL, 10);
+	case S_HEX:
+		if (!sym_string_valid(sym, str))
+			return false;
+		prop = sym_get_range_prop(sym);
+		if (!prop)
+			return true;
+		val = strtol(str, NULL, 16);
+		return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&
+		       val <= strtol(prop->expr->right.sym->name, NULL, 16);
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (str[0]) {
+		case 'y': case 'Y':
+			return sym_tristate_within_range(sym, yes);
+		case 'm': case 'M':
+			return sym_tristate_within_range(sym, mod);
+		case 'n': case 'N':
+			return sym_tristate_within_range(sym, no);
+		}
+		return false;
+	default:
+		return false;
+	}
+}
+
+bool sym_set_string_value(struct symbol *sym, const char *newval)
+{
+	const char *oldval;
+	char *val;
+	int size;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		switch (newval[0]) {
+		case 'y': case 'Y':
+			return sym_set_tristate_value(sym, yes);
+		case 'm': case 'M':
+			return sym_set_tristate_value(sym, mod);
+		case 'n': case 'N':
+			return sym_set_tristate_value(sym, no);
+		}
+		return false;
+	default:
+		;
+	}
+
+	if (!sym_string_within_range(sym, newval))
+		return false;
+
+	if (sym->flags & SYMBOL_NEW) {
+		sym->flags &= ~SYMBOL_NEW;
+		sym_set_changed(sym);
+	}
+
+	oldval = sym->user.val;
+	size = strlen(newval) + 1;
+	if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
+		size += 2;
+		sym->user.val = val = malloc(size);
+		*val++ = '0';
+		*val++ = 'x';
+	} else if (!oldval || strcmp(oldval, newval))
+		sym->user.val = val = malloc(size);
+	else
+		return true;
+
+	strcpy(val, newval);
+	free((void *)oldval);
+	sym_clear_all_valid();
+
+	return true;
+}
+
+const char *sym_get_string_value(struct symbol *sym)
+{
+	tristate val;
+
+	switch (sym->type) {
+	case S_BOOLEAN:
+	case S_TRISTATE:
+		val = sym_get_tristate_value(sym);
+		switch (val) {
+		case no:
+			return "n";
+		case mod:
+			return "m";
+		case yes:
+			return "y";
+		}
+		break;
+	default:
+		;
+	}
+	return (const char *)sym->curr.val;
+}
+
+bool sym_is_changable(struct symbol *sym)
+{
+	return sym->visible > sym->rev_dep.tri;
+}
+
+struct symbol *sym_lookup(const char *name, int isconst)
+{
+	struct symbol *symbol;
+	const char *ptr;
+	char *new_name;
+	int hash = 0;
+
+	if (name) {
+		if (name[0] && !name[1]) {
+			switch (name[0]) {
+			case 'y': return &symbol_yes;
+			case 'm': return &symbol_mod;
+			case 'n': return &symbol_no;
+			}
+		}
+		for (ptr = name; *ptr; ptr++)
+			hash += *ptr;
+		hash &= 0xff;
+
+		for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+			if (!strcmp(symbol->name, name)) {
+				if ((isconst && symbol->flags & SYMBOL_CONST) ||
+				    (!isconst && !(symbol->flags & SYMBOL_CONST)))
+					return symbol;
+			}
+		}
+		new_name = strdup(name);
+	} else {
+		new_name = NULL;
+		hash = 256;
+	}
+
+	symbol = malloc(sizeof(*symbol));
+	memset(symbol, 0, sizeof(*symbol));
+	symbol->name = new_name;
+	symbol->type = S_UNKNOWN;
+	symbol->flags = SYMBOL_NEW;
+	if (isconst)
+		symbol->flags |= SYMBOL_CONST;
+
+	symbol->next = symbol_hash[hash];
+	symbol_hash[hash] = symbol;
+
+	return symbol;
+}
+
+struct symbol *sym_find(const char *name)
+{
+	struct symbol *symbol = NULL;
+	const char *ptr;
+	int hash = 0;
+
+	if (!name)
+		return NULL;
+
+	if (name[0] && !name[1]) {
+		switch (name[0]) {
+		case 'y': return &symbol_yes;
+		case 'm': return &symbol_mod;
+		case 'n': return &symbol_no;
+		}
+	}
+	for (ptr = name; *ptr; ptr++)
+		hash += *ptr;
+	hash &= 0xff;
+
+	for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
+		if (!strcmp(symbol->name, name) &&
+		    !(symbol->flags & SYMBOL_CONST))
+				break;
+	}
+
+	return symbol;
+}
+
+struct symbol **sym_re_search(const char *pattern)
+{
+	struct symbol *sym, **sym_arr = NULL;
+	int i, cnt, size;
+	regex_t re;
+
+	cnt = size = 0;
+	/* Skip if empty */
+	if (strlen(pattern) == 0)
+		return NULL;
+	if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
+		return NULL;
+
+	for_all_symbols(i, sym) {
+		if (sym->flags & SYMBOL_CONST || !sym->name)
+			continue;
+		if (regexec(&re, sym->name, 0, NULL, 0))
+			continue;
+		if (cnt + 1 >= size) {
+			void *tmp = sym_arr;
+			size += 16;
+			sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));
+			if (!sym_arr) {
+				free(tmp);
+				return NULL;
+			}
+		}
+		sym_arr[cnt++] = sym;
+	}
+	if (sym_arr)
+		sym_arr[cnt] = NULL;
+	regfree(&re);
+
+	return sym_arr;
+}
+
+
+struct symbol *sym_check_deps(struct symbol *sym);
+
+static struct symbol *sym_check_expr_deps(struct expr *e)
+{
+	struct symbol *sym;
+
+	if (!e)
+		return NULL;
+	switch (e->type) {
+	case E_OR:
+	case E_AND:
+		sym = sym_check_expr_deps(e->left.expr);
+		if (sym)
+			return sym;
+		return sym_check_expr_deps(e->right.expr);
+	case E_NOT:
+		return sym_check_expr_deps(e->left.expr);
+	case E_EQUAL:
+	case E_UNEQUAL:
+		sym = sym_check_deps(e->left.sym);
+		if (sym)
+			return sym;
+		return sym_check_deps(e->right.sym);
+	case E_SYMBOL:
+		return sym_check_deps(e->left.sym);
+	default:
+		break;
+	}
+	printf("Oops! How to check %d?\n", e->type);
+	return NULL;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym)
+{
+	struct symbol *sym2;
+	struct property *prop;
+
+	if (sym->flags & SYMBOL_CHECK_DONE)
+		return NULL;
+	if (sym->flags & SYMBOL_CHECK) {
+		printf("Warning! Found recursive dependency: %s", sym->name);
+		return sym;
+	}
+
+	sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+	sym2 = sym_check_expr_deps(sym->rev_dep.expr);
+	if (sym2)
+		goto out;
+
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->type == P_CHOICE || prop->type == P_SELECT)
+			continue;
+		sym2 = sym_check_expr_deps(prop->visible.expr);
+		if (sym2)
+			goto out;
+		if (prop->type != P_DEFAULT || sym_is_choice(sym))
+			continue;
+		sym2 = sym_check_expr_deps(prop->expr);
+		if (sym2)
+			goto out;
+	}
+out:
+	if (sym2)
+		printf(" %s", sym->name);
+	sym->flags &= ~SYMBOL_CHECK;
+	return sym2;
+}
+
+struct property *prop_alloc(enum prop_type type, struct symbol *sym)
+{
+	struct property *prop;
+	struct property **propp;
+
+	prop = malloc(sizeof(*prop));
+	memset(prop, 0, sizeof(*prop));
+	prop->type = type;
+	prop->sym = sym;
+	prop->file = current_file;
+	prop->lineno = zconf_lineno();
+
+	/* append property to the prop list of symbol */
+	if (sym) {
+		for (propp = &sym->prop; *propp; propp = &(*propp)->next)
+			;
+		*propp = prop;
+	}
+
+	return prop;
+}
+
+struct symbol *prop_get_symbol(struct property *prop)
+{
+	if (prop->expr && (prop->expr->type == E_SYMBOL ||
+			   prop->expr->type == E_CHOICE))
+		return prop->expr->left.sym;
+	return NULL;
+}
+
+const char *prop_get_type_name(enum prop_type type)
+{
+	switch (type) {
+	case P_PROMPT:
+		return "prompt";
+	case P_COMMENT:
+		return "comment";
+	case P_MENU:
+		return "menu";
+	case P_DEFAULT:
+		return "default";
+	case P_CHOICE:
+		return "choice";
+	case P_SELECT:
+		return "select";
+	case P_RANGE:
+		return "range";
+	case P_UNKNOWN:
+		break;
+	}
+	return "unknown";
+}
diff --git a/2.3/menu/util.c b/2.3/menu/util.c
new file mode 100644
index 0000000..a72f5ea
--- /dev/null
+++ b/2.3/menu/util.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
+ * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
+ *
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <string.h>
+#include "lkc.h"
+
+/* file already present in list? If not add it */
+struct file *file_lookup(const char *name)
+{
+	struct file *file;
+
+	for (file = file_list; file; file = file->next) {
+		if (!strcmp(name, file->name))
+			return file;
+	}
+
+	file = malloc(sizeof(*file));
+	memset(file, 0, sizeof(*file));
+	file->name = strdup(name);
+	file->next = file_list;
+	file_list = file;
+	return file;
+}
+
+/* write a dependency file as used by kbuild to track dependencies */
+int file_write_dep(const char *name)
+{
+	struct file *file;
+	FILE *out;
+
+	if (!name)
+		name = ".config.cmd";
+	out = fopen(".config.tmp", "w");
+	if (!out)
+		return 1;
+	fprintf(out, "deps_config := \\\n");
+	for (file = file_list; file; file = file->next) {
+		if (file->next)
+			fprintf(out, "\t%s \\\n", file->name);
+		else
+			fprintf(out, "\t%s\n", file->name);
+	}
+	fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
+	fclose(out);
+	rename(".config.tmp", name);
+	return 0;
+}
+
+
+/* Allocate initial growable sting */
+struct gstr str_new(void)
+{
+	struct gstr gs;
+	gs.s = malloc(sizeof(char) * 64);
+	gs.len = 16;
+	strcpy(gs.s, "\0");
+	return gs;
+}
+
+/* Allocate and assign growable string */
+struct gstr str_assign(const char *s)
+{
+	struct gstr gs;
+	gs.s = strdup(s);
+	gs.len = strlen(s) + 1;
+	return gs;
+}
+
+/* Free storage for growable string */
+void str_free(struct gstr *gs)
+{
+	if (gs->s)
+		free(gs->s);
+	gs->s = NULL;
+	gs->len = 0;
+}
+
+/* Append to growable string */
+void str_append(struct gstr *gs, const char *s)
+{
+	size_t l = strlen(gs->s) + strlen(s) + 1;
+	if (l > gs->len) {
+		gs->s   = realloc(gs->s, l);
+		gs->len = l;
+	}
+	strcat(gs->s, s);
+}
+
+/* Append printf formatted string to growable string */
+void str_printf(struct gstr *gs, const char *fmt, ...)
+{
+	va_list ap;
+	char s[10000]; /* big enough... */
+	va_start(ap, fmt);
+	vsnprintf(s, sizeof(s), fmt, ap);
+	str_append(gs, s);
+	va_end(ap);
+}
+
+/* Retreive value of growable string */
+const char *str_get(struct gstr *gs)
+{
+	return gs->s;
+}
+
diff --git a/2.3/menu/zconf.l b/2.3/menu/zconf.l
new file mode 100644
index 0000000..55517b2
--- /dev/null
+++ b/2.3/menu/zconf.l
@@ -0,0 +1,366 @@
+%option backup nostdinit noyywrap never-interactive full ecs
+%option 8bit backup nodefault perf-report perf-report
+%x COMMAND HELP STRING PARAM
+%{
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE	16
+
+char *text;
+static char *text_ptr;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static struct buffer *zconf_endfile(void);
+
+void new_string(void)
+{
+	text = malloc(START_STRSIZE);
+	text_asize = START_STRSIZE;
+	text_ptr = text;
+	text_size = 0;
+	*text_ptr = 0;
+}
+
+void append_string(const char *str, int size)
+{
+	int new_size = text_size + size + 1;
+	if (new_size > text_asize) {
+		text = realloc(text, new_size);
+		text_asize = new_size;
+		text_ptr = text + text_size;
+	}
+	memcpy(text_ptr, str, size);
+	text_ptr += size;
+	text_size += size;
+	*text_ptr = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+	text = malloc(size + 1);
+	memcpy(text, str, size);
+	text[size] = 0;
+}
+%}
+
+ws	[ \n\t]
+n	[A-Za-z0-9_]
+
+%%
+	int str = 0;
+	int ts, i;
+
+[ \t]*#.*\n	current_file->lineno++;
+[ \t]*#.*
+
+[ \t]*\n	current_file->lineno++; return T_EOL;
+
+[ \t]+	{
+	BEGIN(COMMAND);
+}
+
+.	{
+	unput(yytext[0]);
+	BEGIN(COMMAND);
+}
+
+
+<COMMAND>{
+	"mainmenu"		BEGIN(PARAM); return T_MAINMENU;
+	"menu"			BEGIN(PARAM); return T_MENU;
+	"endmenu"		BEGIN(PARAM); return T_ENDMENU;
+	"source"		BEGIN(PARAM); return T_SOURCE;
+	"choice"		BEGIN(PARAM); return T_CHOICE;
+	"endchoice"		BEGIN(PARAM); return T_ENDCHOICE;
+	"comment"		BEGIN(PARAM); return T_COMMENT;
+	"config"		BEGIN(PARAM); return T_CONFIG;
+	"menuconfig"		BEGIN(PARAM); return T_MENUCONFIG;
+	"help"			BEGIN(PARAM); return T_HELP;
+	"if"			BEGIN(PARAM); return T_IF;
+	"endif"			BEGIN(PARAM); return T_ENDIF;
+	"depends"		BEGIN(PARAM); return T_DEPENDS;
+	"requires"		BEGIN(PARAM); return T_REQUIRES;
+	"optional"		BEGIN(PARAM); return T_OPTIONAL;
+	"default"		BEGIN(PARAM); return T_DEFAULT;
+	"prompt"		BEGIN(PARAM); return T_PROMPT;
+	"tristate"		BEGIN(PARAM); return T_TRISTATE;
+	"def_tristate"		BEGIN(PARAM); return T_DEF_TRISTATE;
+	"bool"			BEGIN(PARAM); return T_BOOLEAN;
+	"boolean"		BEGIN(PARAM); return T_BOOLEAN;
+	"def_bool"		BEGIN(PARAM); return T_DEF_BOOLEAN;
+	"def_boolean"		BEGIN(PARAM); return T_DEF_BOOLEAN;
+	"int"			BEGIN(PARAM); return T_INT;
+	"hex"			BEGIN(PARAM); return T_HEX;
+	"string"		BEGIN(PARAM); return T_STRING;
+	"select"		BEGIN(PARAM); return T_SELECT;
+	"enable"		BEGIN(PARAM); return T_SELECT;
+	"range"			BEGIN(PARAM); return T_RANGE;
+	{n}+	{
+		alloc_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	.
+	\n	current_file->lineno++; BEGIN(INITIAL);
+}
+
+<PARAM>{
+	"&&"	return T_AND;
+	"||"	return T_OR;
+	"("	return T_OPEN_PAREN;
+	")"	return T_CLOSE_PAREN;
+	"!"	return T_NOT;
+	"="	return T_EQUAL;
+	"!="	return T_UNEQUAL;
+	"if"	return T_IF;
+	"on"	return T_ON;
+	\"|\'	{
+		str = yytext[0];
+		new_string();
+		BEGIN(STRING);
+	}
+	\n	BEGIN(INITIAL); current_file->lineno++; return T_EOL;
+	---	/* ignore */
+	({n}|[-/.])+	{
+		alloc_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD;
+	}
+	#.*	/* comment */
+	\\\n	current_file->lineno++;
+	.
+	<<EOF>> {
+		BEGIN(INITIAL);
+	}
+}
+
+<STRING>{
+	[^'"\\\n]+/\n	{
+		append_string(yytext, yyleng);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	[^'"\\\n]+	{
+		append_string(yytext, yyleng);
+	}
+	\\.?/\n	{
+		append_string(yytext + 1, yyleng - 1);
+		zconflval.string = text;
+		return T_WORD_QUOTE;
+	}
+	\\.?	{
+		append_string(yytext + 1, yyleng - 1);
+	}
+	\'|\"	{
+		if (str == yytext[0]) {
+			BEGIN(PARAM);
+			zconflval.string = text;
+			return T_WORD_QUOTE;
+		} else
+			append_string(yytext, 1);
+	}
+	\n	{
+		printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+		current_file->lineno++;
+		BEGIN(INITIAL);
+		return T_EOL;
+	}
+	<<EOF>>	{
+		BEGIN(INITIAL);
+	}
+}
+
+<HELP>{
+	[ \t]+	{
+		ts = 0;
+		for (i = 0; i < yyleng; i++) {
+			if (yytext[i] == '\t')
+				ts = (ts & ~7) + 8;
+			else
+				ts++;
+		}
+		last_ts = ts;
+		if (first_ts) {
+			if (ts < first_ts) {
+				zconf_endhelp();
+				return T_HELPTEXT;
+			}
+			ts -= first_ts;
+			while (ts > 8) {
+				append_string("        ", 8);
+				ts -= 8;
+			}
+			append_string("        ", ts);
+		}
+	}
+	[ \t]*\n/[^ \t\n] {
+		current_file->lineno++;
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+	[ \t]*\n	{
+		current_file->lineno++;
+		append_string("\n", 1);
+	}
+	[^ \t\n].* {
+		append_string(yytext, yyleng);
+		if (!first_ts)
+			first_ts = last_ts;
+	}
+	<<EOF>>	{
+		zconf_endhelp();
+		return T_HELPTEXT;
+	}
+}
+
+<<EOF>>	{
+	if (current_buf) {
+		zconf_endfile();
+		return T_EOF;
+	}
+	fclose(yyin);
+	yyterminate();
+}
+
+%%
+void zconf_starthelp(void)
+{
+	new_string();
+	last_ts = first_ts = 0;
+	BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+	zconflval.string = text;
+	BEGIN(INITIAL);
+}
+
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+	char *env, fullname[PATH_MAX+1];
+	FILE *f;
+
+	f = fopen(name, "r");
+	if (!f && name[0] != '/') {
+		env = getenv(SRCTREE);
+		if (env) {
+			sprintf(fullname, "%s/%s", env, name);
+			f = fopen(fullname, "r");
+		}
+	}
+	return f;
+}
+
+void zconf_initscan(const char *name)
+{
+	yyin = zconf_fopen(name);
+	if (!yyin) {
+		printf("can't find file %s\n", name);
+		exit(1);
+	}
+
+	current_buf = malloc(sizeof(*current_buf));
+	memset(current_buf, 0, sizeof(*current_buf));
+
+	current_file = file_lookup(name);
+	current_file->lineno = 1;
+	current_file->flags = FILE_BUSY;
+}
+
+void zconf_nextfile(const char *name)
+{
+	struct file *file = file_lookup(name);
+	struct buffer *buf = malloc(sizeof(*buf));
+	memset(buf, 0, sizeof(*buf));
+
+	current_buf->state = YY_CURRENT_BUFFER;
+	yyin = zconf_fopen(name);
+	if (!yyin) {
+		printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
+		exit(1);
+	}
+	yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+	buf->parent = current_buf;
+	current_buf = buf;
+
+	if (file->flags & FILE_BUSY) {
+		printf("recursive scan (%s)?\n", name);
+		exit(1);
+	}
+	if (file->flags & FILE_SCANNED) {
+		printf("file %s already scanned?\n", name);
+		exit(1);
+	}
+	file->flags |= FILE_BUSY;
+	file->lineno = 1;
+	file->parent = current_file;
+	current_file = file;
+}
+
+static struct buffer *zconf_endfile(void)
+{
+	struct buffer *parent;
+
+	current_file->flags |= FILE_SCANNED;
+	current_file->flags &= ~FILE_BUSY;
+	current_file = current_file->parent;
+
+	parent = current_buf->parent;
+	if (parent) {
+		fclose(yyin);
+		yy_delete_buffer(YY_CURRENT_BUFFER);
+		yy_switch_to_buffer(parent->state);
+	}
+	free(current_buf);
+	current_buf = parent;
+
+	return parent;
+}
+
+int zconf_lineno(void)
+{
+	if (current_buf)
+		return current_file->lineno - 1;
+	else
+		return 0;
+}
+
+char *zconf_curname(void)
+{
+	if (current_buf)
+		return current_file->name;
+	else
+		return "<none>";
+}
diff --git a/2.3/menu/zconf.tab.c_shipped b/2.3/menu/zconf.tab.c_shipped
new file mode 100644
index 0000000..f79289f
--- /dev/null
+++ b/2.3/menu/zconf.tab.c_shipped
@@ -0,0 +1,2130 @@
+/* A Bison parser, made by GNU Bison 1.875a.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+/* Written by Richard Stallman by simplifying the original so called
+   ``semantic'' parser.  */
+
+/* All symbols defined below should begin with yy or YY, to avoid
+   infringing on user name space.  This should be done even for local
+   variables, as they might otherwise be expanded by user macros.
+   There are some unavoidable exceptions within include files to
+   define necessary library symbols; they are noted "INFRINGES ON
+   USER NAME SPACE" below.  */
+
+/* Identify Bison output.  */
+#define YYBISON 1
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
+/* Pure parsers.  */
+#define YYPURE 0
+
+/* Using locations.  */
+#define YYLSP_NEEDED 0
+
+/* If NAME_PREFIX is specified substitute the variables and functions
+   names.  */
+#define yyparse zconfparse
+#define yylex   zconflex
+#define yyerror zconferror
+#define yylval  zconflval
+#define yychar  zconfchar
+#define yydebug zconfdebug
+#define yynerrs zconfnerrs
+
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     T_MAINMENU = 258,
+     T_MENU = 259,
+     T_ENDMENU = 260,
+     T_SOURCE = 261,
+     T_CHOICE = 262,
+     T_ENDCHOICE = 263,
+     T_COMMENT = 264,
+     T_CONFIG = 265,
+     T_MENUCONFIG = 266,
+     T_HELP = 267,
+     T_HELPTEXT = 268,
+     T_IF = 269,
+     T_ENDIF = 270,
+     T_DEPENDS = 271,
+     T_REQUIRES = 272,
+     T_OPTIONAL = 273,
+     T_PROMPT = 274,
+     T_DEFAULT = 275,
+     T_TRISTATE = 276,
+     T_DEF_TRISTATE = 277,
+     T_BOOLEAN = 278,
+     T_DEF_BOOLEAN = 279,
+     T_STRING = 280,
+     T_INT = 281,
+     T_HEX = 282,
+     T_WORD = 283,
+     T_WORD_QUOTE = 284,
+     T_UNEQUAL = 285,
+     T_EOF = 286,
+     T_EOL = 287,
+     T_CLOSE_PAREN = 288,
+     T_OPEN_PAREN = 289,
+     T_ON = 290,
+     T_SELECT = 291,
+     T_RANGE = 292,
+     T_OR = 293,
+     T_AND = 294,
+     T_EQUAL = 295,
+     T_NOT = 296
+   };
+#endif
+#define T_MAINMENU 258
+#define T_MENU 259
+#define T_ENDMENU 260
+#define T_SOURCE 261
+#define T_CHOICE 262
+#define T_ENDCHOICE 263
+#define T_COMMENT 264
+#define T_CONFIG 265
+#define T_MENUCONFIG 266
+#define T_HELP 267
+#define T_HELPTEXT 268
+#define T_IF 269
+#define T_ENDIF 270
+#define T_DEPENDS 271
+#define T_REQUIRES 272
+#define T_OPTIONAL 273
+#define T_PROMPT 274
+#define T_DEFAULT 275
+#define T_TRISTATE 276
+#define T_DEF_TRISTATE 277
+#define T_BOOLEAN 278
+#define T_DEF_BOOLEAN 279
+#define T_STRING 280
+#define T_INT 281
+#define T_HEX 282
+#define T_WORD 283
+#define T_WORD_QUOTE 284
+#define T_UNEQUAL 285
+#define T_EOF 286
+#define T_EOL 287
+#define T_CLOSE_PAREN 288
+#define T_OPEN_PAREN 289
+#define T_ON 290
+#define T_SELECT 291
+#define T_RANGE 292
+#define T_OR 293
+#define T_AND 294
+#define T_EQUAL 295
+#define T_NOT 296
+
+
+
+
+/* Copy the first part of user declarations.  */
+
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD		0x0001
+#define DEBUG_PARSE	0x0002
+
+int cdebug = PRINTD;
+
+extern int zconflex(void);
+static void zconfprint(const char *err, ...);
+static void zconferror(const char *err);
+static bool zconf_endtoken(int token, int starttoken, int endtoken);
+
+struct symbol *symbol_hash[257];
+
+static struct menu *current_menu, *current_entry;
+
+#define YYERROR_VERBOSE
+
+
+/* Enabling traces.  */
+#ifndef YYDEBUG
+# define YYDEBUG 0
+#endif
+
+/* Enabling verbose error messages.  */
+#ifdef YYERROR_VERBOSE
+# undef YYERROR_VERBOSE
+# define YYERROR_VERBOSE 1
+#else
+# define YYERROR_VERBOSE 0
+#endif
+
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+
+typedef union YYSTYPE {
+	int token;
+	char *string;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+} YYSTYPE;
+/* Line 191 of yacc.c.  */
+
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
+#endif
+
+
+
+/* Copy the second part of user declarations.  */
+
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+
+/* Line 214 of yacc.c.  */
+
+
+#if ! defined (yyoverflow) || YYERROR_VERBOSE
+
+/* The parser invokes alloca or malloc; define the necessary symbols.  */
+
+# if YYSTACK_USE_ALLOCA
+#  define YYSTACK_ALLOC alloca
+# else
+#  ifndef YYSTACK_USE_ALLOCA
+#   if defined (alloca) || (defined (_ALLOCA_H) && defined (__GNUC__))
+#    define YYSTACK_ALLOC alloca
+#   else
+#    ifdef __GNUC__
+#     define YYSTACK_ALLOC __builtin_alloca
+#    endif
+#   endif
+#  endif
+# endif
+
+# ifdef YYSTACK_ALLOC
+   /* Pacify GCC's `empty if-body' warning. */
+#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
+# else
+#  if defined (__STDC__) || defined (__cplusplus)
+#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
+#   define YYSIZE_T size_t
+#  endif
+#  define YYSTACK_ALLOC malloc
+#  define YYSTACK_FREE free
+# endif
+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
+
+
+#if (! defined (yyoverflow) \
+     && (! defined (__cplusplus) \
+	 || (YYSTYPE_IS_TRIVIAL)))
+
+/* A type that is properly aligned for any stack member.  */
+union yyalloc
+{
+  short yyss;
+  YYSTYPE yyvs;
+  };
+
+/* The size of the maximum gap between one aligned stack and the next.  */
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
+
+/* The size of an array large to enough to hold all stacks, each with
+   N elements.  */
+# define YYSTACK_BYTES(N) \
+     ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
+      + YYSTACK_GAP_MAXIMUM)
+
+/* Copy COUNT objects from FROM to TO.  The source and destination do
+   not overlap.  */
+# ifndef YYCOPY
+#  if 1 < __GNUC__
+#   define YYCOPY(To, From, Count) \
+      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
+#  else
+#   define YYCOPY(To, From, Count)		\
+      do					\
+	{					\
+	  register YYSIZE_T yyi;		\
+	  for (yyi = 0; yyi < (Count); yyi++)	\
+	    (To)[yyi] = (From)[yyi];		\
+	}					\
+      while (0)
+#  endif
+# endif
+
+/* Relocate STACK from its old location to the new one.  The
+   local variables YYSIZE and YYSTACKSIZE give the old and new number of
+   elements in the stack, and YYPTR gives the new location of the
+   stack.  Advance YYPTR to a properly aligned location for the next
+   stack.  */
+# define YYSTACK_RELOCATE(Stack)					\
+    do									\
+      {									\
+	YYSIZE_T yynewbytes;						\
+	YYCOPY (&yyptr->Stack, Stack, yysize);				\
+	Stack = &yyptr->Stack;						\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
+	yyptr += yynewbytes / sizeof (*yyptr);				\
+      }									\
+    while (0)
+
+#endif
+
+#if defined (__STDC__) || defined (__cplusplus)
+   typedef signed char yysigned_char;
+#else
+   typedef short yysigned_char;
+#endif
+
+/* YYFINAL -- State number of the termination state. */
+#define YYFINAL  2
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   201
+
+/* YYNTOKENS -- Number of terminals. */
+#define YYNTOKENS  42
+/* YYNNTS -- Number of nonterminals. */
+#define YYNNTS  41
+/* YYNRULES -- Number of rules. */
+#define YYNRULES  104
+/* YYNRULES -- Number of states. */
+#define YYNSTATES  182
+
+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
+#define YYUNDEFTOK  2
+#define YYMAXUTOK   296
+
+#define YYTRANSLATE(YYX)						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
+
+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
+static const unsigned char yytranslate[] =
+{
+       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
+       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
+      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
+      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
+      35,    36,    37,    38,    39,    40,    41
+};
+
+#if YYDEBUG
+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
+   YYRHS.  */
+static const unsigned short yyprhs[] =
+{
+       0,     0,     3,     4,     7,     9,    11,    13,    17,    19,
+      21,    23,    26,    28,    30,    32,    34,    36,    38,    42,
+      45,    49,    52,    53,    56,    59,    62,    65,    69,    74,
+      78,    83,    87,    91,    95,   100,   105,   110,   116,   119,
+     122,   124,   128,   131,   132,   135,   138,   141,   144,   149,
+     153,   157,   160,   165,   166,   169,   173,   175,   179,   182,
+     183,   186,   189,   192,   196,   199,   201,   205,   208,   209,
+     212,   215,   218,   222,   226,   228,   232,   235,   238,   241,
+     242,   245,   248,   253,   257,   261,   262,   265,   267,   269,
+     272,   275,   278,   280,   282,   283,   286,   288,   292,   296,
+     300,   303,   307,   311,   313
+};
+
+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
+static const yysigned_char yyrhs[] =
+{
+      43,     0,    -1,    -1,    43,    44,    -1,    45,    -1,    55,
+      -1,    66,    -1,     3,    77,    79,    -1,     5,    -1,    15,
+      -1,     8,    -1,     1,    79,    -1,    61,    -1,    71,    -1,
+      47,    -1,    49,    -1,    69,    -1,    79,    -1,    10,    28,
+      32,    -1,    46,    50,    -1,    11,    28,    32,    -1,    48,
+      50,    -1,    -1,    50,    51,    -1,    50,    75,    -1,    50,
+      73,    -1,    50,    32,    -1,    21,    76,    32,    -1,    22,
+      81,    80,    32,    -1,    23,    76,    32,    -1,    24,    81,
+      80,    32,    -1,    26,    76,    32,    -1,    27,    76,    32,
+      -1,    25,    76,    32,    -1,    19,    77,    80,    32,    -1,
+      20,    81,    80,    32,    -1,    36,    28,    80,    32,    -1,
+      37,    82,    82,    80,    32,    -1,     7,    32,    -1,    52,
+      56,    -1,    78,    -1,    53,    58,    54,    -1,    53,    58,
+      -1,    -1,    56,    57,    -1,    56,    75,    -1,    56,    73,
+      -1,    56,    32,    -1,    19,    77,    80,    32,    -1,    21,
+      76,    32,    -1,    23,    76,    32,    -1,    18,    32,    -1,
+      20,    28,    80,    32,    -1,    -1,    58,    45,    -1,    14,
+      81,    32,    -1,    78,    -1,    59,    62,    60,    -1,    59,
+      62,    -1,    -1,    62,    45,    -1,    62,    66,    -1,    62,
+      55,    -1,     4,    77,    32,    -1,    63,    74,    -1,    78,
+      -1,    64,    67,    65,    -1,    64,    67,    -1,    -1,    67,
+      45,    -1,    67,    66,    -1,    67,    55,    -1,    67,     1,
+      32,    -1,     6,    77,    32,    -1,    68,    -1,     9,    77,
+      32,    -1,    70,    74,    -1,    12,    32,    -1,    72,    13,
+      -1,    -1,    74,    75,    -1,    74,    32,    -1,    16,    35,
+      81,    32,    -1,    16,    81,    32,    -1,    17,    81,    32,
+      -1,    -1,    77,    80,    -1,    28,    -1,    29,    -1,     5,
+      79,    -1,     8,    79,    -1,    15,    79,    -1,    32,    -1,
+      31,    -1,    -1,    14,    81,    -1,    82,    -1,    82,    40,
+      82,    -1,    82,    30,    82,    -1,    34,    81,    33,    -1,
+      41,    81,    -1,    81,    38,    81,    -1,    81,    39,    81,
+      -1,    28,    -1,    29,    -1
+};
+
+/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
+static const unsigned short yyrline[] =
+{
+       0,    94,    94,    95,    98,    99,   100,   101,   102,   103,
+     104,   105,   109,   110,   111,   112,   113,   114,   120,   128,
+     134,   142,   152,   154,   155,   156,   157,   160,   166,   173,
+     179,   186,   192,   198,   204,   210,   216,   222,   230,   239,
+     245,   254,   255,   261,   263,   264,   265,   266,   269,   275,
+     281,   287,   293,   299,   301,   306,   315,   324,   325,   331,
+     333,   334,   335,   340,   347,   353,   362,   363,   369,   371,
+     372,   373,   374,   377,   383,   390,   397,   404,   410,   417,
+     418,   419,   422,   427,   432,   440,   442,   447,   448,   451,
+     452,   453,   457,   457,   459,   460,   463,   464,   465,   466,
+     467,   468,   469,   472,   473
+};
+#endif
+
+#if YYDEBUG || YYERROR_VERBOSE
+/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
+   First, the terminals, then, starting at YYNTOKENS, nonterminals. */
+static const char *const yytname[] =
+{
+  "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
+  "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
+  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
+  "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
+  "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
+  "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL",
+  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
+  "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block",
+  "common_block", "config_entry_start", "config_stmt",
+  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
+  "config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
+  "choice_option_list", "choice_option", "choice_block", "if", "if_end",
+  "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt",
+  "menu_block", "source", "source_stmt", "comment", "comment_stmt",
+  "help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
+  "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
+};
+#endif
+
+# ifdef YYPRINT
+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
+   token YYLEX-NUM.  */
+static const unsigned short yytoknum[] =
+{
+       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
+     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
+     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296
+};
+# endif
+
+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
+static const unsigned char yyr1[] =
+{
+       0,    42,    43,    43,    44,    44,    44,    44,    44,    44,
+      44,    44,    45,    45,    45,    45,    45,    45,    46,    47,
+      48,    49,    50,    50,    50,    50,    50,    51,    51,    51,
+      51,    51,    51,    51,    51,    51,    51,    51,    52,    53,
+      54,    55,    55,    56,    56,    56,    56,    56,    57,    57,
+      57,    57,    57,    58,    58,    59,    60,    61,    61,    62,
+      62,    62,    62,    63,    64,    65,    66,    66,    67,    67,
+      67,    67,    67,    68,    69,    70,    71,    72,    73,    74,
+      74,    74,    75,    75,    75,    76,    76,    77,    77,    78,
+      78,    78,    79,    79,    80,    80,    81,    81,    81,    81,
+      81,    81,    81,    82,    82
+};
+
+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
+static const unsigned char yyr2[] =
+{
+       0,     2,     0,     2,     1,     1,     1,     3,     1,     1,
+       1,     2,     1,     1,     1,     1,     1,     1,     3,     2,
+       3,     2,     0,     2,     2,     2,     2,     3,     4,     3,
+       4,     3,     3,     3,     4,     4,     4,     5,     2,     2,
+       1,     3,     2,     0,     2,     2,     2,     2,     4,     3,
+       3,     2,     4,     0,     2,     3,     1,     3,     2,     0,
+       2,     2,     2,     3,     2,     1,     3,     2,     0,     2,
+       2,     2,     3,     3,     1,     3,     2,     2,     2,     0,
+       2,     2,     4,     3,     3,     0,     2,     1,     1,     2,
+       2,     2,     1,     1,     0,     2,     1,     3,     3,     3,
+       2,     3,     3,     1,     1
+};
+
+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
+   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
+   means the default is an error.  */
+static const unsigned char yydefact[] =
+{
+       2,     0,     1,     0,     0,     0,     8,     0,     0,    10,
+       0,     0,     0,     0,     9,    93,    92,     3,     4,    22,
+      14,    22,    15,    43,    53,     5,    59,    12,    79,    68,
+       6,    74,    16,    79,    13,    17,    11,    87,    88,     0,
+       0,     0,    38,     0,     0,     0,   103,   104,     0,     0,
+       0,    96,    19,    21,    39,    42,    58,    64,     0,    76,
+       7,    63,    73,    75,    18,    20,     0,   100,    55,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    85,     0,
+      85,     0,    85,    85,    85,    26,     0,     0,    23,     0,
+      25,    24,     0,     0,     0,    85,    85,    47,    44,    46,
+      45,     0,     0,     0,    54,    41,    40,    60,    62,    57,
+      61,    56,    81,    80,     0,    69,    71,    66,    70,    65,
+      99,   101,   102,    98,    97,    77,     0,     0,     0,    94,
+      94,     0,    94,    94,     0,    94,     0,     0,     0,    94,
+       0,    78,    51,    94,    94,     0,     0,    89,    90,    91,
+      72,     0,    83,    84,     0,     0,     0,    27,    86,     0,
+      29,     0,    33,    31,    32,     0,    94,     0,     0,    49,
+      50,    82,    95,    34,    35,    28,    30,    36,     0,    48,
+      52,    37
+};
+
+/* YYDEFGOTO[NTERM-NUM]. */
+static const short yydefgoto[] =
+{
+      -1,     1,    17,    18,    19,    20,    21,    22,    52,    88,
+      23,    24,   105,    25,    54,    98,    55,    26,   109,    27,
+      56,    28,    29,   117,    30,    58,    31,    32,    33,    34,
+      89,    90,    57,    91,   131,   132,   106,    35,   155,    50,
+      51
+};
+
+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
+   STATE-NUM.  */
+#define YYPACT_NINF -99
+static const short yypact[] =
+{
+     -99,    48,   -99,    38,    46,    46,   -99,    46,   -29,   -99,
+      46,   -17,    -3,   -11,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,    38,
+      12,    15,   -99,    18,    51,    62,   -99,   -99,   -11,   -11,
+       4,   -24,   138,   138,   160,   121,   110,    -4,    81,    -4,
+     -99,   -99,   -99,   -99,   -99,   -99,   -19,   -99,   -99,   -11,
+     -11,    70,    70,    73,    32,   -11,    46,   -11,    46,   -11,
+      46,   -11,    46,    46,    46,   -99,    36,    70,   -99,    95,
+     -99,   -99,    96,    46,   106,    46,    46,   -99,   -99,   -99,
+     -99,    38,    38,    38,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   112,   -99,   -99,   -99,   -99,   -99,
+     -99,   117,   -99,   -99,   -99,   -99,   -11,    33,    65,   131,
+       1,   119,   131,     1,   136,     1,   153,   154,   155,   131,
+      70,   -99,   -99,   131,   131,   156,   157,   -99,   -99,   -99,
+     -99,   101,   -99,   -99,   -11,   158,   159,   -99,   -99,   161,
+     -99,   162,   -99,   -99,   -99,   163,   131,   164,   165,   -99,
+     -99,   -99,    99,   -99,   -99,   -99,   -99,   -99,   166,   -99,
+     -99,   -99
+};
+
+/* YYPGOTO[NTERM-NUM].  */
+static const short yypgoto[] =
+{
+     -99,   -99,   -99,   111,   -99,   -99,   -99,   -99,   178,   -99,
+     -99,   -99,   -99,    91,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   115,   -99,   -99,   -99,   -99,   -99,
+     -99,   146,   168,    89,    27,     0,   126,    -1,   -98,   -48,
+     -63
+};
+
+/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
+   positive, shift that token.  If negative, reduce the rule which
+   number is the opposite.  If zero, do what YYDEFACT says.
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -68
+static const short yytable[] =
+{
+      66,    67,    36,    42,    39,    40,    71,    41,   123,   124,
+      43,    44,    74,    75,   120,   154,    72,    46,    47,    69,
+      70,   121,   122,    48,   140,    45,   127,   128,   112,   130,
+      49,   133,   156,   135,   158,   159,    68,   161,    60,    69,
+      70,   165,    69,    70,    61,   167,   168,    62,     2,     3,
+      63,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      46,    47,    13,    14,   139,   152,    48,   126,   178,    15,
+      16,    69,    70,    49,    37,    38,   129,   166,   151,    15,
+      16,   -67,   114,    64,   -67,     5,   101,     7,     8,   102,
+      10,    11,    12,   143,    65,    13,   103,   153,    46,    47,
+     147,   148,   149,    69,    70,   125,   172,   134,   141,   136,
+     137,   138,    15,    16,     5,   101,     7,     8,   102,    10,
+      11,    12,   145,   146,    13,   103,   101,     7,   142,   102,
+      10,    11,    12,   171,   144,    13,   103,    69,    70,    69,
+      70,    15,    16,   100,   150,   154,   113,   108,   113,   116,
+      73,   157,    15,    16,    74,    75,    70,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,   104,   107,   160,   115,
+      85,   110,    73,   118,    86,    87,    74,    75,    92,    93,
+      94,    95,   111,    96,   119,   162,   163,   164,   169,   170,
+     173,   174,    97,   175,   176,   177,   179,   180,   181,    53,
+      99,    59
+};
+
+static const unsigned char yycheck[] =
+{
+      48,    49,     3,    32,     4,     5,    30,     7,    71,    72,
+      10,    28,    16,    17,    33,    14,    40,    28,    29,    38,
+      39,    69,    70,    34,    87,    28,    74,    75,    32,    77,
+      41,    79,   130,    81,   132,   133,    32,   135,    39,    38,
+      39,   139,    38,    39,    32,   143,   144,    32,     0,     1,
+      32,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      28,    29,    14,    15,    28,    32,    34,    35,   166,    31,
+      32,    38,    39,    41,    28,    29,    76,   140,   126,    31,
+      32,     0,     1,    32,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    93,    32,    14,    15,    32,    28,    29,
+     101,   102,   103,    38,    39,    32,   154,    80,    13,    82,
+      83,    84,    31,    32,     4,     5,     6,     7,     8,     9,
+      10,    11,    95,    96,    14,    15,     5,     6,    32,     8,
+       9,    10,    11,    32,    28,    14,    15,    38,    39,    38,
+      39,    31,    32,    54,    32,    14,    57,    56,    59,    58,
+      12,    32,    31,    32,    16,    17,    39,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    55,    56,    32,    58,
+      32,    56,    12,    58,    36,    37,    16,    17,    18,    19,
+      20,    21,    56,    23,    58,    32,    32,    32,    32,    32,
+      32,    32,    32,    32,    32,    32,    32,    32,    32,    21,
+      54,    33
+};
+
+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
+   symbol of state STATE-NUM.  */
+static const unsigned char yystos[] =
+{
+       0,    43,     0,     1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    14,    15,    31,    32,    44,    45,    46,
+      47,    48,    49,    52,    53,    55,    59,    61,    63,    64,
+      66,    68,    69,    70,    71,    79,    79,    28,    29,    77,
+      77,    77,    32,    77,    28,    28,    28,    29,    34,    41,
+      81,    82,    50,    50,    56,    58,    62,    74,    67,    74,
+      79,    32,    32,    32,    32,    32,    81,    81,    32,    38,
+      39,    30,    40,    12,    16,    17,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    32,    36,    37,    51,    72,
+      73,    75,    18,    19,    20,    21,    23,    32,    57,    73,
+      75,     5,     8,    15,    45,    54,    78,    45,    55,    60,
+      66,    78,    32,    75,     1,    45,    55,    65,    66,    78,
+      33,    81,    81,    82,    82,    32,    35,    81,    81,    77,
+      81,    76,    77,    81,    76,    81,    76,    76,    76,    28,
+      82,    13,    32,    77,    28,    76,    76,    79,    79,    79,
+      32,    81,    32,    32,    14,    80,    80,    32,    80,    80,
+      32,    80,    32,    32,    32,    80,    82,    80,    80,    32,
+      32,    32,    81,    32,    32,    32,    32,    32,    80,    32,
+      32,    32
+};
+
+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
+# define YYSIZE_T __SIZE_TYPE__
+#endif
+#if ! defined (YYSIZE_T) && defined (size_t)
+# define YYSIZE_T size_t
+#endif
+#if ! defined (YYSIZE_T)
+# if defined (__STDC__) || defined (__cplusplus)
+#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYSIZE_T size_t
+# endif
+#endif
+#if ! defined (YYSIZE_T)
+# define YYSIZE_T unsigned int
+#endif
+
+#define yyerrok		(yyerrstatus = 0)
+#define yyclearin	(yychar = YYEMPTY)
+#define YYEMPTY		(-2)
+#define YYEOF		0
+
+#define YYACCEPT	goto yyacceptlab
+#define YYABORT		goto yyabortlab
+#define YYERROR		goto yyerrlab1
+
+
+/* Like YYERROR except do call yyerror.  This remains here temporarily
+   to ease the transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+
+#define YYFAIL		goto yyerrlab
+
+#define YYRECOVERING()  (!!yyerrstatus)
+
+#define YYBACKUP(Token, Value)					\
+do								\
+  if (yychar == YYEMPTY && yylen == 1)				\
+    {								\
+      yychar = (Token);						\
+      yylval = (Value);						\
+      yytoken = YYTRANSLATE (yychar);				\
+      YYPOPSTACK;						\
+      goto yybackup;						\
+    }								\
+  else								\
+    {								\
+      yyerror ("syntax error: cannot back up");\
+      YYERROR;							\
+    }								\
+while (0)
+
+#define YYTERROR	1
+#define YYERRCODE	256
+
+/* YYLLOC_DEFAULT -- Compute the default location (before the actions
+   are run).  */
+
+#ifndef YYLLOC_DEFAULT
+# define YYLLOC_DEFAULT(Current, Rhs, N)         \
+  Current.first_line   = Rhs[1].first_line;      \
+  Current.first_column = Rhs[1].first_column;    \
+  Current.last_line    = Rhs[N].last_line;       \
+  Current.last_column  = Rhs[N].last_column;
+#endif
+
+/* YYLEX -- calling `yylex' with the right arguments.  */
+
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
+
+/* Enable debugging if requested.  */
+#if YYDEBUG
+
+# ifndef YYFPRINTF
+#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
+#  define YYFPRINTF fprintf
+# endif
+
+# define YYDPRINTF(Args)			\
+do {						\
+  if (yydebug)					\
+    YYFPRINTF Args;				\
+} while (0)
+
+# define YYDSYMPRINT(Args)			\
+do {						\
+  if (yydebug)					\
+    yysymprint Args;				\
+} while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr,					\
+                  Token, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (cinluded).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short *bottom;
+    short *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylineno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylineno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
+/* Nonzero means print parse trace.  It is left uninitialized so that
+   multiple parsers can coexist.  */
+int yydebug;
+#else /* !YYDEBUG */
+# define YYDPRINTF(Args)
+# define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
+#endif /* !YYDEBUG */
+
+
+/* YYINITDEPTH -- initial size of the parser's stacks.  */
+#ifndef	YYINITDEPTH
+# define YYINITDEPTH 200
+#endif
+
+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
+   if the built-in stack extension method is used).
+
+   Do not make this value too large; the results are undefined if
+   SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
+   evaluated with infinite-precision integer arithmetic.  */
+
+#if YYMAXDEPTH == 0
+# undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+# define YYMAXDEPTH 10000
+#endif
+
+
+
+#if YYERROR_VERBOSE
+
+# ifndef yystrlen
+#  if defined (__GLIBC__) && defined (_STRING_H)
+#   define yystrlen strlen
+#  else
+/* Return the length of YYSTR.  */
+static YYSIZE_T
+#   if defined (__STDC__) || defined (__cplusplus)
+yystrlen (const char *yystr)
+#   else
+yystrlen (yystr)
+     const char *yystr;
+#   endif
+{
+  register const char *yys = yystr;
+
+  while (*yys++ != '\0')
+    continue;
+
+  return yys - yystr - 1;
+}
+#  endif
+# endif
+
+# ifndef yystpcpy
+#  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
+#   define yystpcpy stpcpy
+#  else
+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
+   YYDEST.  */
+static char *
+#   if defined (__STDC__) || defined (__cplusplus)
+yystpcpy (char *yydest, const char *yysrc)
+#   else
+yystpcpy (yydest, yysrc)
+     char *yydest;
+     const char *yysrc;
+#   endif
+{
+  register char *yyd = yydest;
+  register const char *yys = yysrc;
+
+  while ((*yyd++ = *yys++) != '\0')
+    continue;
+
+  return yyd - 1;
+}
+#  endif
+# endif
+
+#endif /* !YYERROR_VERBOSE */
+
+
+
+#if YYDEBUG
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  if (yytype < YYNTOKENS)
+    {
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
+# ifdef YYPRINT
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
+# endif
+    }
+  else
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
+
+  switch (yytype)
+    {
+      default:
+        break;
+    }
+  YYFPRINTF (yyoutput, ")");
+}
+
+#endif /* ! YYDEBUG */
+/*-----------------------------------------------.
+| Release the memory associated to this symbol.  |
+`-----------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
+#else
+static void
+yydestruct (yytype, yyvaluep)
+    int yytype;
+    YYSTYPE *yyvaluep;
+#endif
+{
+  /* Pacify ``unused variable'' warnings.  */
+  (void) yyvaluep;
+
+  switch (yytype)
+    {
+
+      default:
+        break;
+    }
+}
+
+
+/* Prevent warnings from -Wmissing-prototypes.  */
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM);
+# else
+int yyparse ();
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void);
+#else
+int yyparse ();
+#endif
+#endif /* ! YYPARSE_PARAM */
+
+
+
+/* The lookahead symbol.  */
+int yychar;
+
+/* The semantic value of the lookahead symbol.  */
+YYSTYPE yylval;
+
+/* Number of syntax errors so far.  */
+int yynerrs;
+
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
+int
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
+{
+
+  register int yystate;
+  register int yyn;
+  int yyresult;
+  /* Number of tokens to shift before error messages enabled.  */
+  int yyerrstatus;
+  /* Lookahead token as an internal (translated) token number.  */
+  int yytoken = 0;
+
+  /* Three stacks and their tools:
+     `yyss': related to states,
+     `yyvs': related to semantic values,
+     `yyls': related to locations.
+
+     Refer to the stacks thru separate pointers, to allow yyoverflow
+     to reallocate them elsewhere.  */
+
+  /* The state stack.  */
+  short	yyssa[YYINITDEPTH];
+  short *yyss = yyssa;
+  register short *yyssp;
+
+  /* The semantic value stack.  */
+  YYSTYPE yyvsa[YYINITDEPTH];
+  YYSTYPE *yyvs = yyvsa;
+  register YYSTYPE *yyvsp;
+
+
+
+#define YYPOPSTACK   (yyvsp--, yyssp--)
+
+  YYSIZE_T yystacksize = YYINITDEPTH;
+
+  /* The variables used to return semantic value and location from the
+     action routines.  */
+  YYSTYPE yyval;
+
+
+  /* When reducing, the number of symbols on the RHS of the reduced
+     rule.  */
+  int yylen;
+
+  YYDPRINTF ((stderr, "Starting parse\n"));
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;		/* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.
+     The wasted elements are never initialized.  */
+
+  yyssp = yyss;
+  yyvsp = yyvs;
+
+  goto yysetstate;
+
+/*------------------------------------------------------------.
+| yynewstate -- Push a new state, which is found in yystate.  |
+`------------------------------------------------------------*/
+ yynewstate:
+  /* In all cases, when you get here, the value and location stacks
+     have just been pushed. so pushing a state here evens the stacks.
+     */
+  yyssp++;
+
+ yysetstate:
+  *yyssp = yystate;
+
+  if (yyss + yystacksize - 1 <= yyssp)
+    {
+      /* Get the current used size of the three stacks, in elements.  */
+      YYSIZE_T yysize = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      {
+	/* Give user a chance to reallocate the stack. Use copies of
+	   these so that the &'s don't force the real ones into
+	   memory.  */
+	YYSTYPE *yyvs1 = yyvs;
+	short *yyss1 = yyss;
+
+
+	/* Each stack pointer address is followed by the size of the
+	   data in use in that stack, in bytes.  This used to be a
+	   conditional around just the two extra args, but that might
+	   be undefined if yyoverflow is a macro.  */
+	yyoverflow ("parser stack overflow",
+		    &yyss1, yysize * sizeof (*yyssp),
+		    &yyvs1, yysize * sizeof (*yyvsp),
+
+		    &yystacksize);
+
+	yyss = yyss1;
+	yyvs = yyvs1;
+      }
+#else /* no yyoverflow */
+# ifndef YYSTACK_RELOCATE
+      goto yyoverflowlab;
+# else
+      /* Extend the stack our own way.  */
+      if (YYMAXDEPTH <= yystacksize)
+	goto yyoverflowlab;
+      yystacksize *= 2;
+      if (YYMAXDEPTH < yystacksize)
+	yystacksize = YYMAXDEPTH;
+
+      {
+	short *yyss1 = yyss;
+	union yyalloc *yyptr =
+	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
+	if (! yyptr)
+	  goto yyoverflowlab;
+	YYSTACK_RELOCATE (yyss);
+	YYSTACK_RELOCATE (yyvs);
+
+#  undef YYSTACK_RELOCATE
+	if (yyss1 != yyssa)
+	  YYSTACK_FREE (yyss1);
+      }
+# endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + yysize - 1;
+      yyvsp = yyvs + yysize - 1;
+
+
+      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
+		  (unsigned long int) yystacksize));
+
+      if (yyss + yystacksize - 1 <= yyssp)
+	YYABORT;
+    }
+
+  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
+
+  goto yybackup;
+
+/*-----------.
+| yybackup.  |
+`-----------*/
+yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYPACT_NINF)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
+  if (yychar == YYEMPTY)
+    {
+      YYDPRINTF ((stderr, "Reading a token: "));
+      yychar = YYLEX;
+    }
+
+  if (yychar <= YYEOF)
+    {
+      yychar = yytoken = YYEOF;
+      YYDPRINTF ((stderr, "Now at end of input.\n"));
+    }
+  else
+    {
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
+    }
+
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
+     detect an error, take that action.  */
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
+    goto yydefault;
+  yyn = yytable[yyn];
+  if (yyn <= 0)
+    {
+      if (yyn == 0 || yyn == YYTABLE_NINF)
+	goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+
+
+  /* Count tokens shifted since error; after three, turn off error
+     status.  */
+  if (yyerrstatus)
+    yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-----------------------------------------------------------.
+| yydefault -- do the default action for the current state.  |
+`-----------------------------------------------------------*/
+yydefault:
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+  goto yyreduce;
+
+
+/*-----------------------------.
+| yyreduce -- Do a reduction.  |
+`-----------------------------*/
+yyreduce:
+  /* yyn is the number of a rule to reduce with.  */
+  yylen = yyr2[yyn];
+
+  /* If YYLEN is nonzero, implement the default value of the action:
+     `$$ = $1'.
+
+     Otherwise, the following line sets YYVAL to garbage.
+     This behavior is undocumented and Bison
+     users should not rely upon it.  Assigning to YYVAL
+     unconditionally makes the parser a bit smaller, and it avoids a
+     GCC warning that YYVAL may be used uninitialized.  */
+  yyval = yyvsp[1-yylen];
+
+
+  YY_REDUCE_PRINT (yyn);
+  switch (yyn)
+    {
+        case 8:
+
+    { zconfprint("unexpected 'endmenu' statement"); ;}
+    break;
+
+  case 9:
+
+    { zconfprint("unexpected 'endif' statement"); ;}
+    break;
+
+  case 10:
+
+    { zconfprint("unexpected 'endchoice' statement"); ;}
+    break;
+
+  case 11:
+
+    { zconfprint("syntax error"); yyerrok; ;}
+    break;
+
+  case 18:
+
+    {
+	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
+;}
+    break;
+
+  case 19:
+
+    {
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 20:
+
+    {
+	struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
+;}
+    break;
+
+  case 21:
+
+    {
+	if (current_entry->prompt)
+		current_entry->prompt->type = P_MENU;
+	else
+		zconfprint("warning: menuconfig statement without prompt");
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 27:
+
+    {
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 28:
+
+    {
+	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 29:
+
+    {
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 30:
+
+    {
+	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 31:
+
+    {
+	menu_set_type(S_INT);
+	printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 32:
+
+    {
+	menu_set_type(S_HEX);
+	printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 33:
+
+    {
+	menu_set_type(S_STRING);
+	printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 34:
+
+    {
+	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 35:
+
+    {
+	menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 36:
+
+    {
+	menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 37:
+
+    {
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 38:
+
+    {
+	struct symbol *sym = sym_lookup(NULL, 0);
+	sym->flags |= SYMBOL_CHOICE;
+	menu_add_entry(sym);
+	menu_add_expr(P_CHOICE, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 39:
+
+    {
+	menu_end_entry();
+	menu_add_menu();
+;}
+    break;
+
+  case 40:
+
+    {
+	if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 42:
+
+    {
+	printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+;}
+    break;
+
+  case 48:
+
+    {
+	menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 49:
+
+    {
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 50:
+
+    {
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 51:
+
+    {
+	current_entry->sym->flags |= SYMBOL_OPTIONAL;
+	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 52:
+
+    {
+	menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 55:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_dep(yyvsp[-1].expr);
+	menu_end_entry();
+	menu_add_menu();
+;}
+    break;
+
+  case 56:
+
+    {
+	if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 58:
+
+    {
+	printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+;}
+    break;
+
+  case 63:
+
+    {
+	menu_add_entry(NULL);
+	menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 64:
+
+    {
+	menu_end_entry();
+	menu_add_menu();
+;}
+    break;
+
+  case 65:
+
+    {
+	if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+	}
+;}
+    break;
+
+  case 67:
+
+    {
+	printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+;}
+    break;
+
+  case 72:
+
+    { zconfprint("invalid menu option"); yyerrok; ;}
+    break;
+
+  case 73:
+
+    {
+	yyval.string = yyvsp[-1].string;
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
+;}
+    break;
+
+  case 74:
+
+    {
+	zconf_nextfile(yyvsp[0].string);
+;}
+    break;
+
+  case 75:
+
+    {
+	menu_add_entry(NULL);
+	menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 76:
+
+    {
+	menu_end_entry();
+;}
+    break;
+
+  case 77:
+
+    {
+	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+	zconf_starthelp();
+;}
+    break;
+
+  case 78:
+
+    {
+	current_entry->sym->help = yyvsp[0].string;
+;}
+    break;
+
+  case 82:
+
+    {
+	menu_add_dep(yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 83:
+
+    {
+	menu_add_dep(yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 84:
+
+    {
+	menu_add_dep(yyvsp[-1].expr);
+	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 86:
+
+    {
+	menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr);
+;}
+    break;
+
+  case 89:
+
+    { yyval.token = T_ENDMENU; ;}
+    break;
+
+  case 90:
+
+    { yyval.token = T_ENDCHOICE; ;}
+    break;
+
+  case 91:
+
+    { yyval.token = T_ENDIF; ;}
+    break;
+
+  case 94:
+
+    { yyval.expr = NULL; ;}
+    break;
+
+  case 95:
+
+    { yyval.expr = yyvsp[0].expr; ;}
+    break;
+
+  case 96:
+
+    { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
+    break;
+
+  case 97:
+
+    { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
+    break;
+
+  case 98:
+
+    { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
+    break;
+
+  case 99:
+
+    { yyval.expr = yyvsp[-1].expr; ;}
+    break;
+
+  case 100:
+
+    { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
+    break;
+
+  case 101:
+
+    { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
+    break;
+
+  case 102:
+
+    { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
+    break;
+
+  case 103:
+
+    { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
+    break;
+
+  case 104:
+
+    { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
+    break;
+
+
+    }
+
+/* Line 999 of yacc.c.  */
+
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+
+
+  YY_STACK_PRINT (yyss, yyssp);
+
+  *++yyvsp = yyval;
+
+
+  /* Now `shift' the result of the reduction.  Determine what state
+     that goes to, based on the state we popped back to and the rule
+     number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
+  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTOKENS];
+
+  goto yynewstate;
+
+
+/*------------------------------------.
+| yyerrlab -- here on detecting error |
+`------------------------------------*/
+yyerrlab:
+  /* If not already recovering from an error, report this error.  */
+  if (!yyerrstatus)
+    {
+      ++yynerrs;
+#if YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (YYPACT_NINF < yyn && yyn < YYLAST)
+	{
+	  YYSIZE_T yysize = 0;
+	  int yytype = YYTRANSLATE (yychar);
+	  char *yymsg;
+	  int yyx, yycount;
+
+	  yycount = 0;
+	  /* Start YYX at -YYN if negative to avoid negative indexes in
+	     YYCHECK.  */
+	  for (yyx = yyn < 0 ? -yyn : 0;
+	       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
+	  yysize += yystrlen ("syntax error, unexpected ") + 1;
+	  yysize += yystrlen (yytname[yytype]);
+	  yymsg = (char *) YYSTACK_ALLOC (yysize);
+	  if (yymsg != 0)
+	    {
+	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
+	      yyp = yystpcpy (yyp, yytname[yytype]);
+
+	      if (yycount < 5)
+		{
+		  yycount = 0;
+		  for (yyx = yyn < 0 ? -yyn : 0;
+		       yyx < (int) (sizeof (yytname) / sizeof (char *));
+		       yyx++)
+		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
+		      {
+			const char *yyq = ! yycount ? ", expecting " : " or ";
+			yyp = yystpcpy (yyp, yyq);
+			yyp = yystpcpy (yyp, yytname[yyx]);
+			yycount++;
+		      }
+		}
+	      yyerror (yymsg);
+	      YYSTACK_FREE (yymsg);
+	    }
+	  else
+	    yyerror ("syntax error; also virtual memory exhausted");
+	}
+      else
+#endif /* YYERROR_VERBOSE */
+	yyerror ("syntax error");
+    }
+
+
+
+  if (yyerrstatus == 3)
+    {
+      /* If just tried and failed to reuse lookahead token after an
+	 error, discard it.  */
+
+      /* Return failure if at end of input.  */
+      if (yychar == YYEOF)
+        {
+	  /* Pop the error token.  */
+          YYPOPSTACK;
+	  /* Pop the rest of the stack.  */
+	  while (yyss < yyssp)
+	    {
+	      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+	      yydestruct (yystos[*yyssp], yyvsp);
+	      YYPOPSTACK;
+	    }
+	  YYABORT;
+        }
+
+      YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+      yydestruct (yytoken, &yylval);
+      yychar = YYEMPTY;
+
+    }
+
+  /* Else will try to reuse lookahead token after shifting the error
+     token.  */
+  goto yyerrlab1;
+
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
+  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
+
+  for (;;)
+    {
+      yyn = yypact[yystate];
+      if (yyn != YYPACT_NINF)
+	{
+	  yyn += YYTERROR;
+	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
+	    {
+	      yyn = yytable[yyn];
+	      if (0 < yyn)
+		break;
+	    }
+	}
+
+      /* Pop the current state because it cannot handle the error token.  */
+      if (yyssp == yyss)
+	YYABORT;
+
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
+      yyvsp--;
+      yystate = *--yyssp;
+
+      YY_STACK_PRINT (yyss, yyssp);
+    }
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  YYDPRINTF ((stderr, "Shifting error token, "));
+
+  *++yyvsp = yylval;
+
+
+  yystate = yyn;
+  goto yynewstate;
+
+
+/*-------------------------------------.
+| yyacceptlab -- YYACCEPT comes here.  |
+`-------------------------------------*/
+yyacceptlab:
+  yyresult = 0;
+  goto yyreturn;
+
+/*-----------------------------------.
+| yyabortlab -- YYABORT comes here.  |
+`-----------------------------------*/
+yyabortlab:
+  yyresult = 1;
+  goto yyreturn;
+
+#ifndef yyoverflow
+/*----------------------------------------------.
+| yyoverflowlab -- parser overflow comes here.  |
+`----------------------------------------------*/
+yyoverflowlab:
+  yyerror ("parser stack overflow");
+  yyresult = 2;
+  /* Fall through.  */
+#endif
+
+yyreturn:
+#ifndef yyoverflow
+  if (yyss != yyssa)
+    YYSTACK_FREE (yyss);
+#endif
+  return yyresult;
+}
+
+
+
+
+
+void conf_parse(const char *name)
+{
+	struct symbol *sym;
+	int i;
+
+	zconf_initscan(name);
+
+	sym_init();
+	menu_init();
+	modules_sym = sym_lookup("MODULES", 0);
+	rootmenu.prompt = menu_add_prop(P_MENU, "JHALFS Configuration", NULL, NULL);
+
+	//zconfdebug = 1;
+	zconfparse();
+	if (zconfnerrs)
+		exit(1);
+	menu_finalize(&rootmenu);
+	for_all_symbols(i, sym) {
+                if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
+                        printf("\n");
+		else
+			sym->flags |= SYMBOL_CHECK_DONE;
+        }
+
+	sym_change_count = 1;
+}
+
+const char *zconf_tokenname(int token)
+{
+	switch (token) {
+	case T_MENU:		return "menu";
+	case T_ENDMENU:		return "endmenu";
+	case T_CHOICE:		return "choice";
+	case T_ENDCHOICE:	return "endchoice";
+	case T_IF:		return "if";
+	case T_ENDIF:		return "endif";
+	}
+	return "<token>";
+}
+
+static bool zconf_endtoken(int token, int starttoken, int endtoken)
+{
+	if (token != endtoken) {
+		zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	if (current_menu->file != current_file) {
+		zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
+		zconfprint("location of the '%s'", zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconferror(const char *err)
+{
+	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+}
+
+void print_quoted_string(FILE *out, const char *str)
+{
+	const char *p;
+	int len;
+
+	putc('"', out);
+	while ((p = strchr(str, '"'))) {
+		len = p - str;
+		if (len)
+			fprintf(out, "%.*s", len, str);
+		fputs("\\\"", out);
+		str = p + 1;
+	}
+	fputs(str, out);
+	putc('"', out);
+}
+
+void print_symbol(FILE *out, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	struct property *prop;
+
+	if (sym_is_choice(sym))
+		fprintf(out, "choice\n");
+	else
+		fprintf(out, "config %s\n", sym->name);
+	switch (sym->type) {
+	case S_BOOLEAN:
+		fputs("  boolean\n", out);
+		break;
+	case S_TRISTATE:
+		fputs("  tristate\n", out);
+		break;
+	case S_STRING:
+		fputs("  string\n", out);
+		break;
+	case S_INT:
+		fputs("  integer\n", out);
+		break;
+	case S_HEX:
+		fputs("  hex\n", out);
+		break;
+	default:
+		fputs("  ???\n", out);
+		break;
+	}
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu != menu)
+			continue;
+		switch (prop->type) {
+		case P_PROMPT:
+			fputs("  prompt ", out);
+			print_quoted_string(out, prop->text);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_DEFAULT:
+			fputs( "  default ", out);
+			expr_fprint(prop->expr, out);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_CHOICE:
+			fputs("  #choice value\n", out);
+			break;
+		default:
+			fprintf(out, "  unknown prop %d!\n", prop->type);
+			break;
+		}
+	}
+	if (sym->help) {
+		int len = strlen(sym->help);
+		while (sym->help[--len] == '\n')
+			sym->help[len] = 0;
+		fprintf(out, "  help\n%s\n", sym->help);
+	}
+	fputc('\n', out);
+}
+
+void zconfdump(FILE *out)
+{
+	struct property *prop;
+	struct symbol *sym;
+	struct menu *menu;
+
+	menu = rootmenu.list;
+	while (menu) {
+		if ((sym = menu->sym))
+			print_symbol(out, menu);
+		else if ((prop = menu->prompt)) {
+			switch (prop->type) {
+			case P_COMMENT:
+				fputs("\ncomment ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			case P_MENU:
+				fputs("\nmenu ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			default:
+				;
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs("  depends ", out);
+				expr_fprint(prop->visible.expr, out);
+				fputc('\n', out);
+			}
+			fputs("\n", out);
+		}
+
+		if (menu->list)
+			menu = menu->list;
+		else if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->prompt && menu->prompt->type == P_MENU)
+				fputs("\nendmenu\n", out);
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+}
+
+#include "lex.zconf.c"
+#include "util.c"
+#include "confdata.c"
+#include "expr.c"
+#include "symbol.c"
+#include "menu.c"
+
+
diff --git a/2.3/menu/zconf.tab.h_shipped b/2.3/menu/zconf.tab.h_shipped
new file mode 100644
index 0000000..3b191ef
--- /dev/null
+++ b/2.3/menu/zconf.tab.h_shipped
@@ -0,0 +1,125 @@
+/* A Bison parser, made from zconf.y, by GNU bison 1.75.  */
+
+/* Skeleton parser for Yacc-like parsing with Bison,
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* As a special exception, when this file is copied by Bison into a
+   Bison output file, you may use that output file without restriction.
+   This special exception was added by the Free Software Foundation
+   in version 1.24 of Bison.  */
+
+#ifndef BISON_ZCONF_TAB_H
+# define BISON_ZCONF_TAB_H
+
+/* Tokens.  */
+#ifndef YYTOKENTYPE
+# define YYTOKENTYPE
+   /* Put the tokens into the symbol table, so that GDB and other debuggers
+      know about them.  */
+   enum yytokentype {
+     T_MAINMENU = 258,
+     T_MENU = 259,
+     T_ENDMENU = 260,
+     T_SOURCE = 261,
+     T_CHOICE = 262,
+     T_ENDCHOICE = 263,
+     T_COMMENT = 264,
+     T_CONFIG = 265,
+     T_HELP = 266,
+     T_HELPTEXT = 267,
+     T_IF = 268,
+     T_ENDIF = 269,
+     T_DEPENDS = 270,
+     T_REQUIRES = 271,
+     T_OPTIONAL = 272,
+     T_PROMPT = 273,
+     T_DEFAULT = 274,
+     T_TRISTATE = 275,
+     T_BOOLEAN = 276,
+     T_INT = 277,
+     T_HEX = 278,
+     T_WORD = 279,
+     T_STRING = 280,
+     T_UNEQUAL = 281,
+     T_EOF = 282,
+     T_EOL = 283,
+     T_CLOSE_PAREN = 284,
+     T_OPEN_PAREN = 285,
+     T_ON = 286,
+     T_OR = 287,
+     T_AND = 288,
+     T_EQUAL = 289,
+     T_NOT = 290
+   };
+#endif
+#define T_MAINMENU 258
+#define T_MENU 259
+#define T_ENDMENU 260
+#define T_SOURCE 261
+#define T_CHOICE 262
+#define T_ENDCHOICE 263
+#define T_COMMENT 264
+#define T_CONFIG 265
+#define T_HELP 266
+#define T_HELPTEXT 267
+#define T_IF 268
+#define T_ENDIF 269
+#define T_DEPENDS 270
+#define T_REQUIRES 271
+#define T_OPTIONAL 272
+#define T_PROMPT 273
+#define T_DEFAULT 274
+#define T_TRISTATE 275
+#define T_BOOLEAN 276
+#define T_INT 277
+#define T_HEX 278
+#define T_WORD 279
+#define T_STRING 280
+#define T_UNEQUAL 281
+#define T_EOF 282
+#define T_EOL 283
+#define T_CLOSE_PAREN 284
+#define T_OPEN_PAREN 285
+#define T_ON 286
+#define T_OR 287
+#define T_AND 288
+#define T_EQUAL 289
+#define T_NOT 290
+
+
+
+
+#ifndef YYSTYPE
+#line 33 "zconf.y"
+typedef union {
+	int token;
+	char *string;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+} yystype;
+/* Line 1281 of /usr/share/bison/yacc.c.  */
+#line 118 "zconf.tab.h"
+# define YYSTYPE yystype
+#endif
+
+extern YYSTYPE zconflval;
+
+
+#endif /* not BISON_ZCONF_TAB_H */
+
diff --git a/2.3/menu/zconf.y b/2.3/menu/zconf.y
new file mode 100644
index 0000000..ee4ce96
--- /dev/null
+++ b/2.3/menu/zconf.y
@@ -0,0 +1,690 @@
+%{
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD		0x0001
+#define DEBUG_PARSE	0x0002
+
+int cdebug = PRINTD;
+
+extern int zconflex(void);
+static void zconfprint(const char *err, ...);
+static void zconferror(const char *err);
+static bool zconf_endtoken(int token, int starttoken, int endtoken);
+
+struct symbol *symbol_hash[257];
+
+static struct menu *current_menu, *current_entry;
+
+#define YYERROR_VERBOSE
+%}
+%expect 40
+
+%union
+{
+	int token;
+	char *string;
+	struct symbol *symbol;
+	struct expr *expr;
+	struct menu *menu;
+}
+
+%token T_MAINMENU
+%token T_MENU
+%token T_ENDMENU
+%token T_SOURCE
+%token T_CHOICE
+%token T_ENDCHOICE
+%token T_COMMENT
+%token T_CONFIG
+%token T_MENUCONFIG
+%token T_HELP
+%token <string> T_HELPTEXT
+%token T_IF
+%token T_ENDIF
+%token T_DEPENDS
+%token T_REQUIRES
+%token T_OPTIONAL
+%token T_PROMPT
+%token T_DEFAULT
+%token T_TRISTATE
+%token T_DEF_TRISTATE
+%token T_BOOLEAN
+%token T_DEF_BOOLEAN
+%token T_STRING
+%token T_INT
+%token T_HEX
+%token <string> T_WORD
+%token <string> T_WORD_QUOTE
+%token T_UNEQUAL
+%token T_EOF
+%token T_EOL
+%token T_CLOSE_PAREN
+%token T_OPEN_PAREN
+%token T_ON
+%token T_SELECT
+%token T_RANGE
+
+%left T_OR
+%left T_AND
+%left T_EQUAL T_UNEQUAL
+%nonassoc T_NOT
+
+%type <string> prompt
+%type <string> source
+%type <symbol> symbol
+%type <expr> expr
+%type <expr> if_expr
+%type <token> end
+
+%{
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+%}
+%%
+input:	  /* empty */
+	| input block
+;
+
+block:	  common_block
+	| choice_stmt
+	| menu_stmt
+	| T_MAINMENU prompt nl_or_eof
+	| T_ENDMENU		{ zconfprint("unexpected 'endmenu' statement"); }
+	| T_ENDIF		{ zconfprint("unexpected 'endif' statement"); }
+	| T_ENDCHOICE		{ zconfprint("unexpected 'endchoice' statement"); }
+	| error nl_or_eof	{ zconfprint("syntax error"); yyerrok; }
+;
+
+common_block:
+	  if_stmt
+	| comment_stmt
+	| config_stmt
+	| menuconfig_stmt
+	| source_stmt
+	| nl_or_eof
+;
+
+
+/* config/menuconfig entry */
+
+config_entry_start: T_CONFIG T_WORD T_EOL
+{
+	struct symbol *sym = sym_lookup($2, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+config_stmt: config_entry_start config_option_list
+{
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
+{
+	struct symbol *sym = sym_lookup($2, 0);
+	sym->flags |= SYMBOL_OPTIONAL;
+	menu_add_entry(sym);
+	printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+menuconfig_stmt: menuconfig_entry_start config_option_list
+{
+	if (current_entry->prompt)
+		current_entry->prompt->type = P_MENU;
+	else
+		zconfprint("warning: menuconfig statement without prompt");
+	menu_end_entry();
+	printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+config_option_list:
+	  /* empty */
+	| config_option_list config_option
+	| config_option_list depends
+	| config_option_list help
+	| config_option_list T_EOL
+;
+
+config_option: T_TRISTATE prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEF_TRISTATE expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_BOOLEAN prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEF_BOOLEAN expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_INT prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_INT);
+	printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_HEX prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_HEX);
+	printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_STRING prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_STRING);
+	printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_PROMPT prompt if_expr T_EOL
+{
+	menu_add_prompt(P_PROMPT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_DEFAULT expr if_expr T_EOL
+{
+	menu_add_expr(P_DEFAULT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_SELECT T_WORD if_expr T_EOL
+{
+	menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
+	printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_RANGE symbol symbol if_expr T_EOL
+{
+	menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
+	printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+};
+
+/* choice entry */
+
+choice: T_CHOICE T_EOL
+{
+	struct symbol *sym = sym_lookup(NULL, 0);
+	sym->flags |= SYMBOL_CHOICE;
+	menu_add_entry(sym);
+	menu_add_expr(P_CHOICE, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+};
+
+choice_entry: choice choice_option_list
+{
+	menu_end_entry();
+	menu_add_menu();
+};
+
+choice_end: end
+{
+	if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+choice_stmt:
+	  choice_entry choice_block choice_end
+	| choice_entry choice_block
+{
+	printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+};
+
+choice_option_list:
+	  /* empty */
+	| choice_option_list choice_option
+	| choice_option_list depends
+	| choice_option_list help
+	| choice_option_list T_EOL
+;
+
+choice_option: T_PROMPT prompt if_expr T_EOL
+{
+	menu_add_prompt(P_PROMPT, $2, $3);
+	printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_TRISTATE prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_TRISTATE);
+	printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_BOOLEAN prompt_stmt_opt T_EOL
+{
+	menu_set_type(S_BOOLEAN);
+	printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_OPTIONAL T_EOL
+{
+	current_entry->sym->flags |= SYMBOL_OPTIONAL;
+	printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_DEFAULT T_WORD if_expr T_EOL
+{
+	menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
+	printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
+};
+
+choice_block:
+	  /* empty */
+	| choice_block common_block
+;
+
+/* if entry */
+
+if: T_IF expr T_EOL
+{
+	printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+	menu_add_entry(NULL);
+	menu_add_dep($2);
+	menu_end_entry();
+	menu_add_menu();
+};
+
+if_end: end
+{
+	if (zconf_endtoken($1, T_IF, T_ENDIF)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+if_stmt:
+	  if if_block if_end
+	| if if_block
+{
+	printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+};
+
+if_block:
+	  /* empty */
+	| if_block common_block
+	| if_block menu_stmt
+	| if_block choice_stmt
+;
+
+/* menu entry */
+
+menu: T_MENU prompt T_EOL
+{
+	menu_add_entry(NULL);
+	menu_add_prop(P_MENU, $2, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+};
+
+menu_entry: menu depends_list
+{
+	menu_end_entry();
+	menu_add_menu();
+};
+
+menu_end: end
+{
+	if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
+		menu_end_menu();
+		printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+	}
+};
+
+menu_stmt:
+	  menu_entry menu_block menu_end
+	| menu_entry menu_block
+{
+	printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
+	zconfnerrs++;
+};
+
+menu_block:
+	  /* empty */
+	| menu_block common_block
+	| menu_block menu_stmt
+	| menu_block choice_stmt
+	| menu_block error T_EOL		{ zconfprint("invalid menu option"); yyerrok; }
+;
+
+source: T_SOURCE prompt T_EOL
+{
+	$$ = $2;
+	printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+source_stmt: source
+{
+	zconf_nextfile($1);
+};
+
+/* comment entry */
+
+comment: T_COMMENT prompt T_EOL
+{
+	menu_add_entry(NULL);
+	menu_add_prop(P_COMMENT, $2, NULL, NULL);
+	printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+};
+
+comment_stmt: comment depends_list
+{
+	menu_end_entry();
+};
+
+/* help option */
+
+help_start: T_HELP T_EOL
+{
+	printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+	zconf_starthelp();
+};
+
+help: help_start T_HELPTEXT
+{
+	current_entry->sym->help = $2;
+};
+
+/* depends option */
+
+depends_list:	  /* empty */
+		| depends_list depends
+		| depends_list T_EOL
+;
+
+depends: T_DEPENDS T_ON expr T_EOL
+{
+	menu_add_dep($3);
+	printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+}
+	| T_DEPENDS expr T_EOL
+{
+	menu_add_dep($2);
+	printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
+}
+	| T_REQUIRES expr T_EOL
+{
+	menu_add_dep($2);
+	printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
+};
+
+/* prompt statement */
+
+prompt_stmt_opt:
+	  /* empty */
+	| prompt if_expr
+{
+	menu_add_prop(P_PROMPT, $1, NULL, $2);
+};
+
+prompt:	  T_WORD
+	| T_WORD_QUOTE
+;
+
+end:	  T_ENDMENU nl_or_eof	{ $$ = T_ENDMENU; }
+	| T_ENDCHOICE nl_or_eof	{ $$ = T_ENDCHOICE; }
+	| T_ENDIF nl_or_eof	{ $$ = T_ENDIF; }
+;
+
+nl_or_eof:
+	T_EOL | T_EOF;
+
+if_expr:  /* empty */			{ $$ = NULL; }
+	| T_IF expr			{ $$ = $2; }
+;
+
+expr:	  symbol				{ $$ = expr_alloc_symbol($1); }
+	| symbol T_EQUAL symbol			{ $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
+	| symbol T_UNEQUAL symbol		{ $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
+	| T_OPEN_PAREN expr T_CLOSE_PAREN	{ $$ = $2; }
+	| T_NOT expr				{ $$ = expr_alloc_one(E_NOT, $2); }
+	| expr T_OR expr			{ $$ = expr_alloc_two(E_OR, $1, $3); }
+	| expr T_AND expr			{ $$ = expr_alloc_two(E_AND, $1, $3); }
+;
+
+symbol:	  T_WORD	{ $$ = sym_lookup($1, 0); free($1); }
+	| T_WORD_QUOTE	{ $$ = sym_lookup($1, 1); free($1); }
+;
+
+%%
+
+void conf_parse(const char *name)
+{
+	struct symbol *sym;
+	int i;
+
+	zconf_initscan(name);
+
+	sym_init();
+	menu_init();
+	modules_sym = sym_lookup("MODULES", 0);
+	rootmenu.prompt = menu_add_prop(P_MENU, "JHALFS Configuration", NULL, NULL);
+
+	//zconfdebug = 1;
+	zconfparse();
+	if (zconfnerrs)
+		exit(1);
+	menu_finalize(&rootmenu);
+	for_all_symbols(i, sym) {
+                if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
+                        printf("\n");
+		else
+			sym->flags |= SYMBOL_CHECK_DONE;
+        }
+
+	sym_change_count = 1;
+}
+
+const char *zconf_tokenname(int token)
+{
+	switch (token) {
+	case T_MENU:		return "menu";
+	case T_ENDMENU:		return "endmenu";
+	case T_CHOICE:		return "choice";
+	case T_ENDCHOICE:	return "endchoice";
+	case T_IF:		return "if";
+	case T_ENDIF:		return "endif";
+	}
+	return "<token>";
+}
+
+static bool zconf_endtoken(int token, int starttoken, int endtoken)
+{
+	if (token != endtoken) {
+		zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	if (current_menu->file != current_file) {
+		zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
+		zconfprint("location of the '%s'", zconf_tokenname(starttoken));
+		zconfnerrs++;
+		return false;
+	}
+	return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+	va_list ap;
+
+	fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
+	va_start(ap, err);
+	vfprintf(stderr, err, ap);
+	va_end(ap);
+	fprintf(stderr, "\n");
+}
+
+static void zconferror(const char *err)
+{
+	fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+}
+
+void print_quoted_string(FILE *out, const char *str)
+{
+	const char *p;
+	int len;
+
+	putc('"', out);
+	while ((p = strchr(str, '"'))) {
+		len = p - str;
+		if (len)
+			fprintf(out, "%.*s", len, str);
+		fputs("\\\"", out);
+		str = p + 1;
+	}
+	fputs(str, out);
+	putc('"', out);
+}
+
+void print_symbol(FILE *out, struct menu *menu)
+{
+	struct symbol *sym = menu->sym;
+	struct property *prop;
+
+	if (sym_is_choice(sym))
+		fprintf(out, "choice\n");
+	else
+		fprintf(out, "config %s\n", sym->name);
+	switch (sym->type) {
+	case S_BOOLEAN:
+		fputs("  boolean\n", out);
+		break;
+	case S_TRISTATE:
+		fputs("  tristate\n", out);
+		break;
+	case S_STRING:
+		fputs("  string\n", out);
+		break;
+	case S_INT:
+		fputs("  integer\n", out);
+		break;
+	case S_HEX:
+		fputs("  hex\n", out);
+		break;
+	default:
+		fputs("  ???\n", out);
+		break;
+	}
+	for (prop = sym->prop; prop; prop = prop->next) {
+		if (prop->menu != menu)
+			continue;
+		switch (prop->type) {
+		case P_PROMPT:
+			fputs("  prompt ", out);
+			print_quoted_string(out, prop->text);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_DEFAULT:
+			fputs( "  default ", out);
+			expr_fprint(prop->expr, out);
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs(" if ", out);
+				expr_fprint(prop->visible.expr, out);
+			}
+			fputc('\n', out);
+			break;
+		case P_CHOICE:
+			fputs("  #choice value\n", out);
+			break;
+		default:
+			fprintf(out, "  unknown prop %d!\n", prop->type);
+			break;
+		}
+	}
+	if (sym->help) {
+		int len = strlen(sym->help);
+		while (sym->help[--len] == '\n')
+			sym->help[len] = 0;
+		fprintf(out, "  help\n%s\n", sym->help);
+	}
+	fputc('\n', out);
+}
+
+void zconfdump(FILE *out)
+{
+	struct property *prop;
+	struct symbol *sym;
+	struct menu *menu;
+
+	menu = rootmenu.list;
+	while (menu) {
+		if ((sym = menu->sym))
+			print_symbol(out, menu);
+		else if ((prop = menu->prompt)) {
+			switch (prop->type) {
+			case P_COMMENT:
+				fputs("\ncomment ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			case P_MENU:
+				fputs("\nmenu ", out);
+				print_quoted_string(out, prop->text);
+				fputs("\n", out);
+				break;
+			default:
+				;
+			}
+			if (!expr_is_yes(prop->visible.expr)) {
+				fputs("  depends ", out);
+				expr_fprint(prop->visible.expr, out);
+				fputc('\n', out);
+			}
+			fputs("\n", out);
+		}
+
+		if (menu->list)
+			menu = menu->list;
+		else if (menu->next)
+			menu = menu->next;
+		else while ((menu = menu->parent)) {
+			if (menu->prompt && menu->prompt->type == P_MENU)
+				fputs("\nendmenu\n", out);
+			if (menu->next) {
+				menu = menu->next;
+				break;
+			}
+		}
+	}
+}
+
+#include "lex.zconf.c"
+#include "util.c"
+#include "confdata.c"
+#include "expr.c"
+#include "symbol.c"
+#include "menu.c"
diff --git a/2.3/optimize/opt_config b/2.3/optimize/opt_config
new file mode 100644
index 0000000..05ca5a5
--- /dev/null
+++ b/2.3/optimize/opt_config
@@ -0,0 +1,51 @@
+#####
+#
+# optimization configuration file
+#
+#####
+#
+#$Id$
+#
+
+#--- Extra flags passed to the packages make commands
+#    "unset" will cause the variable to be not set
+#    instead of just set to null.
+MAKEFLAGS="-j3"
+
+#--- List of packages that don't support well MAKEFLAGS.
+#    This list may be different for you.
+BLACK_LIST="autoconf dejagnu gettext groff"
+
+#--- Default optimization mode
+#    This mode is overridden by definitions in opt_override;
+#    in this way, packages can be tuned independently.  For example,
+#    if you have trouble building a package in the mode set here, add
+#    the package to opt_override with a different mode.
+#
+#    Not set here combined modes of form defOpt_myMode.
+#    Combined modes of form modeA_modeB can be set here.
+DEF_OPT_MODE=O3pipe
+
+
+#--- Active optimization variables
+#    Variables listed here will be set as defined in the appropriate
+#    file in opt_config.d/; others will be ignored.
+ACTIVE_OPT_VARS="CFLAGS CXXFLAGS LDFLAGS \
+                 OTHER_CFLAGS OTHER_CXXFLAGS OTHER_LDFLAGS"
+
+#--- Load optimization modes
+#    To add modes, create a working template..
+#      cp opt_config.d/O3pipe opt_config.d/newMode
+#    ..and edit it as desired.
+#
+#    To inherit another mode and add to it, see opt_config.d/O3pipe_march
+#    or opt_config.d/defOpt_fPIC as examples for two different ways of
+#    doing it.  Given opt_config.d/modeA_modeB_modeC, modeB inherits
+#    the optimizations of modeA by sourcing it, and modeC inherits those
+#    of modeB (which includes those of modeA).
+#
+#    Add packages that are to use this mode to opt_override with:
+#      echo 'myPkg  newMode' >> opt_override
+for mode in optimize/opt_config.d/* ; do
+  source $mode
+done
diff --git a/2.3/optimize/opt_config.d/O3pipe b/2.3/optimize/opt_config.d/O3pipe
new file mode 100644
index 0000000..517f39f
--- /dev/null
+++ b/2.3/optimize/opt_config.d/O3pipe
@@ -0,0 +1,22 @@
+#
+#$Id$
+#
+#####
+#
+# MODE O3pipe configuration
+#
+# Usage: - Apply optimization string to each variable
+#        - "unset" will cause the variable to be not set
+#          instead of just set to null.
+#
+# Use this as an example for cunstomized modes
+#
+#####
+
+CFLAGS_O3pipe="-O3 -pipe"
+CXXFLAGS_O3pipe=$CFLAGS_O3pipe
+LDFLAGS_O3pipe="unset"
+
+OTHER_CFLAGS_O3pipe=$CFLAGS_O3pipe
+OTHER_CXXFLAGS_O3pipe=$CXXFLAGS_O3pipe
+OTHER_LDFLAGS_O3pipe=$LDFLAGS_O3pipe
diff --git a/2.3/optimize/opt_config.d/O3pipe_march b/2.3/optimize/opt_config.d/O3pipe_march
new file mode 100644
index 0000000..7f0f50e
--- /dev/null
+++ b/2.3/optimize/opt_config.d/O3pipe_march
@@ -0,0 +1,25 @@
+#
+#$Id$
+#
+#####
+#
+# MODE O3pipe_march configuration
+#
+# Usage: - Apply optimization string to each variable
+#        - "unset" will cause the variable to be not set
+#          instead of just set to null.
+#
+# Use this as an example for modeA_modeB combined modes
+#
+#####
+
+# Inherit optimizations from O3pipe
+source optimize/opt_config.d/O3pipe
+
+CFLAGS_O3pipe_march=$CFLAGS_O3pipe" -march=pentium4"
+CXXFLAGS_O3pipe_march=$CFLAGS_O3pipe"  -march=pentium4"
+LDFLAGS_O3pipe_march=$LDFLAGS_O3pipe
+
+OTHER_CFLAGS_O3pipe_march=$CFLAGS_O3pipe" -march=pentium4"
+OTHER_CXXFLAGS_O3pipe_march=$CXXFLAGS_O3pipe" -march=pentium4"
+OTHER_LDFLAGS_O3pipe_march=$LDFLAGS_O3pipe
diff --git a/2.3/optimize/opt_config.d/defOpt_fPIC b/2.3/optimize/opt_config.d/defOpt_fPIC
new file mode 100644
index 0000000..f114ab8
--- /dev/null
+++ b/2.3/optimize/opt_config.d/defOpt_fPIC
@@ -0,0 +1,36 @@
+#
+#$Id$
+#
+#####
+#
+# MODE defOpt_fPIC configuration
+#
+# WARNING: Do not edit this mode unless you know what you are
+#          doing. It's required to build Zlib.
+#
+# Usage: - Apply optimization string to each variable
+#        - "unset" will cause the variable to be not set
+#          instead of just set to null.
+#
+# Use this as an example for defOpt_myMode combined modes
+#
+#####
+
+# Inherit optimizations from DEF_OPT_MODE
+source optimize/opt_config.d/${DEF_OPT_MODE}
+
+# Append " -fPIC" to default *C{,XX}FLAGS and retain other defaults
+for OPT_VAR in $ACTIVE_OPT_VARS ; do
+  case $OPT_VAR in
+    CFLAGS | CXXFLAGS | OTHER_CFLAGS | OTHER_CXXFLAGS)
+      if [[ "$(eval "echo \$${OPT_VAR}_${DEF_OPT_MODE}")" != "unset" ]] ; then
+        eval ${OPT_VAR}_defOpt_fPIC=\$${OPT_VAR}_${DEF_OPT_MODE}\" -fPIC\"
+      else
+        eval ${OPT_VAR}_defOpt_fPIC="unset"
+      fi
+      ;;
+    *)
+      eval ${OPT_VAR}_defOpt_fPIC=\$${OPT_VAR}_${DEF_OPT_MODE}
+      ;;
+  esac
+done
diff --git a/2.3/optimize/opt_config.d/noOpt b/2.3/optimize/opt_config.d/noOpt
new file mode 100644
index 0000000..39abdb3
--- /dev/null
+++ b/2.3/optimize/opt_config.d/noOpt
@@ -0,0 +1,27 @@
+#
+#$Id$
+#
+#####
+#
+# MODE noOpt configuration
+#
+# WARNING: Do not edit this mode unless you know what you are
+#          doing.  By default, this is set to disable optimization
+#          of packages known to have build or runtime failure.
+#
+#          Also, if you what to use MAKEFLAGS but no build
+#          optimizations, set this mode in DEF_OPT_MODE
+#
+# Usage: - Apply optimization string to each variable
+#        - "unset" will cause the variable to be not set
+#          instead of being just set to null.
+#
+#####
+
+CFLAGS_noOpt="unset"
+CXXFLAGS_noOpt="unset"
+LDFLAGS_noOpt="unset"
+
+OTHER_CFLAGS_noOpt="unset"
+OTHER_CXXFLAGS_noOpt="unset"
+OTHER_LDFLAGS_noOpt="unset"
diff --git a/2.3/optimize/opt_config.d/noSymbols b/2.3/optimize/opt_config.d/noSymbols
new file mode 100644
index 0000000..7089f02
--- /dev/null
+++ b/2.3/optimize/opt_config.d/noSymbols
@@ -0,0 +1,23 @@
+#
+#$Id$
+#
+#####
+#
+# MODE noOpt_noSymbols configuration
+#
+# Usage: - Apply optimization string to each variable
+#        - "unset" will cause the variable to be not set
+#          instead of just set to null.
+#
+# NOTE: If using this mode in DEF_OPT_MODE (alone or combined with
+#       other modes) please set STRIP=0 in common/config
+#
+#####
+
+CFLAGS_noSymbols="-s"
+CXXFLAGS_noSymbols=$CFLAGS_noSymbols
+LDFLAGS_noSymbols="-s"
+
+OTHER_CFLAGS_noSymbols=$CFLAGS_noSymbols
+OTHER_CXXFLAGS_noSymbols=$CXXFLAGS_noSymbols
+OTHER_LDFLAGS_noSymbols=$LDFLAGS_noSymbols
diff --git a/2.3/optimize/opt_override b/2.3/optimize/opt_override
new file mode 100644
index 0000000..05f8637
--- /dev/null
+++ b/2.3/optimize/opt_override
@@ -0,0 +1,5 @@
+binutils       noOpt
+gcc            noOpt
+glibc          noOpt
+grub           noOpt
+zlib           defOpt_fPIC
diff --git a/2.3/optimize/optimize_functions b/2.3/optimize/optimize_functions
new file mode 100644
index 0000000..baec318
--- /dev/null
+++ b/2.3/optimize/optimize_functions
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# $Id$
+
+set +e
+
+
+#----------------------------------#
+validate_opt_settings() {          # Show optimize setting and wait user agreement
+#----------------------------------#
+  local OPT_VAR optVal
+
+  echo -e "\t\t${RED}${BOLD}WARNING:${OFF}\n"
+  echo -e "${BOLD}The use of build optimizations may be dangerous.\n"
+  echo -e "You should know what you are doing and be sure that the"
+  echo -e "optimization settings listed below are what you want.\n"
+  echo -e "If there are build issues or the system doesn't work as"
+  echo -e "expected, please rebuild without optimizations before"
+  echo -e "asking for support.${OFF}\n"
+
+  echo -e "MAKEFLAGS: ${L_arrow}${BOLD}${MAKEFLAGS}${OFF}${R_arrow}"
+  [[ "$MAKEFLAGS" = "unset" ]] && echo
+  [[ "$MAKEFLAGS" != "unset" ]] && \
+  echo -e "BLACK_LIST: ${L_arrow}${BOLD}${BLACK_LIST}${OFF}${R_arrow}\n"
+
+  echo -e "DEF_OPT_MODE: ${L_arrow}${BOLD}${DEF_OPT_MODE}${OFF}${R_arrow}\n"
+
+  for OPT_VAR in $ACTIVE_OPT_VARS ; do
+    eval optVal=\$${OPT_VAR}_${DEF_OPT_MODE}
+    echo -e "${OPT_VAR}: ${L_arrow}${BOLD}${optVal}${OFF}${R_arrow}"
+  done
+
+  echo -e "\nOverridden packages:"
+  cat optimize/opt_override
+  echo "${nl_}${SD_BORDER}${nl_}"
+
+  echo -n "Are you happy with these optimization settings? yes/no (no): "
+  read ANSWER
+  if [ x$ANSWER != "xyes" ] ; then
+    echo "${nl_}Fix the optimization options and rerun the script.${nl_}"
+    exit 1
+  fi
+  echo "${nl_}${SD_BORDER}${nl_}"
+}
+
+#----------------------------------#
+wrt_optimize() {                   # Apply pkg specific opt's to build
+#----------------------------------#
+  local pkg=$1
+  local optMode optVal OPT_VAR
+
+  optMode=`awk -v pkg="$pkg" '$1 == pkg { print $2 }' $JHALFSDIR/opt_override`
+  if [[ "$optMode" = "" ]] ; then
+    optMode=$DEF_OPT_MODE;
+  fi
+
+  for OPT_VAR in $ACTIVE_OPT_VARS ; do
+    eval optVal=\$${OPT_VAR}_$optMode
+
+    if [[ "$optVal" != "unset" ]]; then
+(
+cat << EOF
+	@echo "export $OPT_VAR=\"$optVal\"" >> envars
+EOF
+) >> $MKFILE.tmp
+    else
+      continue
+    fi
+  done
+}
+
+#----------------------------------#
+wrt_makeflags() {                  # Apply MAKEFLAGS to build
+#----------------------------------#
+  local pkg=$1
+  local MKF
+
+  if [[ "$BLACK_LIST" =~ ${pkg} ]]; then
+    MKF=unset
+  else
+    MKF=$MAKEFLAGS
+  fi
+
+  if [[ "$MKF" != "unset" ]]; then
+(
+cat << EOF
+	@echo "export MAKEFLAGS=\"$MAKEFLAGS\"" >> envars
+EOF
+) >> $MKFILE.tmp
+  fi
+}