diff --git a/doc/efun/function_exists b/doc/efun/function_exists
index 2c7f03a..516d69b 100644
--- a/doc/efun/function_exists
+++ b/doc/efun/function_exists
@@ -6,55 +6,54 @@
         mixed function_exists(string str, object|lwobject ob)
         mixed function_exists(string str, object|lwobject ob, int flags)
 
-BESCHREIBUNG
-        Sucht eine Funktion <str> im aktuellen Objekt bzw. im Objekt <ob>. Je
-        nach den angegeben <flags> werden folgende Informationen angezeigt:
+DESCRIPTION
+        Look up a function <str> in the current object, respectively
+        in the object <ob>. Depending on the value of <flags>, one
+        of the following informations is returned:
 
-        FEXISTS_PROGNAME (0, default):
-        Liefert den Namen des Programms, in dem die Funktion definiert ist.
-        Das kann entweder der Objektname object_name(ob) sein, oder der
-        Name eines geerbten Programms. Wenn der Driver nicht im Compat-Modus
-        laeuft, beginnt der Name immer mit einem '/'.
+        <flags> == FEXISTS_PROGNAME (0, default):
+          Return the name of the program the function is defined in.
+          This can be either object_name(ob), or the name of an inherited
+          program. If !compat mode, the returned name always begins
+          with a '/'.
 
-        FEXISTS_FILENAME (1):
-        Liefert den Namen der Datei, in der die Funktion definiert ist. Das
-        kann auch ein Inlcude-File sein. Wenn der Driver nicht im Compat-
-        Modus laeuft, beginnt der Name mit einem '/'.
+        <flags> == FEXISTS_FILENAME (1):
+          Return the name of the file the function is defined in (this
+          may be an include file). If !compat mode, the returned name
+          always begins with a '/'.
 
-        FEXISTS_LINENO (2):
-        Liefert die Zeilennummer im Quellcode, in der die Funktion definiert
-        wird.
+        <flags> == FEXISTS_LINENO (2):
+          Return the line number within the source file.
 
-        FEXISTS_ALL (3):
-          Liefert ein Array mit der gesamten Information der anderen Flags,
-          sowie zusaetzlichen Informationen ueber die Funktion:
+        <flags> == FEXISTS_ALL (3):
+          Return an array with all the above information, plus information
+          about the function type/flags/number of arguments.
           
-            string [FEXISTS_PROGNAME]: der Programmname
-            string [FEXISTS_FILENAME]: der Dateiname
-            int    [FEXISTS_LINENO]:   die Zeilennummer
-            int    [FEXISTS_NUMARG]:   die Anzahl der Funktionsargumente
-            int    [FEXISTS_TYPE]:     der Ergebnistyp der Funktion
-            int    [FEXISTS_FLAGS]:    die Funktionsflags
+          The returned array contains this information:
+            string [FEXISTS_PROGNAME]: the program name
+            string [FEXISTS_FILENAME]: the filename
+            int    [FEXISTS_LINENO]:   the linenumber
+            int    [FEXISTS_NUMARG]:   the number of arguments to the function
+            int    [FEXISTS_TYPE]:     the return type of the function
+            int    [FEXISTS_FLAGS]:    the function flags
 
-        <flags> kann mit einem binaren Oder mit NAME_HIDDEN ergaenzt
-        werden, um Informationen ueber als static und protected deklarierte
-        Funktionen in anderen Objekten zu erhalten. Es ist nicht moeglich,
-        Informationen ueber als private deklarierte Funktionen zu erhalten.
+        The <flags> value can be or-ed to NAME_HIDDEN to return
+        information about static and protected functions in other objects.
+        It is not possible to return information about private functions.
 
-        Wenn die gesuchte Funktion nicht gefunden werden kann (weil sie
-        nicht existiert oder fuer den Aufrufer nicht sichtbar ist), dann
-        wird als Rueckgabewert 0 geliefert.
+        If the function cannot be found (because it doesn't exist or
+        it is not visible to the caller), the result is 0.
 
 
-BEISPIELE
-        function_exists("create");
+EXAMPLES
+        function_exists("create")
         function_exists("create", that_object, NAME_HIDDEN|FEXISTS_ALL);
 
-GESCHICHTE
-        LDMud 3.2.10 erweiterte die Menge der zurueck gelieferten Werte und
-            fuehrte das <flags> Argument ein.
-        LDMud 3.2.12/3.3.713 fuegte die zusaetzliche Funktionsinformation zum
-            FEXISTS_ALL Ergebnis hinzu.
+HISTORY
+        LDMud 3.2.10 broadened the range of returned values and introduced
+          the <flags> argument.
+        LDMud 3.2.12/3.3.713 added the function type/flags/number of arguments
+          to the result of FEXISTS_ALL.
 
-SIEHE AUCH
+SEE ALSO
         call_other(E), call_resolved(E), functionlist(E), variable_exists(E)
