diff --git a/docs/chart.tex b/docs/chart.tex
index 04e3d47be0..8e8c041cbe 100644
--- a/docs/chart.tex
+++ b/docs/chart.tex
@@ -15,6 +15,7 @@
 A & & \var{\$ASMMODE} & Select assembler mode. \\
 &\var{\$B} & \var{\$BOOLEVAL} & Use complete boolean evaluation. \\
 Sa &\var{\$C} & \var{\$ASSERTIONS} & Enable assertion support. \\
+& & \var{\$CALLING} & Set default calling convention \\
 d && \var{\$DEFINE} & Define a symbol. \\
 && \var{\$ELSE} & Switch conditional compilation. \\
 && \var{\$ENDIF} & End conditional compilation. \\
@@ -37,7 +38,8 @@ Ci &\var{\$I} & \var{\$IOCHECKS} & Include Input/Output checking. \\
 &\var{\$L} & \var{\$LINK} & Link object file. \\
 && \var{\$LINKLIB} & Link to a library. \\
 &\var{\$M} & \var{\$TYPEINFO} & Generate Run-Time type information. \\
-Sm && \var{\$MACRO} & Enable macro support. \\
+Sm & & \var{\$MACRO} & Enable macro support. \\
+& & \var{\$MAXFPUREGISTER} & set maximum number of FPU registers \\
 && \var{\$MESSAGE} & Generate info message. \\
 && \var{\$MMX} & Enable Intel MMX support. \\
 && \var{\$NOTE} & Generate note message. \\
@@ -66,21 +68,24 @@ u && \var{\$UNDEF} & Undefine a symbol. \\
 %\caption{Global compiler switches}
 \begin{tabularx}{\textwidth}{lllX}
 \textbf{cmd} & \textbf {short} & \textbf {long} & \textbf{explanation }\\ \hline
+& & \var{\$APPID} & Set application ID (PalmOS) \\
+& & \var{\$APPNAME} & Set application name (PalmOS) \\
 & & \var{\$APPTYPE} & Specify type of application (Win32 only) \\
 g& \var{\$D} & \var{\$DEBUGINFO} & Include debugging symbols. \\
 & & \var{\$DESCRIPTION} & Not supported. \\
 &\var{\$E} & & Enable emulation of coprocessor. \\
-& & \var{\$G} & Generate 80286 code. \\
+& \var{\$G}& & Generate 80286 code. \\
 Fi& & \var{\$INCLUDEPATH} & Specify include file search path. \\
 &\var{\$L} & \var{\$LOCALSYMBOLS} & Enable local symbol information. \\
 Fl& & \var{\$LIBRARYPATH} & Specify library search path. \\
 &\var{\$M} & \var{\$MEMORY} & Specify memory sizes. \\
 M& & \var{\$MODE} & Specify compiler compatibility mode. \\
-& & \var{\$N} & Enable numeric processing.  \\
-& & \var{\$O} & Enable overlay code generation.  \\
+& \var{\$N}& & Enable numeric processing.  \\
+& \var{\$O}& & Enable overlay code generation.  \\
 Fo& & \var{\$OBJECTPATH} & Specify object file search path. \\
 Ct& \var{\$S} & & Use stack checking \\
 Fu& & \var{\$UNITPATH} & Specify unit file search path. \\
+& & \var{\$VERSION} & Set DLL version (Windows)\\
 & \var{\$W} & \var{\$STACKFRAMES} & Generate stackframes. \\
 b & \var{\$Y} & \var{\$REFERENCEINFO} & Insert browser information. \\ \hline
 \end{tabularx}
diff --git a/docs/fpc.sty b/docs/fpc.sty
index 58f41f5fa8..b91e469aa1 100644
--- a/docs/fpc.sty
+++ b/docs/fpc.sty
@@ -189,6 +189,7 @@
 \newcommand{\ostwo}{\textsc{os/2}\xspace}
 \newcommand{\windows}{\textsc{Windows}\xspace}
 \newcommand{\windowsnt}{\textsc{Windows NT}\xspace}
+\newcommand{\macos}{\textsc{mac OS}\xspace}
 \newcommand{\fpc}{Free Pascal\xspace}
 \newcommand{\gnu}{\textsc{gnu}\xspace}
 \newcommand{\atari}{\textsc{Atari}\xspace}
diff --git a/docs/prog.tex b/docs/prog.tex
index 50fc6c13ba..b714fa92c3 100644
--- a/docs/prog.tex
+++ b/docs/prog.tex
@@ -204,6 +204,17 @@ is the same as
 \end{verbatim}
 This is useful for indication what switch is meant.
 
