diff --git a/doc/wrs-build.in b/doc/wrs-build.in
index 4a17d96fd8f44040a1a565c38cf20ec015a9e626..842ca12df43c03c89c44a28e3e4796ecf9ff7d51 100644
--- a/doc/wrs-build.in
+++ b/doc/wrs-build.in
@@ -80,7 +80,7 @@ granted write access).
 * Schematics are Available::    
 * Older Hardware Releases::     
 * Installing from Jtag::        
-* Troubleshooting::             
+* Bugs and Troubleshooting::    
 @end menu
 
 @c ##########################################################################
@@ -626,7 +626,7 @@ You can also flash the image you have build using @ref{Building} by
 adding the tag @code{-b|--build}.
 
 Finally you can select a mode using the @code{-m|--mode} flag to choose
-to write in dataflash (df), nandflash (nf), both (default) or ddr memories (ddr).
+to write in dataflash (df), nandflash (nf), both (default) or ddr memories (ddr). The last option is for developers.
 You can also erase the selected memory before write your binaries; to do this
 add the option @code{-e}.
 
@@ -648,63 +648,107 @@ The script performs the following steps:
 @node Booting with Barebox
 @chapter Booting with Barebox
 
-After initial installation, you should reach the following menu.
+After the initial installation, the boot loader will offer you an
+interactive  menu, where the first entry is selected by default.
+The menu is a simple ASCII interface on the serial port, and looks
+like the following:
 
 @example
- Welcome on WRSv3 Boot Sequence
-      1: boot from nand (default)      
-      2: boot from dataflash (failsafe)
-      3: boot from script        
-      4: edit & save config            
-      5: shell (prompt terminal)       
-      6: reset barebox    
+   Welcome on WRSv3 Boot Sequence
+       1: boot from nand (default)
+       2: boot from TFTP script
+       3: edit config
+       4: exit to shell
+       5: reboot
 @end example
 
-You have multiple choise to boot your switch. The default is the boot
-from NAND memory, but you need to install the Linux kernel and the
-file system on it before succesfully boot the switch. Please see
-@ref{Install Kernel to NAND} to install the kernel and the file system
-on the NAND memory.
-You can also boot from the DataFlash; this is the failsafe mode, you can
-use it when the NAND memory is corrupted.
-@c FIXME how can I install on DataFlash?
+If flashing of the whole system was successful, the first entry will
+simply work, booting the switch without any network access.  Although
+a DCHP client runs by default after boot, everything will work even if
+you leave the Ethernet port unconnected or you have no DHCP server
+when the switch is operational.
 
-Script option requires an active network connection and a
-TFTP server, optionally a DHCP server. By defaul it uses a DHCP server to
-obtain the IP address to connect to the TFTP server.
+If booting from NAND memory fails (for example because you erased the
+kernel partition) the menu is re-entered automatically.
 
-However, if you do not want to use DHCP you must edit the configuration and
-add the following lines@footnote{replace IP addresses with your local
-addressing}:
+The other entries are provided to help developers.
 
+@menu
+* The Compiler::                
+@end menu
 
-@example
-   eth0.ipaddr=192.168.16.9
-   eth0.serverip=192.168.16.1
-@end example
+@c ==========================================================================
+@node Description of the menus
+@section Description of the menus
 
+The individual menu items perform the following actions:
+@table @code
 
-The script booting procedure asks to the TFTP server a script named
-@file{wrboot}. This file can be placed in the root TFTP directory, or
-in its direct sub-directory named with the MAC address of the destination
-switch. Once the script is loaded, the switch execute it within barabox
-to boot the system. You can use this option to write costum kernel
-commandline.
+@item 1: boot from nand (default)
 
-Finally in save & edit config you have some parameters to easily fit
-the booting process to your need. i.e, Selecting alternative boot method,
-forcing alternative boot, etc.
+	This entry is selected by default after 10 seconds of
+        inactivity on the serial port. It boots the system from its
+        own NAND memory. This ``just works''.
 
