diff --git a/Doc/ext.tex b/Doc/ext.tex
index 963f8ff..6603eb0 100644
--- a/Doc/ext.tex
+++ b/Doc/ext.tex
@@ -1364,6 +1364,8 @@
 files).  No \samp{-l} options can be used.
 
 
+\input{extref}
+
 \input{ext.ind}
 
 \end{document}
diff --git a/Doc/ext/ext.tex b/Doc/ext/ext.tex
index 963f8ff..6603eb0 100644
--- a/Doc/ext/ext.tex
+++ b/Doc/ext/ext.tex
@@ -1364,6 +1364,8 @@
 files).  No \samp{-l} options can be used.
 
 
+\input{extref}
+
 \input{ext.ind}
 
 \end{document}
diff --git a/Doc/extref.tex b/Doc/extref.tex
new file mode 100644
index 0000000..755539a
--- /dev/null
+++ b/Doc/extref.tex
@@ -0,0 +1,514 @@
+
+\section{Extension Reference}
+
+From the viewpoint of of C access to Python services, we have:
+
+\begin{enumerate}
+  \item "Very high level layer": two or three functions that let you exec or
+    eval arbitrary Python code given as a string in a module whose name is
+    given, passing C values in and getting C values out using
+    mkvalue/getargs style format strings.  This does not require the user
+    to declare any variables of type "PyObject *".  This should be enough
+    to write a simple application that gets Python code from the user,
+    execs it, and returns the output or errors.
+
+  \item "Abstract objects layer": which is the subject of this proposal.
+    It has many functions operating on objects, and lest you do many
+    things from C that you can also write in Python, without going
+    through the Python parser.
+
+  \item "Concrete objects layer": This is the public type-dependent
+    interface provided by the standard built-in types, such as floats,
+    strings, and lists.  This interface exists and is currently
+    documented by the collection of include files provides with the
+    Python distributions.
+
+  From the point of view of Python accessing services provided by C
+  modules: 
+
+  \item "Python module interface": this interface consist of the basic
+    routines used to define modules and their members.  Most of the
+    current extensions-writing guide deals with this interface.
+
+  \item "Built-in object interface": this is the interface that a new
+    built-in type must provide and the mechanisms and rules that a
+    developer of a new built-in type must use and follow.
+\end{enumerate}
+
+  The Python C object interface provides four protocols: object,
+  numeric, sequence, and mapping.  Each protocol consists of a
+  collection of related operations.  If an operation that is not
+  provided by a particular type is invoked, then a standard exception,
+  NotImplementedError is raised with a operation name as an argument.
+  In addition, for convenience this interface defines a set of
+  constructors for building objects of built-in types.  This is needed
+  so new objects can be returned from C functions that otherwise treat
+  objects generically.
+
+\subsubsection{Object Protocol}
+     \code{int *PyObject_Print(PyObject *o, FILE *fp, int flags)}\\
+         Print an object \code{o}, on file \code{fp}.  Returns -1 on error
+	 The flags argument is used to enable certain printing
+	 options. The only option currently supported is \code{Py_Print_RAW}. 
+
+     \code{int PyObject_HasAttrString(PyObject *o, char *attr_name)}\\
+         Returns 1 if o has the attribute attr_name, and 0 otherwise.
+     This is equivalent to the Python expression:
+	 \code{hasattr(o,attr_name)}.
+	 This function always succeeds.
+
+     \code{PyObject* PyObject_AttrString(PyObject *o, char *attr_name)}\\
+	 Retrieve an attributed named attr_name form object o.
+	 Returns the attribute value on success, or NULL on failure.
+	 This is the equivalent of the Python expression: \code{o.attr_name}.
+
+
+     \code{int PyObject_HasAttr(PyObject *o, PyObject *attr_name)}\\
+         Returns 1 if o has the attribute attr_name, and 0 otherwise.
+	 This is equivalent to the Python expression:
+	 \code{hasattr(o,attr_name)}. 
+	 This function always succeeds.
+
+
+     \code{PyObject* PyObject_GetAttr(PyObject *o, PyObject *attr_name)}\\
+	 Retrieve an attributed named attr_name form object o.
+	 Returns the attribute value on success, or NULL on failure.
+	 This is the equivalent of the Python expression: o.attr_name.
+
+
+     \code{int PyObject_SetAttrString(PyObject *o, char *attr_name, PyObject *v)}\\
+	 Set the value of the attribute named \code{attr_name}, for object \code{o},
+	 to the value \code{v}. Returns -1 on failure.  This is
+	 the equivalent of the Python statement: \code{o.attr_name=v}.
+
+
+     \code{int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)}\\
+	 Set the value of the attribute named \code{attr_name}, for object \code{o},
+	 to the value \code{v}. Returns -1 on failure.  This is
+	 the equivalent of the Python statement: \code{o.attr_name=v}.
+
+
+     \code{int PyObject_DelAttrString(PyObject *o, char *attr_name)}\\
+	 Delete attribute named \code{attr_name}, for object \code{o}. Returns -1 on
+	 failure.  This is the equivalent of the Python
+	 statement: \code{del o.attr_name}.
+
+
+     \code{int PyObject_DelAttr(PyObject *o, PyObject *attr_name)}\\
+	 Delete attribute named \code{attr_name}, for object \code{o}. Returns -1 on
+	 failure.  This is the equivalent of the Python
+	 statement: \code{del o.attr_name}.
+
+
+     \code{int PyObject_Cmp(PyObject *o1, PyObject *o2, int *result)}\\
+	 Compare the values of \code{o1} and \code{o2} using a routine provided by
+	 \code{o1}, if one exists, otherwise with a routine provided by \code{o2}.
+	 The result of the comparison is returned in \code{result}.  Returns
+	 -1 on failure.  This is the equivalent of the Python
+	 statement: \code{result=cmp(o1,o2)}.
+
+
+     \code{int PyObject_Compare(PyObject *o1, PyObject *o2)}\\
+	 Compare the values of \code{o1} and \code{o2} using a routine provided by
+	 \code{o1}, if one exists, otherwise with a routine provided by \code{o2}.
+	 Returns the result of the comparison on success.  On error,
+	 the value returned is undefined. This is equivalent to the
+	 Python expression: \code{cmp(o1,o2)}.
+
+
+     \code{PyObject *PyObject_Repr(PyObject *o)}\\
+	 Compute the string representation of object, \code{o}.  Returns the
+	 string representation on success, NULL on failure.  This is
+	 the equivalent of the Python expression: \code{repr(o)}.
+	 Called by the \code{repr()} built-in function and by reverse quotes.
+
+
+     \code{PyObject *PyObject_Str(PyObject *o)}\\
+	 Compute the string representation of object, \code{o}.  Returns the
+	 string representation on success, NULL on failure.  This is
+	 the equivalent of the Python expression: \code{str(o)}.
+	 Called by the \code{str()} built-in function and by the \code{print}
+	 statement.
+
+
+     \code{int *PyCallable_Check(PyObject *o))}\\
+	 Determine if the object \code{o}, is callable.  Return 1 if the
+	 object is callable and 0 otherwise.
+	 This function always succeeds.
+
+
+     \code{PyObject *PyObject_CallObject(PyObject *callable_object, PyObject *args)}\\
+	 Call a callable Python object \code{callable_object}, with
+	 arguments given by the tuple \code{args}.  If no arguments are
+	 needed, then args may be NULL.  Returns the result of the
+	 call on success, or NULL on failure.  This is the equivalent
+	 of the Python expression: \code{apply(o,args)}.
+
+     \code{PyObject *PyObject_CallFunction(PyObject *callable_object, char *format, ...)}\\
+         Call a callable Python object \code{callable_object}, with a
+         variable number of C arguments. The C arguments are described
+         using a mkvalue-style format string. The format may be NULL,
+         indicating that no arguments are provided.  Returns the
+         result of the call on success, or NULL on failure.  This is
+         the equivalent of the Python expression: \code{apply(o,args)}.
+
+
+     \code{PyObject *PyObject_CallMethod(PyObject *o, char *m, char *format, ...)}\\
+         Call the method named \code{m} of object \code{o} with a variable number of
+         C arguments.  The C arguments are described by a mkvalue
+         format string.  The format may be NULL, indicating that no
+         arguments are provided. Returns the result of the call on
+         success, or NULL on failure.  This is the equivalent of the
+         Python expression: \code{o.method(args)}.
+         Note that Special method names, such as "\code{__add__}",
+         "\code{__getitem__}", and so on are not supported. The specific
+         abstract-object routines for these must be used.
+
+
+     \code{int PyObject_Hash(PyObject *o)}\\
+         Compute and return the hash value of an object \code{o}.  On
+         failure, return -1.  This is the equivalent of the Python
+         expression: \code{hash(o)}.
+
+
+     \code{int *PyObject_IsTrue(PyObject *o)}\\
+	 Returns 1 if the object \code{o} is considered to be true, and
+	 0 otherwise. This is equivalent to the Python expression:
+	 \code{not not o}.
+	 This function always succeeds.
+	 
+
+     \code{PyObject *PyObject_Type(PyObject *o)}\\
+	 On success, returns a type object corresponding to the object
+	 type of object \code{o}. On failure, returns NULL.  This is
+	 equivalent to the Python expression: \code{type(o)}.
+
+     \code{int PyObject_Length(PyObject *o)}\\
+         Return the length of object \code{o}.  If the object \code{o} provides
+	 both sequence and mapping protocols, the sequence length is
+	 returned. On error, -1 is returned.  This is the equivalent
+	 to the Python expression: \code{len(o)}.
+
+
+     \code{PyObject *PyObject_GetItem(PyObject *o, PyObject *key)}\\
+	 Return element of \code{o} corresponding to the object \code{key} or NULL
+	 on failure. This is the equivalent of the Python expression:
+	 \code{o[key]}.
+
+
+     \code{int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)}\\
+	 Map the object \code{key} to the value \code{v}.
+	 Returns -1 on failure.  This is the equivalent
+	 of the Python statement: \code{o[key]=v}.
+
+
+\subsubsection{Number Protocol}
+
+     \code{int PyNumber_Check(PyObject *o)}\\
+         Returns 1 if the object \code{o} provides numeric protocols, and
+	 false otherwise. 
+	 This function always succeeds.
+
+
+     \code{PyObject *PyNumber_Add(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of adding \code{o1} and \code{o2}, or null on failure.
+	 This is the equivalent of the Python expression: \code{o1+o2}.
+
+
+     \code{PyObject *PyNumber_Subtract(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of subtracting \code{o2} from \code{o1}, or null on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{o1-o2}.
+
+
+     \code{PyObject *PyNumber_Multiply(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of multiplying \code{o1} and \code{o2}, or null on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{o1*o2}.
+
+
+     \code{PyObject *PyNumber_Divide(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of dividing \code{o1} by \code{o2}, or null on failure.
+	 This is the equivalent of the Python expression: \code{o1/o2}.
+
+
+     \code{PyObject *PyNumber_Remainder(PyObject *o1, PyObject *o2)}\\
+	 Returns the remainder of dividing \code{o1} by \code{o2}, or null on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{o1\%o2}.
+
+
+     \code{PyObject *PyNumber_Divmod(PyObject *o1, PyObject *o2)}\\
+	 See the built-in function divmod.  Returns NULL on failure.
+	 This is the equivalent of the Python expression:
+	 \code{divmod(o1,o2)}.
+
+
+     \code{PyObject *PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)}\\
+	 See the built-in function pow.  Returns NULL on failure.
+	 This is the equivalent of the Python expression:
+	 \code{pow(o1,o2,o3)}, where \code{o3} is optional.
+
+
+     \code{PyObject *PyNumber_Negative(PyObject *o)}\\
+	 Returns the negation of \code{o} on success, or null on failure.
+	 This is the equivalent of the Python expression: \code{-o}.
+
+
+     \code{PyObject *PyNumber_Positive(PyObject *o)}\\
+         Returns \code{o} on success, or NULL on failure.
+	 This is the equivalent of the Python expression: \code{+o}.
+
+
+     \code{PyObject *PyNumber_Absolute(PyObject *o)}\\
+	 Returns the absolute value of \code{o}, or null on failure.  This is
+	 the equivalent of the Python expression: \code{abs(o)}.
+
+
+     \code{PyObject *PyNumber_Invert(PyObject *o)}\\
+	 Returns the bitwise negation of \code{o} on success, or NULL on
+	 failure.  This is the equivalent of the Python expression:
+	 \code{~o}.
+
+
+     \code{PyObject *PyNumber_Lshift(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of left shifting \code{o1} by \code{o2} on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o1 << o2}.
+
+
+     \code{PyObject *PyNumber_Rshift(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of right shifting \code{o1} by \code{o2} on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o1 >> o2}.
+
+
+     \code{PyObject *PyNumber_And(PyObject *o1, PyObject *o2)}\\
+	 Returns the result of "anding" \code{o2} and \code{o2} on success and NULL
+	 on failure. This is the equivalent of the Python
+	 expression: \code{o1 and o2}.
+
+
+     \code{PyObject *PyNumber_Xor(PyObject *o1, PyObject *o2)}\\
+	 Returns the bitwise exclusive or of \code{o1} by \code{o2} on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o1\^{ }o2}.
+
+     \code{PyObject *PyNumber_Or(PyObject *o1, PyObject *o2)}\\
+	 Returns the result or \code{o1} and \code{o2} on success, or NULL on
+	 failure.  This is the equivalent of the Python expression: 
+	 \code{o1 or o2}.
+
+
+     \code{PyObject *PyNumber_Coerce(PyObject *o1, PyObject *o2)}\\
+         On success, returns a tuple containing \code{o1} and \code{o2} converted to
+	 a common numeric type, or None if no conversion is possible.
+	 Returns -1 on failure. This is equivalent to the Python
+	 expression: \code{coerce(o1,o2)}.
+
+
+     \code{PyObject *PyNumber_Int(PyObject *o)}\\
+	 Returns the \code{o} converted to an integer object on success, or
+	 NULL on failure.  This is the equivalent of the Python
+	 expression: \code{int(o)}.
+
+
+     \code{PyObject *PyNumber_Long(PyObject *o)}\\
+	 Returns the \code{o} converted to a long integer object on success,
+	 or NULL on failure.  This is the equivalent of the Python
+	 expression: \code{long(o)}.
+
+
+     \code{PyObject *PyNumber_Float(PyObject *o)}\\
+	 Returns the \code{o} converted to a float object on success, or NULL
+	 on failure.  This is the equivalent of the Python expression:
+	 \code{float(o)}.
+
+
+\subsubsection{Sequence protocol}
+
+     \code{int PySequence_Check(PyObject *o)}\\
+         Return 1 if the object provides sequence protocol, and 0
+	 otherwise.  
+	 This function always succeeds.
+
+
+     \code{PyObject *PySequence_Concat(PyObject *o1, PyObject *o2)}\\
+	 Return the concatination of \code{o1} and \code{o2} on success, and NULL on
+	 failure.   This is the equivalent of the Python
+	 expression: \code{o1+o2}.
+
+
+     \code{PyObject *PySequence_Repeat(PyObject *o, int count)}\\
+	 Return the result of repeating sequence object \code{o} count times,
+	 or NULL on failure.  This is the equivalent of the Python
+	 expression: \code{o*count}.
+
+
+     \code{PyObject *PySequence_GetItem(PyObject *o, int i)}\\
+	 Return the ith element of \code{o}, or NULL on failure. This is the
+	 equivalent of the Python expression: \code{o[i]}.
+
+
+     \code{PyObject *PySequence_GetSlice(PyObject *o, int i1, int i2)}\\
+	 Return the slice of sequence object \code{o} between \code{i1} and \code{i2}, or
+	 NULL on failure. This is the equivalent of the Python
+	 expression, \code{o[i1:i2]}.
+
+
+     \code{int PySequence_SetItem(PyObject *o, int i, PyObject *v)}\\
+	 Assign object \code{v} to the \code{i}th element of \code{o}.
+Returns -1 on failure.  This is the equivalent of the Python
+	 statement, \code{o[i]=v}.
+
+     \code{int PySequence_SetSlice(PyObject *o, int i1, int i2, PyObject *v)}\\
+         Assign the sequence object \code{v} to the slice in sequence
+	 object \code{o} from \code{i1} to \code{i2}.  This is the equivalent of the Python
+	 statement, \code{o[i1:i2]=v}.
+
+     \code{PyObject *PySequence_Tuple(PyObject *o)}\\
+	 Returns the \code{o} as a tuple on success, and NULL on failure.
+	 This is equivalent to the Python expression: \code{tuple(o)}.
+
+     \code{int PySequence_Count(PyObject *o, PyObject *value)}\\
+         Return the number of occurrences of \code{value} on \code{o}, that is,
+	 return the number of keys for which \code{o[key]==value}.  On
+	 failure, return -1.  This is equivalent to the Python
+	 expression: \code{o.count(value)}.
+
+     \code{int PySequence_In(PyObject *o, PyObject *value)}\\
+	 Determine if \code{o} contains \code{value}.  If an item in \code{o} is equal to
+	 \code{value}, return 1, otherwise return 0.  On error, return -1.  This
+	 is equivalent to the Python expression: \code{value in o}.
+
+     \code{int PySequence_Index(PyObject *o, PyObject *value)}\\
+	 Return the first index for which \code{o[i]=value}.  On error,
+	 return -1.    This is equivalent to the Python
+	 expression: \code{o.index(value)}.
+
+\subsubsection{Mapping protocol}
+
+     \code{int PyMapping_Check(PyObject *o)}\\
+         Return 1 if the object provides mapping protocol, and 0
+	 otherwise.  
+	 This function always succeeds.
+
+
+     \code{int PyMapping_Length(PyObject *o)}\\
+         Returns the number of keys in object \code{o} on success, and -1 on
+	 failure.  For objects that do not provide sequence protocol,
+	 this is equivalent to the Python expression: \code{len(o)}.
+
+
+     \code{int PyMapping_DelItemString(PyObject *o, char *key)}\\
+	 Remove the mapping for object \code{key} from the object \code{o}.
+	 Return -1 on failure.  This is equivalent to
+	 the Python statement: \code{del o[key]}.
+
+
+     \code{int PyMapping_DelItem(PyObject *o, PyObject *key)}\\
+	 Remove the mapping for object \code{key} from the object \code{o}.
+	 Return -1 on failure.  This is equivalent to
+	 the Python statement: \code{del o[key]}.
+
+
+     \code{int PyMapping_HasKeyString(PyObject *o, char *key)}\\
+	 On success, return 1 if the mapping object has the key \code{key}
+	 and 0 otherwise.  This is equivalent to the Python expression:
+	 \code{o.has_key(key)}. 
+	 This function always succeeds.
+
+
+     \code{int PyMapping_HasKey(PyObject *o, PyObject *key)}\\
+	 Return 1 if the mapping object has the key \code{key}
+	 and 0 otherwise.  This is equivalent to the Python expression:
+	 \code{o.has_key(key)}. 
+	 This function always succeeds.
+
+
+     \code{PyObject *PyMapping_Keys(PyObject *o)}\\
+         On success, return a list of the keys in object \code{o}.  On
+	 failure, return NULL. This is equivalent to the Python
+	 expression: \code{o.keys()}.
+
+
+     \code{PyObject *PyMapping_Values(PyObject *o)}\\
+         On success, return a list of the values in object \code{o}.  On
+	 failure, return NULL. This is equivalent to the Python
+	 expression: \code{o.values()}.
+
+
+     \code{PyObject *PyMapping_Items(PyObject *o)}\\
+         On success, return a list of the items in object \code{o}, where
+	 each item is a tuple containing a key-value pair.  On
+	 failure, return NULL. This is equivalent to the Python
+	 expression: \code{o.items()}.
+
+     \code{int PyMapping_Clear(PyObject *o)}\\
+         Make object \code{o} empty.  Returns 1 on success and 0 on failure.
+	 This is equivalent to the Python statement:
+	 \code{for key in o.keys(): del o[key]}
+
+
+     \code{PyObject *PyMapping_GetItemString(PyObject *o, char *key)}\\
+	 Return element of \code{o} corresponding to the object \code{key} or NULL
+	 on failure. This is the equivalent of the Python expression:
+	 \code{o[key]}.
+
+     \code{PyObject *PyMapping_SetItemString(PyObject *o, char *key, PyObject *v)}\\
+         Map the object \code{key} to the value \code{v} in object \code{o}.  Returns 
+         -1 on failure.  This is the equivalent of the Python
+         statement: \code{o[key]=v}.
+
+
+\subsubsection{Constructors}
+
+     \code{PyObject *PyFile_FromString(char *file_name, char *mode)}\\
+	 On success, returns a new file object that is opened on the
+	 file given by \code{file_name}, with a file mode given by \code{mode},
+	 where \code{mode} has the same semantics as the standard C routine,
+	 fopen.  On failure, return -1.
+     
+     \code{PyObject *PyFile_FromFile(FILE *fp, char *file_name, char *mode, int close_on_del)}\\
+	 Return a new file object for an already opened standard C
+	 file pointer, \code{fp}.  A file name, \code{file_name}, and open mode,
+	 \code{mode}, must be provided as well as a flag, \code{close_on_del}, that
+	 indicates whether the file is to be closed when the file
+	 object is destroyed.  On failure, return -1.
+
+     \code{PyObject *PyFloat_FromDouble(double v)}\\
+	 Returns a new float object with the value \code{v} on success, and
+	 NULL on failure.
+     
+     \code{PyObject *PyInt_FromLong(long v)}\\
+	 Returns a new int object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyList_New(int l)}\\
+	 Returns a new list of length \code{l} on success, and NULL on
+	 failure.
+
+     \code{PyObject *PyLong_FromLong(long v)}\\
+	 Returns a new long object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyLong_FromDouble(double v)}\\
+	 Returns a new long object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyDict_New()}\\
+	 Returns a new empty dictionary on success, and NULL on
+	 failure.
+
+     \code{PyObject *PyString_FromString(char *v)}\\
+	 Returns a new string object with the value \code{v} on success, and
+	 NULL on failure.
+
+     \code{PyObject *PyString_FromStringAndSize(char *v, int l)}\\
+	 Returns a new string object with the value \code{v} and length \code{l}
+	 on success, and NULL on failure.
+
+     \code{PyObject *PyTuple_New(int l)}\\
+	 Returns a new tuple of length \code{l} on success, and NULL on
+	 failure.
+