+\subsection{\var{\protect\$ELSEC} : Switch conditional compilation}
+In MAC mode, this directive can be used as an alternative to the \var{\$ELSE}
+directive. It is supported for compatibility with existing \macos pascal
+compilers.
+
+
+\subsection{\var{\protect\$ENDC} : End conditional compilation}
+In MAC mode, this directive can be used as an alternative to the
+\var{\$ENDIF} directive. It is supported for compatibility with existing \macos pascal
+compilers.
+
 \subsection{\var{\protect\$ENDIF} : End conditional compilation}
 
 The \var{\{\$ENDIF\}} directive ends the conditional compilation initiated by the
@@ -380,6 +391,11 @@ the source cannot be used. Macros and symbols may be used, however.
 More information on this can be found in the section about
 conditionals.
 
+\subsection{\var{\protect\$IFC} : Start conditional compilation}
+In MAC mode, this directive can be used as an alternative to the \var{\$IF}
+directive. It is supported for compatibility with existing \macos pascal
+compilers.
+
 \subsection{\var{\protect\$IFDEF Name} : Start conditional compilation}
 
 If the symbol \var{Name} is not defined then the \var{\{\$IFDEF name\}}
@@ -415,6 +431,17 @@ Will compile the writeln statement if generation of type information is on.
 i.e. \var{\{\$IFOPT TYPEINFO\}} will not be accepted.
 \end{remark}
 
+\subsection{\var{\protect\$IMPLICITEXCEPTIONS} : Do not generate
+finalization code}
+
+The compiler generates an implicit \var{try}...\var{finally} frame around
+each procedure that needs initialization or finalization of variables, and
+finalizes the variables in the \var{finally} block. This
+slows down these procedures (with 5-10% sometimes). With this directive, the generation of such
+frames can be disabled. One should be careful with this directive, because
+it can lead to memory leaks if an exception occurs inside the routine.
+Therefore, standard it is set to \var{OFF}.
+
 \subsection{\var{\protect\$INFO} : Generate info message}
 
 If the generation of info is turned on, through the \var{-vi} command-line
@@ -440,6 +467,19 @@ By default, \var{Inline} procedures are not allowed. This directive must be
 specified to use inlined code. The directive is equivalent to the command-line
  switch \var{-Si}. For more information on inline routines, consult the \refref.
 
+\subsection{\var{\protect\$INTERFACES\}} : Specify Interface type.}
+The \var{\{\$INTERFACES\}} directive tells the compiler what it should take
+as the parent interface of an interface declaration which does not
+explicitly specify a parent interface. By default the Windows COM \var{IUnknown}
+interface is used. Other implementations of interfaces (CORBA or Java) do
+not necessarily have this interface, and for such cases, this directive can
+be used. It accepts the following three values:
+\begin{description}
+\item[COM] Interfaces will descend from \var{IUnknown}.
+\item[CORBA] Interfaces will not have a parent.
+\item[DEFAULT] Currently, this is COM.
+\end{description}
+
 \subsection{\var{\protect\$I} or \var{\protect\$IOCHECKS} : Input/Output checking}
 
 The \var{\{\$I-\}} or \var{\{\$IOCHECKS OFF\}} directive tells the compiler
@@ -900,34 +940,10 @@ This works only on the intel compiler, and MMX support must be on
 saturation support (\sees{SaturationSupport}) for more information
 on the effect of this directive.
 
-\subsection{\var{\protect\$SMARTLINK} : Use smartlinking}
-
-A unit that is compiled in the \var{\{\$SMARTLINK ON\}} state will be
-compiled in such a way that it can be used for smartlinking. This means that
-the unit is chopped in logical pieces: each procedure is put in it's own
-object file, and all object files are put together in a big archive. When
-using such a unit, only the pieces of code that you really need or call,
-will be linked in your program, thus reducing the size of your executable
-substantially.
-
-Beware: using smartlinked units slows down the compilation process, because
-a separate object file must be created for each procedure. If you have units
-with many functions and procedures, this can be a time consuming process,
-even more so if you use an external assembler (the assembler is called to
-assemble each procedure or function code block separately).
-
-The smartlinking directive should be specified {\em before} the unit
-declaration part:
-\begin{verbatim}
-{$SMARTLINK ON}
-
-Unit MyUnit;
-
-Interface
- ...
-\end{verbatim}
-
-This directive is equivalent to the \var{-Cx} command-line switch.
+\subsection{\var{\protect\$SETC} : Define a symbol}
+In MAC mode, this directive can be used as an alternative to the
+\var{\$DEFINE} directive. It is supported for compatibility with existing \macos pascal
+compilers.
 
 \subsection{\var{\protect\$STATIC} : Allow use of \var{Static} keyword.}
 
