diff --git a/scheme/httpd/surflets/howto.tex b/scheme/httpd/surflets/howto.tex
new file mode 100644
index 0000000..c4f63cc
--- /dev/null
+++ b/scheme/httpd/surflets/howto.tex
@@ -0,0 +1,652 @@
+\documentclass{article}
+
+\usepackage[latin1]{inputenc}
+\usepackage{fontenc}
+\usepackage{alltt}
+\usepackage{url,xspace}
+\usepackage{tabularx}
+\usepackage{theorem,ulem,float,afterpage}
+\normalem %usually, don't use ulem
+
+
+\input{decls}
+
+\title{Howto write \surflets}
+\author{Andreas Bernauer}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+This report gives a short introduction in how to write a \surflet. It
+is concentrated on the practical side rather on describing the
+\surflet API in detail to give you instant succes in running your own
+surflets. The \surflet API will be described in the SUnet
+documentation eventually.
+
+For those who don't know it already, \surflets are pieces of code that
+can be executed interactively trough a website. There is a \surflet
+handler who administrates their execution and suspension and as part
+of the SUnet webserver. \surflets ease the implementation of web
+applications in two ways, compared to other server-side scripting
+tools like Java\texttrademark Servlets or Microsoft\textregistered
+Active Server Pages or PHP:
+
+\begin{enumerate}
+\item \surflets have an automatic program flow control like any
+other usual program, \ie the web designer doesn't have to care about
+session management at all. The sequence of the web pages result from
+their appearance in the program like the print statements in any other
+usual program.
+
+\item \surflets come along with a library for robust user
+interaction. \surflets represent interaction elements of the web page
+like text input fields or dropdown lists in the \surflet program by
+specific objects. A web designer can plug in these objects into a
+website and use them to read out the user input.
+\end{enumerate}
+
+The following sections probably assume that you have basic knowledge
+of the SUnet webserver and scsh. The environment variable
+\code{\$sunet} refers to the top level directory of your sunet
+installation. On my system this is \name{/home/andreas/sw/sunet}.
+
+\section{How to run the SUnet webserver that handles \surflets}
+
+The following sections will show pieces of \surflet code you might
+want to try out. Therefore you need the SUnet webserver running with
+the ability to serve \surflets. This section tells you how to do it.
+
+\begin{enumerate}
+\item You need Oleg's SSAX package (for scsh), to be able to use
+\surflets:
+
+\begin{itemize}
+ \item Download Oleg's SSAX package from
+ \url{http://prdownloads.sourceforge.net/ssax/ssax-sr5rs-plt200-4.9.tar.gz?download}.
+
+ \item Uncompress and untar it to any directory. This will create a
+ directory called \name{SSAX}, to which I will refer to as
+ \code{\$SSAX}.
+
+ \item Unfortunately, this distribution (plt200-4.9) has a typo in
+ the package definition for scsh. Apply the patch that comes with
+ the \surflets distribution to get rid of this typo:
+ \begin{itemize}
+ \item \code{cd \$SSAX}
+ \item \code{patch -p1 < \$sunet/httpd/surflets/SSAX-goodhtml-patch}
+ \end{itemize}
+\end{itemize}
+
+\item You can start the SUnet webserver along with the
+\surflet-handler now. The \surflets distribution comes with a script that
+does this for you:
+
+\begin{itemize}
+ \item \code{cd \$sunet/httpd/surflets}
+ \item \code{SSAX=\$SSAX ./start-surflet-server}
+\end{itemize}
+
+
+Please be patient, scsh has to load a lot of libraries. If the
+loading succeeds you will see something like this:
+
+\begin{alltt}
+[andreas@hgt surflets]\$ ssax=/home/andreas/sw/SSAX ./start-surflet-server
+Loading...
+reading options: ()
+Going to run SUrflet server with:
+ htdocs-dir: /home/andreas/sw/sunet/httpd/surflets/web-server/root/htdocs
+ surflet-dir: /home/andreas/sw/sunet/httpd/surflets/web-server/root/surflets
+ images-dir: /home/andreas/sw/sunet/httpd/surflets/web-server/root/img
+ port: 8008
+ log-file-name: /home/andreas/sw/sunet/httpd/surflets/web-server/httpd.log
+ a maximum of 5 simultaneous requests, syslogging activated,
+ and home-dir-handler (public_html) activated.
+
+ NOTE: This is the SUrflet server. It does not support cgi.
+\end{alltt}
+
+This means the server is up and running. Try to connect to
+\url{http://localhost:8008} with your browser and you will see the
+welcome page of the \surflets. You can also already try out some of
+\surflets that come with the distribution.
+
+You will probably notice a long response time the first time you load
+the first \surflet. This is because the server has to load the
+\surflet libraries. The server handles further requests to \surflets
+faster.
+
+If the port the \surflet server tries to use is occupied use, you will
+see an error message similar to this one:
+
+\begin{alltt}
+Error: 98
+ "Address already in use"
+ #{Procedure 11701 (\%bind in scsh-level-0)}
+ 4
+ 2
+ (0 . 8008)
+\end{alltt}
+
+In this case, pass another port number to the script, \eg 8000:
+\codex{ssax=\$SSAX ./start-surflet-server -p 8000}
+
+The \code{--help} option will show you more parameters that you can
+adjust, but you won't need them for this howto.
+\end{enumerate}
+
+
+
+\section{How to send web pages}
+
+This section will discuss some of the various ways in which you can
+send a web page to a browser that contacted your \surflet.
+
+\subsection{My first \surflet}
+\label{sec:first-surflet}
+
+Traditionally, your first program in any programming language prints
+something like ``Hello, World!''. We follow this tradition:
+
+\begin{listing}
+(define-structure surflet surflet-interface
+ (open surflets
+ scheme-with-scsh)
+ (begin
+ (define (main req)
+ (send-html/finish
+ '(html (body (h1 "Hello, world!")))))
+ ))
+\end{listing}
+
+You can either save a file with that content in the \surflets
+directory the server mentioned at startup or you can use the file
+\name{howto/hello.scm} that comes along with the \surflets
+distribution and which is located in the server's standard \surflets
+directory. Let's go through the small script step by step:
+
+\begin{alltt}
+(define-structure surflet surflet-interface
+\end{alltt}
+
+This defines a module named \name{surflet} which implements the
+interface \name{surflet-interface}. \name{surflet-interface} just
+states that the module exports a function named \name{main} to which
+we will come shortly. For those of you who know about the scsh module
+system: Yes, \surflets are basically scsh modules that are loaded
+dynamically during run time.
+
+\begin{alltt}
+ (open surflets
+ scheme-with-scsh)
+\end{alltt}
+
+The \name{open} form lists all the modules the \surflet needs. You
+will probably always need the two modules that are stated here
+(namely \name{surflets} and \name{scheme-with-scsh}). If you need
+other modules, like \name{srfi-13} for string manipulation, this is
+the place where you want to state it.
+
+\begin{alltt}
+ (begin
+\end{alltt}
+
+This just opens the body of the \surflet. All your \surflet code goes
+here.\footnote{If you know about scsh modules, you probably also know
+that there is a \name{file} clause that you could use to place the
+code in a file instead or along with the \name{begin} clause.}
+
+\begin{alltt}
+ (define (main req)
+\end{alltt}
+
+Here is the \name{main} function that the interface declared this
+\surflet will implement. The \name{main} function is the entry point
+to your \surflet: The server calls this function every time a user
+browses to your \surflet the first time. The server calls \name{main}
+with one argument: a representation of the inital request of the
+browser. We don't have to worry about that at this point.
+
+\begin{alltt}
+ (send-html/finish
+ '(html (body (h1 "Hello, world!")))))
+ ))
+\end{alltt}
+
+\name{send-html/finish} is one of three function you will regularly
+use to send web pages to the browser. The other two functions are
+\name{send-html} and \name{send-html/suspend}.
+\name{send-html/finish} -- as the name already suggests -- sends a
+HTML page to the browser and finishes the \surflet. \name{send-html}
+just sends the HTML page and does not return and
+\name{send-html/suspend} sends the HTML page and suspends the
+\surflet, \ie it waits until the user continues with the \surflet,
+\eg by submitting a webform. We will discuss \name{send-html} and
+\name{send-html/suspend} in detail later. I will refer to these three
+functions as the \emph{sending functions}.
+
+In a \surflet, HTML pages are represented as lists, or, to be more
+precise, as SXML (S-expression based XML). The first element of a
+SXML list is a symbol stating the HTML tag. The other elements of a
+SXML list are the contents that are enclosed by this HTML tag. The
+contents can be other SXML list, too. Here are some examples of SXML
+lists and how they translate to HTML:
+
+\newcommand{\tag}[1]{$\mathtt{<}$#1$\mathtt{>}$}
+\begin{tabbing}
+HTML: \medskip\=\kill
+SXML: \> \texttt{'(p "A paragraph.")} \\
+HTML: \> \texttt{\tag{p}A paragraph.\tag{/p}}\\
+\\
+SXML: \> \texttt{'(p "A paragraph." (br) "With break line.")} \\
+HTML: \> \texttt{\tag{p}A paragraph.\tag{br}With break line.\tag{/p}}\\
+\\
+SXML: \> \texttt{'(p "Nested" (p "paragraphs"))}\\
+HTML: \> \texttt{\tag{p}Nested\tag{p}paragraphs\tag{/p}\tag{/p}}\\
+\end{tabbing}
+
+Attributes are stated by a special list whose first element is the
+at-symbol. The attribute list must be the second element in the list:
+
+\begin{tabbing}
+HTML: \medskip\=\kill
+SXML: \> \texttt{'(a (@ (href "attr.html")) "Attributed HTML tags.")} \\
+HTML: \> \texttt{\tag{a href="attr.html"}Attributed HTML tags.\tag{/a}}\\
+\\
+SXML: \> \texttt{'(a (@ (href "attr2.html") (target "\_blank")) "2
+attributes.")} \\
+HTML: \> \texttt{\tag{a href="attr2.html" target="\_blank"}2
+attributes.\tag{/a}}
+\end{tabbing}
+
+As you see from the \surflet example, \name{send-html/finish} expects
+as an argument SXML. In the example, the SXML translates to the
+following HTML code:
+\begin{alltt}
+
Hello, world!
+
+
+\end{alltt}
+
+Please note, that there is no check for valid HTML or even XHTML
+here. The only thing the translation process takes care of are
+special characters in strings like the ampersand (\code{\&}). The
+translation process replaces them by their HTML representation (\eg,
+\code{\&}) so you don't have to worry about that when you use
+strings. Everything else like using valid HTML tags or valid
+attributes is your responsibility.
+
+
+\subsection{Dynamic content}
+
+Let's extend our first \surflet example by some dynamic content, \eg
+by displaying the current time using scsh's \name{format-date}
+function. As the HTML page is basically represented as a list, this
+can be done like this:
+
+\begin{listing}
+(define-structure surflet surflet-interface
+ (open surflets
+ scheme-with-scsh)
+ (begin
+ (define (main req)
+ (send-html/finish
+ `(html (body (h1 "Hello, world!")
+ (p "The current date and time is "
+ ,(format-date "~H:~M:~S ~p ~m/~d/~Y"
+ (date)))))))
+ ))
+\end{listing}
+
+This \surflet can be found in \name{howto/hello-date.scm}. The
+beginning of this \surflet is the same as in the previous example.
+The difference lies in the argument to \name{send-html/finish}. Note
+that the argument starts with a backquote (\code{`}) rather than with
+a regular quote (\code{'}) as in the previous example.
+
+Instead of passing a ``static'' list, \ie a list whose contents are
+given before execution, this \surflet uses the quasiquote and unquote
+feature of Scheme to create a ``dynamic'' list, \ie list whose
+contents are given only during execution. A ``dynamic'' list is
+introduced by a backquote (\code{`}) and its dynamic contents are
+noted by commata (\code{,}). Thus, if the \surflet is executed while
+I am writing this howto, the argument to \name{send-html/finish} above
+is translated to
+
+\begin{alltt}
+ '(html (body (h1 "Hello, world!")
+ (p "The current date and time is "
+ "13:09:03 PM 11/18/2003")))))
+\end{alltt}
+
+\noindent\emph{before} it is passed to \name{send-html/finish}. Thus, using
+dynamic content can be easily done with Scheme's quasiquote and
+unquote feature. Of course, you can build your list in any way you
+want; the quasiquote notation is just a convenient way to do it.
+
+
+\subsection{Several web pages in a row}
+
+The previous example \surflets only showed one page and finished
+afterwards. Here, we want to present to web pages in a row. We use
+the previously mentioned function \name{send-html/suspend}, which
+suspends after it has send the page and continues when the user
+clicked for the next page. In contrast to \name{send-html/finish},
+that expected SXML, \name{send-html/suspend} expects a function that
+takes an argument and returns SXML. The parameter the function gets
+(here: \name{k-url} is the URL that points to the next
+page:\footnote{In the API this URL is called the \emph{continuation
+URL}.}
+
+\begin{listing}
+(define-structure surflet surflet-interface
+ (open surflets
+ scheme-with-scsh)
+ (begin
+
+ (define (main req)
+ (send-html/suspend
+ (lambda (k-url)
+ `(html (body (h1 "Hello, world!")
+ (p (a (@ (href ,k-url)) "Next page -->"))))))
+ (send-html/finish
+ '(html (body (h1 "Hello, again!")))))
+ ))
+\end{listing}
+
+This \surflet can be found in \name{howto/hello-twice.scm}. This
+example first displays a web page with the message ``Hello, world!''
+and a link to the next page labeled with ``Next page --$>$''. When the
+user clicks on the provided link, \name{send-html/suspend} returns and
+the the next statement after the call to \name{send-html/suspend} is
+executed. Here it is \name{send-html/finish} which shows a web page
+with the message ``Hello, again!''.
+
+When \name{send-html/suspend} returns, (almost) the complete context
+of the running \surflet is restored. Thus, every variable in the
+\surflet will retain its value during suspension. The consequence is
+that you don't have to worry about sessions, sesssion variables and
+alike. The user can freely use the back button of her browser or
+clone a window while the \surflet will keep on responding in the
+expected way. This is all automatically managed by the
+\surflet-handler.
+
+The only exception are variables whose values are changed by side
+effects, \eg if you change a variable via \name{set!}. These
+variables keep their modified values, allowing communication between
+sessions of the same \surflet.\footnote{If you want to change a
+variable via side effects but you don't want to interfere with other
+session, you can use \name{set-session-data!} and
+\name{get-session-data}. See the API documentation for further
+information.}
+
+
+\subsection{Begin and end of sessions}
+
+So far I don't have mentioned too much details about sessions. The
+reason is, as mentioned before, that the \surflet handler takes of the
+session automatically as described in the previous paragraph.
+%, \ie it starts the session automatically when an
+%instance of your \surflet starts and takes care of the saving and
+%restoring of all variable values during suspensions of your \surflet
+%instance, except for \code{set!}ed values.
+
+The only thing you have to worry about is when your session
+\emph{ends}. As long as your session hasn't been finished by
+\name{send-html/finish}, the user can move freely between the web
+pages your \surflet provides. Once you've finished the session via
+\name{send-html/finish}, this freedom ends. As the session is over,
+the user will get an error message when he tries to recall some web
+page from the server. The server will tell the user about the
+possible reasons for the error (namely that most likely the session
+was finished) and provides a link to the beginning of a new session.
+
+Thus, \name{send-html/suspend} suspends the current execution of a
+\surflet, returning with the request for the next web page of your
+\surflet and \name{send/finish} finishes the session. The third
+sending function is \name{send-html} which just sends a web page.
+\name{send-html} does not return and does not touch the session of
+your \surflet instance.
+
+\subsection{Abbreviations in SXML}
+
+The example in subsection ``Several web pages in a row'' wrote down
+the link to the next web page explicitly via the ``a''-tag. As
+websites contain a lot of links, the sending functions (like
+\name{send-html/finish}) allow an abbreviation. The following SXML
+snippets are equivalent:
+
+\begin{alltt}
+(a (@ (href ,k-url)) "Next page -->")
+(url ,k-url "Next page -->")
+\end{alltt}
+
+\name{url} expects the target address as the next element and includes
+every text afterwards as part of the link.
+
+There are also some other abbreviations. \code{(nbsp)} inserts
+`\code{\ }' into the HTML, \code{(*COMMENT* \dots)} inserts a
+comment, and with \code{(plain-html \dots)} you can insert arbitrary
+HTML code (\ie strings) directly , without any string conversions.
+The last abbreviation, \name{surflet-form}, is discussed in the next
+section.
+
+
+\section{How to write web forms}
+
+The \surflets come along with a libary for easy user interaction. The
+following subsections will show how to write web forms.
+
+
+\subsection{Simple web forms}
+
+Let's write a \surflet that reads user input and prints it out on the
+next page:
+
+\begin{listing}
+(define-structure surflet surflet-interface
+ (open surflets
+ scheme-with-scsh)
+ (begin
+ (define (main req)
+ (let* ((text-input (make-text-field))
+ (submit-button (make-submit-button))
+ (req (send-html/suspend
+ (lambda (k-url)
+ `(html
+ (body
+ (h1 "Echo")
+ (surflet-form ,k-url
+ (p "Please enter something:"
+ ,text-input
+ ,submit-button)))))))
+ (bindings (get-bindings req))
+ (user-input (input-field-value text-input bindings)))
+ (send-html/finish
+ `(html (body
+ (h1 "Echo result")
+ (p "You've entered: '" ,user-input "'."))))))
+))
+\end{listing}
+
+Here are the details to the code in \name{main}:
+
+\begin{alltt}
+ (define (main req)
+ (let* ((text-input (make-text-field))
+ (submit-button (make-submit-button))
+\end{alltt}
+
+\name{make-text-field} and \name{make-submit-button} define two user
+interaction elements: a text input field and a submit button.
+\surflets represent user interaction elements by \name{Input-field}
+objects. Thus, user interaction elements are first class values in
+\surflet, unlike in many other web scripting languages, \eg Java
+surflets, PHP or Microsoft Active Server Pages. You'll see soon what
+the advantages of this approach are.
+
+\begin{alltt}
+ (req (send-html/suspend
+ (lambda (k-url)
+ `(html
+ (body
+ (h1 "Echo")
+ (surflet-form ,k-url
+ (p "Please enter something:"
+ ,text-input
+ ,submit-button)))))))
+\end{alltt}
+
+Instead of discarding the return value of \name{send-html/suspend} as
+in the examples of the previous section, this time we'll save the
+return value, as it will contain the data the user has entered in our
+text input field.
+
+The definition of the website is as described in the previous section
+except for the new abbreviation \name{surflet-form}.
+\name{surflet-form} creates the HTML code for a web form and expects
+as its next value the URL to the next webpage as provided by
+\name{send-html/suspend}, here named
+\name{k-url}. The remaining arguments constitute the content of the
+web form. Thus, the code above is equal to the following SXML:
+
+\begin{alltt}
+(form (@ (action ,k-url) (method "GET"))
+ (p "Please enter something:"
+ ,text-input
+ ,submit-button))
+\end{alltt}
+
+If you want to use the POST method instead of the default GET method,
+add the symbol \name{'POST} after the URL:
+
+\begin{alltt}
+(surflet-form ,k-url
+ POST
+ (p "Please enter something:"
+ ,text-input
+ ,submit-button))
+\end{alltt}
+
+The web page \name{send-html/suspend} sends to the browser looks like
+in figure \ref{fig:user1-1}. After the user has entered his data into
+the web form, \name{send-html/suspend} returns with the request object
+of the browser for the next page. This request object contains the
+data the user has entered.
+
+\begin{alltt}
+ (bindings (get-bindings req))
+\end{alltt}
+
+With the function \name{get-bindings} we pull out the user data of the
+request object. Here we save the user data into the variable
+\name{bindings}. \name{get-bindings} works for both request methods
+\code{GET} and \code{POST}.
+
+\begin{alltt}
+ (user-input (input-field-value text-input bindings)))
+\end{alltt}
+
+With the function \name{input-field-value} and the extracted user data
+we can read the value for an \name{input-field}. Here, we want to
+know what the user has entered into the \name{text-input-field}.
+
+\begin{alltt}
+ (send-html/finish
+ `(html (body
+ (h1 "Echo result")
+ (p "You've entered: '" ,user-input "'."))))))
+\end{alltt}
+
+After we have extracted what the user has entered into the text field,
+we can show the final page of our \surflet and echo her input.
+
+The scheme for user interaction is thus about the following:
+
+\begin{itemize}
+\item Create the user interaction elements, \name{input-field}s, you
+want to use in your web page.
+\item Send the web page with \name{send-html/suspend} to the browser.
+Plug in the \name{input-field}s in the web page as if they were usual
+values. Save the return value of \name{send-html/suspend}.
+\item Extract the user data from the return value of
+\name{send-html/suspend}.
+\item Read the values of each \name{input-field} out of the extracted
+user data with \name{input-field-value}.
+\end{itemize}
+
+The complete list of functions that create \name{input-fields} can be
+found in the API.
+
+\subsection{Return types other than strings}
+
+As the user interaction elements are first class values in a \surflet,
+they can return other types than strings. For example the \surflets
+come with a number input field, \ie a input field that accepts only
+text that can be interpreted as a number. If the user enters
+something that is not a number, \name{input-field-value} will return
+\sharpf as the value of the number input field. If you'd rather want
+an error to be raise, you can use \name{raw-input-field-value}
+instead.
+
+\subsubsection{Annotated input fields}
+
+The return value of an input field need not even be a primitive
+value. The \surflets library allows you to ``annotate'' your input
+fields with values which should be returned indicated by the user's
+input. \Eg, Consider this \surflet:
+
+\begin{alltt}
+(define-structure surflet surflet-interface
+ (open surflets
+ scheme-with-scsh)
+ (begin
+ (define (main req)
+ (let* ((select-input-field
+ (make-select
+ (map make-annotated-select-option
+ '("Icecream" "Chocolate" "Candy")
+ '(1.5 2.0 0.5))))
+ (req (send-html/suspend
+ (lambda (k-url)
+ `(html
+ (head (title "Sweet Store"))
+ (body
+ (h1 "Your choice")
+ (surflet-form
+ ,k-url
+ (p "Select the sweet you want:"
+ ,select-input-field)
+ ,(make-submit-button)))))))
+ (bindings (get-bindings req))
+ (price (input-field-value select-input-field bindings)))
+ (send-html/finish
+ `(html (head (title "Receipt"))
+ (body
+ (h2 "Your receipt:")
+ (p "This costs you \$" ,price "."))))))
+))
+\end{alltt}
+
+\begin{alltt}
+ (let* ((select-input-field
+ (make-select
+ (map make-annotated-select-option
+ '("Icecream" "Chocolate" "Candy")
+ '(1.5 2.0 0.5))))
+\end{alltt}
+
+Here we define a select input field (a dropdown list). Instead of
+only providing a list of values that shall show up in the dropdown
+list and later examining which one was select and looking up the price
+for the sweet, we bind the values in the list with price while we
+create the select input field. When the select input field is shown
+in the browser, it will show the names of the sweets. When we lookup
+the user's input, we will get the associated price for the sweet.
+Again, this works not only with numbers, but with any arbitrary Scheme
+value (\eg functions or records).
+
+More to come soon.
+
+\end{document}