-@menu
-* Booting from NFS::            
-* Install Kernel to NAND::      
-@end menu
+@item 2: boot from TFTP script
+
+	This entry tries to download a @i{barebox} script from your TFTP
+        server; if successful it then executes it. Developers are
+        expected to customize the script to support any kind of environment,
+        from customized kernel command-line to NFS-Root environments.
+        See @ref{Using wrboot} for details.
+
+@item 3: edit config
+
+	This fires the editor on the configuration file, and
+        saves it to flash when the user is done. This is useful to
+        change the MAC address of the ARM network port.
+
+@item 4: exit to shell
+
+	By choosing this entry, the user can access the shell-like
+        interface of @i{barebox}. The entry is aimed at developers
+        who know what they are going to type.
+
+@item 5: reboot
+
+	This entry is useful to see and log the exact boot messages.
+        Since the serial-USB converter is @i{switch-powered} and not
+        @i{USB-powered}, you won't be able to hook at the serial port
+        soon enough after power-on.  Actually, the menu timeout is
+        left to 10 seconds and not less for the very same reason.
+
+@end table
 
 @c ==========================================================================
-@node Booting from NFS
-@section Booting from NFS
+@node Using wrboot
+@section Using wrboot
+
+
+
+If you use the @i{wrboot} script option, you can for example run
+an NFS-Root system using a script similar to the one included
+in the @file{binaries} directory of this package. Even though
+the directory is called @file{binaries} the file
+is ASCII anyways).
+@c FIXME: wrboot ``binary''
+
+
+dhcpd: DHCPOFFER on 192.168.16.224 to 02:0b:ad:c0:ff:ee via eth0
+atftpd[5623]: Serving wrboot-02:0B:AD:C0:FF:EE to 192.168.16.224:1029
+atftpd[5623]: Serving 192.168.16.224/wrboot to 192.168.16.224:1030
+atftpd[5623]: Serving wrboot to 192.168.16.224:1031
+
 
-Assuming you have a known-working NFS-Root installation, a TFTP
+        The boot loader tries to download three files, in this order:
+        ``@code{wrboot-MA:CA:DD:RR:EE:SS}'',
+        ``@code{192.168.from.dhcp/wrboot}'', ``@code{wrboot}''. If no such
+        file is found, the menu is re-entered.
+
+
+Assuming you have a known-working NFS-Root installation, in the
+usual directory of your server, 
+standard a TFTP
 server and you don't use the DHCP server; you can write a @file{wrboot}
 script to boot the Linux kernel loaded with TFTP and the file system on NFS.
 Following an example of a @file{wrboot} script used too boot from NFS.
@@ -723,19 +767,8 @@ As described above, by using the @i{boot from script} option, barebox
 automatically load your @file{wrboot} script @footnote{See
 @ref{Booting with Barebox} to know where place your @file{wrboot}}.
 
-@c ==========================================================================
-@node Install Kernel to NAND
-@section Install Kernel to NAND
-
-In order to boot from NAND memory, you must install the kernel and
-the filesystem  to NAND memory, so you can have a self-hosted switch.
-If you already done this step you can skip this procedure and directly
-boot from NAND. Pleae note this is not the production release, as some
-shortcuts have been taken.
 
-After a successful NFS-Root (See @ref{Booting from NFS}), you'll notice
-the system identified two flash devices, for a total of 3 partitions.
-Note however that NAND memory may have bad blocks:
+@c FIXME: remove this one
 
 @example
    # dmesg | grep -i mtd
@@ -968,8 +1001,25 @@ If you build using a local @i{git} repository, we suggest to use
 @code{git am --whitespace=nowarn} because we have a number of
 white space errors, and we apologize for that.
 