@@ -1046,20 +1062,70 @@ By default, extended syntax is assumed.
 \label{se:GlobalSwitch}
 Global directives affect the whole of the compilation process. That is why
 they also have a command-line counterpart. The command-line counterpart is
-given for each of the directives.
+given for each of the directives. They must be specified {\em before} the
+\var{unit} or \var{program} clause in a source file, or they will have no
+effect.
 
-\subsection{\var{\protect\$APPTYPE} : Specify type of application (Win32 and AmigaOS only)}
+\subsection{\var{\protect\$APPNAME} : Specify application name.}
+Used on the PALM os only, it can be set to specify the application name,
+which can be viewed on the Palm only. This directive only makes sense in a
+program source file, not in a unit.
 
-The \var{\{\$APPTYPE XXX\}} accepts one argument that can have two possible
-values: \var{GUI} or \var{CONSOLE}. It is used to tell the \windows
-Operating system if an application is a console application or a graphical
-application. By default, a program compiled by \fpc is a console
-application. Running it will display a console window. Specifying the
-\var{\{\$APPTYPE GUI\}} directive will mark the application as a graphical
-application; no console window will be opened when the application is run.
-If run from the command-line, the command prompt will be returned immediatly
-after the application was started.
+\begin{verbatim}
+{$APPID MyApplication}
+\end{verbatim}
 
+\subsection{\var{\protect\$APPNAME} : Specify application name.}
+Used on the PALM os only, it can be set to specify the application name,
+which can be viewed on the Palm only. This directive only makes sense in a
+program source file, not in a unit.
+
+\begin{verbatim}
+{$APPNAME My Application, compiled using Free Pascal.}
+\end{verbatim}
+
+\subsection{\var{\protect\$APPTYPE} : Specify type of application.}
+This directive is currently only supported on the following targets:
+ Win32, Mac, OS2 and AmigaOS. On other targets, the directive is ignored.
+
+The \var{\{\$APPTYPE XXX\}} accepts one argument which specifies what kind
+of application is compiled. It can have the following
+values:
+\begin{description}
+\item[CONSOLE] A console application. A terminal will be created and
+standard input, output and standard error file descriptors will be
+initialized. In Windows, a terminal window will be created. This is the
+default. 
+
+Note that on \macos such applications cannot take command-line
+options, nor return a result code. They will run in a special 
+terminal window.
+
+On \ostwo, these applications can run both full-screen and in a terminal
+window.
+
+\linux applications are always console applications. The application itself
+can decide to close the standard files, though.
+
+\item[FS] specifies a full-screen VIO application on \ostwo. These
+applications use a special BIOS-like API to program the screen. \ostwo
+starts these application allways in full screen.
+
+\item[GUI] Specifying the \var{\{\$APPTYPE GUI\}} directive will mark the 
+application as a graphical application; no console window will be opened 
+when the application is run. No stanrdard file descriptors will be
+initialized, using them (with e.g. \var{writeln} statements) will produce  a
+run-time error. If run from the command-line, the command prompt will be
+returned immediatly after the application was started.
+
+On \ostwo and \macos, the GUI application type creates a GUI application, as
+on Windows. On \ostwo, this is a real Presentation Manager application.
+
+\item[TOOL] this is a special directive for the \macos. It tells the compiler
+to create a tool application: It initializes input, output, stderr files,
+it can take parameters and return a result code. It is implemented as an MPW
+tool which can only be run by MPW or ToolServer.
+\end{description} 
 Care should be taken when compiling \var{GUI} applications; the \var{Input}
 and \var{Output} files are not available in a GUI application, and
 attempting to read from or write to them will result in a run-time error.
@@ -1069,11 +1135,43 @@ at runtime. The \var{IsConsole} constant, declared in the Win32 and Amiga
 system units as
 \begin{verbatim}
 Const
-  IsConsole : Boolean
+  IsConsole : Boolean;
 \end{verbatim}
 contains \var{True} if the application is a console application, \var{False}
 if the application is a GUI application.
 
