From 9ab42c1f53fc3bd131c1812c23490f4f6df266ca Mon Sep 17 00:00:00 2001
From: Eitan Adler <eadler@FreeBSD.org>
Date: Fri, 3 Apr 2015 01:10:52 +0000
Subject: [PATCH] fbsd-from-scratch: remove it 	- it references sysinstall,
 which is gone 	- the scripts used to install the system use pkg_add not pkg 
 - and are rotted in other ways 	- the limitations of sysinstall have
 been somewhat mitigated by 	  bsdinstall (which can install into a new
 directory) 	- it warns of outdated stuff (acroread8 doesn't exist anymore)
 	- package building takes place on runnning system and not on poudriere
 	- many of the packages referenced don't exist or are vastly changed 
 - it incorrectly installs the base system 	- and more

Discussed with:	jmg,  Daniel O'Connor, bjk
---
 en_US.ISO8859-1/articles/Makefile             |   1 -
 .../articles/fbsd-from-scratch/Makefile       |  30 -
 .../articles/fbsd-from-scratch/article.xml    | 599 ------------------
 .../fbsd-from-scratch/stage_1.conf.default    | 175 -----
 .../articles/fbsd-from-scratch/stage_1.sh     | 163 -----
 .../fbsd-from-scratch/stage_2.conf.default    |  98 ---
 .../articles/fbsd-from-scratch/stage_2.sh     | 131 ----
 .../articles/fbsd-from-scratch/stage_3.mk     | 252 --------
 en_US.ISO8859-1/htdocs/docs/books.xml         |   6 -
 9 files changed, 1455 deletions(-)
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/article.xml
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.conf.default
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.conf.default
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh
 delete mode 100644 en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk

diff --git a/en_US.ISO8859-1/articles/Makefile b/en_US.ISO8859-1/articles/Makefile
index 2036fe856c..b99ed2bb07 100644
--- a/en_US.ISO8859-1/articles/Makefile
+++ b/en_US.ISO8859-1/articles/Makefile
@@ -12,7 +12,6 @@ SUBDIR+= contributors
 SUBDIR+= cups
 SUBDIR+= custom-gcc
 SUBDIR+= explaining-bsd
-SUBDIR+= fbsd-from-scratch
 SUBDIR+= filtering-bridges
 SUBDIR+= fonts
 SUBDIR+= freebsd-questions
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile b/en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile
deleted file mode 100644
index 978c47925e..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-# $FreeBSD$
-#
-# Article: FreeBSD From Scratch
-
-DOC?= article
-
-FORMATS?= html
-
-MAINTAINER= schweikh@FreeBSD.org
-
-INSTALL_COMPRESSED?= gz
-INSTALL_ONLY_COMPRESSED?=
-
-EXTRAS=		stage_1.conf.default
-EXTRAS+=	stage_1.sh
-EXTRAS+=	stage_2.conf.default
-EXTRAS+=	stage_2.sh
-EXTRAS+=	stage_3.mk
-
-SRCS=		article.xml
-SRCS+=		${EXTRAS}
-
-afterinstall:
-.for entry in ${EXTRAS}
-	${INSTALL_DOCS} ${.CURDIR}/${entry} ${DESTDIR}
-.endfor
-
-DOC_PREFIX?= ${.CURDIR}/../../..
-.include "${DOC_PREFIX}/share/mk/doc.project.mk"
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/article.xml b/en_US.ISO8859-1/articles/fbsd-from-scratch/article.xml
deleted file mode 100644
index c3cb6d8e81..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/article.xml
+++ /dev/null
@@ -1,599 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!DOCTYPE article PUBLIC "-//FreeBSD//DTD DocBook XML V5.0-Based Extension//EN"
-	"http://www.FreeBSD.org/XML/share/xml/freebsd50.dtd" [
-<!ENTITY scratch.ap "<application xmlns='http://docbook.org/ns/docbook'>FreeBSD From Scratch</application>">
-]>
-<article xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:lang="en">
-  <info><title>FreeBSD From Scratch</title>
-    
-
-    <author><personname><firstname>Jens</firstname><surname>Schweikhardt</surname></personname><affiliation>
-        <address><email>schweikh@FreeBSD.org</email></address>
-      </affiliation></author>
-    <copyright>
-      <year>2002,2003,2004,2008</year>
-      <holder>Jens Schweikhardt</holder>
-    </copyright>
-
-    <legalnotice xml:id="trademarks" role="trademarks">
-  	  &tm-attrib.freebsd;
-  	  &tm-attrib.adobe;
-  	  &tm-attrib.general;
-  	</legalnotice>
-
-    <pubdate>$FreeBSD$</pubdate>
-
-    <releaseinfo>$FreeBSD$</releaseinfo>
-
-    <abstract>
-      <para>This article describes my efforts at &scratch.ap;: a fully
-        automated installation of a customized &os; system compiled from
-        source, including compilation of all your favorite ports and
-        configured to match your idea of the perfect system.  If you
-        think <command>make world</command> is a wonderful concept,
-        &scratch.ap; extends it to <command>make evenmore</command>.</para>
-    </abstract>
-  </info>
-
-  <sect1 xml:id="introduction">
-    <title>Introduction</title>
-
-    <para>Have you ever upgraded your system with <command>make world</command>?
-      There is a problem if you have only one system on your disks.  If
-      the <buildtarget>installworld</buildtarget> fails partway through,
-      you are left with a broken system that might not even boot any
-      longer.  Or maybe the <buildtarget>installworld</buildtarget> runs
-      smoothly but the new kernel does not boot.  Then it is time to
-      reach for the Fixit CD and dig for those backups you have taken
-      half a year ago.</para>
-
-    <para>I believe in the <quote>wipe your disks when upgrading systems</quote>
-      paradigm.  Wiping disks, or rather partitions, makes sure there is no
-      old cruft left lying around, something which most upgrade procedures
-      just do not care about.  But wiping the partitions means you have to
-      also recompile/reinstall all your ports and packages and then
-      redo all your carefully crafted configuration tweaks.
-      If you think that this task should be automated as well, read on.</para>
-  </sect1>
-
-  <sect1 xml:id="why">
-    <title>Why would I (not) want &scratch.ap;?</title>
-
-    <para>This is a legitimate question.  We have
-      <application>sysinstall</application> and the well known way to
-      compile the kernel and the userland tools.</para>
-
-    <para>The problem with <application>sysinstall</application> is
-      that it is severely limited in what, where and how it can install.</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>It is normally used to install pre-built distribution sets and
-          packages from some other source (CD, DVD, FTP).  It cannot install
-          the result of a <literal>make buildworld</literal>.</para>
-      </listitem>
-
-      <listitem>
-        <para>It cannot install a second system under a directory
-          in a running system.</para>
-      </listitem>
-
-      <listitem>
-        <para>It cannot install in <application>Vinum</application>
-          or <application>ZFS</application> partitions.</para>
-      </listitem>
-
-      <listitem>
-        <para>It cannot compile ports, only install precompiled packages.</para>
-      </listitem>
-
-      <listitem>
-        <para>It is hard to script or to make arbitrary post-installation
-          changes.</para>
-      </listitem>
-
-      <listitem>
-        <para>Last but not least, <application>sysinstall</application>
-          is semi-officially at its End-Of-Life.</para>
-      </listitem>
-    </itemizedlist>
-
-    <para>The well known way to build and install the world, as
-      described in <link xlink:href="http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/makeworld.html">the
-      Handbook</link>, by default replaces
-      the existing system.  Only the kernel and modules are saved.
-      System binaries, headers and a lot of other files are overwritten;
-      obsolete files are still present and can cause surprises.  If the
-      upgrade fails for any reason, it may be hard or even impossible to
-      restore the previous state of the system.</para>
-
-    <para>&scratch.ap; solves all these problems.  The strategy is
-      simple: use a running system to install a new system under an empty
-      directory tree, while new partitions are mounted appropriately
-      in that tree.  Many config files can be copied to the appropriate
-      place and &man.mergemaster.8; can take care of those that cannot.
-      Arbitrary post-configuration of the new system can be
-      done from within the old system, up to the point where you can
-      chroot to the new system.  In other words, we go through three
-      stages, where each stage consists of either running a shell
-      script or invoking <command>make</command>:</para>
-
-    <orderedlist>
-      <listitem>
-        <para><filename>stage_1.sh</filename>:
-          Create a new bootable system under an empty directory and merge
-          or copy as many files as are necessary.
-          Then boot the new system.</para>
-      </listitem>
-
-      <listitem>
-        <para><filename>stage_2.sh</filename>:
-          Install desired ports.</para>
-      </listitem>
-
-      <listitem>
-        <para><filename>stage_3.mk</filename>:
-          Do post-configuration for software installed in previous stage.</para>
-      </listitem>
-    </orderedlist>
-
-    <para>Once you have used &scratch.ap; to build a second system and
-      found it works satisfactorily for a couple of weeks, you can then
-      use it again to reinstall the original system.  From now on, whenever
-      you feel like an update is in order, you simply toggle the
-      partitions you want to wipe and reinstall.</para>
-
-    <para>Maybe you have heard of or even tried <link xlink:href="http://www.linuxfromscratch.org/">Linux From Scratch</link>,
-      or LFS for short.  LFS also describes how to build and install a
-      system from scratch in empty partitions using a running system.
-      The focus in LFS seems to be to show the role of each system
-      component (such as kernel, compiler, devices, shell, terminal database,
-      etc) and the details of each component's installation.
-      &scratch.ap; does not go into that much detail.  My goal is to
-      provide an automated and complete installation, not explaining all
-      the gory details that go on under the hood when making the world.
-      In case you want to explore &os; at this level of detail, start
-      looking at <filename>/usr/src/Makefile</filename> and follow the
-      actions of a <command>make buildworld</command>.</para>
-
-    <para>There are also downsides in the approach taken by &scratch.ap;
-      that you should bear in mind.</para>
-
-      <!-- XXX: A nice idea would be to write stage_2.sh using a jail
-           that runs into the newly installed world from stage_1.  Having
-           properly set up a network address as the jail's primary IP
-           address, it might even be possible to build ports in a chroot
-           without uninstalling anything from the 'host' system.  But
-           keep in mind that even jails run on the 'host' kernel. -->
-
-    <itemizedlist>
-      <listitem>
-        <para>While compiling the ports during stage two the system can
-        not be used for its usual duties.  If you run a production server
-        you have to consider the downtime caused by stage two.  The ports
-        compiled by <filename>stage_2.conf.default</filename> below require
-        about 8 hours (of which 4 hours are due to
-        <application>OpenOffice.org</application>) to build on a contemporary
-        system.  If you prefer to install packages instead of ports,
-        you can significantly reduce the downtime to about 10 minutes.</para>
-      </listitem>
-    </itemizedlist>
-  </sect1>
-
-  <sect1 xml:id="prerequisites">
-    <title>Prerequisites</title>
-
-    <para>For going the &scratch.ap; way, you need to have:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>A running &os; system with sources and a ports tree.</para>
-      </listitem>
-
-      <listitem>
-        <para>At least one unused partition where the new system will be
-          installed.</para>
-      </listitem>
-
-      <listitem>
-        <para>Experience with running &man.mergemaster.8;.  Or at least no fear
-          doing so.</para>
-      </listitem>
-
-      <listitem>
-        <para>If you have no or only a slow link to the Internet: the distfiles
-          for your favorite ports.</para>
-      </listitem>
-
-      <listitem>
-        <para>Basic knowledge of shell scripting with the Bourne shell,
-          &man.sh.1;.</para>
-      </listitem>
-
-      <listitem>
-        <para>Finally, you should also be able to tell your boot
-          loader how to boot the new system, either interactively, or
-          by means of a config file.</para>
-      </listitem>
-    </itemizedlist>
-  </sect1>
-
-  <sect1 xml:id="stage1">
-    <title>Stage One: System Installation</title>
-
-    <para>The first version of this article used a single shell script
-      for stage one where all your customization had to be done by editing
-      the script.  After valuable user feedback I have decided to
-      separate the code and data in the scripts.  This allows to have
-      different configuration data sets to install different systems
-      without changing any of the code scripts.</para>
-
-    <para>The code script for stage one is
-      <filename>stage_1.sh</filename> and when run with exactly one
-      argument, like</para>
-
-    <informalexample>
-      <screen>&prompt.root; <userinput>./stage_1.sh <replaceable>default</replaceable></userinput></screen>
-    </informalexample>
-
-    <para>will read its configuration from
-      <filename>stage_1.conf.default</filename> and write a log to
-      <filename>stage_1.log.default</filename>.</para>
-
-    <para>Further below you find my <filename>stage_1.conf.default</filename>.
-      You need to customize it in various places to match your idea of the
-      <quote>perfect system</quote>.  I have tried to extensively comment
-      the places you should adapt.  The configuration script must provide
-      four shell functions, <command>create_file_systems</command>,
-      <command>create_etc_fstab</command>, <command>copy_files</command>
-      and <command>all_remaining_customization</command> (in case it
-      matters: this is also the sequence in which they will be called
-      from <filename>stage_1.sh</filename>).</para>
-
-      <para>The points to ponder are:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>Partition layout.</para>
-
-        <para>I do not subscribe to the idea of a single huge partition
-          for the whole system.  My systems generally have at least
-          one partition for
-          <filename>/</filename>,
-          <filename>/usr</filename> and
-          <filename>/var</filename> with
-          <filename>/tmp</filename> symlinked to
-          <filename>/var/tmp</filename>.
-          In addition I share the file systems for
-          <filename>/home</filename> (user homes),
-          <filename>/home/ncvs</filename> (&os; CVS repository replica),
-          <filename>/usr/ports</filename> (the ports tree),
-          <filename>/src</filename> (various checked out src trees) and
-          <filename>/share</filename> (other shared data without the need
-          for backups, like the news spool).</para>
-      </listitem>
-
-      <listitem>
-        <para>Luxury items.</para>
-
-        <para>What you want immediately after booting the new system and
-          even before starting stage two.  The reason for not simply
-          chrooting to the new system during stage one and installing
-          all my beloved ports is that in theory and in practice there
-          are bootstrap and consistency issues: stage one has your old
-          kernel running, but the chrooted environment consists of new
-          binaries and headers.  If the new binaries use a new system
-          call, these binaries will die with <literal>SIGSYS, Bad
-          system call</literal>, because the old kernel does not have
-          that system call.  I have seen other issues when I tried
-          building <package>lang/perl5.8</package>.</para>
-
-      </listitem>
-    </itemizedlist>
-
-    <para>Before you run <filename>stage_1.sh</filename> make sure
-      you have completed the usual tasks in preparation for
-      <command>make installworld installkernel</command>, like:</para>
-
-    <itemizedlist>
-      <listitem>
-        <para>configured your kernel config file</para>
-      </listitem>
-
-      <listitem>
-        <para>successfully completed <command>make buildworld</command></para>
-      </listitem>
-
-      <listitem>
-        <para>successfully completed <command>make buildkernel
-            KERNCONF=<replaceable>whatever</replaceable></command></para>
-      </listitem>
-    </itemizedlist>
-
-    <para>When you run <filename>stage_1.sh</filename> for the first
-      time, and the config files copied from your running system to the
-      new system are not up-to-date with respect to what is under
-      <filename>/usr/src</filename>, <command>mergemaster</command> will
-      ask you how to proceed.  I recommend merging the changes.  If you get
-      tired of going through the dialogues you can simply update the files
-      on your <emphasis>running</emphasis> system once (Only if this is an
-      option.  You probably do not want to do this if one of your systems
-      runs <literal>-STABLE</literal> and the other
-      <literal>-CURRENT</literal>.  The changes may be incompatible).
-      Subsequent <command>mergemaster</command> invocations will detect
-      that the RCS version IDs match those under
-      <filename>/usr/src</filename> and skip the file.</para>
-
-    <para>The <filename>stage_1.sh</filename> script will stop at the
-      first command that fails (returns a non-zero exit status) due to
-      <command>set -e</command>, so you cannot overlook errors.  It will
-      also stop if you use an unset environment variable, probably due
-      to a typo.  You should correct any errors in your version of
-      <filename>stage_1.conf.default</filename> before you go on.</para>
-
-    <para>In <filename>stage_1.sh</filename> we invoke
-      <command>mergemaster</command>.  Even if none of the files requires a
-      merge, it will display and ask at the end</para>
-
-    <screen>*** Comparison complete
-*** Saving mtree database for future upgrades
-
-Do you wish to delete what is left of /var/tmp/temproot.stage1? [no] <userinput>no</userinput></screen>
-
-    <para>Please answer <literal>no</literal> or just hit
-      <keycap>Enter</keycap>.  The reason is that <command>mergemaster</command>
-      will have left a few zero sized files below
-      <filename>/var/tmp/temproot.stage1</filename> which will be copied to the
-      new system later (unless already there).</para>
-
-    <para>After that <command>mergemaster</command> will list the files it
-      installed and ask if the new <filename>login.conf</filename> should be
-      generated:</para>
-
-<screen>*** You chose the automatic install option for files that did not
-    exist on your system.  The following were installed for you:
-      /newroot/etc/defaults/rc.conf
-      ...
-      /newroot/COPYRIGHT
-
-*** You installed a new aliases file into /newroot/etc/mail, but
-    the newaliases command is limited to the directories configured
-    in sendmail.cf.  Make sure to create your aliases database by
-    hand when your sendmail configuration is done.
-
-*** You installed a login.conf file, so make sure that you run
-    '/usr/bin/cap_mkdb /newroot/etc/login.conf'
-     to rebuild your login.conf database
-
-    Would you like to run it now? y or n [n]</screen>
-
-    <para>The answer does not matter since <filename>stage_1.sh</filename> will
-      run &man.cap.mkdb.1; for you in any case.</para>
-
-    <para>Here is the author's <link xlink:href="stage_1.conf.default"><filename>stage_1.conf.default</filename></link>,
-      which you need to modify substantially.  The comments give you
-      enough information what to change.</para>
-
-<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="stage_1.conf.default" parse="text"/></programlisting>
-
-    <para>Download <link xlink:href="stage_1.conf.default"><filename>stage_1.conf.default</filename>
-      </link>.</para>
-
-    <para>Running this script installs a system that when booted
-      provides:</para>
-    <itemizedlist>
-      <listitem>
-        <para>Inherited users and groups.</para>
-      </listitem>
-      <listitem>
-        <para>Firewalled Internet connectivity over Ethernet.</para>
-      </listitem>
-      <listitem>
-        <para>Correct time zone and NTP.</para>
-      </listitem>
-      <listitem>
-        <para>Some more minor configuration, like
-        <filename>/etc/ttys</filename> and
-        <command>inetd</command>.</para>
-      </listitem>
-    </itemizedlist>
-
-    <para>Other areas are prepared for configuration, but will not work
-      until stage two is completed.  For example we have copied files to
-      configure printing and X11.  Printing however is likely to need
-      applications not found in the base system, like &postscript;
-      utilities.  X11 will not run before we have compiled the server,
-      libraries and programs.</para>
-  </sect1>
-
-  <sect1 xml:id="stage2">
-    <title>Stage Two: Ports Installation</title>
-
-    <note>
-      <para>It is also possible to install the (precompiled)
-        packages at this stage, instead of compiling ports.  In this case,
-        <filename>stage_2.sh</filename> would be nothing more than a list of
-        <command>pkg_add</command> commands.  I trust you know how to write
-        such a script.  Here we concentrate on the more flexible and
-        traditional way of using the ports.</para>
-    </note>
-
-    <para>The following <filename>stage_2.sh</filename> script is how I
-      install my favorite ports.  It can be run any number of times and
-      will skip all ports that are already installed.  It supports the
-      <emphasis>dryrun</emphasis> option (<option>-n</option>) to just
-      show what would be done.  You run it like <filename>stage_1.sh</filename>
-      with exactly one argument to denote a config file, e.g.</para>
-
-    <informalexample>
-      <screen>&prompt.root; <userinput>./stage_2.sh <replaceable>default</replaceable></userinput></screen>
-    </informalexample>
-
-    <para>which will read the list of ports from
-      <filename>stage_2.conf.default</filename>.</para>
-
-    <para>The list of ports consists of lines with two or more space
-      separated words: the category and the port, optionally followed by
-      an installation command that will compile and install the port
-      (default: <command>make install BATCH=yes &lt; /dev/null</command>).
-      Empty lines and lines
-      starting with # are ignored.  Most of the time it suffices to only
-      name category and port.  A few ports however can be fine tuned by
-      specifying <command>make</command> variables, e.g.:</para>
-
-    <programlisting>www mozilla make WITHOUT_MAILNEWS=yes WITHOUT_CHATZILLA=yes install</programlisting>
-
-    <para>In fact you can specify arbitrary shell commands, so you are
-      not restricted to simple <command>make</command> invocations:</para>
-
-    <programlisting>java jdk16            echo true &gt; files/license.sh; make install BATCH=yes &lt; /dev/null
-print acroread8       yes accept | make install PAGER=ls
-x11-fonts gnu-unifont make install &amp;&amp; mkfontdir /usr/local/lib/X11/fonts/local
-news inn-stable       CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" make install</programlisting>
-
-    <para>The first two lines are examples how you can handle ports
-      asking you to accept a licence.  Note how the line for
-      <package>news/inn-stable</package> is an example
-      for a one-shot shell variable assignment to
-      <literal>CONFIGURE_ARGS</literal>.  The port
-      <filename>Makefile</filename> will use this as an initial value
-      and augment some other essential args.  The difference to
-      specifying a <application>make</application> variable on the command line
-      with</para>
-
-    <programlisting>news inn-stable make CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" install</programlisting>
-
-    <para>is that the latter will override instead of augment.  It depends on
-      the particular port which method you want.</para>
-
-    <para>Be careful that your ports do not use an interactive install, i.e.
-      they should not try to read from stdin other than what you explicitly
-      give them on stdin.  If they do, they will read the next line(s) from
-      your list of ports in the here-document and get confused.  If
-      <filename>stage_2.sh</filename> mysteriously skips a port or stops
-      processing, this is likely the reason.</para>
-
-    <para>Below is <filename>stage_2.conf.default</filename>.  A log file named
-      <filename>LOGDIR/category+port</filename> is created for each port
-      it actually installs.</para>
-
-<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="stage_2.conf.default" parse="text"/></programlisting>
-
-    <para>Download <link xlink:href="stage_2.conf.default"><filename>stage_2.conf.default</filename></link>.</para>
-  </sect1>
-
-  <sect1 xml:id="stage3">
-    <title>Stage Three</title>
-
-    <para>You have installed your beloved ports during stage two.  Some
-      ports require a little bit of configuration.  This is what stage three,
-      the post-configuration is for.  I could have integrated this
-      post-configuration at the end of the <filename>stage_2.sh</filename>
-      script.  However, I think there is a conceptual difference between
-      installing a port and modifying its out-of-the-box configuration
-      that warrants a separate stage.</para>
-
-    <para>I have chosen to implement stage three as a
-      <filename>Makefile</filename> because this allows easy selection of
-      what you want to configure simply by running:</para>
-
-    <informalexample>
-      <screen>&prompt.root; <userinput>make -f stage_3.mk <replaceable>target</replaceable></userinput></screen>
-    </informalexample>
-
-    <para>As with <filename>stage_2.sh</filename> make sure you have
-      <filename>stage_3.mk</filename> available after booting the new
-      system, either by putting it on a shared partition or copying it
-      somewhere on the new system.</para>
-  </sect1>
-
-  <sect1 xml:id="limitations">
-    <title>Limitations</title>
-
-    <para>The automated installation of a port may prove difficult if it
-      is interactive and does not support <command>make BATCH=YES
-        install</command>.  For a few ports the interaction is nothing more
-      than typing <literal>yes</literal> when asked to accept some license.
-      If the answer is read from standard input, simply pipe the
-      appropriate answers to the installation command (e.g. <command>yes |
-        make install</command>.  For other ports you need to investigate
-      where exactly the interactive command is located and deal with it
-      appropriately.  See the examples above for
-      <package>print/acroread8</package> and
-      <package>java/jdk16</package>.</para>
-
-    <para>You should also be aware of upgrade issues for config files.
-      In general you do not know when and if the format or contents of a
-      config file changes.  A new group may be added to
-      <filename>/etc/group</filename>, or <filename>/etc/passwd</filename>
-      may gain another field.  All of this has happened in the past.  Simply
-      copying a config file from the old to the new system may be enough
-      most of the time, but in these cases it was not.  If you update a
-      system the canonical way (by overwriting the old files) you are
-      expected to use <command>mergemaster</command> to deal with changes
-      where you effectively want to merge your local config with
-      potentially new items.  Unfortunately, <command>mergemaster</command>
-      is only available for base system files, not for anything installed
-      by ports.  Some third party software seems to be especially designed
-      to keep me on my toes by changing the config file format every
-      fortnight.  To detect such silent changes, I keep a copy of the
-      modified config files in the same place where I keep
-      <filename>stage_3.mk</filename> and compare the result with a
-      <application>make</application> rule, e.g. for
-      <application>apache</application>'s <filename>httpd.conf</filename>
-      in target <command>config_apache</command> with</para>
-
-<programlisting>
-@if ! cmp -s /usr/local/etc/apache2/httpd.conf httpd.conf; then \
-    echo "ATTENTION: the httpd.conf has changed. Please examine if"; \
-    echo "the modifications are still correct. Here is the diff:"; \
-    diff -u /usr/local/etc/apache2/httpd.conf httpd.conf; \
-fi
-</programlisting>
-
-    <para>If the diff is innocuous I can make the message go away with
-      <command>cp /usr/local/etc/apache2/httpd.conf
-        httpd.conf</command>.</para>
-
-    <para>I have used &scratch.ap; several times to update a
-      <literal>7-CURRENT</literal> to <literal>7-CURRENT</literal> and
-      <literal>8-CURRENT</literal> to <literal>8-CURRENT</literal>, i.e.
-      I have never tried to install a <literal>8-CURRENT</literal> from
-      a <literal>7-CURRENT</literal> system or vice versa.  Due to the
-      number of changes between different major release numbers I would
-      expect this process to be a bit more involved.  Using &scratch.ap;
-      for upgrades within the realm of a <literal>STABLE</literal> branch
-      should work painlessly (although I have not yet tried it.)</para>
-
-  </sect1>
-
-  <sect1 xml:id="files">
-    <title>The Files</title>
-
-    <para>Here are the three files you need beside the config files
-      already shown above.</para>
-
-    <para>This is the <link xlink:href="stage_1.sh"><filename>stage_1.sh</filename></link>
-      script, which you should not need to modify.</para>
-
-<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="stage_1.sh" parse="text"/></programlisting>
-
-    <para>Download <link xlink:href="stage_1.sh"><filename>stage_1.sh</filename></link>.</para>
-
-    <para>This is the <link xlink:href="stage_2.sh"><filename>stage_2.sh</filename></link>
-      script.  You may want to modify the variables at the
-      beginning.</para>
-
-<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="stage_2.sh" parse="text"/></programlisting>
-
-    <para>Download <link xlink:href="stage_2.sh"><filename>stage_2.sh</filename></link>.</para>
-
-    <para>This is my <link xlink:href="stage_3.mk"><filename>stage_3.mk</filename></link> to
-      give you an idea how to automate all reconfiguration.</para>
-
-<programlisting><xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="stage_3.mk" parse="text"/></programlisting>
-
-    <para>Download <link xlink:href="stage_3.mk"><filename>stage_3.mk</filename></link>.</para>
-  </sect1>
-
-</article>
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.conf.default b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.conf.default
deleted file mode 100644
index d706c7092b..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.conf.default
+++ /dev/null
@@ -1,175 +0,0 @@
-# This file: stage_1.conf.default, sourced by stage_1.sh.
-#
-# $Id: stage_1.conf.default,v 1.5 2011-05-14 20:44:31 hrs Exp $
-# $FreeBSD$
-
-# Root mount point where you create the new system. Because it is only
-# used as a mount point, no space will be used on that file system as all
-# files are of course written to the mounted file system(s).
-DESTDIR="/newroot"
-
-# Where your src tree is.
-SRC="/usr/src"
-
-# Where your obj is.
-MAKEOBJDIRPREFIX="/usr/obj"
-
-# Your kernel config name as from make buildkernel KERNCONF=...
-KERNCONF="HAL9000"
-
-# Your target architecture as used for make buildworld TARGET=...
-# If you did not specify a TARGET when building world, it defaulted
-# to the build architecture (run "uname -m" to find out if you are unsure).
-TARGET="i386"  # amd64 arm i386 ia64 mips pc98 powerpc sparc64
-
-# Available time zones are those under /usr/share/zoneinfo.
-TIMEZONE="Europe/Berlin"
-
-
-#
-# The create_file_systems function must create the mountpoints under
-# DESTDIR, create the file systems, and then mount them under DESTDIR.
-#
-create_file_systems () {
-  # The new root file system. Mandatory.
-  # Change DEVICE names.
-  DEVICE=/dev/daXYZs1a
-  mkdir -m 755 -p ${DESTDIR}
-  chown root:wheel ${DESTDIR}
-  newfs -U ${DEVICE}
-  mount -o noatime ${DEVICE} ${DESTDIR}
-
-  # Additional file systems and initial mount points. Optional.
-  DEVICE=/dev/daXYZs1e
-  mkdir -m 755 -p ${DESTDIR}/var
-  chown root:wheel ${DESTDIR}/var
-  newfs -U ${DEVICE}
-  mount -o noatime ${DEVICE} ${DESTDIR}/var
-
-  DEVICE=/dev/daXYZs1e
-  mkdir -m 755 -p ${DESTDIR}/usr
-  chown root:wheel ${DESTDIR}/usr
-  newfs -U ${DEVICE}
-  mount -o noatime ${DEVICE} ${DESTDIR}/usr
-}
-
-#
-# The create_etc_fstab function must create an fstab matching the
-# file systems created in create_file_systems.
-#
-create_etc_fstab () {
-  cat <<EOF >${DESTDIR}/etc/fstab
-# Device         Mountpoint          FStype    Options              Dump Pass#
-/dev/da0s1b      none                swap      sw                   0    0
-/dev/da1s1b      none                swap      sw                   0    0
-/dev/da2s2b      none                swap      sw                   0    0
-/dev/da3s2b      none                swap      sw                   0    0
-/dev/da0s1a      /                   ufs       rw,noatime           1    1
-/dev/da0s1e      /var                ufs       rw,noatime           1    1
-/dev/da2s1e      /usr                ufs       rw,noatime           1    1
-/dev/vinum/Share /share              ufs       rw,noatime           0    2
-/dev/vinum/home  /home               ufs       rw,noatime           0    2
-/dev/vinum/ncvs  /home/ncvs          ufs       rw,noatime           0    2
-/dev/vinum/ports /usr/ports          ufs       rw,noatime           0    2
-/dev/ad1s1a      /flash              ufs       rw,noatime           0    0
-/dev/ad0s1       /2k                 ntfs      ro,noauto            0    0
-/dev/ad0s6       /linux              ext2fs    ro,noauto            0    0
-#
-/dev/cd0         /cdrom              cd9660    ro,noauto            0    0
-/dev/cd1         /dvd                cd9660    ro,noauto            0    0
-proc             /proc               procfs    rw                   0    0
-linproc          /compat/linux/proc  linprocfs rw                   0    0
-EOF
-  chmod 644 ${DESTDIR}/etc/fstab
-  chown root:wheel ${DESTDIR}/etc/fstab
-}
-
-#
-# The copy_files function is used to copy files before mergemaster is run.
-#
-copy_files () {
-  # Add or remove from this list at your discretion. Mostly mandatory.
-  for f in \
-    /.profile \
-    /etc/devd.conf \
-    /etc/devd.rules \
-    /etc/exports \
-    /etc/group \
-    /etc/hosts \
-    /etc/inetd.conf \
-    /etc/ipfw.conf \
-    /etc/make.conf \
-    /etc/master.passwd \
-    /etc/nsswitch.conf \
-    /etc/ntp.conf \
-    /etc/printcap \
-    /etc/profile \
-    /etc/rc.conf \
-    /etc/resolv.conf \
-    /etc/src.conf \
-    /etc/sysctl.conf \
-    /etc/ttys \
-    /etc/mail/aliases \
-    /etc/mail/aliases.db \
-    /etc/mail/hal9000.mc \
-    /etc/mail/service.switch \
-    /etc/ssh/*key* \
-    /etc/ssh/*_config \
-    /etc/X11/xorg.conf \
-    /var/cron/tabs/* \
-    /root/.profile \
-    /boot/*.bmp \
-    /boot/loader.conf \
-    /boot/device.hints ; do
-    cp -p ${f} ${DESTDIR}${f}
-  done
-}
-
-#
-# Everything else you want to tune in the new system.
-# NOTE: Do not install too many binaries here. With the old system running and
-# the new binaries and headers installed you are likely to run into bootstrap
-# problems. Ports should be compiled after you have booted in the new system.
-#
-all_remaining_customization () {
-  # Without the compat symlink the linux_base files end up on the root fs:
-  cd ${DESTDIR}
-  mkdir -m 755 usr/compat; chown root:wheel usr/compat; ln -s usr/compat
-  mkdir -m 755 usr/compat/linux;      chown root:wheel usr/compat/linux
-  mkdir -m 555 usr/compat/linux/proc; chown root:wheel usr/compat/linux/proc
-  mkdir -m 755 boot/grub;             chown root:wheel boot/grub
-  mkdir -m 755 linux 2k;              chown root:wheel linux 2k
-  mkdir -m 755 src;                   chown root:wheel src
-  mkdir -m 755 share;                 chown root:wheel share
-  mkdir -m 755 dvd cdrom flash;       chown root:wheel dvd cdrom flash
-  mkdir -m 755 home;                  chown root:wheel home
-  mkdir -m 755 usr/ports;             chown root:wheel usr/ports
-
-  # Create the ntp and slip log files.
-  touch ${DESTDIR}/var/log/ntp ${DESTDIR}/var/log/slip.log
-
-  # Make /usr/src point to the right directory. Optional.
-  # Note: some ports need part of the src tree, e.g. emulators/kqemu,
-  # sysutils/lsof, sysutils/fusefs, ...
-  cd ${DESTDIR}/usr
-  if test "${SRC}" != /usr/src; then
-    rmdir src; ln -s ${SRC}
-  fi
-  if test "${MAKEOBJDIRPREFIX}" != /usr/obj; then
-    rmdir obj; ln -s ${MAKEOBJDIRPREFIX}
-  fi
-
-  # My personal preference is to symlink tmp -> var/tmp. Optional.
-  cd ${DESTDIR}; rmdir tmp; ln -s var/tmp
-
-  # Make spooldirs for the printers in my /etc/printcap.
-  cd ${DESTDIR}/var/spool/output/lpd; mkdir -p as od ev te lp da
-  touch ${DESTDIR}/var/log/lpd-errs
-
-  # If you do not have /home on a shared partition, you may want to copy it:
-  # mkdir -p ${DESTDIR}/home
-  # cd /home; tar cf - . | (cd ${DESTDIR}/home; tar xpvf -)
-}
-
-# vim: tabstop=2:expandtab:shiftwidth=2:syntax=sh:
-# EOF $RCSfile: stage_1.conf.default,v $
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh
deleted file mode 100644
index 9e8760c6ca..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh
+++ /dev/null
@@ -1,163 +0,0 @@
-#!/bin/sh
-#
-# stage_1.sh - FreeBSD From Scratch, Stage 1: System Installation.
-#              Usage: ./stage_1.sh profile
-#              will read profile
-#              and write ./stage_1.log.profile
-#
-# Author:      Jens Schweikhardt
-# $Id: stage_1.sh,v 1.7 2008-12-11 19:48:21 schweikh Exp $
-# $FreeBSD$
-
-PATH=/bin:/usr/bin:/sbin:/usr/sbin
-
-# Prerequisites:
-#
-# a) Successfully completed "make buildworld" and "make buildkernel"
-# b) Unused partitions (at least one for the root fs, probably more for
-#    the new /usr and /var, to your liking.)
-# c) A customized profile file.
-
-if test $# -ne 1; then
-  echo "usage: stage_1.sh profile" 1>&2
-  exit 1
-fi
-
-# ---------------------------------------------------------------------------- #
-# Step 1: Create an empty directory tree below $DESTDIR.
-# ---------------------------------------------------------------------------- #
-
-step_one () {
-  create_file_systems
-  # Now create all the other directories. Mandatory.
-  cd ${SRC}/etc; make distrib-dirs DESTDIR=${DESTDIR} TARGET=${TARGET}
-}
-
-# ---------------------------------------------------------------------------- #
-# Step 2: Fill the empty /etc directory tree and put a few files in /.
-# ---------------------------------------------------------------------------- #
-
-step_two () {
-  copy_files
-
-  # Delete mergemaster's temproot, if any.
-  TEMPROOT=/var/tmp/temproot.stage1
-  if test -d ${TEMPROOT}; then
-    chflags -R 0 ${TEMPROOT}
-    rm -rf ${TEMPROOT}
-  fi
-  export MAKEDEVPATH="/bin:/sbin:/usr/bin"
-  mergemaster -i -m ${SRC}/etc -t ${TEMPROOT} -D ${DESTDIR}
-  cap_mkdb ${DESTDIR}/etc/login.conf
-  pwd_mkdb -d ${DESTDIR}/etc -p ${DESTDIR}/etc/master.passwd
-
-  # Mergemaster does not create empty files, e.g. in /var/log. Do so now,
-  # but do not clobber files that may have been copied with copy_files.
-  cd ${TEMPROOT}
-  find . -type f | sed 's,^\./,,' |
-  while read f; do
-    if test -r ${DESTDIR}/${f}; then
-      echo "${DESTDIR}/${f} already exists; not copied"
-    else
-      echo "Creating empty ${DESTDIR}/${f}"
-      cp -p ${f} ${DESTDIR}/${f}
-    fi
-  done
-  chflags -R 0 ${TEMPROOT}
-  rm -rf ${TEMPROOT}
-}
-
-# ---------------------------------------------------------------------------- #
-# Step 3: Install world.
-# ---------------------------------------------------------------------------- #
-
-step_three () {
-  cd ${SRC}
-  make installworld DESTDIR=${DESTDIR} TARGET=${TARGET}
-}
-
-# ---------------------------------------------------------------------------- #
-# Step 4: Install kernel and modules.
-# ---------------------------------------------------------------------------- #
-
-step_four () {
-  cd ${SRC}
-  # The loader.conf and device.hints are required by the installkernel target.
-  # If you have not copied them in Step 2, cp them as shown in the next 2 lines.
-  #   cp sys/boot/forth/loader.conf ${DESTDIR}/boot/defaults
-  #   cp sys/${TARGET}/conf/GENERIC.hints ${DESTDIR}/boot/device.hints
-  make installkernel DESTDIR=${DESTDIR} KERNCONF=${KERNCONF} TARGET=${TARGET}
-}
-
-# ---------------------------------------------------------------------------- #
-# Step 5: Install /etc/fstab and time zone info.
-# ---------------------------------------------------------------------------- #
-
-step_five () {
-  create_etc_fstab
-
-  # Setup time zone info; pretty much mandatory.
-  cp ${DESTDIR}/usr/share/zoneinfo/${TIMEZONE} ${DESTDIR}/etc/localtime
-  if test -r /etc/wall_cmos_clock; then
-    cp -p /etc/wall_cmos_clock ${DESTDIR}/etc/wall_cmos_clock
-  fi
-}
-
-# ---------------------------------------------------------------------------- #
-# Step 6: All remaining customization.
-# ---------------------------------------------------------------------------- #
-
-step_six () {
-  all_remaining_customization
-}
-
-do_steps () {
-  echo "PROFILE=${PROFILE}"
-  echo "TARGET=${TARGET}"
-  echo "DESTDIR=${DESTDIR}"
-  echo "SRC=${SRC}"
-  echo "KERNCONF=${KERNCONF}"
-  echo "TIMEZONE=${TIMEZONE}"
-  echo "TYPE=${TYPE}"
-  echo "REVISION=${REVISION}"
-  echo "BRANCH=${BRANCH}"
-  echo "RELDATE=${RELDATE}"
-  step_one
-  step_two
-  step_three
-  step_four
-  step_five
-  step_six
-}
-
-# ---------------------------------------------------------------------------- #
-# The ball starts rolling here.
-# ---------------------------------------------------------------------------- #
-
-PROFILE="$1"
-set -x -e -u # Stop for any error or use of an undefined variable.
-. ${PROFILE}
-
-# Determine a few variables from the sources that were used to make the
-# world. The variables can be used to modify actions, e.g. depending on
-# the system's version. The __FreeBSD_version numbers
-# for RELDATE are documented in the Porter's Handbook,
-# doc/en_US.ISO8859-1/books/porters-handbook/freebsd-versions.html.
-# Scheme is:  <major><two digit minor><0 if release branch, otherwise 1>xx
-# The result will be something like
-#
-#   TYPE="FreeBSD"
-#   REVISION="8.0"
-#   BRANCH="RC"      { "CURRENT", "STABLE", "RELEASE" }
-#   RELDATE="800028"
-#
-eval $(awk '/^(TYPE|REVISION|BRANCH)=/' ${SRC}/sys/conf/newvers.sh)
-RELDATE=$(awk '/^[ \t]*#[ \t]*define[ \t][ \t]*__FreeBSD_version[ \t]/ {
-                print $3
-              }' ${SRC}/sys/sys/param.h)
-
-echo "=> Logging to stage_1.${PROFILE}.log"
-do_steps 2>&1 | tee "stage_1.${PROFILE}.log"
-
-# vim: tabstop=2:expandtab:shiftwidth=2:
-# EOF $RCSfile: stage_1.sh,v $
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.conf.default b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.conf.default
deleted file mode 100644
index b188cb0e11..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.conf.default
+++ /dev/null
@@ -1,98 +0,0 @@
-# vim: syntax=sh
-# $Id: stage_2.conf.default,v 1.4 2008-12-03 21:59:51 schweikh Exp $
-# $FreeBSD$
-devel ccache
-shells zsh
-devel gettext
-archivers unzip
-archivers zip
-security sudo
-x11 xorg
-x11-servers xorg-server
-x11-fonts xorg-fonts-100dpi
-x11-fonts xorg-fonts-75dpi
-x11-fonts xorg-fonts-miscbitmaps
-x11-fonts xorg-fonts-truetype
-x11-fonts xorg-fonts-type1
-x11-fonts gnu-unifont make install && mkfontdir /usr/local/lib/X11/fonts/local
-x11-fonts urwfonts
-x11-fonts webfonts
-x11-toolkits open-motif
-x11-wm ctwm
-x11 wdm
-security openssh-askpass
-astro xplanet
-astro xephem
-editors vim
-print ghostscript8
-print psutils-a4
-print a2ps-a4
-print gv
-print transfig
-print teTeX
-print cups-base
-emulators linux_base-fc6
-print acroread8 yes accept | make install PAGER=ls
-java jdk16 echo true > files/license.sh; make install BATCH=yes < /dev/null
-www apache22
-www amaya
-www firefox3
-www checkbot
-www p5-HTML-Parser
-www validator
-www mplayer-plugin
-math p5-Math-Combinatorics
-math p5-Bit-Vector
-graphics evince
-graphics xfig
-graphics xv
-graphics gphoto2
-multimedia xawtv
-lang expect
-lang gawk
-lang python
-news tin
-net freebsd-uucp
-net cvsup-without-gui
-net rsync
-ftp wget
-textproc ispell
-german ispell-neu
-german ispell-alt
-textproc docproj
-sysutils samefile
-sysutils smartmontools
-sysutils pstree
-sysutils cdrtools
-sysutils dvd+rw-tools
-sysutils grub
-sysutils lsof
-devel subversion-freebsd
-devel bcc
-devel ddd
-devel gindent
-devel ctags
-devel ElectricFence
-devel strace
-devel perltidy
-mail procmail
-mail metamail
-mail mutt-devel
-ports-mgmt portupgrade
-news inn CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" make BATCH=yes install < /dev/null
-misc figlet-fonts
-security gpa
-mail spamoracle
-textproc rman
-multimedia mplayer
-multimedia mplayer-fonts
-multimedia acidrip
-multimedia ogle
-multimedia ogle-gui
-audio pacpl
-audio p5-CDDB_get
-audio cowbell
-shells bash
-editors openoffice.org-3-RC
-java eclipse
-java netbeans
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh
deleted file mode 100644
index 699c940353..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/bin/sh
-#
-# stage_2.sh - FreeBSD From Scratch, Stage 2: Ports Installation.
-#              Usage: ./stage_2.sh [-hnp] configname
-#
-# Author:      Jens Schweikhardt
-# $Id: stage_2.sh,v 1.5 2004-07-19 21:02:26 schweikh Exp $
-# $FreeBSD$
-
-DBDIR="/var/db/pkg"
-PORTS="/usr/ports"
-: ${PACKAGES:=${PORTS}/packages}
-LOGDIR="/home/root/setup/ports.log"; mkdir -p ${LOGDIR}
-PKG_PATH="/cdrom/packages/All:/dvd/packages/All"
-PKG=
-
-MYNAME="$(basename $0)"
-usage () {
-	exec >&2
-	echo "usage: ${MYNAME} [-hnp] configname"
-	echo ""
-	echo "  Options:"
-	echo "  -h    Print this help text."
-	echo "  -n    Dryrun: just show what would be done."
-	echo "  -p    Install a precompiled package if one can be found."
-	echo ""
-	echo "  The config file (stage_2.conf.configname) is a list of"
-	echo "  ports to install with one entry per line. Each line"
-	echo "  consists of two or three space separated fields:"
-	echo "  category, port, and optionally a build command."
-	echo ""
-	exit 1
-}
-
-# Look for a package in these locations in sequence.
-# Returns as soon as the first is found. Result on stdout.
-#
-#   ${PORTS}/${CATEGORY}/${NAME}
-#   ${PACKAGES}/All
-#   ${PACKAGES}/${CATEGORY}
-#   ${PKG_PATH}
-#
-find_package () {
-	echo "${PORTS}/${CATEGORY}/${NAME}:${PACKAGES}/All:${PACKAGES}/${CATEGORY}:${PKG_PATH}" |
-	tr : '\n' |
-	while read d; do
-		test -d "${d}" || continue
-		PKG=$(ls ${d}/${PKGNAME}.* 2>/dev/null)
-		test $? -eq 0 && echo "${PKG}" && return
-	done
-}
-
-#
-# Parse command line arguments.
-#
-args=`getopt hnp $*`
-if test $? != 0; then
-	usage
-fi
-set -- $args
-DRYRUN=
-CHKPKG=
-for i; do
-	case "$i" in
-	-n) DRYRUN="yes"; shift;;
-	-p) CHKPKG="yes"; shift;;
-	--) shift; break;;
-	*) usage;;
-	esac
-done
-if test $# -eq 1; then
-	DATAFILE="$1"
-else
-	usage
-fi
-
-#
-# Loop over the ports list.
-#
-while read CATEGORY NAME CMD; do
-	case "${CATEGORY}" in
-	\#*) continue;;
-	'') continue;;
-	esac
-	DIR="${PORTS}/${CATEGORY}/${NAME}"
-	if ! test -d "${DIR}"; then
-		echo "$DIR does not exist -- ignored"
-		continue
-	fi
-	cd ${DIR}
-	PKGNAME=`make -V PKGNAME`
-	if test -n "${CHKPKG}"; then
-		PKG=$(find_package)
-	else
-		PKG=""
-	fi
-	if test -d "${DBDIR}/${PKGNAME}"; then
-		echo "${CATEGORY}/${NAME} already installed as ${PKGNAME}"
-		continue
-	fi
-	LOG="${LOGDIR}/${CATEGORY}+${NAME}"
-	echo "===> Installing ${CATEGORY}/${NAME}; logging to ${LOG}"
-	test -n "${CMD}" || CMD="make install BATCH=yes < /dev/null"
-	if test -n "${DRYRUN}"; then
-		if test -n "${PKG}"; then
-			echo pkg_add -v ${PKG}
-		else
-			echo "${CMD}"
-		fi
-		continue
-	fi
-	date "++++ Started %v %T +++" > ${LOG}
-	STARTED=$(date +%s)
-	(
-		if test -n "${PKG}"; then
-			echo "Found package ${PKG}"
-			pkg_add -v ${PKG}
-		else
-			echo "CMD: ${CMD}"
-			make clean
-			eval "${CMD}"
-			make clean # Uncomment if diskspace is tight under ${PORTS}.
-		fi
-	) 2>&1 | tee -a ${LOG}
-	FINISHED=$(date +%s)
-	DURATION=$(dc -e "${FINISHED} ${STARTED} - p")
-	date "++++ Finished %v %T after ${DURATION} secs +++" >> ${LOG}
-done < stage_2.conf.${DATAFILE}
-
-# vim: tabstop=4:
-# EOF $RCSfile: stage_2.sh,v $
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk
deleted file mode 100644
index 901ba1d801..0000000000
--- a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk
+++ /dev/null
@@ -1,252 +0,0 @@
-# stage_3.mk - FreeBSD From Scratch, Stage 3: Ports Post-Configuration.
-#              Usage: make -f stage_3.mk all     (configure everything)
-#                or   make -f stage_3.mk target  (just configure target)
-#
-# Author:      Jens Schweikhardt
-#
-# It is a good idea to make sure any target can be made more than
-# once without ill effect.
-#
-# $Id: stage_3.mk,v 1.5 2008-12-03 21:59:51 schweikh Exp $
-# $FreeBSD$
-
-.POSIX:
-
-message:
-	@echo "Please use one of the following targets:"
-	@echo "config_apache"
-	@echo "config_cups"
-	@echo "config_firefox"
-	@echo "config_inn"
-	@echo "config_javaplugin"
-	@echo "config_openoffice"
-	@echo "config_sudo"
-	@echo "config_TeX"
-	@echo "config_tin"
-	@echo "config_wdm"
-	@echo "config_uucp"
-	@echo "all -- all of the above"
-
-all: \
-	config_apache \
-	config_cups \
-	config_firefox \
-	config_inn \
-	config_javaplugin \
-	config_openoffice \
-	config_sudo \
-	config_TeX \
-	config_tin \
-	config_wdm \
-	config_uucp
-
-APACHE = apache22
-config_apache:
-	# 1. Modify httpd.conf.
-	perl -pi \
-	-e 's/^\s*ServerAdmin.*/ServerAdmin schweikh\@schweikhardt.net/;' \
-	-e 's/^#?ServerName .*/ServerName hal9000.schweikhardt.net:80/;' \
-	-e 's/^\s*Listen.*/Listen 127.0.0.1:80/;' \
-	-e 's/^\s*Deny from all/    Allow from 127.0.0.1/i;' \
-	-e 's,/usr/local/www/$(APACHE)/cgi-bin/,/home/opt/www/cgi-bin/,;' \
-	  /usr/local/etc/$(APACHE)/httpd.conf
-	cp w3c-validator.conf /usr/local/etc/$(APACHE)/Includes
-	# 2. Restore symlinks to web pages.
-	cd /usr/local/www/$(APACHE)/data && \
-	ln -fs /home/schweikh/prj/homepage schweikhardt.net && \
-	ln -fs /home/opt/www/test .
-	# 3. Restore W3C Validator config.
-	mkdir -p /etc/w3c
-	cp /usr/local/www/validator/htdocs/config/validator.conf.sample \
-		/etc/w3c/validator.conf
-	perl -pi \
-	-e 's/^Allow Private IPs.*/Allow Private IPs = yes/;' \
-		/etc/w3c/validator.conf
-	# Test if the httpd.conf has changed.
-	@if ! cmp -s /usr/local/etc/$(APACHE)/httpd.conf httpd.conf; then \
-		echo "ATTENTION: the httpd.conf has changed. Please examine if"; \
-		echo "the modifications are still correct. If so you can simply"; \
-		echo "cp /usr/local/etc/$(APACHE)/httpd.conf httpd.conf"; \
-		echo "to make this message go away. Here is the diff:"; \
-		diff -u /usr/local/etc/$(APACHE)/httpd.conf httpd.conf; \
-	fi
-	if test -f /var/run/httpd.pid; then \
-		/usr/local/etc/rc.d/$(APACHE) stop; \
-		/usr/local/etc/rc.d/$(APACHE) start; \
-	else \
-		/usr/local/etc/rc.d/$(APACHE) start; \
-	fi
-
-# The original ppd file is from http://www.cups.org/ppd.php?L63+I0+T+Q2300
-# = http://www.cups.org/ppd/hp/de/hpc2325s.ppd.gz
-config_cups:
-	chmod 644 /usr/local/etc/cups/cupsd.conf
-	cp printers.conf /usr/local/etc/cups/printers.conf
-	cp LaserJet_2300d.ppd /usr/local/etc/cups/ppd/LaserJet_2300d.ppd
-
-config_firefox:
-	# Make this group wheel writable to allow extensions being installed.
-	chmod -R g+w /usr/local/lib/firefox3/chrome
-
-config_inn:
-	pw usermod -n news -d /usr/local/news -s /bin/sh
-	mkdir -p /share/news/spool/outgoing \
-	         /share/news/spool/incoming \
-	         /share/news/spool/articles \
-	         /share/news/spool/overview \
-	         /share/news/spool/tmp      \
-	         /share/news/db
-	chown -R news:news /share/news
-	# Give the news system its initial configuration.
-	cd /home/root/setup && \
-	if test ! -f /share/news/db/active; then \
-		echo "installing /share/news/db/active"; \
-		install -C -o news -g news -m 664 active /share/news/db; \
-	fi; \
-	if test ! -f /share/news/db/newsgroups; then \
-		echo "installing /share/news/db/newsgroups"; \
-		install -C -o news -g news -m 664 newsgroups /share/news/db; \
-	fi
-	# Configure storage method.
-	cd /home/root/setup &&    \
-	printf "%s\n%s\n%s\n%s\n" \
-		"method tradspool {"  \
-		"  newsgroups: *"     \
-		"  class: 0"          \
-		"}"                   \
-	>storage.conf &&          \
-	install -C -o news -g news -m 664 storage.conf /usr/local/news/etc
-	# Configure newsfeeds.
-	printf "%s\n%s\n" \
-		"ME:*::"      \
-		"shuttle/news2.shuttle.de:!junk,!control:B32768/512,Tf,Wfb:" \
-	>/usr/local/news/etc/newsfeeds
-	# Configure inn.conf.
-	perl -pi                                                        \
-	-e 's/^#*\s*(organization:\s*).*/$$1"An Open Pod Bay Door"/;'   \
-	-e 's/^#*\s*(pathhost:\s*).*/$$1hal9000.schweikhardt.net/;'     \
-	-e 's/^#*\s*(server:).*/$$1 localhost/;'                        \
-	-e 's/^#*\s*(domain:).*/$$1 schweikhardt.net/;'                 \
-	-e 's/^#*\s*(fromhost:).*/$$1 schweikhardt.net/;'               \
-	-e 's,^#*\s*(moderatormailer:).*,$$1 \%s\@moderators.isc.org,;' \
-	-e 's,^#*\s*(pathdb:\s*).*,$$1/share/news/db,;'                 \
-	-e 's,/usr/local/news/spool,/share/news/spool,;'                \
-	/usr/local/news/etc/inn.conf
-	# Create empty history, if none there.
-	# See post-install in /usr/ports/news/inn-stable/Makefile.
-	set -e; cd /share/news/db; \
-	if test ! -f history; then \
-		touch history; \
-		chmod 644 history; \
-		chown news:news history; \
-		su -fm news -c "/usr/local/news/bin/makedbz -i"; \
-		for s in dir hash index; do \
-			mv history.n.$${s} history.$${s}; \
-		done; \
-	fi
-	# Configure send-uucp.
-	echo shuttle:shuttle >/usr/local/news/etc/send-uucp.cf
-	# Satisfy inncheck:
-	set -e; cd /usr/local/news/etc; \
-	chown news:news *; \
-	chmod 640 control.ctl expire.ctl nntpsend.ctl readers.conf
-	/usr/local/news/bin/inncheck
-	# Test if the inn.conf has changed.
-	@if ! cmp -s /usr/local/news/etc/inn.conf inn.conf; then \
-		echo "ATTENTION: the inn.conf has changed. Please examine if"; \
-		echo "the modifications are still correct. If so you can simply"; \
-		echo "cp /usr/local/news/etc/inn.conf inn.conf"; \
-		echo "to make this message go away. Here is the diff:"; \
-		diff -u /usr/local/news/etc/inn.conf inn.conf; \
-	fi
-	if ! test -f /usr/local/news/run/innd.pid; then \
-		/usr/local/etc/rc.d/innd start; \
-	fi
-
-config_javaplugin:
-	cd /usr/local/lib/firefox3/plugins && \
-	  ln -fs /usr/local/jdk1.6.0/jre/plugin/$$(uname -m)/ns7/libjavaplugin_oji.so
-
-config_openoffice:
-	# Copy some truetype files so ooo can use them.
-	find /usr/local/openoffice.org* -type d -name truetype \
-		-exec echo cp *.ttf {} \; -exec cp *.ttf {} \;
-
-config_sudo:
-	if ! grep -q schweikh /usr/local/etc/sudoers; then \
-		echo 'schweikh ALL = (ALL) NOPASSWD: ALL' >> /usr/local/etc/sudoers; \
-	fi
-	chmod 440 /usr/local/etc/sudoers
-
-config_TeX:
-	# textproc/docproj advises: to typeset the FreeBSD Handbook with JadeTeX,
-	# change the following settings to the listed values:
-	perl -pi                                      \
-	-e 's/^% original texmf.cnf/% texmf.cnf/;'    \
-	-e 's/^(hash_extra\s*=\s*).*/$${1}60000/;'    \
-	-e 's/^(pool_size\s*=\s*).*/$${1}1000000/;'   \
-	-e 's/^(max_strings\s*=\s*).*/$${1}70000/;'   \
-	-e 's/^(save_size\s*=\s*).*/$${1}10000/;'     \
-	/usr/local/share/texmf/web2c/texmf.cnf
-	# Test if the texmf.cnf has changed.
-	@if ! cmp -s /usr/local/share/texmf/web2c/texmf.cnf texmf.cnf; then \
-		echo "ATTENTION: the texmf.cnf has changed. Please examine if"; \
-		echo "the modifications are still correct. If so you can simply"; \
-		echo "cp /usr/local/share/texmf/web2c/texmf.cnf texmf.cnf"; \
-		echo "to make this message go away. Here is the diff:"; \
-		diff -u /usr/local/share/texmf/web2c/texmf.cnf texmf.cnf; \
-	fi
-
-config_tin:
-	# Point tin to our files.
-	printf "%s\n%s\n%s\n"                          \
-		"activefile=/share/news/db/active"         \
-		"newsgroupsfile=/share/news/db/newsgroups" \
-		"spooldir=/share/news/spool/articles"      \
-	>/usr/local/etc/tin.defaults
-
-config_wdm:
-	cp daemon1-JS-1600x1200.jpg FreeBSD_small.png \
-		/usr/local/lib/X11/wdm/pixmaps
-	perl -pi \
-	-e 's,^(DisplayManager\*wdmBg:).*,\1 pixmap:/usr/local/lib/X11/wdm/pixmaps/daemon1-JS-1600x1200.jpg,;' \
-	-e 's,^(DisplayManager\*wdmLogo:).*,\1 /usr/local/lib/X11/wdm/pixmaps/FreeBSD_small.png,;' \
-	-e 's,^(DisplayManager\*wdmWm:).*,\1 ctwm:icewm:xfce4:tvtwm,;' \
-		/usr/local/lib/X11/wdm/wdm-config
-	@if ! cmp -s /usr/local/lib/X11/wdm/wdm-config wdm-config; then \
-		echo "ATTENTION: the wdm-config has changed. Please examine if"; \
-		echo "the modifications are still correct. If so you can simply"; \
-		echo "cp /usr/local/lib/X11/wdm/wdm-config wdm-config"; \
-		echo "to make this message go away. Here is the diff:"; \
-		diff -u /usr/local/lib/X11/wdm/wdm-config wdm-config; \
-	fi
-
-config_uucp:
-	cd /etc/mail && make install SENDMAIL_MC=/etc/mail/hal9000.mc
-	# Make the uucp user's shell the correct uucico, so su(1) works.
-	chpass -s /usr/local/libexec/uucp/uucico uucp
-	# UUCP expects to find /usr/bin/rnews.
-	cd /usr/bin && ln -fs ../local/news/bin/rnews .
-	# Actual UUCP configuration.
-	echo nodename js2015           > /usr/local/etc/uucp/config
-	echo shuttle js2015 `cat uucp` > /usr/local/etc/uucp/call
-	printf 'port tcp\ntype tcp\n'  > /usr/local/etc/uucp/port
-	printf "%s\n"                         \
-		"call-login    *"                 \
-		"call-password *"                 \
-		"time          any"               \
-		"system        shuttle"           \
-		"address       mail.s.shuttle.de" \
-		"commands      rmail rnews"       \
-		"port          tcp"               \
-	>/usr/local/etc/uucp/sys
-	cd /usr/local/etc/uucp && chown uucp:uucp * && chmod o-rwx *
-	# Trigger uucico after booting.
-	mkdir -p /usr/local/etc/rc.d
-	cp uucp.sh /usr/local/etc/rc.d
-	# Rebuild the aliases.db.
-	cp aliases /etc/mail/aliases
-	newaliases
-
-# vim: tabstop=4:
-# EOF $RCSfile: stage_3.mk,v $
diff --git a/en_US.ISO8859-1/htdocs/docs/books.xml b/en_US.ISO8859-1/htdocs/docs/books.xml
index 9629f56d24..2575a4fb09 100644
--- a/en_US.ISO8859-1/htdocs/docs/books.xml
+++ b/en_US.ISO8859-1/htdocs/docs/books.xml
@@ -142,12 +142,6 @@
 	BSD</a> (explaining-bsd)<br/>
       An answer to the question ``What is BSD?''</p>
 
-    <p><a href="&url.articles;/fbsd-from-scratch/index.html">FreeBSD
-	From Scratch</a> (fbsd-from-scratch)<br/>
-      How to automatically compile, install and configure a system
-      from scratch (i.e. to an empty file system), including your
-      favorite ports.</p>
-
     <p><a href="&url.articles;/filtering-bridges/index.html">Filtering
 	Bridges</a> (filtering-bridges)<br/>
       Configuring firewalls and filtering on FreeBSD hosts acting as