-After patching, the build scripts compile with the following commands, where the
-cross-compiler is the one built by @i{buildroot}. If you run these
+The @i{barebox} boot loader is organized as a small Unix-like
+environment, and its own configuration and scripts live in a small
+filesystem.  To ease modification of such configuration and boot steps
+the build script copies over the configuration instead of patching it
+in the sources.  You can thus edit the files you find in
+@file{patches/barebox/env} and rebuild your customized bootloader.
+The script that is executed at boot time is @file{env/bin/init} and as
+you see it calls the other ones.  The menus included in the shipped
+configuration are described in @ref{Booting with Barebox}.
+
+Building @i{barebox} relies on a @i{Kconfig} setup, and the
+configuration file we use is
+@file{patches/barebox/wrs3_defconfig}. Again, this is copied over and
+not patched in (see the simple @file{build/scripts/wrs_build_barebox}
+for details).
+
+After patching and copying over the files, the following commands
+build the boot loader using the
+cross-compiler built by @i{buildroot}. If you run these
 by hand you can use a different compiler (as shown):
 
 @example
@@ -977,10 +1027,10 @@ by hand you can use a different compiler (as shown):
    export ARCH=arm
    make wrs3_defconfig
    make
-   cp barebox.bin /tftpboot/bb.bin
+   cp barebox.bin images/
 @end example
 
-To use the compiler the scripts use, you need this setting (which is split
+To use the same compiler the scripts use, you need this setting (which is split
 in two lines with a local variable to fit the page with in documentation):
 
 @smallexample
@@ -989,10 +1039,9 @@ in two lines with a local variable to fit the page with in documentation):
 @end smallexample
 
 A pre-built binary is available as @code{binaries/barebox.bin}.
-
 The ELF version is copied to @i{images} as well, as
-@code{images/barebox}; this file includes the symbol table and may (or may not) be
-useful.
+@code{images/barebox}; this file includes the symbol table and may (or
+may not) be useful.
 
 @c ==========================================================================
 @node The Linux Kernel
@@ -1017,7 +1066,7 @@ and are currently the following ones:
    0006-fiq-support.patch
 @end example
 
-The configuration we use to build the kernel is not a patch but a plan
+The configuration we use to build the kernel is not a patch but a plain
 @code{.config} file, in the same directory as the patches, so you
 can change it easily, if needed. As an alternative,
 you can also set @code{WRS_KERNEL_CONFIG} to the full pathname of
@@ -1047,13 +1096,15 @@ becomes dirty with output and intermediate files. The advantage is that
 any modification you make to the code is already in the repository
 for your to commit.
 
-Currently, the modules build built are @i{wr_vic.ko} (the interrupt
-controller) and @i{wr-nic.ko} (the network ``card'' driver).  The
-@i{wr_rtu.ko} driver is compiled too, but it is not currently used nor
-has it been tested.
+Currently, the package includes the following modules:
 
-@b{Warning}: I plan to soon rename all modules to have a hyphen
-instead of an underscore in the name.
+@itemize @bullet
+@item @i{wr_vic.ko}: the interrupt controller for in-FPGA devices.
+@item @i{wr-nic.ko}: the network ``card'' driver for WR ports.
+@item @i{at91_softpwm}: a tool that generates a PWM signal for the fan.
+@item @i{wr_rtu.ko}: the routing-table interface between the
+switching core and the associated user-space daemon.
+@end itemize
 
 @c ==========================================================================
 @node PTPd
@@ -1174,8 +1225,12 @@ with it to avoid requiring an LM32 development environment.
 @node The Complete Filesystem
 @section The Complete Filesystem
 
-The final step in compiling the filesystem is making the CPIO archive
-with the overall filesystem contents.  This archive can be used as an
+The final step in building the switch software is wrapping together
+the filesystem for the switch, also making the archives and the
+@i{jffs2} image file.
+
+@c FIXME: all of this
+  This archive can be used as an
 @i{initramfs} or uncompressed to some directory.  The build procedure
 does not leave a directory tree on disk because that would require
 administrator privileges. I think it is best not to call @i{sudo} from