+\subsection{\var{\protect\$CALLING} : Default calling convention}
+This directive allows to specify the default calling convention used by the
+compiler, when no calling convention is specified for a procedure or
+function declaration. It can be one of the following values:
+\begin{description}
+\item[CDECL] C compiler calling convention.
+\item[CPPDECL] C++ compiler calling convention.
+\item[FAR16] Ignored, but parsed for compatibility reasons.
+\item[FPCCALL] Older FPC (1.0.X and before) standard calling convention. If
+a lot of direct assembler blocks are used, this mode should be used for
+maximum compatibility.
+\item[INLINE] Use inline code: the code for the function is inserted
+whenever it is called.
+\item[PASCAL] Pascal calling convention.
+\item[REGISTER] Register calling convention.
+\item[SAFECALL] Safecall calling convention (used in COM): The called
+procedure/function saves all registers.
+\item[STDCALL] Windows library calling convention.
+\item[SOFTFLOAT] For ARM processors.
+\end{description}
+It is equivalent to the \var{-Cc} command-line option.
+
+\subsection{\var{\protect\$COPYRIGHT} specify copyright info}
+This is intended for the NETWARE version of the compiler: it specifies the
+copyright information that can be viewed on a module for a Netware OS.
+
+For example:
+\begin{verbatim}
+{$COPYRIGHT GNU copyleft. compiled using Free Pascal}
+\end{verbatim}
+
+
 \subsection{\var{\protect\$D} or \var{\protect\$DEBUGINFO} : Debugging symbols}
 
 When this switch is on,
@@ -1148,7 +1246,9 @@ Caution is in order when using this directive: If you distribute files, the
 places of the files may not be the same as on your machine; moreover, the
 directory structure may be different. In general it would be fair to say
 that you should avoid using {\em absolute} paths, instead use {\em relative}
-paths, as in the example above. Only use this directive if you are certain
+paths, as in the example above. Only
+
+ use this directive if you are certain
 of the places where the files reside. If you are not sure, it is better
 practice to use makefiles and makefile variables.
 
@@ -1215,6 +1315,9 @@ supplied.
 command-line option.
 \item[GPC] GNU pascal mode. This is the same as the \var{-Sp} command-line
 option.
+\item[MAC] MAC mode. In this mode, the compiler tries to be more compatible
+to commonly used pascal dialects on the \macos, such as Think Pascal, Metrowerks 
+Pascal, MPW Pascal. 
 \end{description}
 
 For an exact description of each of these modes, see appendix \ref{ch:AppD},
@@ -1258,6 +1361,13 @@ paths, as in the example above. Only use this directive if you are certain
 of the places where the files reside. If you are not sure, it is better
 practice to use makefiles and makefile variables.
 
+\subsection{\var{\protect\$PROFILE} : Profiling}
+
+This directive turns the generation of profiling code on (or off). It is
+equivalent to the \var{-gp} command-line option. Default is \var{OFF}. This
+directive only makes sense in a program source file, not in a unit.
+
+
 \subsection{\var{\protect\$S} : Stack checking}
 
 The \var{\{\$S+\}} directive tells the compiler to generate stack checking
@@ -1273,6 +1383,49 @@ The command-line compiler switch \var{-Ct} has the same effect as the
 
 By default, no stack checking is performed.
 
+\subsection{\var{\protect\$SMARTLINK} : Use smartlinking}
+
+A unit that is compiled in the \var{\{\$SMARTLINK ON\}} state will be
+compiled in such a way that it can be used for smartlinking. This means that
+the unit is chopped in logical pieces: each procedure is put in it's own
+object file, and all object files are put together in a big archive. When
+using such a unit, only the pieces of code that you really need or call,
+will be linked in your program, thus reducing the size of your executable
+substantially.
+
+Beware: using smartlinked units slows down the compilation process, because
+a separate object file must be created for each procedure. If you have units
+with many functions and procedures, this can be a time consuming process,
+even more so if you use an external assembler (the assembler is called to
+assemble each procedure or function code block separately).
+
+The smartlinking directive should be specified {\em before} the unit
+declaration part:
+\begin{verbatim}
+{$SMARTLINK ON}
+
+Unit MyUnit;
+
+Interface
+ ...
+\end{verbatim}
+
+This directive is equivalent to the \var{-Cx} command-line switch.
+
+\subsection{\var{\protect\$THREADNAME} : Set thread name in Netware}
+This directive can be set to specify the thread name when compiling for
+Netware. 
+
+\subsection{\var{\protect\$THREADING} : Allow use of threads.}
+If a program needs threading, this directive must be specified; The compiler
+will then insert the \var{systhrd} unit in the uses list of the program and
+will enable some threading features. This directive defines or undefines the 
+\var{FPC\_THREADING} macro symbol.
+
+Specifying \var{\{\$THREADING OFF\}} will disable threading. The
+\var{FPC\_THREADING} will be undefined.
+
+
 \subsection{\var{\protect\$UNITPATH} : Specify unit path.}
 
 This option serves to specify the unit path, where the compiler looks for
@@ -1300,6 +1453,26 @@ paths, as in the example above. Only use this directive if you are certain
 of the places where the files reside. If you are not sure, it is better
 practice to use makefiles and makefile variables.
 
+\subsection{\var{\protect\$VERSION} : Specify DLL version.}
+On \windows, this can be used to specify a version number for a library.
+This version number will be used when the library is installed, and can be
+viewed in the Windows Explorer by opening the property sheet of the DLL and
+looking on the tab 'Version'. The version number consists of minimally one,
+maximum 3 numbers:
+\begin{verbatim}
+{$VERSION 1}
+\end{verbatim}
+Or:
+\begin{verbatim}
+{$VERSION 1.1}
+\end{verbatim}
+And even:
+\begin{verbatim}
+{$VERSION 1.1.1}
+\end{verbatim}
+This can not yet be used for executables on Windows, but may be activated in
+the future.
+
 \subsection{\var{\protect\$W} or \var{\protect\$STACKFRAMES} : Generate stackframes}
 
 The \var{\{\$W\}} switch directive controls the generation of stackframes.
@@ -1426,7 +1599,9 @@ will evaluate to \var{True}.
 
 You can use any Pascal operator to construct your expression: \var{=, <>,
 >, <, >=, <=, AND, NOT, OR} and you can use round brackets to change the
-precedence of the operators.
+precedence of the operators. Additionally, the constants \var{FALSE} and
+\var{TRUE} can be used, and the operator \var{UNDEFINED}. The \var{UNDEFINED}
+operator returns \var{TRUE} if a macro was not yet defined.
 
 The following example shows you many of the possibilities:
 \begin{verbatim}
@@ -1526,6 +1701,19 @@ begin
 {$fatal $if not(0) rejected}
 {$endif}
 
+{$IF NOT UNDEFINED FPC} 
+// Detect FPC stuff when compiling on MAC.
+{$SETC TARGET_RT_MAC_68881:= FALSE}
+{$SETC TARGET_OS_MAC      := (NOT UNDEFINED MACOS) 
+                             OR (NOT UNDEFINED DARWIN)}
+{$SETC TARGET_OS_WIN32    := NOT UNDEFINED WIN32}
+{$SETC TARGET_OS_UNIX     := (NOT UNDEFINED UNIX) 
+                             AND (UNDEFINED DARWIN)}
+{$SETC TYPE_EXTENDED      := TRUE}
+{$SETC TYPE_LONGLONG      := FALSE}
+{$SETC TYPE_BOOL          := FALSE}
+{$ENDIF}
+
 {$info *************************************************}
 {$info * Now have to follow at least 2 error messages: *}
 {$info *************************************************}
@@ -5678,7 +5866,7 @@ set with the \var{\$Mode} switch, or by command line switches.
 \section{FPC mode}
 This mode is selected by the \var{{\$MODE FPC}} switch. On the command-line,
 this means that you use none of the other compatibility mode switches.
-It is the default mode of the compiler. This means essentially:
+It is the default mode of the compiler (\var{-Mfpc}). This means essentially:
 \begin{enumerate}
 \item You must use the address operator to assign procedural variables.
 \item A forward declaration must be repeated exactly the same by the
@@ -5696,7 +5884,7 @@ parameters when implementing the function or procedure.
 \section{TP mode}
 This mode is selected by the \var{{\$MODE TP}} switch. It tries to emulate, 
 as closely as possible, the behavior of Turbo Pascal 7. On the command-line,
-this mode is selected by the \var{-So} switch.
+this mode is selected by the \var{-Mtp} switch.
 
 \begin{enumerate}
 \item Enumeration sizes default to a storage size of 1 byte if there
@@ -5716,7 +5904,7 @@ parameters when implementing the function or procedure.
 \section{Delphi mode}
 This mode is selected by the \var{{\$MODE DELPHI}} switch. It tries to emulate,
 as closely as possible, the behavior of Delphi 4. On the command-line,
-this mode is selected by the \var{-Sd} switch.
+this mode is selected by the \var{-Mdelpih} switch.
 \begin{enumerate}
 \item You can not use the address operator to assign procedural variables.
 \item A forward declaration must not be repeated exactly the same by the
@@ -5735,7 +5923,7 @@ properties (although it is bad programming practice).
 % GPC Mode
 \section{GPC mode}
 This mode is selected by the \var{{\$MODE GPC}} switch. On the command-line,
-this mode is selected by the \var{-Sp} switch.
+this mode is selected by the \var{-Mgpc} switch.
 \begin{enumerate}
 \item You must use the address operator to assign procedural variables.
 \item A forward declaration must not be repeated exactly the same by the
@@ -5751,7 +5939,7 @@ parameters when implementing the function or procedure.
 % Objfpc mode
 \section{OBJFPC mode}
 This mode is selected by the \var{{\$MODE OBJFPC}} switch. On the command-line,
-this mode is selected by the \var{-S2} switch.
+this mode is selected by the \var{-Mobjfpc} switch.
 \begin{enumerate}
 \item You must use the address operator to assign procedural variables.
 \item A forward declaration must be repeated exactly the same by the