diff --git a/patches/barebox/env/bin/boot-nand b/patches/barebox/env/bin/boot-nand
new file mode 100644
index 0000000000000000000000000000000000000000..7ef5900367659def1426d01d06af41da3fde9e65
--- /dev/null
+++ b/patches/barebox/env/bin/boot-nand
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+# boot kernel from bad block aware partition
+cp /dev/nand0.kernel.bb /dev/mem.kernel
+bootargs="console=ttyS0,115200 panic=10"
+bootargs="$bootargs root=/dev/mtdblock1 rootfstype=jffs2"
+bootz /dev/mem.kernel
+
+# If it don't boot, show the menu
+echo "Can't boot from NAND"
+# Sleep 2 seconds so you can see the message and return to menu
+sleep 2
+menu -s boot
diff --git a/patches/barebox/env/bin/boot-script b/patches/barebox/env/bin/boot-script
new file mode 100644
index 0000000000000000000000000000000000000000..0c5f33675bb87af4a7e0370a487dc1a464534d53
--- /dev/null
+++ b/patches/barebox/env/bin/boot-script
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+# This script loads a wrboot script from the TFTP server and runs it.
+dhcp 5
+if [ "$?" -ne "0" ]; then
+    echo "Cannot obtain IP from DHCP server"
+else
+    # fetch wrboot-<MAC> script
+    tftp wrboot-$eth0.ethaddr wrboot
+    if [ "$?" -ne "0" ]; then
+	sleep 1
+	tftp $eth0.ipaddr/wrboot wrboot
+    fi
+    if [ "$?" -ne "0" ]; then
+	sleep 1
+	tftp wrboot wrboot
+    fi
+    if [ "$?" -eq "0" ]; then
+	./wrboot
+    fi
+fi
+# If the script doesn't boot return to menu after some time to read output
+sleep 2
+menu -s boot
diff --git a/patches/barebox/env/bin/edit-config b/patches/barebox/env/bin/edit-config
new file mode 100644
index 0000000000000000000000000000000000000000..a0573f5f3b201c2243135bf041232482befa60c1
--- /dev/null
+++ b/patches/barebox/env/bin/edit-config
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+edit /env/config
+. /env/config
+saveenv
+
+sleep 2
+menu -s boot
diff --git a/patches/barebox/env/bin/init b/patches/barebox/env/bin/init
index 166078b9bde5e995ed63246672d0e79147cbea55..d7e8b11e5005900b5a7c54f36ac2b7c98121d88d 100644
--- a/patches/barebox/env/bin/init
+++ b/patches/barebox/env/bin/init
@@ -1,26 +1,6 @@
 #!/bin/sh
-#
-# Init script for WRS barebox
-# ========================
-# Syntax: Hush shell script
-# Authors: Benoit Rat, Tomasz Wlostowski
-# Environment variables:
-#	-	autoboot_timeout: number of seconds
-#	-	autoboot_altforced: "1" or "0"
-#	-	default_altmode: i.e "the menu number"
-#	- 	ip: dhcp or none (in this case setup by eth0)
-#######################################
 
-echo ""
-echo "=============================================="
-
-### Default value ": ${VISUAL:=vi}"
 autoboot_timeout="10";
-autoboot_altforced="0";
-autoboot_altmode="2";
-error_timeout="60";
-net="0"
-bootargs="console=ttyS0,115200"
 
 ### Override default value using /env/config
 . /env/config
@@ -31,193 +11,39 @@ echo "Starting up barebox [wrs3] (MAC=$eth0.ethaddr)"
 PATH=/env/bin
 export PATH
 
-if [ x$autoboot_timeout != x ]; then menu_timeout="-A $autoboot_timeout"; fi
+if [ x$autoboot_timeout != x ]; then
+    menu_timeout="-A $autoboot_timeout"
+fi
+
+#Set 2nd LED ON (PA2)
+gpio_set_value 33 0
 
-gpio_set_value 33 0 #Set 2nd LED ON (PA2)
 PS1="wrs-$eth0.ethaddr# "
-mode=""
-ok="0"
-run="1"
 
 ### Creating the partitions:
-if [ -e /dev/mem.kernel ]; then; 	else addpart /dev/mem  8M@0x71000000(kernel); fi
-if [ -e /dev/nand0.kernel ]; then; else addpart /dev/nand0 256k@0x4000(bareboxenv),8M@0x100000(kernel),-@0x4000000(rootfs); fi
-if [ -e /dev/nand0.kernel.bb ]; then; else nand -a /dev/nand0.*; fi
-
-### Create the menu for various boot in case we don't run the autoboot
-menu -r -m boot
-menu -a -m boot -d "Welcome on WRSv3 Boot Sequence"
-menu -e -a -m boot -c 'init -m nand'						-d "boot from nand (default)"
-menu -e -a -m boot -c 'init -m df'							-d "boot from dataflash (failsafe)"
-menu -e -a -m boot -c 'init -m script -n'					-d "boot from script"
-menu -e -a -m boot -c 'init -m ram -r tftp -n'				-d "boot from ram"
-menu -e -a -m boot -c 'init -m tftp -r nfs -n'				-d "boot from nfs"
-menu -e -a -m boot -c 'init -m tftp -r nfs -n -x test'		-d "boot from nfs (test)"
-menu -e -a -m boot -c 'init -m config'						-d "edit & save config"
-menu -e -a -m boot -c 'exit 0'								-d "shell (prompt terminal)"
-menu -e -a -m boot -c reset									-d "reset barebox"
-
-### Check init arguments
-while getopt "m:r:x:n" Option
-do
-if [ ${Option} = m ]; then
-	mode=${OPTARG}
-elif [ ${Option} = r ]; then
-	rootfs_loc=${OPTARG}
-elif [ ${Option} = n ]; then
-	net="1"
-elif [ ${Option} = x ]; then
-	xtra="-${OPTARG}"
+if [ -e /dev/mem.kernel ]; then
 else
+    addpart /dev/mem  8M@0x71000000(kernel)
 fi
-done
-
-
-### In case mode is not set
-if [ x$run = x1 -a x$mode = x ]; then ### Check if an alternative mode is on or off
-	run="0"
-
-	gpio_get_value 103 #Obtain value of alternative boot jumper (only for v3.2+)
-	if [ "$?" -eq "0" ]; then
-		autoboot_altforced="1" #Force alternative boot if FGPA button is pushed
-	fi
-
-	## Check if there is an alternative boot
-	if [ "$autoboot_altforced" -eq "1" ]; then
-		menu -m boot -S -n $autoboot_altmode
-		ok="1"
-	else
-		### If barebox is not already set in NAND (first boot or NAND formatted)
-		if [ -f /env/this_is_compiled_in ]; then
-			echo "You might save & edit the config to run from NAND"
-			menu -m boot -S -n 6	#Select automatic NFS (test) option for next boot
-			ok="1"
-		### Otherwise boot from NAND
-	    else
-			menu -m boot -S -n 1
-			ok="1"
-		fi
-	fi
-fi
-
-################################# Boot modes
-
-
-
-
-
-### Try booting from NAND (default mode)
-if [ x$run = x1 -a x$mode = xnand ]; then
-	echo "booting from NAND"
-	run="0"
-
-	cp /dev/nand0.kernel /dev/mem.kernel
-	bootargs="$bootargs root=1f01 rootfstype=jffs2 mem=32m init=/init"
-	bootz /dev/mem.kernel
-	menu -m boot -S -n $autoboot_altmode #Select the alternative boot
-fi
-
-### Edit and save config mode
-if [ x$run = x1 -a x$mode = xconfig ]; then
-	echo "Editing config..."
-	run="0"
-
-	edit /env/config
-	.	/env/config
-	if [ -f /env/this_is_compiled_in ]; then
-	   echo "No NAND environment..."
-	   rm /env/this_is_compiled_in
-	fi
-	saveenv
-	ok="1"
-fi
-
-
-### Try failsafe boot from DF
-if [ x$run = x1 -a x$mode = xdf ]; then
-	run="0"
-
-	echo "not implemented"
-fi
-
-
-### Try booting from RAM
-if [ x$run = x1 -a x$mode = xram ]; then
-	echo "booting from RAM"
-	run="0"
-
-	echo "Kernel+FS must have been set using usb-loader"
-	addpart /dev/mem  8M@0x72000000(fs)
-	bootargs="$bootargs initrd=0x72000000,8388608"
-	bootz /dev/mem.kernel
-
-	## Otherwise try to load from TFTP
-	run="1"
-	ip=dhcp
-	mode=tftp
-	rootfs_loc=tftp
-fi
-
-
-### Obtain DHCP
-if [ x$run = x1 -a x$net = x1 -a x$ip = xdhcp ]; then
-	dhcp 5
-	if [ "$?" -eq "1" ]; then
-			echo "Enable to obtain IP from DHCP (Required for $mode)"
-			run="0"
-			ok="0"
-	fi
-
-fi
-
-### Try autoboot from loading script
-if [ x$run = x1 -a x$mode = xscript ]; then
-	echo "booting from Script"
-	run="0"
-
-	### Search customboot based on MAC address
-	tftp $eth0.ethaddr/wrboot /customboot
-	if [ "$?" -eq "0" ]; then
-		echo "We have got a custom boot file for this particular switch."
-		./customboot
-
-	### Load generic script
-	else
-		tftp wrboot
-		if [ "$?" -eq "0" ]; then
-			./wrboot
-		fi
-	fi
+if [ -e /dev/nand0.kernel ]; then
+else
+    addpart /dev/nand0 256k@0x4000(bareboxenv),8M@0x100000(kernel),-@0x4000000(rootfs)
 fi