@@ -5768,6 +5956,34 @@ consequences of this is that the type \var{Integer} is redefined as
 properties.
 \end{enumerate}
 
+\section{MAC mode}
+This mode is selected by the \var{{\$MODE MAC}} switch. On the
+command-line, this mode is selected by the \var{-MMAC} switch. It mainly
+switches on some extra features:
+\begin{enumerate}
+\item Support for the \var{\$SETC} directive.
+\item Support for the \var{\$IFC}, \var{\$ELSEC} and \var{\$ENDC}
+directives.
+\item Support for the \var{UNDEFINED} construct in macros.
+\item Support for \var{TRUE} and \var{FALSE} as values in macro expressions.
+\item Macros may be assigned hexadecimal numbers, like \var{\$2345}.
+\end{enumerate}
+(Note: Macros are called 'Compiler Variables' in \macos dialects.)
+
+Currently, the following \macos pascal extensions are not yet supported in
+\var{MAC} mode:
+\begin{itemize}
+\item A nested procedure cannot be an actual parameter to a procedure. 
+\item No anonymous procedure types in formal parameters. 
+\item External procedures declared in the interface must have the directive \var{External}. 
+\item \var{Continue} instead of \var{Cycle}.
+\item \var{Break} instead of \var{Leave}
+\item \var{Exit} should not have the name of the procedure to exit as parameter.
+Instead, for a function the value to return can be supplied as parameter. 
+\item No propagating \var{uses}.
+\item Compiler directives defined in interface sections are not exported.
+\end{itemize}
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Appendix E
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/docs/ref.tex b/docs/ref.tex
index 8d0cac6eff..2776abfadd 100644
--- a/docs/ref.tex
+++ b/docs/ref.tex
@@ -303,8 +303,9 @@ true
 \end{verbatim}
 \end{multicols}
 \subsection{Modifiers}
-The following is a list of all modifiers. Contrary to Delphi, \fpc doesn't
-allow the programmer to redefine these modifiers.
+The following is a list of all modifiers. They are not exactly reserved
+words in the sense that they can be used as identifiers, but in specific
+places, they have a special meaning for the compiler.
 \begin{multicols}{4}
 \begin{verbatim}
 absolute
@@ -316,7 +317,9 @@ default
 export
 external
 far
+far16
 forward
+fpccall
 index
 name
 near
@@ -329,7 +332,9 @@ public
 published
 read
 register
+safecall
 saveregisters
+softfloat
 stdcall
 virtual
 write
@@ -1813,6 +1818,10 @@ can be converted to a variable of this type.
 Note that expressions involving variants take more time to be evaluated, and
 should therefore be used with caution. If a lot of calculations need to be
 made, it is best to avoid the use of variants.
+
+When considering implicit type conversions (e.g. byte to integer, integer to
+double, char to string) the compiler will ignore variants unless a variant
+appears explicitly in the expression. 
  
 \subsection{Variants and interfaces}
 
@@ -2004,7 +2013,58 @@ end.
 \end{verbatim}
 
 The read/write specifiers can be hidden by declaring them in another unit
-(which must be in the \var{uses} clause of the unit).
+which must be in the \var{uses} clause of the unit. This can be used to hide
+the read/write access specifiers for programmers, just as if they were in a
+\var{private} section of a class (discussed below). For the previous
+example, this could look as follows:
+\begin{verbatim}
+{$mode objfpc}
+unit testrw;
+
+Interface
+
+Function GetMyInt : Integer;
+Procedure SetMyInt(Value : Integer);
+
+Implementation
+
+Uses sysutils;
+
+Var
+  FMyInt : Integer;  
+  
+Function GetMyInt : Integer;
+
+begin
+  Result:=FMyInt;
+end;
+
+Procedure SetMyInt(Value : Integer);
+
+begin
+  If ((Value mod 2)=1) then
+    Raise Exception.Create('Only even values are allowed');
+  FMyInt:=Value;  
+end;
+
+end.
+\end{verbatim}
+The unit \file{testprop} would then look like:
+\begin{verbatim}
+{$mode objfpc}
+unit testprop;
+
+Interface
+
+uses testrw;
+
+Property
+  MyProp : Integer Read GetMyInt Write SetMyInt;
+
+Implementation
+
+end.  
+\end{verbatim}
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Objects
@@ -2812,7 +2872,7 @@ methods of the parent interface(s).
 An interface can be uniquely identified by a GUID (GUID is an acronym for
 Globally Unique Identifier, a 128-bit integer guaranteed always to be 
 unique\footnote{In theory, of course.}. Especially on Windows systems, the
-GUID of an interface can and most be used when using COM.
+GUID of an interface can and must be used when using COM.
 
 The definition of an Interface has the following form:
 \input{syntax/typeintf.syn}
@@ -2833,7 +2893,7 @@ hence also \var{override} cannot be present in the definition of a interface
 definition.
 \end{itemize}
 
-\section{Identification: A GUID}
+\section{Interface identification: A GUID}
 An interface can be identified by a GUID. This is a 128-bit number, which is
 represented in a text representation (a string literal):
 \begin{verbatim}
@@ -2872,6 +2932,8 @@ Const
 begin
 end.
 \end{verbatim}
+Normally, the GUIDs are only used in Windows, when using COM interfaces.
+More on this in the next section.
 
 \section{Interfaces and COM}
 When using interfaces on Windows which should be available to the COM
@@ -2938,6 +3000,20 @@ This declaration should tell the compiler that the \var{MyFunc} method of
 the \var{IMyInterface} interface is implemented in the \var{MyOtherFunction}
 method of the \var{TMyClass} class.
 
+\section{CORBA and other Interfaces}
+COM is not the only architecture where interfaces are used. CORBA knows
+interfaces, UNO (the OpenOffice API) uses interfaces, and Java as well.
+These languages do not know the \var{IUnknown} interface used as the basis of
+all interfaces in COM. It would therefore be a bad idea if an interface
+automatically descended from \var{IUnknown} if no parent interface was
+specified. Therefore, a directive \var{\{\$INTERFACES\}} was introduced in
+ \fpc: it specifies what the parent interface is of an interface, declared
+without parent. More information about this directive can be found in the
+\progref.
+
+Note that COM interfaces are by default reference counted. 
+CORBA interfaces are not necessarily reference counted.
+
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 % Expressions
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -4415,7 +4491,8 @@ assembly-language level, by using it's mangled name (see the \progref).
 \label{se:register}
 The \var{register} keyword is used for compatibility with Delphi. In
 version 1.0.x of the compiler, this directive has no effect on the
-generated code.
+generated code. As of the 1.9.X versions, this directive is supported. The
+first three arguments are passed in registers EAX,ECX and EDX.
 
 \subsection{saveregisters}
 If this modifier is specified after a procedure or function, then the
@@ -4428,11 +4505,14 @@ calling assembler code.
 
 \subsection{safecall}
 This modifier ressembles closely the \var{stdcall} modifier. It sends
-parameters from right to left on the stack.
+parameters from right to left on the stack. The called procedure saves and
+restores all registers.
 
 More information about this modifier can be found in the \progref, in the
 section on the calling mechanism and the chapter on linking.
 
+\subsection{softfloat}
+This modifier makes sense only on the ARM architecture.
 
 \subsection{stdcall}
 This modifier pushes the parameters from right to left on the stack,
diff --git a/docs/user.tex b/docs/user.tex
index fb836f3d57..d137dbdc07 100644
--- a/docs/user.tex
+++ b/docs/user.tex
@@ -1066,8 +1066,12 @@ be used by an Integrated Development Environment (IDE) to provide information
 on classes, objects, procedures, types  and variables in a unit.
 \item[-bl] \olabel{bl} is the same as \var{-b} but also generates
 information about local variables, types and procedures.
+\item[-Cc] set the default calling convention used by the compiler.
 \item [-CD] Create a dynamic library. This is used to transform units into
 dynamically linkable libraries on \linux.
+\item[-CeXXX] set the used floating point emulation.
+\item[-CfXXX] set the used floating point processor.
+\item[-Cg] enable generation of PIC code.
 \item [-Chxxx] \olabel {Ch} Reserves \var{xxx} bytes heap. \var{xxx} should
 be between 1024 and 67107840.
 \item [-Ci] \olabel{Ci} Generate Input/Output checking code. In case some
@@ -1076,6 +1080,7 @@ exit with a run-time error. Which error is generated depends on the I/O error.
 \item [-Cn] \olabel{Cn} Omit the linking stage.
 \item [-Co] \olabel{Co} Generate Integer overflow checking code. In case of
 integer errors, a run-time error will be generated by your program.
+\item [-CpXXX] set the processor type to XXX
 \item [-Cr] \olabel{Cr} Generate Range checking code. In case your program
 acesses an array element with an invalid index, or if it increases an
 enumerated type beyond it's scope, a run-time error will be generated.
@@ -1131,7 +1136,15 @@ defines.
 Instead, the compiler writes a script, \file{PPAS.BAT} under \dos, or
 \file{ppas.sh} under \linux, which can then be executed to produce an
 executable. This can be used to speed up the compiling process or to debug
-the compiler's output.
+the compiler's output. This option can take some extra parameter, mainly
+used for cross-compilation.
+\begin{description}
+\item[h] Generate script to link on host. The generated script can be run on
+the compilation platform (host platform).
+\item[t] Generate script to link on target platform. The generated script
+can be run on the target platform. (where the binary must be run)
+\item[r] Skip register allocation phase (optimizations will be disabled).
+\end{description}
 \item[-Txxx] \olabel{T} Specifies the target operating system. \var{xxx} can be one of
 the following:
 \begin{itemize}
@@ -1149,6 +1162,18 @@ of the \var{-d} option.
 recompiled, even when the sources are available. This is useful when making
 release distributions. This also overrides the \var{-B} option for release 
 mode units.
+\item[-W] set some \windows or \ostwo attributes of the generated binary. It
+can be one or more of the following
+\begin{description}
+\item[Bhhh] set preferred base address to hhh (a hexadecimal address)
+\item[C] Generate a console application (+) or a gui application (-).
+\item[D] Force use of Def file for exports.
+\item[F] Generate a FS application (+) or a console application (-).
+\item[G] Generate a GUI application (+) or a console application (-).
+\item[N] Do not generate relocation section.
+\item[R] Generate a relocation section.
+\item[T] Generate a TOOL application (+) or a console application (-).
+\end{description}
 \item [-Xx] \olabel{X} executable options. This tells the compiler what
 kind of executable should be generated. the parameter \var{x}
 can be one of the following:
@@ -1174,6 +1199,19 @@ can be one of the following:
 \label{se:sourceoptions}
 for more information on these options, see also \progref
 \begin{description}
+\item[-Mmode] set language mode to \var{mode}, which can be one of the
+following:
+\begin{description}
+\item[delphi] tries to be Delphi compatible. This is more strict
+than the \var{objfpc} mode, since some \fpc extensions are switched off.
+\item[fpc] free pascal dialect (default)
+\item[gpc] tries to be gpc compatible.
+\item[mac] tries to be compatible to the macintosh pascal dialects.
+\item[objfpc] switch some Delphi 2 extensions on. This is different from 
+Delphi mode. because some \fpc constructs are still available.
+\item[tp] tries to be TP/BP 7.0 compatible. This means, no function overloading
+etc.
+\end{description}
 \item [-Rxxx] \olabel{R} Specifies what kind of assembler you use in
 your \var{asm} assembler code blocks. Here \var{xxx} is one of the following:
 \begin{description}
@@ -1185,15 +1223,13 @@ only replacing certain variables.
 file.
 \end{description}
 \item [-S2] \olabel{Stwo} Switch on Delphi 2 extensions (\var{objfpc} mode). 
-This is different from \var{-Sd} (Delphi mode) because some \fpc constructs 
-are still available.
+Deprecated, use \var{-Mobjfpc} instead.
 \item [-Sa] \olabel{Sa} Include assert statements in compiled code. Omitting 
 this option will cause assert statements to be ignored.
 \item [-Sc] \olabel{Sc} Support C-style operators, i.e. \var{*=, +=, /= and
 -=}.
-\item [-Sd] Tells the compiler to be Delphi compatible. This is more strict
-than the \var{-S2} option, since some \var{fpc} extensions are switched off.
-\olabel{Sd}
+\item [-Sd] \olabel{Sd} Tells the compiler to be Delphi compatible. Deprecated, use
+\var{-Mdelphi} instead. 
 \item [-SeN] \olabel{Se} The compiler stops after the N-th error. Normally,
 the compiler tries to continue compiling after an error, until 50 errors are
 reached, or a fatal error is reached, and then it stops. With this switch,
@@ -1207,11 +1243,12 @@ assember)
 specified, the compiler will interpret the \var{string} keyword as a
 ansistring. Otherwise it is supposed to be a short strings (TP style).
 \item [-Si] \olabel{Si} Support \var{C++} style INLINE.
+\item [-SIXXX] set interfaces style to XXX.
 \item [-Sm] \olabel{Sm} Support C-style macros.
-\item [-So] \olabel{So} Try to be Borland TP 7.0 compatible (no function
-overloading etc.).
+\item [-So] \olabel{So} Try to be Borland TP 7.0 compatible. Deprecated, use
+\var{-Mtp} instead.
 \item [-Sp] \olabel{Sp} Try to be \file{gpc} (\gnu pascal compiler)
-compatible.
+compatible. Deprecated, use \var{-Mgpc} instead.
 \item [-Ss] \olabel{Ss} The name of constructors must be \var{init}, and the
 name of destructors should be \var{done}.
 \item [-St] \olabel{St} Allow the \var{static} keyword in objects.