-
-### Try booting from TFTP
-if [ x$run = x1 -a x$mode = xtftp ]; then
-	echo "booting from TFTP"
-	run="0"
-
-	#loading the kernel
-	tftp zImage /dev/mem.kernel
-	if [ x$rootfs_loc = xnfs ]; then
-		bootargs="$bootargs ip=${eth0.ipaddr}:${eth0.gateway}:${eth0.netmask}:${eth0.gateway}"
-		bootargs="$bootargs root=/dev/nfs nfsroot=/tftpboot/rootfs${xtra},tcp mem=32m"
-		bootz /dev/mem.kernel
-	elif [ x$rootfs_loc = xtftp ]; then
-		addpart /dev/mem  8M@0x72000000(fs)
-		tftp wrs-image.cpio.gz /dev/mem.fs
-		bootargs="$bootargs initrd=0x72000000,8388608"
-		bootz /dev/mem.kernel
-	else
-		echo "not implemented"
-	fi
+if [ -e /dev/nand0.kernel.bb ]; then
+else
+    nand -a /dev/nand0.*
 fi
 
-
-
-### Error message and go back to the menu
-if [ "$ok" -eq "0" ]; then
-	echo "Error: Loading kernel+FS from $mode!"
-	echo -n "hit any key to go to menu..."; timeout -a $error_timeout
-	menu_timeout=""
-fi
+# Create the menu
+#menu -r -m boot
+menu -a -m boot -d "Welcome on WRSv3 Boot Sequence"
+menu -e -a -m boot -c 'boot-nand' -d "boot from nand (default)"
+menu -e -a -m boot -c 'boot-script' -d "boot from TFTP script"
+menu -e -a -m boot -c 'edit-config' -d "edit config"
+menu -e -a -m boot -c 'exit 0' -d "exit to shell"
+menu -e -a -m boot -c reset -d "reboot"
+
+# allow the user to see previous messages
+echo "starting menu in 5 seconds"
+sleep 5
 menu -s boot $menu_timeout
-exit 0
diff --git a/patches/barebox/env/this_is_compiled_in b/patches/barebox/env/this_is_compiled_in
deleted file mode 100644
index 7a4c24a6318a927c76743926d5ea3c5c3c7ec754..0000000000000000000000000000000000000000
--- a/patches/barebox/env/this_is_compiled_in
+++ /dev/null
@@ -1,3 +0,0 @@
-# File to check if we are using environment on NAND or not
-#
-#	It is supposed to be automatically deleted when environment is installed in NAND